]> granicus.if.org Git - icu/commitdiff
ICU-9101 merge branches/markus/collv2@35225 into the trunk
authorMarkus Scherer <markus.icu@gmail.com>
Tue, 25 Feb 2014 21:21:49 +0000 (21:21 +0000)
committerMarkus Scherer <markus.icu@gmail.com>
Tue, 25 Feb 2014 21:21:49 +0000 (21:21 +0000)
X-SVN-Rev: 35227

167 files changed:
.gitattributes
.gitignore
icu4c/source/common/Makefile.in
icu4c/source/common/common.vcxproj
icu4c/source/common/common.vcxproj.filters
icu4c/source/common/normalizer2impl.cpp
icu4c/source/common/normalizer2impl.h
icu4c/source/common/ucol_swp.cpp
icu4c/source/common/ucol_swp.h
icu4c/source/common/udataswp.c
icu4c/source/common/udataswp.h
icu4c/source/common/unicode/uvernum.h
icu4c/source/common/unorm_it.c [deleted file]
icu4c/source/common/unorm_it.h [deleted file]
icu4c/source/common/uresdata.c
icu4c/source/common/utrie2.cpp
icu4c/source/common/utrie2.h
icu4c/source/common/utrie2_builder.cpp
icu4c/source/common/uvectr64.h
icu4c/source/data/Makefile.in
icu4c/source/data/coll/fa.txt
icu4c/source/data/coll/ja.txt
icu4c/source/data/coll/ko.txt
icu4c/source/data/coll/ps.txt
icu4c/source/data/in/coll/invuca.icu [deleted file]
icu4c/source/data/in/coll/ucadata.icu
icu4c/source/data/makedata.mak
icu4c/source/data/unidata/FractionalUCA.txt
icu4c/source/data/unidata/UCARules.txt
icu4c/source/i18n/Makefile.in
icu4c/source/i18n/alphaindex.cpp
icu4c/source/i18n/bocsu.cpp
icu4c/source/i18n/bocsu.h
icu4c/source/i18n/coleitr.cpp
icu4c/source/i18n/coll.cpp
icu4c/source/i18n/collation.cpp [new file with mode: 0644]
icu4c/source/i18n/collation.h [new file with mode: 0644]
icu4c/source/i18n/collationbasedatabuilder.cpp [new file with mode: 0644]
icu4c/source/i18n/collationbasedatabuilder.h [new file with mode: 0644]
icu4c/source/i18n/collationbuilder.cpp [new file with mode: 0644]
icu4c/source/i18n/collationbuilder.h [new file with mode: 0644]
icu4c/source/i18n/collationcompare.cpp [new file with mode: 0644]
icu4c/source/i18n/collationcompare.h [new file with mode: 0644]
icu4c/source/i18n/collationdata.cpp [new file with mode: 0644]
icu4c/source/i18n/collationdata.h [new file with mode: 0644]
icu4c/source/i18n/collationdatabuilder.cpp [new file with mode: 0644]
icu4c/source/i18n/collationdatabuilder.h [new file with mode: 0644]
icu4c/source/i18n/collationdatareader.cpp [new file with mode: 0644]
icu4c/source/i18n/collationdatareader.h [new file with mode: 0644]
icu4c/source/i18n/collationdatawriter.cpp [new file with mode: 0644]
icu4c/source/i18n/collationdatawriter.h [new file with mode: 0644]
icu4c/source/i18n/collationfastlatin.cpp [new file with mode: 0644]
icu4c/source/i18n/collationfastlatin.h [new file with mode: 0644]
icu4c/source/i18n/collationfastlatinbuilder.cpp [new file with mode: 0644]
icu4c/source/i18n/collationfastlatinbuilder.h [new file with mode: 0644]
icu4c/source/i18n/collationfcd.cpp [new file with mode: 0644]
icu4c/source/i18n/collationfcd.h [new file with mode: 0644]
icu4c/source/i18n/collationiterator.cpp [new file with mode: 0644]
icu4c/source/i18n/collationiterator.h [new file with mode: 0644]
icu4c/source/i18n/collationkeys.cpp [new file with mode: 0644]
icu4c/source/i18n/collationkeys.h [new file with mode: 0644]
icu4c/source/i18n/collationroot.cpp [new file with mode: 0644]
icu4c/source/i18n/collationroot.h [new file with mode: 0644]
icu4c/source/i18n/collationrootelements.cpp [new file with mode: 0644]
icu4c/source/i18n/collationrootelements.h [new file with mode: 0644]
icu4c/source/i18n/collationruleparser.cpp [new file with mode: 0644]
icu4c/source/i18n/collationruleparser.h [new file with mode: 0644]
icu4c/source/i18n/collationsets.cpp [new file with mode: 0644]
icu4c/source/i18n/collationsets.h [new file with mode: 0644]
icu4c/source/i18n/collationsettings.cpp [new file with mode: 0644]
icu4c/source/i18n/collationsettings.h [new file with mode: 0644]
icu4c/source/i18n/collationtailoring.cpp [new file with mode: 0644]
icu4c/source/i18n/collationtailoring.h [new file with mode: 0644]
icu4c/source/i18n/collationweights.cpp [new file with mode: 0644]
icu4c/source/i18n/collationweights.h [new file with mode: 0644]
icu4c/source/i18n/i18n.vcxproj
icu4c/source/i18n/i18n.vcxproj.filters
icu4c/source/i18n/nfrule.cpp
icu4c/source/i18n/rbnf.cpp
icu4c/source/i18n/rulebasedcollator.cpp [new file with mode: 0644]
icu4c/source/i18n/stsearch.cpp
icu4c/source/i18n/tblcoll.cpp [deleted file]
icu4c/source/i18n/ucln_in.h
icu4c/source/i18n/ucol.cpp
icu4c/source/i18n/ucol_bld.cpp [deleted file]
icu4c/source/i18n/ucol_bld.h [deleted file]
icu4c/source/i18n/ucol_cnt.cpp [deleted file]
icu4c/source/i18n/ucol_cnt.h [deleted file]
icu4c/source/i18n/ucol_elm.cpp [deleted file]
icu4c/source/i18n/ucol_elm.h [deleted file]
icu4c/source/i18n/ucol_imp.h
icu4c/source/i18n/ucol_res.cpp
icu4c/source/i18n/ucol_sit.cpp
icu4c/source/i18n/ucol_tok.cpp [deleted file]
icu4c/source/i18n/ucol_tok.h [deleted file]
icu4c/source/i18n/ucol_wgt.cpp [deleted file]
icu4c/source/i18n/ucol_wgt.h [deleted file]
icu4c/source/i18n/ucoleitr.cpp
icu4c/source/i18n/uitercollationiterator.cpp [new file with mode: 0644]
icu4c/source/i18n/uitercollationiterator.h [new file with mode: 0644]
icu4c/source/i18n/unicode/alphaindex.h
icu4c/source/i18n/unicode/coleitr.h
icu4c/source/i18n/unicode/coll.h
icu4c/source/i18n/unicode/rbnf.h
icu4c/source/i18n/unicode/sortkey.h
icu4c/source/i18n/unicode/stsearch.h
icu4c/source/i18n/unicode/tblcoll.h
icu4c/source/i18n/unicode/ucol.h
icu4c/source/i18n/unicode/ucoleitr.h
icu4c/source/i18n/usearch.cpp
icu4c/source/i18n/usrchimp.h
icu4c/source/i18n/utf16collationiterator.cpp [new file with mode: 0644]
icu4c/source/i18n/utf16collationiterator.h [new file with mode: 0644]
icu4c/source/i18n/utf8collationiterator.cpp [new file with mode: 0644]
icu4c/source/i18n/utf8collationiterator.h [new file with mode: 0644]
icu4c/source/test/cintltst/callcoll.c
icu4c/source/test/cintltst/capitst.c
icu4c/source/test/cintltst/citertst.c
icu4c/source/test/cintltst/citertst.h
icu4c/source/test/cintltst/cmsccoll.c
icu4c/source/test/cintltst/crestst.c
icu4c/source/test/cintltst/creststn.c
icu4c/source/test/cintltst/custrtst.c
icu4c/source/test/cintltst/udatatst.c
icu4c/source/test/depstest/dependencies.txt
icu4c/source/test/intltest/Makefile.in
icu4c/source/test/intltest/alphaindextst.cpp
icu4c/source/test/intltest/alphaindextst.h
icu4c/source/test/intltest/apicoll.cpp
icu4c/source/test/intltest/apicoll.h
icu4c/source/test/intltest/cntabcol.cpp [deleted file]
icu4c/source/test/intltest/cntabcol.h [deleted file]
icu4c/source/test/intltest/collationtest.cpp [new file with mode: 0644]
icu4c/source/test/intltest/colldata.cpp
icu4c/source/test/intltest/dadrcoll.cpp [deleted file]
icu4c/source/test/intltest/dadrcoll.h [deleted file]
icu4c/source/test/intltest/intltest.cpp
icu4c/source/test/intltest/intltest.h
icu4c/source/test/intltest/intltest.vcxproj
icu4c/source/test/intltest/intltest.vcxproj.filters
icu4c/source/test/intltest/itercoll.cpp
icu4c/source/test/intltest/regcoll.cpp
icu4c/source/test/intltest/regcoll.h
icu4c/source/test/intltest/ssearch.cpp
icu4c/source/test/intltest/svccoll.cpp
icu4c/source/test/intltest/thcoll.cpp
icu4c/source/test/intltest/tscoll.cpp
icu4c/source/test/intltest/ucaconf.cpp
icu4c/source/test/testdata/CollationTest_NON_IGNORABLE_SHORT.txt
icu4c/source/test/testdata/CollationTest_SHIFTED_SHORT.txt
icu4c/source/test/testdata/DataDrivenCollationTest.txt [deleted file]
icu4c/source/test/testdata/collationtest.txt [new file with mode: 0644]
icu4c/source/test/testdata/testdata.mak
icu4c/source/test/testdata/tstfiles.mk
icu4c/source/tools/dumpce/Makefile.in [deleted file]
icu4c/source/tools/dumpce/dumpce.cpp [deleted file]
icu4c/source/tools/dumpce/dumpce.dsp [deleted file]
icu4c/source/tools/dumpce/dumpce.dsw [deleted file]
icu4c/source/tools/genrb/genrb.c
icu4c/source/tools/genrb/genrb.vcxproj
icu4c/source/tools/genrb/parse.cpp
icu4c/source/tools/genrb/parse.h
icu4c/source/tools/genrb/wrtxml.cpp
icu4c/source/tools/toolutil/Makefile.in
icu4c/source/tools/toolutil/collationinfo.cpp [new file with mode: 0644]
icu4c/source/tools/toolutil/collationinfo.h [new file with mode: 0644]
icu4c/source/tools/toolutil/toolutil.vcxproj

index ac908d3d93ba11712de1edf9de80a99e444a9fae..102c8a9cd6bcfe40eee3d5a63233fd902d863596 100644 (file)
@@ -56,7 +56,6 @@ icu4c/source/common/common.vcxproj.filters -text
 icu4c/source/common/simplepatternformatter.cpp -text
 icu4c/source/common/simplepatternformatter.h -text
 icu4c/source/data/curr/pool.res -text
-icu4c/source/data/in/coll/invuca.icu -text
 icu4c/source/data/in/coll/ucadata.icu -text
 icu4c/source/data/in/nfc.nrm -text
 icu4c/source/data/in/nfkc.nrm -text
index 7bc7c3ef74c8e3793a2d030e257c84e18bd9af80..5453c662e9622a30417e07b29a99510f5a6930de 100644 (file)
@@ -631,12 +631,6 @@ icu4c/source/tools/ctestfw/libsicutest*
 icu4c/source/tools/ctestfw/release
 icu4c/source/tools/ctestfw/x64
 icu4c/source/tools/ctestfw/x86
-icu4c/source/tools/dumpce/*.css
-icu4c/source/tools/dumpce/*.d
-icu4c/source/tools/dumpce/*.html
-icu4c/source/tools/dumpce/*.o
-icu4c/source/tools/dumpce/Makefile
-icu4c/source/tools/dumpce/dumpce
 icu4c/source/tools/genbrk/*.d
 icu4c/source/tools/genbrk/*.o
 icu4c/source/tools/genbrk/*.pdb
index 754a7bbf15ba43c083423505aa73f46eb42b6de4..98d23d6a444a35ca756a245f0980cb6cfa0f5a11 100644 (file)
@@ -94,7 +94,7 @@ dictionarydata.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 \
-normalizer2impl.o normalizer2.o filterednormalizer2.o normlzr.o unorm.o unormcmp.o unorm_it.o \
+normalizer2impl.o normalizer2.o filterednormalizer2.o normlzr.o unorm.o unormcmp.o \
 chariter.o schriter.o uchriter.o uiter.o \
 patternprops.o uchar.o uprops.o ucase.o propname.o ubidi_props.o ubidi.o ubidiwrt.o ubidiln.o ushape.o \
 uscript.o uscript_props.o usc_impl.o unames.o \
index 0f2a0a30e47364d3d9d90719ad838e902f60bcfa..44f4f8803f8554a4ed2fec7503cdab28f4047e97 100644 (file)
     <ClCompile Include="normlzr.cpp">\r
     </ClCompile>\r
     <ClCompile Include="unorm.cpp" />\r
-    <ClCompile Include="unorm_it.c" />\r
     <ClCompile Include="unormcmp.cpp" />\r
     <ClCompile Include="bmpset.cpp" />\r
     <ClCompile Include="patternprops.cpp" />\r
 </Command>\r
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>\r
     </CustomBuild>\r
-    <ClInclude Include="unorm_it.h" />\r
     <ClInclude Include="unormimp.h" />\r
     <ClInclude Include="bmpset.h" />\r
     <ClInclude Include="messageimpl.h" />\r
index e255a686527774d69057152de833349aada4ebdb..63e83b4bbc1ad2f319ef544718218f06e5d2f8c4 100644 (file)
     <ClCompile Include="unorm.cpp">\r
       <Filter>normalization</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="unorm_it.c">\r
-      <Filter>normalization</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="unormcmp.cpp">\r
       <Filter>normalization</Filter>\r
     </ClCompile>\r
     <ClInclude Include="normalizer2impl.h">\r
       <Filter>normalization</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="unorm_it.h">\r
-      <Filter>normalization</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="unormimp.h">\r
       <Filter>normalization</Filter>\r
     </ClInclude>\r
index 9c00c1c818d12aff921fe62a82a14b6517ff527b..e8e11095a7a595c4a15b078c24a07bc69f8ae87b 100644 (file)
@@ -1,7 +1,7 @@
 /*
 *******************************************************************************
 *
-*   Copyright (C) 2009-2013, International Business Machines
+*   Copyright (C) 2009-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
@@ -357,8 +357,70 @@ uint8_t Normalizer2Impl::getTrailCCFromCompYesAndZeroCC(const UChar *cpStart, co
     }
 }
 
+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 {
+            uint16_t fcd16=impl.getFCD16(start);
+            if(fcd16>0xff) { set.add(start, end); }
+        }
+    }
+
+private:
+    const Normalizer2Impl &impl;
+    UnicodeSet &set;
+};
+
+struct PropertyStartsContext {
+    PropertyStartsContext(const Normalizer2Impl &ni, const USetAdder *adder)
+            : impl(ni), sa(adder) {}
+
+    const Normalizer2Impl &impl;
+    const USetAdder *sa;
+};
+
+}  // namespace
+
 U_CDECL_BEGIN
 
+static UBool U_CALLCONV
+enumLcccRange(const void *context, UChar32 start, UChar32 end, uint32_t value) {
+    ((LcccContext *)context)->handleRange(start, end, (uint16_t)value);
+    return TRUE;
+}
+
+static UBool U_CALLCONV
+enumNorm16PropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32_t value) {
+    /* add the start code point to the USet */
+    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)) {
+        // 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);
+        while(++start<=end) {
+            uint16_t fcd16=ctx->impl.getFCD16(start);
+            if(fcd16!=prevFCD16) {
+                sa->add(sa->set, start);
+                prevFCD16=fcd16;
+            }
+        }
+    }
+    return TRUE;
+}
+
 static UBool U_CALLCONV
 enumPropertyStartsRange(const void *context, UChar32 start, UChar32 /*end*/, uint32_t /*value*/) {
     /* add the start code point to the USet */
@@ -374,10 +436,18 @@ segmentStarterMapper(const void * /*context*/, uint32_t value) {
 
 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);
+}
+
 void
 Normalizer2Impl::addPropertyStarts(const USetAdder *sa, UErrorCode & /*errorCode*/) const {
     /* add the start code point of each same-value range of each trie */
-    utrie2_enum(normTrie, NULL, enumPropertyStartsRange, sa);
+    PropertyStartsContext context(*this, sa);
+    utrie2_enum(normTrie, NULL, enumNorm16PropertyStartsRange, &context);
 
     /* add Hangul LV syllables and LV+1 because of skippables */
     for(UChar c=Hangul::HANGUL_BASE; c<Hangul::HANGUL_LIMIT; c+=Hangul::JAMO_T_COUNT) {
@@ -419,6 +489,38 @@ Normalizer2Impl::copyLowPrefixFromNulTerminated(const UChar *src,
     return src;
 }
 
+UnicodeString &
+Normalizer2Impl::decompose(const UnicodeString &src, UnicodeString &dest,
+                           UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) {
+        dest.setToBogus();
+        return dest;
+    }
+    const UChar *sArray=src.getBuffer();
+    if(&dest==&src || sArray==NULL) {
+        errorCode=U_ILLEGAL_ARGUMENT_ERROR;
+        dest.setToBogus();
+        return dest;
+    }
+    decompose(sArray, sArray+src.length(), dest, src.length(), errorCode);
+    return dest;
+}
+
+void
+Normalizer2Impl::decompose(const UChar *src, const UChar *limit,
+                           UnicodeString &dest,
+                           int32_t destLengthEstimate,
+                           UErrorCode &errorCode) const {
+    if(destLengthEstimate<0 && limit!=NULL) {
+        destLengthEstimate=(int32_t)(limit-src);
+    }
+    dest.remove();
+    ReorderingBuffer buffer(*this, dest);
+    if(buffer.init(destLengthEstimate, errorCode)) {
+        decompose(src, limit, &buffer, errorCode);
+    }
+}
+
 // Dual functionality:
 // buffer!=NULL: normalize
 // buffer==NULL: isNormalized/spanQuickCheckYes
index 3b85eb040ed0d6eafb9d2012b1c0c3b2954406af..68c9bbbd64b39bdc5db1146e1874630607c43794 100644 (file)
@@ -1,7 +1,7 @@
 /*
 *******************************************************************************
 *
-*   Copyright (C) 2009-2013, International Business Machines
+*   Copyright (C) 2009-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
@@ -34,15 +34,19 @@ U_NAMESPACE_BEGIN
 
 struct CanonIterData;
 
-class Hangul {
+class U_COMMON_API Hangul {
 public:
     /* Korean Hangul and Jamo constants */
     enum {
         JAMO_L_BASE=0x1100,     /* "lead" jamo */
+        JAMO_L_END=0x1112,
         JAMO_V_BASE=0x1161,     /* "vowel" jamo */
+        JAMO_V_END=0x1175,
         JAMO_T_BASE=0x11a7,     /* "trail" jamo */
+        JAMO_T_END=0x11c2,
 
         HANGUL_BASE=0xac00,
+        HANGUL_END=0xd7a3,
 
         JAMO_L_COUNT=19,
         JAMO_V_COUNT=21,
@@ -110,7 +114,7 @@ private:
 
 class Normalizer2Impl;
 
-class ReorderingBuffer : public UMemory {
+class U_COMMON_API ReorderingBuffer : public UMemory {
 public:
     ReorderingBuffer(const Normalizer2Impl &ni, UnicodeString &dest) :
         impl(ni), str(dest),
@@ -222,6 +226,7 @@ public:
 
     void load(const char *packageName, const char *name, UErrorCode &errorCode);
 
+    void addLcccChars(UnicodeSet &set) const;
     void addPropertyStarts(const USetAdder *sa, UErrorCode &errorCode) const;
     void addCanonIterPropertyStarts(const USetAdder *sa, UErrorCode &errorCode) const;
 
@@ -242,6 +247,7 @@ public:
             return UNORM_NO;
         }
     }
+    UBool isAlgorithmicNoNo(uint16_t norm16) const { return limitNoNo<=norm16 && norm16<minMaybeYes; }
     UBool isCompNo(uint16_t norm16) const { return minNoNo<=norm16 && norm16<minMaybeYes; }
     UBool isDecompYes(uint16_t norm16) const { return norm16<minYesNo || minMaybeYes<=norm16; }
 
@@ -416,6 +422,18 @@ public:
 
     // higher-level functionality ------------------------------------------ ***
 
+    // NFD without an NFD Normalizer2 instance.
+    UnicodeString &decompose(const UnicodeString &src, UnicodeString &dest,
+                             UErrorCode &errorCode) const;
+    /**
+     * Decomposes [src, limit[ and writes the result to dest.
+     * limit can be NULL if src is NUL-terminated.
+     * destLengthEstimate is the initial dest buffer capacity and can be -1.
+     */
+    void decompose(const UChar *src, const UChar *limit,
+                   UnicodeString &dest, int32_t destLengthEstimate,
+                   UErrorCode &errorCode) const;
+
     const UChar *decompose(const UChar *src, const UChar *limit,
                            ReorderingBuffer *buffer, UErrorCode &errorCode) const;
     void decomposeAndAppend(const UChar *src, const UChar *limit,
index b33268c8fef578c319634fb9c18d4869d90d36a2..13e467364c44c85c21c5f6186e9fb62d363b1453 100644 (file)
@@ -1,7 +1,7 @@
 /*
 *******************************************************************************
 *
-*   Copyright (C) 2003-2012, International Business Machines
+*   Copyright (C) 2003-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
@@ -18,6 +18,7 @@
 
 #include "unicode/udata.h" /* UDataInfo */
 #include "utrie.h"
+#include "utrie2.h"
 #include "udataswp.h"
 #include "cmemory.h"
 #include "ucol_data.h"
@@ -102,18 +103,28 @@ utrie_swap(const UDataSwapper *ds,
 
 #if !UCONFIG_NO_COLLATION
 
-/* Modified copy of the beginning of ucol_swapBinary(). */
 U_CAPI UBool U_EXPORT2
 ucol_looksLikeCollationBinary(const UDataSwapper *ds,
                               const void *inData, int32_t length) {
-    const UCATableHeader *inHeader;
-    UCATableHeader header;
-
     if(ds==NULL || inData==NULL || length<-1) {
         return FALSE;
     }
 
-    inHeader=(const UCATableHeader *)inData;
+    // First check for format version 4+ which has a standard data header.
+    UErrorCode errorCode=U_ZERO_ERROR;
+    (void)udata_swapDataHeader(ds, inData, -1, NULL, &errorCode);
+    if(U_SUCCESS(errorCode)) {
+        const UDataInfo &info=*(const UDataInfo *)((const char *)inData+4);
+        if(info.dataFormat[0]==0x55 &&   // dataFormat="UCol"
+                info.dataFormat[1]==0x43 &&
+                info.dataFormat[2]==0x6f &&
+                info.dataFormat[3]==0x6c) {
+            return TRUE;
+        }
+    }
+
+    // Else check for format version 3.
+    const UCATableHeader *inHeader=(const UCATableHeader *)inData;
 
     /*
      * The collation binary must contain at least the UCATableHeader,
@@ -121,6 +132,7 @@ ucol_looksLikeCollationBinary(const UDataSwapper *ds,
      * sizeof(UCATableHeader)==42*4 in ICU 2.8
      * check the length against the header size before reading the size field
      */
+    UCATableHeader header;
     uprv_memset(&header, 0, sizeof(header));
     if(length<0) {
         header.size=udata_readInt32(ds, inHeader->size);
@@ -144,11 +156,13 @@ ucol_looksLikeCollationBinary(const UDataSwapper *ds,
     return TRUE;
 }
 
-/* swap a header-less collation binary, inside a resource bundle or ucadata.icu */
-U_CAPI int32_t U_EXPORT2
-ucol_swapBinary(const UDataSwapper *ds,
-                const void *inData, int32_t length, void *outData,
-                UErrorCode *pErrorCode) {
+namespace {
+
+/* swap a header-less collation formatVersion=3 binary, inside a resource bundle or ucadata.icu */
+int32_t
+swapFormatVersion3(const UDataSwapper *ds,
+                   const void *inData, int32_t length, void *outData,
+                   UErrorCode *pErrorCode) {
     const uint8_t *inBytes;
     uint8_t *outBytes;
 
@@ -159,7 +173,7 @@ ucol_swapBinary(const UDataSwapper *ds,
     uint32_t count;
 
     /* argument checking in case we were not called from ucol_swap() */
-    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
+    if(U_FAILURE(*pErrorCode)) {
         return 0;
     }
     if(ds==NULL || inData==NULL || length<-1 || (length>0 && outData==NULL)) {
@@ -183,7 +197,7 @@ ucol_swapBinary(const UDataSwapper *ds,
     if(length<0) {
         header.size=udata_readInt32(ds, inHeader->size);
     } else if((length<(42*4) || length<(header.size=udata_readInt32(ds, inHeader->size)))) {
-        udata_printError(ds, "ucol_swapBinary(): too few bytes (%d after header) for collation data\n",
+        udata_printError(ds, "ucol_swap(formatVersion=3): too few bytes (%d after header) for collation data\n",
                          length);
         *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;
         return 0;
@@ -195,7 +209,7 @@ ucol_swapBinary(const UDataSwapper *ds,
         inHeader->formatVersion[0]==3 /*&&
         inHeader->formatVersion[1]>=0*/
     )) {
-        udata_printError(ds, "ucol_swapBinary(): magic 0x%08x or format version %02x.%02x is not a collation binary\n",
+        udata_printError(ds, "ucol_swap(formatVersion=3): magic 0x%08x or format version %02x.%02x is not a collation binary\n",
                          header.magic,
                          inHeader->formatVersion[0], inHeader->formatVersion[1]);
         *pErrorCode=U_UNSUPPORTED_ERROR;
@@ -203,7 +217,7 @@ ucol_swapBinary(const UDataSwapper *ds,
     }
 
     if(inHeader->isBigEndian!=ds->inIsBigEndian || inHeader->charSetFamily!=ds->inCharset) {
-        udata_printError(ds, "ucol_swapBinary(): endianness %d or charset %d does not match the swapper\n",
+        udata_printError(ds, "ucol_swap(formatVersion=3): endianness %d or charset %d does not match the swapper\n",
                          inHeader->isBigEndian, inHeader->charSetFamily);
         *pErrorCode=U_INVALID_FORMAT_ERROR;
         return 0;
@@ -327,44 +341,252 @@ ucol_swapBinary(const UDataSwapper *ds,
     return header.size;
 }
 
+// swap formatVersion 4 ---------------------------------------------------- ***
+
+// The following are copied from CollationDataReader, trading an awkward copy of constants
+// for an awkward relocation of the i18n collationdatareader.h file into the common library.
+// Keep them in sync!
+
+enum {
+    IX_INDEXES_LENGTH,  // 0
+    IX_OPTIONS,
+    IX_RESERVED2,
+    IX_RESERVED3,
+
+    IX_JAMO_CE32S_START,  // 4
+    IX_REORDER_CODES_OFFSET,
+    IX_REORDER_TABLE_OFFSET,
+    IX_TRIE_OFFSET,
+
+    IX_RESERVED8_OFFSET,  // 8
+    IX_CES_OFFSET,
+    IX_RESERVED10_OFFSET,
+    IX_CE32S_OFFSET,
+
+    IX_ROOT_ELEMENTS_OFFSET,  // 12
+    IX_CONTEXTS_OFFSET,
+    IX_UNSAFE_BWD_OFFSET,
+    IX_FAST_LATIN_TABLE_OFFSET,
+
+    IX_SCRIPTS_OFFSET,  // 16
+    IX_COMPRESSIBLE_BYTES_OFFSET,
+    IX_RESERVED18_OFFSET,
+    IX_TOTAL_SIZE
+};
+
+int32_t
+swapFormatVersion4(const UDataSwapper *ds,
+                   const void *inData, int32_t length, void *outData,
+                   UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+
+    const uint8_t *inBytes=(const uint8_t *)inData;
+    uint8_t *outBytes=(uint8_t *)outData;
+
+    const int32_t *inIndexes=(const int32_t *)inBytes;
+    int32_t indexes[IX_TOTAL_SIZE+1];
+
+    // Need at least IX_INDEXES_LENGTH and IX_OPTIONS.
+    if(0<=length && length<8) {
+        udata_printError(ds, "ucol_swap(formatVersion=4): too few bytes "
+                         "(%d after header) for collation data\n",
+                         length);
+        errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
+        return 0;
+    }
+
+    int32_t indexesLength=indexes[0]=udata_readInt32(ds, inIndexes[0]);
+    if(0<=length && length<(indexesLength*4)) {
+        udata_printError(ds, "ucol_swap(formatVersion=4): too few bytes "
+                         "(%d after header) for collation data\n",
+                         length);
+        errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
+        return 0;
+    }
+
+    for(int32_t i=1; i<=IX_TOTAL_SIZE && i<indexesLength; ++i) {
+        indexes[i]=udata_readInt32(ds, inIndexes[i]);
+    }
+    for(int32_t i=indexesLength; i<=IX_TOTAL_SIZE; ++i) {
+        indexes[i]=-1;
+    }
+    inIndexes=NULL;  // Make sure we do not accidentally use these instead of indexes[].
+
+    // Get the total length of the data.
+    int32_t size;
+    if(indexesLength>IX_TOTAL_SIZE) {
+        size=indexes[IX_TOTAL_SIZE];
+    } else if(indexesLength>IX_REORDER_CODES_OFFSET) {
+        size=indexes[indexesLength-1];
+    } else {
+        size=indexesLength*4;
+    }
+    if(length<0) { return size; }
+
+    if(length<size) {
+        udata_printError(ds, "ucol_swap(formatVersion=4): too few bytes "
+                         "(%d after header) for collation data\n",
+                         length);
+        errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
+        return 0;
+    }
+
+    // Copy the data for inaccessible bytes and arrays of bytes.
+    if(inBytes!=outBytes) {
+        uprv_memcpy(outBytes, inBytes, size);
+    }
+
+    // Swap the int32_t indexes[].
+    ds->swapArray32(ds, inBytes, indexesLength * 4, outBytes, &errorCode);
+
+    // The following is a modified version of CollationDataReader::read().
+    // Here we use indexes[] not inIndexes[] because
+    // the inIndexes[] may not be in this machine's endianness.
+    int32_t index;  // one of the indexes[] slots
+    int32_t offset;  // byte offset for the index part
+    // int32_t length;  // number of bytes in the index part
+
+    index = IX_REORDER_CODES_OFFSET;
+    offset = indexes[index];
+    length = indexes[index + 1] - offset;
+    if(length > 0) {
+        ds->swapArray32(ds, inBytes + offset, length, outBytes + offset, &errorCode);
+    }
+
+    // Skip the IX_REORDER_TABLE_OFFSET byte array.
+
+    index = IX_TRIE_OFFSET;
+    offset = indexes[index];
+    length = indexes[index + 1] - offset;
+    if(length > 0) {
+        utrie2_swap(ds, inBytes + offset, length, outBytes + offset, &errorCode);
+    }
+
+    index = IX_RESERVED8_OFFSET;
+    offset = indexes[index];
+    length = indexes[index + 1] - offset;
+    if(length > 0) {
+        udata_printError(ds, "ucol_swap(formatVersion=4): unknown data at IX_RESERVED8_OFFSET\n", length);
+        errorCode = U_UNSUPPORTED_ERROR;
+        return 0;
+    }
+
+    index = IX_CES_OFFSET;
+    offset = indexes[index];
+    length = indexes[index + 1] - offset;
+    if(length > 0) {
+        ds->swapArray64(ds, inBytes + offset, length, outBytes + offset, &errorCode);
+    }
+
+    index = IX_RESERVED10_OFFSET;
+    offset = indexes[index];
+    length = indexes[index + 1] - offset;
+    if(length > 0) {
+        udata_printError(ds, "ucol_swap(formatVersion=4): unknown data at IX_RESERVED10_OFFSET\n", length);
+        errorCode = U_UNSUPPORTED_ERROR;
+        return 0;
+    }
+
+    index = IX_CE32S_OFFSET;
+    offset = indexes[index];
+    length = indexes[index + 1] - offset;
+    if(length > 0) {
+        ds->swapArray32(ds, inBytes + offset, length, outBytes + offset, &errorCode);
+    }
+
+    index = IX_ROOT_ELEMENTS_OFFSET;
+    offset = indexes[index];
+    length = indexes[index + 1] - offset;
+    if(length > 0) {
+        ds->swapArray32(ds, inBytes + offset, length, outBytes + offset, &errorCode);
+    }
+
+    index = IX_CONTEXTS_OFFSET;
+    offset = indexes[index];
+    length = indexes[index + 1] - offset;
+    if(length > 0) {
+        ds->swapArray16(ds, inBytes + offset, length, outBytes + offset, &errorCode);
+    }
+
+    index = IX_UNSAFE_BWD_OFFSET;
+    offset = indexes[index];
+    length = indexes[index + 1] - offset;
+    if(length > 0) {
+        ds->swapArray16(ds, inBytes + offset, length, outBytes + offset, &errorCode);
+    }
+
+    index = IX_FAST_LATIN_TABLE_OFFSET;
+    offset = indexes[index];
+    length = indexes[index + 1] - offset;
+    if(length > 0) {
+        ds->swapArray16(ds, inBytes + offset, length, outBytes + offset, &errorCode);
+    }
+
+    index = IX_SCRIPTS_OFFSET;
+    offset = indexes[index];
+    length = indexes[index + 1] - offset;
+    if(length > 0) {
+        ds->swapArray16(ds, inBytes + offset, length, outBytes + offset, &errorCode);
+    }
+
+    // Skip the  IX_COMPRESSIBLE_BYTES_OFFSET byte array.
+
+    index = IX_RESERVED18_OFFSET;
+    offset = indexes[index];
+    length = indexes[index + 1] - offset;
+    if(length > 0) {
+        udata_printError(ds, "ucol_swap(formatVersion=4): unknown data at IX_RESERVED18_OFFSET\n", length);
+        errorCode = U_UNSUPPORTED_ERROR;
+        return 0;
+    }
+
+    return size;
+}
+
+}  // namespace
+
 /* swap ICU collation data like ucadata.icu */
 U_CAPI int32_t U_EXPORT2
 ucol_swap(const UDataSwapper *ds,
           const void *inData, int32_t length, void *outData,
           UErrorCode *pErrorCode) {
-          
-    const UDataInfo *pInfo;
-    int32_t headerSize, collationSize;
+    if(U_FAILURE(*pErrorCode)) { return 0; }
 
     /* udata_swapDataHeader checks the arguments */
-    headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode);
-    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
-        return 0;
+    int32_t headerSize=udata_swapDataHeader(ds, inData, length, outData, pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        // Try to swap the old format version which did not have a standard data header.
+        *pErrorCode=U_ZERO_ERROR;
+        return swapFormatVersion3(ds, inData, length, outData, pErrorCode);
     }
 
     /* check data format and format version */
-    pInfo=(const UDataInfo *)((const char *)inData+4);
+    const UDataInfo &info=*(const UDataInfo *)((const char *)inData+4);
     if(!(
-        pInfo->dataFormat[0]==0x55 &&   /* dataFormat="UCol" */
-        pInfo->dataFormat[1]==0x43 &&
-        pInfo->dataFormat[2]==0x6f &&
-        pInfo->dataFormat[3]==0x6c &&
-        pInfo->formatVersion[0]==3 /*&&
-        pInfo->formatVersion[1]>=0*/
+        info.dataFormat[0]==0x55 &&   // dataFormat="UCol"
+        info.dataFormat[1]==0x43 &&
+        info.dataFormat[2]==0x6f &&
+        info.dataFormat[3]==0x6c &&
+        (info.formatVersion[0]==3 || info.formatVersion[0]==4)
     )) {
-        udata_printError(ds, "ucol_swap(): data format %02x.%02x.%02x.%02x (format version %02x.%02x) is not a collation file\n",
-                         pInfo->dataFormat[0], pInfo->dataFormat[1],
-                         pInfo->dataFormat[2], pInfo->dataFormat[3],
-                         pInfo->formatVersion[0], pInfo->formatVersion[1]);
+        udata_printError(ds, "ucol_swap(): data format %02x.%02x.%02x.%02x "
+                         "(format version %02x.%02x) is not recognized as collation data\n",
+                         info.dataFormat[0], info.dataFormat[1],
+                         info.dataFormat[2], info.dataFormat[3],
+                         info.formatVersion[0], info.formatVersion[1]);
         *pErrorCode=U_UNSUPPORTED_ERROR;
         return 0;
     }
 
-    collationSize=ucol_swapBinary(ds,
-                        (const char *)inData+headerSize,
-                        length>=0 ? length-headerSize : -1,
-                        (char *)outData+headerSize,
-                        pErrorCode);
+    inData=(const char *)inData+headerSize;
+    if(length>=0) { length-=headerSize; }
+    outData=(char *)outData+headerSize;
+    int32_t collationSize;
+    if(info.formatVersion[0]>=4) {
+        collationSize=swapFormatVersion4(ds, inData, length, outData, *pErrorCode);
+    } else {
+        collationSize=swapFormatVersion3(ds, inData, length, outData, pErrorCode);
+    }
     if(U_SUCCESS(*pErrorCode)) {
         return headerSize+collationSize;
     } else {
index cb5ef15353565020fc59877d3b91e84adaba270b..855b40419dac5e8ab228cbe8604e539a8852655d 100644 (file)
@@ -1,7 +1,7 @@
 /*
 *******************************************************************************
 *
-*   Copyright (C) 2003-2009, International Business Machines
+*   Copyright (C) 2003-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
@@ -33,16 +33,6 @@ U_INTERNAL UBool U_EXPORT2
 ucol_looksLikeCollationBinary(const UDataSwapper *ds,
                               const void *inData, int32_t length);
 
-/**
- * Swap a header-less collation binary, inside a resource bundle or ucadata.icu.
- * See udataswp.h.
- * @internal
- */
-U_CAPI int32_t U_EXPORT2
-ucol_swapBinary(const UDataSwapper *ds,
-                const void *inData, int32_t length, void *outData,
-                UErrorCode *pErrorCode);
-
 /**
  * Swap ICU collation data like ucadata.icu. See udataswp.h.
  * @internal
index cacf716610eb7cfff136926f5b0021120555fc4b..06fe85bc463c0defcf4ee78d1c4995ff89acd6cb 100644 (file)
@@ -1,7 +1,7 @@
 /*
 *******************************************************************************
 *
-*   Copyright (C) 2003, International Business Machines
+*   Copyright (C) 2003-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
@@ -123,6 +123,55 @@ uprv_copyArray32(const UDataSwapper *ds,
     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));
@@ -344,8 +393,15 @@ udata_openSwapper(UBool inIsBigEndian, uint8_t inCharset,
 
     swapper->compareInvChars= outCharset==U_ASCII_FAMILY ? uprv_compareInvAscii : uprv_compareInvEbcdic;
 
-    swapper->swapArray16= inIsBigEndian==outIsBigEndian ? uprv_copyArray16 : uprv_swapArray16;
-    swapper->swapArray32= inIsBigEndian==outIsBigEndian ? uprv_copyArray32 : uprv_swapArray32;
+    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;
index 52b99aaa3cf340548e1fc86bf849d9a52bd9a0ca..66c849556767086eab1b5fb9b032ef506700dc71 100644 (file)
@@ -1,7 +1,7 @@
 /*
 *******************************************************************************
 *
-*   Copyright (C) 2003-2005, International Business Machines
+*   Copyright (C) 2003-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
@@ -178,6 +178,8 @@ struct UDataSwapper {
     UDataSwapFn *swapArray16;
     /** Transform an array of 32-bit integers. @internal ICU 2.8 */
     UDataSwapFn *swapArray32;
+    /** Transform an array of 64-bit integers. @internal ICU 53 */
+    UDataSwapFn *swapArray64;
     /** Transform an invariant-character string. @internal ICU 2.8 */
     UDataSwapFn *swapInvChars;
 
index 553ec25ff4dddf1cec7584e42b1b5962918324d2..8b4c356f2f0dd12c8032fa58a6128205d8ceedcc 100644 (file)
@@ -1,6 +1,6 @@
 /*
 *******************************************************************************
-*   Copyright (C) 2000-2013, International Business Machines
+*   Copyright (C) 2000-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
 *
  * This value may change in subsequent releases of ICU.
  * @stable ICU 2.4
  */
-#define UCOL_RUNTIME_VERSION 7
+#define UCOL_RUNTIME_VERSION 8
 
 /**
  * Collation builder code version.
  * This value may change in subsequent releases of ICU.
  * @stable ICU 2.4
  */
-#define UCOL_BUILDER_VERSION 8
+#define UCOL_BUILDER_VERSION 9
 
 /**
  * This is the version of collation tailorings.
diff --git a/icu4c/source/common/unorm_it.c b/icu4c/source/common/unorm_it.c
deleted file mode 100644 (file)
index 3adb1ce..0000000
+++ /dev/null
@@ -1,646 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 2003-2011, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  unorm_it.c
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created on: 2003jan21
-*   created by: Markus W. Scherer
-*/
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_NORMALIZATION
-
-#include "unicode/uiter.h"
-#include "unicode/unorm.h"
-#include "unicode/utf.h"
-#include "unorm_it.h"
-#include "cmemory.h"
-
-/* UNormIterator ------------------------------------------------------------ */
-
-enum {
-    INITIAL_CAPACITY=100
-};
-
-struct UNormIterator {
-    UCharIterator api;
-    UCharIterator *iter;
-
-    /*
-     * chars and states either use the static buffers
-     * or are allocated in the same memory block
-     *
-     * They are parallel arrays with states[] holding the getState() values
-     * from normalization boundaries, and UITER_NO_STATE in between.
-     */
-    UChar *chars;
-    uint32_t *states;
-
-    /*
-     * api.start: first valid character & state in the arrays
-     * api.index: current position
-     * api.limit: one past the last valid character in chars[], but states[limit] is valid
-     * capacity: length of allocated arrays
-     */
-    int32_t capacity;
-
-    /* the current iter->getState(), saved to avoid unnecessary setState() calls; may not correspond to api->index! */
-    uint32_t state;
-
-    /* there are UChars available before start or after limit? */
-    UBool hasPrevious, hasNext, isStackAllocated;
-
-    UNormalizationMode mode;
-
-    UChar charsBuffer[INITIAL_CAPACITY];
-    uint32_t statesBuffer[INITIAL_CAPACITY+1]; /* one more than charsBuffer[]! */
-};
-
-static void
-initIndexes(UNormIterator *uni, UCharIterator *iter) {
-    /* do not pass api so that the compiler knows it's an alias pointer to uni itself */
-    UCharIterator *api=&uni->api;
-
-    if(!iter->hasPrevious(iter)) {
-        /* set indexes to the beginning of the arrays */
-        api->start=api->index=api->limit=0;
-        uni->hasPrevious=FALSE;
-        uni->hasNext=iter->hasNext(iter);
-    } else if(!iter->hasNext(iter)) {
-        /* set indexes to the end of the arrays */
-        api->start=api->index=api->limit=uni->capacity;
-        uni->hasNext=FALSE;
-        uni->hasPrevious=iter->hasPrevious(iter);
-    } else {
-        /* set indexes into the middle of the arrays */
-        api->start=api->index=api->limit=uni->capacity/2;
-        uni->hasPrevious=uni->hasNext=TRUE;
-    }
-}
-
-static UBool
-reallocArrays(UNormIterator *uni, int32_t capacity, UBool addAtStart) {
-    /* do not pass api so that the compiler knows it's an alias pointer to uni itself */
-    UCharIterator *api=&uni->api;
-
-    uint32_t *states;
-    UChar *chars;
-    int32_t start, limit;
-
-    states=(uint32_t *)uprv_malloc((capacity+1)*4+capacity*2);
-    if(states==NULL) {
-        return FALSE;
-    }
-
-    chars=(UChar *)(states+(capacity+1));
-    uni->capacity=capacity;
-
-    start=api->start;
-    limit=api->limit;
-
-    if(addAtStart) {
-        /* copy old contents to the end of the new arrays */
-        int32_t delta;
-
-        delta=capacity-uni->capacity;
-        uprv_memcpy(states+delta+start, uni->states+start, (limit-start+1)*4);
-        uprv_memcpy(chars+delta+start, uni->chars+start, (limit-start)*4);
-
-        api->start=start+delta;
-        api->index+=delta;
-        api->limit=limit+delta;
-    } else {
-        /* copy old contents to the beginning of the new arrays */
-        uprv_memcpy(states+start, uni->states+start, (limit-start+1)*4);
-        uprv_memcpy(chars+start, uni->chars+start, (limit-start)*4);
-    }
-
-    uni->chars=chars;
-    uni->states=states;
-
-    return TRUE;
-}
-
-static void
-moveContentsTowardStart(UCharIterator *api, UChar chars[], uint32_t states[], int32_t delta) {
-    /* move array contents up to make room */
-    int32_t srcIndex, destIndex, limit;
-
-    limit=api->limit;
-    srcIndex=delta;
-    if(srcIndex>api->start) {
-        /* look for a position in the arrays with a known state */
-        while(srcIndex<limit && states[srcIndex]==UITER_NO_STATE) {
-            ++srcIndex;
-        }
-    }
-
-    /* now actually move the array contents */
-    api->start=destIndex=0;
-    while(srcIndex<limit) {
-        chars[destIndex]=chars[srcIndex];
-        states[destIndex++]=states[srcIndex++];
-    }
-
-    /* copy states[limit] as well! */
-    states[destIndex]=states[srcIndex];
-
-    api->limit=destIndex;
-}
-
-static void
-moveContentsTowardEnd(UCharIterator *api, UChar chars[], uint32_t states[], int32_t delta) {
-    /* move array contents up to make room */
-    int32_t srcIndex, destIndex, start;
-
-    start=api->start;
-    destIndex=((UNormIterator *)api)->capacity;
-    srcIndex=destIndex-delta;
-    if(srcIndex<api->limit) {
-        /* look for a position in the arrays with a known state */
-        while(srcIndex>start && states[srcIndex]==UITER_NO_STATE) {
-            --srcIndex;
-        }
-    }
-
-    /* now actually move the array contents */
-    api->limit=destIndex;
-
-    /* copy states[limit] as well! */
-    states[destIndex]=states[srcIndex];
-
-    while(srcIndex>start) {
-        chars[--destIndex]=chars[--srcIndex];
-        states[destIndex]=states[srcIndex];
-    }
-
-    api->start=destIndex;
-}
-
-/* normalize forward from the limit, assume hasNext is true */
-static UBool
-readNext(UNormIterator *uni, UCharIterator *iter) {
-    /* do not pass api so that the compiler knows it's an alias pointer to uni itself */
-    UCharIterator *api=&uni->api;
-
-    /* make capacity/4 room at the end of the arrays */
-    int32_t limit, capacity, room;
-    UErrorCode errorCode;
-
-    limit=api->limit;
-    capacity=uni->capacity;
-    room=capacity/4;
-    if(room>(capacity-limit)) {
-        /* move array contents to make room */
-        moveContentsTowardStart(api, uni->chars, uni->states, room);
-        api->index=limit=api->limit;
-        uni->hasPrevious=TRUE;
-    }
-
-    /* normalize starting from the limit position */
-    errorCode=U_ZERO_ERROR;
-    if(uni->state!=uni->states[limit]) {
-        uiter_setState(iter, uni->states[limit], &errorCode);
-        if(U_FAILURE(errorCode)) {
-            uni->state=UITER_NO_STATE;
-            uni->hasNext=FALSE;
-            return FALSE;
-        }
-    }
-
-    room=unorm_next(iter, uni->chars+limit, capacity-limit, uni->mode, 0, TRUE, NULL, &errorCode);
-    if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
-        if(room<=capacity) {
-            /* empty and re-use the arrays */
-            uni->states[0]=uni->states[limit];
-            api->start=api->index=api->limit=limit=0;
-            uni->hasPrevious=TRUE;
-        } else {
-            capacity+=room+100;
-            if(!reallocArrays(uni, capacity, FALSE)) {
-                uni->state=UITER_NO_STATE;
-                uni->hasNext=FALSE;
-                return FALSE;
-            }
-            limit=api->limit;
-        }
-
-        errorCode=U_ZERO_ERROR;
-        uiter_setState(iter, uni->states[limit], &errorCode);
-        room=unorm_next(iter, uni->chars+limit, capacity-limit, uni->mode, 0, TRUE, NULL, &errorCode);
-    }
-    if(U_FAILURE(errorCode) || room==0) {
-        uni->state=UITER_NO_STATE;
-        uni->hasNext=FALSE;
-        return FALSE;
-    }
-
-    /* room>0 */
-    ++limit; /* leave the known states[limit] alone */
-    for(--room; room>0; --room) {
-        /* set unknown states for all but the normalization boundaries */
-        uni->states[limit++]=UITER_NO_STATE;
-    }
-    uni->states[limit]=uni->state=uiter_getState(iter);
-    uni->hasNext=iter->hasNext(iter);
-    api->limit=limit;
-    return TRUE;
-}
-
-/* normalize backward from the start, assume hasPrevious is true */
-static UBool
-readPrevious(UNormIterator *uni, UCharIterator *iter) {
-    /* do not pass api so that the compiler knows it's an alias pointer to uni itself */
-    UCharIterator *api=&uni->api;
-
-    /* make capacity/4 room at the start of the arrays */
-    int32_t start, capacity, room;
-    UErrorCode errorCode;
-
-    start=api->start;
-    capacity=uni->capacity;
-    room=capacity/4;
-    if(room>start) {
-        /* move array contents to make room */
-        moveContentsTowardEnd(api, uni->chars, uni->states, room);
-        api->index=start=api->start;
-        uni->hasNext=TRUE;
-    }
-
-    /* normalize ending at the start position */
-    errorCode=U_ZERO_ERROR;
-    if(uni->state!=uni->states[start]) {
-        uiter_setState(iter, uni->states[start], &errorCode);
-        if(U_FAILURE(errorCode)) {
-            uni->state=UITER_NO_STATE;
-            uni->hasPrevious=FALSE;
-            return FALSE;
-        }
-    }
-
-    room=unorm_previous(iter, uni->chars, start, uni->mode, 0, TRUE, NULL, &errorCode);
-    if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
-        if(room<=capacity) {
-            /* empty and re-use the arrays */
-            uni->states[capacity]=uni->states[start];
-            api->start=api->index=api->limit=start=capacity;
-            uni->hasNext=TRUE;
-        } else {
-            capacity+=room+100;
-            if(!reallocArrays(uni, capacity, TRUE)) {
-                uni->state=UITER_NO_STATE;
-                uni->hasPrevious=FALSE;
-                return FALSE;
-            }
-            start=api->start;
-        }
-
-        errorCode=U_ZERO_ERROR;
-        uiter_setState(iter, uni->states[start], &errorCode);
-        room=unorm_previous(iter, uni->chars, start, uni->mode, 0, TRUE, NULL, &errorCode);
-    }
-    if(U_FAILURE(errorCode) || room==0) {
-        uni->state=UITER_NO_STATE;
-        uni->hasPrevious=FALSE;
-        return FALSE;
-    }
-
-    /* room>0 */
-    do {
-        /* copy the UChars from chars[0..room[ to chars[(start-room)..start[ */
-        uni->chars[--start]=uni->chars[--room];
-        /* set unknown states for all but the normalization boundaries */
-        uni->states[start]=UITER_NO_STATE;
-    } while(room>0);
-    uni->states[start]=uni->state=uiter_getState(iter);
-    uni->hasPrevious=iter->hasPrevious(iter);
-    api->start=start;
-    return TRUE;
-}
-
-/* Iterator runtime API functions ------------------------------------------- */
-
-static int32_t U_CALLCONV
-unormIteratorGetIndex(UCharIterator *api, UCharIteratorOrigin origin) {
-    switch(origin) {
-    case UITER_ZERO:
-    case UITER_START:
-        return 0;
-    case UITER_CURRENT:
-    case UITER_LIMIT:
-    case UITER_LENGTH:
-        return UITER_UNKNOWN_INDEX;
-    default:
-        /* not a valid origin */
-        /* Should never get here! */
-        return -1;
-    }
-}
-
-static int32_t U_CALLCONV
-unormIteratorMove(UCharIterator *api, int32_t delta, UCharIteratorOrigin origin) {
-    UNormIterator *uni=(UNormIterator *)api;
-    UCharIterator *iter=uni->iter;
-    int32_t pos;
-
-    switch(origin) {
-    case UITER_ZERO:
-    case UITER_START:
-        /* restart from the beginning */
-        if(uni->hasPrevious) {
-            iter->move(iter, 0, UITER_START);
-            api->start=api->index=api->limit=0;
-            uni->states[api->limit]=uni->state=uiter_getState(iter);
-            uni->hasPrevious=FALSE;
-            uni->hasNext=iter->hasNext(iter);
-        } else {
-            /* we already have the beginning of the normalized text */
-            api->index=api->start;
-        }
-        break;
-    case UITER_CURRENT:
-        break;
-    case UITER_LIMIT:
-    case UITER_LENGTH:
-        /* restart from the end */
-        if(uni->hasNext) {
-            iter->move(iter, 0, UITER_LIMIT);
-            api->start=api->index=api->limit=uni->capacity;
-            uni->states[api->limit]=uni->state=uiter_getState(iter);
-            uni->hasPrevious=iter->hasPrevious(iter);
-            uni->hasNext=FALSE;
-        } else {
-            /* we already have the end of the normalized text */
-            api->index=api->limit;
-        }
-        break;
-    default:
-        return -1;  /* Error */
-    }
-
-    /* move relative to the current position by delta normalized UChars */
-    if(delta==0) {
-        /* nothing to do */
-    } else if(delta>0) {
-        /* go forward until the requested position is in the buffer */
-        for(;;) {
-            pos=api->index+delta;   /* requested position */
-            delta=pos-api->limit;   /* remainder beyond buffered text */
-            if(delta<=0) {
-                api->index=pos;     /* position reached */
-                break;
-            }
-
-            /* go to end of buffer and normalize further */
-            api->index=api->limit;
-            if(!uni->hasNext || !readNext(uni, iter)) {
-                break;              /* reached end of text */
-            }
-        }
-    } else /* delta<0 */ {
-        /* go backward until the requested position is in the buffer */
-        for(;;) {
-            pos=api->index+delta;   /* requested position */
-            delta=pos-api->start;   /* remainder beyond buffered text */
-            if(delta>=0) {
-                api->index=pos;     /* position reached */
-                break;
-            }
-
-            /* go to start of buffer and normalize further */
-            api->index=api->start;
-            if(!uni->hasPrevious || !readPrevious(uni, iter)) {
-                break;              /* reached start of text */
-            }
-        }
-    }
-
-    if(api->index==api->start && !uni->hasPrevious) {
-        return 0;
-    } else {
-        return UITER_UNKNOWN_INDEX;
-    }
-}
-
-static UBool U_CALLCONV
-unormIteratorHasNext(UCharIterator *api) {
-    return api->index<api->limit || ((UNormIterator *)api)->hasNext;
-}
-
-static UBool U_CALLCONV
-unormIteratorHasPrevious(UCharIterator *api) {
-    return api->index>api->start || ((UNormIterator *)api)->hasPrevious;
-}
-
-static UChar32 U_CALLCONV
-unormIteratorCurrent(UCharIterator *api) {
-    UNormIterator *uni=(UNormIterator *)api;
-
-    if( api->index<api->limit ||
-        (uni->hasNext && readNext(uni, uni->iter))
-    ) {
-        return uni->chars[api->index];
-    } else {
-        return U_SENTINEL;
-    }
-}
-
-static UChar32 U_CALLCONV
-unormIteratorNext(UCharIterator *api) {
-    UNormIterator *uni=(UNormIterator *)api;
-
-    if( api->index<api->limit ||
-        (uni->hasNext && readNext(uni, uni->iter))
-    ) {
-        return uni->chars[api->index++];
-    } else {
-        return U_SENTINEL;
-    }
-}
-
-static UChar32 U_CALLCONV
-unormIteratorPrevious(UCharIterator *api) {
-    UNormIterator *uni=(UNormIterator *)api;
-
-    if( api->index>api->start ||
-        (uni->hasPrevious && readPrevious(uni, uni->iter))
-    ) {
-        return uni->chars[--api->index];
-    } else {
-        return U_SENTINEL;
-    }
-}
-
-static uint32_t U_CALLCONV
-unormIteratorGetState(const UCharIterator *api) {
-    /* not uni->state because that may not be at api->index */
-    return ((UNormIterator *)api)->states[api->index];
-}
-
-static void U_CALLCONV
-unormIteratorSetState(UCharIterator *api, uint32_t state, UErrorCode *pErrorCode) {
-    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
-        /* do nothing */
-    } else if(api==NULL) {
-        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
-    } else if(state==UITER_NO_STATE) {
-        *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR;
-    } else {
-        UNormIterator *uni=(UNormIterator *)api;
-        UCharIterator *iter=((UNormIterator *)api)->iter;
-        if(state!=uni->state) {
-            uni->state=state;
-            uiter_setState(iter, state, pErrorCode);
-        }
-
-        /*
-         * Try shortcuts: If the requested state is in the array contents
-         * then just set the index there.
-         *
-         * We assume that the state is unique per position!
-         */
-        if(state==uni->states[api->index]) {
-            return;
-        } else if(state==uni->states[api->limit]) {
-            api->index=api->limit;
-            return;
-        } else {
-            /* search for the index with this state */
-            int32_t i;
-
-            for(i=api->start; i<api->limit; ++i) {
-                if(state==uni->states[i]) {
-                    api->index=i;
-                    return;
-                }
-            }
-        }
-
-        /* there is no array index for this state, reset for fresh contents */
-        initIndexes((UNormIterator *)api, iter);
-        uni->states[api->limit]=state;
-    }
-}
-
-static const UCharIterator unormIterator={
-    NULL, 0, 0, 0, 0, 0,
-    unormIteratorGetIndex,
-    unormIteratorMove,
-    unormIteratorHasNext,
-    unormIteratorHasPrevious,
-    unormIteratorCurrent,
-    unormIteratorNext,
-    unormIteratorPrevious,
-    NULL,
-    unormIteratorGetState,
-    unormIteratorSetState
-};
-
-/* Setup functions ---------------------------------------------------------- */
-
-U_CAPI UNormIterator * U_EXPORT2
-unorm_openIter(void *stackMem, int32_t stackMemSize, UErrorCode *pErrorCode) {
-    UNormIterator *uni;
-
-    /* argument checking */
-    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
-        return NULL;
-    }
-
-    /* allocate */
-    uni=NULL;
-    if(stackMem!=NULL && stackMemSize>=sizeof(UNormIterator)) {
-        if(U_ALIGNMENT_OFFSET(stackMem)==0) {
-            /* already aligned */
-            uni=(UNormIterator *)stackMem;
-        } else {
-            int32_t align=(int32_t)U_ALIGNMENT_OFFSET_UP(stackMem);
-            if((stackMemSize-=align)>=(int32_t)sizeof(UNormIterator)) {
-                /* needs alignment */
-                uni=(UNormIterator *)((char *)stackMem+align);
-            }
-        }
-        /* else does not fit */
-    }
-
-    if(uni!=NULL) {
-        uni->isStackAllocated=TRUE;
-    } else {
-        uni=(UNormIterator *)uprv_malloc(sizeof(UNormIterator));
-        if(uni==NULL) {
-            *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
-            return NULL;
-        }
-        uni->isStackAllocated=FALSE;
-    }
-
-    /*
-     * initialize
-     * do not memset because that would unnecessarily initialize the arrays
-     */
-    uni->iter=NULL;
-    uni->chars=uni->charsBuffer;
-    uni->states=uni->statesBuffer;
-    uni->capacity=INITIAL_CAPACITY;
-    uni->state=UITER_NO_STATE;
-    uni->hasPrevious=uni->hasNext=FALSE;
-    uni->mode=UNORM_NONE;
-
-    /* set a no-op iterator into the api */
-    uiter_setString(&uni->api, NULL, 0);
-    return uni;
-}
-
-U_CAPI void U_EXPORT2
-unorm_closeIter(UNormIterator *uni) {
-    if(uni!=NULL) {
-        if(uni->states!=uni->statesBuffer) {
-            /* chars and states are allocated in the same memory block */
-            uprv_free(uni->states);
-        }
-        if(!uni->isStackAllocated) {
-            uprv_free(uni);
-        }
-    }
-}
-
-U_CAPI UCharIterator * U_EXPORT2
-unorm_setIter(UNormIterator *uni, UCharIterator *iter, UNormalizationMode mode, UErrorCode *pErrorCode) {
-    /* argument checking */
-    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
-        return NULL;
-    }
-    if(uni==NULL) {
-        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
-        return NULL;
-    }
-    if( iter==NULL || iter->getState==NULL || iter->setState==NULL ||
-        mode<UNORM_NONE || UNORM_MODE_COUNT<=mode
-    ) {
-        /* set a no-op iterator into the api */
-        uiter_setString(&uni->api, NULL, 0);
-        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
-        return NULL;
-    }
-
-    /* set the iterator and initialize */
-    uprv_memcpy(&uni->api, &unormIterator, sizeof(unormIterator));
-
-    uni->iter=iter;
-    uni->mode=mode;
-
-    initIndexes(uni, iter);
-    uni->states[uni->api.limit]=uni->state=uiter_getState(iter);
-
-    return &uni->api;
-}
-
-#endif /* uconfig.h switches */
diff --git a/icu4c/source/common/unorm_it.h b/icu4c/source/common/unorm_it.h
deleted file mode 100644 (file)
index 384b7d4..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 2003, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  unorm_it.h
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created on: 2003jan21
-*   created by: Markus W. Scherer
-*/
-
-#ifndef __UNORM_IT_H__
-#define __UNORM_IT_H__
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_NORMALIZATION
-
-#include "unicode/uiter.h"
-#include "unicode/unorm.h"
-
-/**
- * Normalizing UCharIterator wrapper.
- * This internal API basically duplicates the functionality of the C++ Normalizer
- * but
- * - it actually implements a character iterator (UCharIterator)
- *   with few restrictions (see unorm_setIter())
- * - it supports UCharIterator getState()/setState()
- * - it uses lower-level APIs and buffers more text and states,
- *   hopefully resulting in higher performance
- *
- * Usage example:
- * \code
- * function(UCharIterator *srcIter) {
- *     UNormIterator *uni;
- *     UCharIterator *iter;
- *     UErrorCode errorCode;
- * 
- *     errorCode=U_ZERO_ERROR;
- *     uni=unorm_openIter(&errorCode);
- *     if(U_FAILURE(errorCode)) {
- *         // report error
- *         return;
- *     }
- * 
- *     iter=unorm_setIter(uni, srcIter, UNORM_FCD, &errorCode);
- *     if(U_FAILURE(errorCode)) {
- *         // report error
- *     } else {
- *         // use iter to iterate over the canonically ordered
- *         // version of srcIter's text
- *         uint32_t state;
- * 
- *         ...
- * 
- *         state=uiter_getState(iter);
- *         if(state!=UITER_NO_STATE) {
- *             // use valid state, store it, use iter some more
- *             ...
- * 
- *             // later restore iter to the saved state:
- *             uiter_setState(iter, state, &errorCode);
- * 
- *             ...
- *         }
- * 
- *         ...
- *     }
- *     unorm_closeIter(uni);
- * }
- * \endcode
- *
- * See also the ICU test suites.
- *
- * @internal
- */
-struct UNormIterator;
-typedef struct UNormIterator UNormIterator;
-
-/**
- * Size of a stack buffer to hold a UNormIterator, see the stackMem parameter
- * of unorm_openIter().
- *
- * @internal
- */
-#define UNORM_ITER_SIZE 1024
-
-/**
- * Open a normalizing iterator. Must be closed later.
- * Use unorm_setIter().
- *
- * @param stackMem Pointer to preallocated (stack-allocated) buffer to hold
- *                 the UNormIterator if possible; can be NULL.
- * @param stackMemSize Number of bytes at stackMem; can be 0,
- *                     or should be >= UNORM_ITER_SIZE for a non-NULL stackMem.
- * @param pErrorCode ICU error code
- * @return an allocated and pre-initialized UNormIterator
- * @internal
- */
-U_CAPI UNormIterator * U_EXPORT2
-unorm_openIter(void *stackMem, int32_t stackMemSize, UErrorCode *pErrorCode);
-
-/**
- * Close a normalizing iterator.
- *
- * @param uni UNormIterator from unorm_openIter()
- * @internal
- */
-U_CAPI void U_EXPORT2
-unorm_closeIter(UNormIterator *uni);
-
-/**
- * Set a UCharIterator and a normalization mode for the normalizing iterator
- * to wrap. The normalizing iterator will read from the character iterator,
- * normalize the text, and in turn deliver it with its own wrapper UCharIterator
- * interface which it returns.
- *
- * The source iterator remains at its current position through the unorm_setIter()
- * call but will be used and moved as soon as the
- * the returned normalizing iterator is.
- *
- * The returned interface pointer is valid for as long as the normalizing iterator
- * is open and until another unorm_setIter() call is made on it.
- *
- * The normalizing iterator's UCharIterator interface has the following properties:
- * - getIndex() and move() will almost always return UITER_UNKNOWN_INDEX
- * - getState() will return UITER_NO_STATE for unknown states for positions
- *              that are not at normalization boundaries
- *
- * @param uni UNormIterator from unorm_openIter()
- * @param iter The source text UCharIterator to be wrapped. It is aliases into the normalizing iterator.
- *             Must support getState() and setState().
- * @param mode The normalization mode.
- * @param pErrorCode ICU error code
- * @return an alias to the normalizing iterator's UCharIterator interface
- * @internal
- */
-U_CAPI UCharIterator * U_EXPORT2
-unorm_setIter(UNormIterator *uni, UCharIterator *iter, UNormalizationMode mode, UErrorCode *pErrorCode);
-
-#endif /* uconfig.h switches */
-
-#endif
index 5ebeb0c52778bbb311ceb96c47c7e1b2e3170823..dabde52b87eb324d566247e02c328d775d923f43 100644 (file)
@@ -1,9 +1,7 @@
 /*
 *******************************************************************************
-*                                                                             *
-* Copyright (C) 1999-2012, International Business Machines Corporation        *
-*               and others. All Rights Reserved.                              *
-*                                                                             *
+* Copyright (C) 1999-2014, International Business Machines Corporation
+*               and others. All Rights Reserved.
 *******************************************************************************
 *   file name:  uresdata.c
 *   encoding:   US-ASCII
@@ -755,7 +753,7 @@ ures_swapResource(const UDataSwapper *ds,
                 /* its table key string is unknown but it looks like a collation binary */
                 ucol_looksLikeCollationBinary(ds, p+1, count))
         ) {
-            ucol_swapBinary(ds, p+1, count, q+1, pErrorCode);
+            ucol_swap(ds, p+1, count, q+1, pErrorCode);
         }
 #endif
         break;
index 86b6a774557622ba8783ca0652147fe87a73040b..5f873c5cac08257b0359ff634d91e062123e8093 100644 (file)
@@ -1,7 +1,7 @@
 /*
 ******************************************************************************
 *
-*   Copyright (C) 2001-2013, International Business Machines
+*   Copyright (C) 2001-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 ******************************************************************************
@@ -399,6 +399,35 @@ utrie2_getVersion(const void *data, int32_t length, UBool anyEndianOk) {
     return 0;
 }
 
+U_CAPI UBool U_EXPORT2
+utrie2_isFrozen(const UTrie2 *trie) {
+    return (UBool)(trie->newTrie==NULL);
+}
+
+U_CAPI int32_t U_EXPORT2
+utrie2_serialize(const UTrie2 *trie,
+                 void *data, int32_t capacity,
+                 UErrorCode *pErrorCode) {
+    /* argument check */
+    if(U_FAILURE(*pErrorCode)) {
+        return 0;
+    }
+
+    if( trie==NULL || trie->memory==NULL || trie->newTrie!=NULL ||
+        capacity<0 || (capacity>0 && (data==NULL || (U_POINTER_MASK_LSB(data, 3)!=0)))
+    ) {
+        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
+        return 0;
+    }
+
+    if(capacity>=trie->length) {
+        uprv_memcpy(data, trie->memory, trie->length);
+    } else {
+        *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
+    }
+    return trie->length;
+}
+
 U_CAPI int32_t U_EXPORT2
 utrie2_swap(const UDataSwapper *ds,
             const void *inData, int32_t length, void *outData,
index d7985fbccd3748fcbdc939a16a5070519fd1c5f9..36ea9b4bb9423fc0e8de71c64a3975015f45f826 100644 (file)
@@ -1,7 +1,7 @@
 /*
 ******************************************************************************
 *
-*   Copyright (C) 2001-2013, International Business Machines
+*   Copyright (C) 2001-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 ******************************************************************************
@@ -319,7 +319,7 @@ utrie2_isFrozen(const UTrie2 *trie);
  * @see utrie2_openFromSerialized()
  */
 U_CAPI int32_t U_EXPORT2
-utrie2_serialize(UTrie2 *trie,
+utrie2_serialize(const UTrie2 *trie,
                  void *data, int32_t capacity,
                  UErrorCode *pErrorCode);
 
index 8d2a4e12ecb41d9e57a9569dc6d3bbd13bb74b69..f195453d11e84f16579d76d4f1805c35455fe0a9 100644 (file)
@@ -1,7 +1,7 @@
 /*
 ******************************************************************************
 *
-*   Copyright (C) 2001-2011, International Business Machines
+*   Copyright (C) 2001-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 ******************************************************************************
@@ -1417,35 +1417,6 @@ utrie2_freeze(UTrie2 *trie, UTrie2ValueBits valueBits, UErrorCode *pErrorCode) {
     trie->newTrie=NULL;
 }
 
-U_CAPI UBool U_EXPORT2
-utrie2_isFrozen(const UTrie2 *trie) {
-    return (UBool)(trie->newTrie==NULL);
-}
-
-U_CAPI int32_t U_EXPORT2
-utrie2_serialize(UTrie2 *trie,
-                 void *data, int32_t capacity,
-                 UErrorCode *pErrorCode) {
-    /* argument check */
-    if(U_FAILURE(*pErrorCode)) {
-        return 0;
-    }
-
-    if( trie==NULL || trie->memory==NULL || trie->newTrie!=NULL ||
-        capacity<0 || (capacity>0 && (data==NULL || (U_POINTER_MASK_LSB(data, 3)!=0)))
-    ) {
-        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
-        return 0;
-    }
-
-    if(capacity>=trie->length) {
-        uprv_memcpy(data, trie->memory, trie->length);
-    } else {
-        *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
-    }
-    return trie->length;
-}
-
 /*
  * This is here to avoid a dependency from utrie2.cpp on utrie.c.
  * This file already depends on utrie.c.
index 05cbc35ec3ea112c08c249a79a4633f5a63b0014..0692821e5685ebf30389619ecb4e5a499dca0447 100644 (file)
@@ -1,6 +1,6 @@
 /*
 **********************************************************************
-*   Copyright (C) 1999-2010, International Business Machines
+*   Copyright (C) 1999-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 **********************************************************************
 */
@@ -122,7 +122,7 @@ public:
 
     int32_t size(void) const;
 
-    //UBool isEmpty(void) const;
+    inline UBool isEmpty(void) const { return count == 0; }
 
     // Inline.  Use this one for speedy size check.
     inline UBool ensureCapacity(int32_t minimumCapacity, UErrorCode &status);
index d0f4698da488bdf9aeee7d4a7b9ba32c9ffee307..f1bf3811377a2efa693c27575c8399b50e221e9f 100644 (file)
@@ -243,7 +243,7 @@ package390: $(OUTTMPDIR)/icudata390.lst $(PKGDATA_LIST) ./icupkg.inc packagedata
 #  2010-dec Removed pnames.icu.
 # These are now hardcoded in ICU4C and only loaded in ICU4J.
 #
-DAT_FILES_SHORT=unames.icu cnvalias.icu coll/ucadata.icu coll/invuca.icu nfc.nrm nfkc.nrm nfkc_cf.nrm uts46.nrm
+DAT_FILES_SHORT=unames.icu cnvalias.icu coll/ucadata.icu nfc.nrm nfkc.nrm nfkc_cf.nrm uts46.nrm
 DAT_FILES=$(DAT_FILES_SHORT:%=$(BUILDDIR)/%)
 
 ## BRK files
index 186bac8fdff2dc109c33f1af9f5e006cd857e5d4..24c17b22f76f52bd19b4bac5b5ea9270f056542f 100644 (file)
@@ -1,6 +1,6 @@
 // ***************************************************************************
 // *
-// * Copyright (C) 2013 International Business Machines
+// * Copyright (C) 2013-2014 International Business Machines
 // * Corporation and others. All Rights Reserved.
 // * Tool: org.unicode.cldr.icu.NewLdml2IcuConverter
 // * Source File: <path>/common/collation/fa.xml
@@ -17,9 +17,11 @@ fa{
                 "[normalization on][reorder Arab]"
                 "&َ<<ِ<<ُ<<ً<<ٍ<<ٌ"
                 "&[before 1]ا<آ"
-                "&ا<<ٱ<ء<<*أٲإٳؤ<<یٔ<<<ىٔ<<<ئ"
+                "&ا<<ٱ<ء"
+                "<<أ<<ٲ<<إ<<ٳ<<ؤ"
+                "<<یٔ<<<ىٔ<<<ئ"
                 "&ک<<*ڪګكڬڭڮ"
-                "&ۏ<ه<<*ەہةۃۀھ"
+                "&ۏ<ه<<ە<<ہ<<ة<<ۃ<<ۀ<<ھ"
                 "&ی<<*ىےيېۑۍێ"
             }
             Version{"24"}
index 50cc3f64ae772969fcdada5ebad26c5637c69ba5..c9d18facb7b4715044c9b6a8013182b3f2b1fcf7 100644 (file)
@@ -1,6 +1,6 @@
 // ***************************************************************************
 // *
-// * Copyright (C) 2013 International Business Machines
+// * Copyright (C) 2013-2014 International Business Machines
 // * Corporation and others. All Rights Reserved.
 // * Tool: org.unicode.cldr.icu.NewLdml2IcuConverter
 // * Source File: <path>/common/collation/ja.xml
@@ -14,282 +14,304 @@ ja{
     collations{
         standard{
             Sequence{
-                "[strength 3][hiraganaQ on][reorder Latn Kana Hani]"
-                "&ヽ"
-                "=ゝ"
-                "&[before 3]ァ"
-                "<<<ァ|ー=ァ|ー=ぁ|ー=ア|ー=ア|ー=あ|ー=カ|ー=カ|ー=か|ー=ゕ|ー"
-                "=ガ|ー=が|ー=サ|ー=サ|ー=さ|ー=ザ|ー=ざ|ー=タ|ー=タ|ー=た|ー=ダ|ー=だ|ー=ナ|ー=ナ|ー=な|ー=ハ|ー=ハ|ー=ㇵ|ー"
-                "=は|ー=バ|ー=ば|ー=パ|ー=ぱ|ー=マ|ー=マ|ー=ま|ー=ャ|ー=ャ|ー=ゃ|ー=ヤ|ー=ヤ|ー=や|ー=ラ|ー=ラ|ー=ㇻ|ー"
-                "=ら|ー=ヮ|ー=ゎ|ー=ワ|ー=ワ|ー=わ|ー=ヵ|ー=ヷ|ー"
-                "&[before 3]ィ"
-                "<<<ィ|ー=ィ|ー=ぃ|ー=イ|ー=イ|ー=い|ー=キ|ー=キ|ー=き|ー=ギ|ー=ぎ|ー=シ|ー=シ|ー=ㇱ|ー"
-                "=し|ー=ジ|ー=じ|ー=チ|ー=チ|ー=ち|ー=ヂ|ー=ぢ|ー=ニ|ー=ニ|ー=に|ー=ヒ|ー=ヒ|ー=ㇶ|ー"
-                "=ひ|ー=ビ|ー=び|ー=ピ|ー=ぴ|ー=ミ|ー=ミ|ー=み|ー=リ|ー=リ|ー=ㇼ|ー"
-                "=り|ー=ヰ|ー=ゐ|ー=ヸ|ー"
-                "&[before 3]ゥ"
-                "<<<ゥ|ー=ゥ|ー=ぅ|ー=ウ|ー=ウ|ー=う|ー=ク|ー=ク|ー=ㇰ|ー"
-                "=く|ー=グ|ー=ぐ|ー=ス|ー=ス|ー=ㇲ|ー"
-                "=す|ー=ズ|ー=ず|ー=ッ|ー=ッ|ー=っ|ー=ツ|ー=ツ|ー=つ|ー=ヅ|ー=づ|ー=ヌ|ー=ヌ|ー=ㇴ|ー"
-                "=ぬ|ー=フ|ー=フ|ー=ㇷ|ー"
-                "=ふ|ー=ブ|ー=ぶ|ー=プ|ー=ぷ|ー=ム|ー=ム|ー=ㇺ|ー"
-                "=む|ー=ュ|ー=ュ|ー=ゅ|ー=ユ|ー=ユ|ー=ゆ|ー=ル|ー=ル|ー=ㇽ|ー"
-                "=る|ー=ヴ|ー=ゔ|ー"
-                "&[before 3]ェ"
-                "<<<ェ|ー=ェ|ー=ぇ|ー=エ|ー=エ|ー=え|ー=ケ|ー=ケ|ー=け|ー=ゖ|ー"
-                "=ゲ|ー=げ|ー=セ|ー=セ|ー=せ|ー=ゼ|ー=ぜ|ー=テ|ー=テ|ー=て|ー=デ|ー=で|ー=ネ|ー=ネ|ー=ね|ー=ヘ|ー=ヘ|ー=ㇸ|ー"
-                "=へ|ー=ベ|ー=べ|ー=ペ|ー=ぺ|ー=メ|ー=メ|ー=め|ー=レ|ー=レ|ー=ㇾ|ー"
-                "=れ|ー=ヱ|ー=ゑ|ー=ヶ|ー=ヹ|ー"
-                "&[before 3]ォ"
-                "<<<ォ|ー=ォ|ー=ぉ|ー=オ|ー=オ|ー=お|ー=コ|ー=コ|ー=こ|ー=ゴ|ー=ご|ー=ソ|ー=ソ|ー=そ|ー=ゾ|ー=ぞ|ー=ト|ー=ト|ー=ㇳ|ー"
-                "=と|ー=ド|ー=ど|ー=ノ|ー=ノ|ー=の|ー=ホ|ー=ホ|ー=ㇹ|ー"
-                "=ほ|ー=ボ|ー=ぼ|ー=ポ|ー=ぽ|ー=モ|ー=モ|ー=も|ー=ョ|ー=ョ|ー=ょ|ー=ヨ|ー=ヨ|ー=よ|ー=ロ|ー=ロ|ー=ㇿ|ー"
-                "=ろ|ー=ヲ|ー=ヲ|ー=を|ー=ヺ|ー"
-                "&[before 3]ア"
-                "<<<ア|ヽ=ア|ヽ=あ|ゝ=ァ|ヽ=ァ|ヽ=ぁ|ゝ"
-                "&[before 3]イ"
-                "<<<イ|ヽ=イ|ヽ=い|ゝ=ィ|ヽ=ィ|ヽ=ぃ|ゝ"
-                "&[before 3]ウ"
-                "<<<ウ|ヽ=ウ|ヽ=う|ゝ=ゥ|ヽ=ゥ|ヽ=ぅ|ゝ=ヴ|ヽ=ゔ|ゝ=ウ|ヾ/゙=ウ|ヾ/゙=う|ゞ/゙=ゥ|ヾ/゙=ゥ|ヾ/゙=ぅ|ゞ/゙=ヴ|ヾ/゙=ゔ|ゞ/゙"
-                "&[before 3]エ"
-                "<<<エ|ヽ=エ|ヽ=え|ゝ=ェ|ヽ=ェ|ヽ=ぇ|ゝ"
-                "&[before 3]オ"
-                "<<<オ|ヽ=オ|ヽ=お|ゝ=ォ|ヽ=ォ|ヽ=ぉ|ゝ"
-                "&[before 3]カ"
-                "<<<カ|ヽ=カ|ヽ=か|ゝ=ヵ|ヽ=ゕ|ゝ"
-                "&[before 3]ガ"
-                "<<<ガ|ヽ=が|ゝ"
-                "&[before 3]キ"
-                "<<<キ|ヽ=キ|ヽ=き|ゝ=ギ|ヽ=ぎ|ゝ=キ|ヾ/゙=キ|ヾ/゙=き|ゞ/゙=ギ|ヾ/゙=ぎ|ゞ/゙"
-                "&[before 3]ク"
-                "<<<ク|ヽ=ク|ヽ=く|ゝ=ㇰ|ヽ"
-                "=グ|ヽ=ぐ|ゝ=ク|ヾ/゙=ク|ヾ/゙=く|ゞ/゙=ㇰ|ヾ/゙"
-                "=グ|ヾ/゙=ぐ|ゞ/゙"
-                "&[before 3]ケ"
-                "<<<ケ|ヽ=ケ|ヽ=け|ゝ=ヶ|ヽ=ゖ|ゝ"
-                "&[before 3]ゲ"
-                "<<<ゲ|ヽ=げ|ゝ"
-                "&[before 3]コ"
-                "<<<コ|ヽ=コ|ヽ=こ|ゝ=ゴ|ヽ=ご|ゝ=コ|ヾ/゙=コ|ヾ/゙=こ|ゞ/゙=ゴ|ヾ/゙=ご|ゞ/゙"
-                "&[before 3]サ"
-                "<<<サ|ヽ=サ|ヽ=さ|ゝ=ザ|ヽ=ざ|ゝ=サ|ヾ/゙=サ|ヾ/゙=さ|ゞ/゙=ザ|ヾ/゙=ざ|ゞ/゙"
-                "&[before 3]シ"
-                "<<<シ|ヽ=シ|ヽ=し|ゝ=ㇱ|ヽ"
-                "=ジ|ヽ=じ|ゝ=シ|ヾ/゙=シ|ヾ/゙=し|ゞ/゙=ㇱ|ヾ/゙"
-                "=ジ|ヾ/゙=じ|ゞ/゙"
-                "&[before 3]ス"
-                "<<<ス|ヽ=ス|ヽ=す|ゝ=ㇲ|ヽ"
-                "=ズ|ヽ=ず|ゝ=ス|ヾ/゙=ス|ヾ/゙=す|ゞ/゙=ㇲ|ヾ/゙"
-                "=ズ|ヾ/゙=ず|ゞ/゙"
-                "&[before 3]セ"
-                "<<<セ|ヽ=セ|ヽ=せ|ゝ=ゼ|ヽ=ぜ|ゝ=セ|ヾ/゙=セ|ヾ/゙=せ|ゞ/゙=ゼ|ヾ/゙=ぜ|ゞ/゙"
-                "&[before 3]ソ"
-                "<<<ソ|ヽ=ソ|ヽ=そ|ゝ=ゾ|ヽ=ぞ|ゝ=ソ|ヾ/゙=ソ|ヾ/゙=そ|ゞ/゙=ゾ|ヾ/゙=ぞ|ゞ/゙"
-                "&[before 3]タ"
-                "<<<タ|ヽ=タ|ヽ=た|ゝ=ダ|ヽ=だ|ゝ=タ|ヾ/゙=タ|ヾ/゙=た|ゞ/゙=ダ|ヾ/゙=だ|ゞ/゙"
-                "&[before 3]チ"
-                "<<<チ|ヽ=チ|ヽ=ち|ゝ=ヂ|ヽ=ぢ|ゝ=チ|ヾ/゙=チ|ヾ/゙=ち|ゞ/゙=ヂ|ヾ/゙=ぢ|ゞ/゙"
-                "&[before 3]ツ"
-                "<<<ツ|ヽ=ツ|ヽ=つ|ゝ=ッ|ヽ=ッ|ヽ=っ|ゝ=ヅ|ヽ=づ|ゝ=ツ|ヾ/゙=ツ|ヾ/゙=つ|ゞ/゙=ヅ|ヾ/゙=づ|ゞ/゙=ツ|ヽ=ツ|ヽ=つ|ゝ=ッ|ヾ/゙"
-                "=ッ|ヾ/゙=っ|ゞ/゙=ツ|ヾ/゙=ツ|ヾ/゙=つ|ゞ/゙"
-                "&[before 3]テ"
-                "<<<テ|ヽ=テ|ヽ=て|ゝ=デ|ヽ=で|ゝ=テ|ヾ/゙=テ|ヾ/゙=て|ゞ/゙=デ|ヾ/゙=で|ゞ/゙"
-                "&[before 3]ト"
-                "<<<ト|ヽ=ト|ヽ=と|ゝ=ㇳ|ヽ"
-                "=ド|ヽ=ど|ゝ=ト|ヾ/゙=ト|ヾ/゙=と|ゞ/゙=ㇳ|ヾ/゙"
-                "=ド|ヾ/゙=ど|ゞ/゙"
-                "&[before 3]ナ"
-                "<<<ナ|ヽ=ナ|ヽ=な|ゝ"
-                "&[before 3]ニ"
-                "<<<ニ|ヽ=ニ|ヽ=に|ゝ"
-                "&[before 3]ヌ"
-                "<<<ヌ|ヽ=ヌ|ヽ=ぬ|ゝ=ㇴ|ヽ"
-                "&[before 3]ネ"
-                "<<<ネ|ヽ=ネ|ヽ=ね|ゝ"
-                "&[before 3]ノ<<<ノ|ヽ"
-                "=ノ|ヽ=の|ゝ"
-                "&[before 3]ハ"
-                "<<<ハ|ヽ=ハ|ヽ=は|ゝ=ㇵ|ヽ"
-                "=バ|ヽ=ば|ゝ=ハ|ヾ/゙=ハ|ヾ/゙=は|ゞ/゙=ㇵ|ヾ/゙"
-                "=バ|ヾ/゙=ば|ゞ/゙=パ|ヽ=ぱ|ゝ=パ|ヾ/゙=ぱ|ゞ/゙"
-                "&[before 3]ヒ"
-                "<<<ヒ|ヽ=ヒ|ヽ=ひ|ゝ=ㇶ|ヽ"
-                "=ビ|ヽ=び|ゝ=ヒ|ヾ/゙=ヒ|ヾ/゙=ひ|ゞ/゙=ㇶ|ヾ/゙"
-                "=ビ|ヾ/゙=び|ゞ/゙=ピ|ヽ=ぴ|ゝ=ピ|ヾ/゙=ぴ|ゞ/゙"
-                "&[before 3]フ"
-                "<<<フ|ヽ=フ|ヽ=ふ|ゝ=ㇷ|ヽ"
-                "=ブ|ヽ=ぶ|ゝ=フ|ヾ/゙=フ|ヾ/゙=ふ|ゞ/゙=ㇷ|ヾ/゙"
-                "=ブ|ヾ/゙=ぶ|ゞ/゙=プ|ヽ=ぷ|ゝ=プ|ヾ/゙=ぷ|ゞ/゙"
-                "&[before 3]ヘ"
-                "<<<ヘ|ヽ=ヘ|ヽ=へ|ゝ=ㇸ|ヽ"
-                "=ベ|ヽ=べ|ゝ=ヘ|ヾ/゙=ヘ|ヾ/゙=へ|ゞ/゙=ㇸ|ヾ/゙"
-                "=ベ|ヾ/゙=べ|ゞ/゙=ペ|ヽ=ぺ|ゝ=ペ|ヾ/゙=ぺ|ゞ/゙"
-                "&[before 3]ホ"
-                "<<<ホ|ヽ=ホ|ヽ=ほ|ゝ=ㇹ|ヽ"
-                "=ボ|ヽ=ぼ|ゝ=ホ|ヾ/゙=ホ|ヾ/゙=ほ|ゞ/゙=ㇹ|ヾ/゙"
-                "=ボ|ヾ/゙=ぼ|ゞ/゙=ポ|ヽ=ぽ|ゝ=ポ|ヾ/゙=ぽ|ゞ/゙"
-                "&[before 3]マ"
-                "<<<マ|ヽ=マ|ヽ=ま|ゝ"
-                "&[before 3]ミ"
-                "<<<ミ|ヽ=ミ|ヽ=み|ゝ"
-                "&[before 3]ム"
-                "<<<ム|ヽ=ム|ヽ=む|ゝ=ㇺ|ヽ"
-                "&[before 3]メ"
-                "<<<メ|ヽ=メ|ヽ=め|ゝ"
-                "&[before 3]モ"
-                "<<<モ|ヽ=モ|ヽ=も|ゝ"
-                "&[before 3]ヤ"
-                "<<<ヤ|ヽ=ヤ|ヽ=や|ゝ=ャ|ヽ=ャ|ヽ=ゃ|ゝ"
-                "&[before 3]ユ"
-                "<<<ユ|ヽ=ユ|ヽ=ゆ|ゝ=ュ|ヽ=ュ|ヽ=ゅ|ゝ"
-                "&[before 3]ヨ"
-                "<<<ヨ|ヽ=ヨ|ヽ=よ|ゝ=ョ|ヽ=ョ|ヽ=ょ|ゝ"
-                "&[before 3]ラ"
-                "<<<ラ|ヽ=ラ|ヽ=ら|ゝ=ㇻ|ヽ"
-                "&[before 3]リ"
-                "<<<リ|ヽ=リ|ヽ=り|ゝ=ㇼ|ヽ"
-                "&[before 3]ル"
-                "<<<ル|ヽ=ル|ヽ=る|ゝ=ㇽ|ヽ"
-                "&[before 3]レ"
-                "<<<レ|ヽ=レ|ヽ=れ|ゝ=ㇾ|ヽ"
-                "&[before 3]ロ"
-                "<<<ロ|ヽ=ロ|ヽ=ろ|ゝ=ㇿ|ヽ"
-                "&[before 3]ワ"
-                "<<<ワ|ヽ=ワ|ヽ=わ|ゝ=ヮ|ヽ=ゎ|ゝ=ヷ|ヽ=ワ|ヾ/゙=ワ|ヾ/゙=わ|ゞ/゙=ヷ|ヾ/゙=ヮ|ヾ/゙=ゎ|ゞ/゙"
-                "&[before 3]ヰ"
-                "<<<ヰ|ヽ=ゐ|ゝ=ヸ|ヽ=ヰ|ヾ/゙=ゐ|ゞ/゙=ヸ|ヾ/゙"
-                "&[before 3]ヱ"
-                "<<<ヱ|ヽ=ゑ|ゝ=ヹ|ヽ=ヱ|ヾ/゙=ゑ|ゞ/゙=ヹ|ヾ/゙"
-                "&[before 3]ヲ"
-                "<<<ヲ|ヽ=ヲ|ヽ=を|ゝ=ヺ|ヽ=ヲ|ヾ/゙=ヲ|ヾ/゙=を|ゞ/゙=ヺ|ヾ/゙"
-                "&[before 3]ン"
-                "<<<ン|ヽ=ン|ヽ=ん|ゝ"
-                "&ァ"
-                "=*ぁァ"
-                "&ア"
-                "=*あア"
-                "&ィ"
-                "=*ぃィ"
-                "&イ"
-                "=*いイ"
-                "&ゥ"
-                "=*ぅゥ"
-                "&ウ"
-                "=*うウ"
-                "&ェ"
-                "=*ぇェ"
-                "&エ"
-                "=*えエ"
-                "&ォ"
-                "=*ぉォ"
-                "&オ"
-                "=*おオ"
-                "&カ"
-                "=*かカ"
-                "&キ"
-                "=*きキ"
-                "&ク"
-                "=*くク"
-                "&ケ"
-                "=*けケ"
-                "&コ"
-                "=*こコ"
-                "&サ"
-                "=*さサ"
-                "&シ"
-                "=*しシ"
-                "&ス"
-                "=*すス"
-                "&セ"
-                "=*せセ"
-                "&ソ"
-                "=*そソ"
-                "&タ"
-                "=*たタ"
-                "&チ"
-                "=*ちチ"
-                "&ッ"
-                "=*っッ"
-                "&ツ"
-                "=*つツ"
-                "&テ"
-                "=*てテ"
-                "&ト"
-                "=*とト"
-                "&ナ"
-                "=*なナ"
-                "&ニ"
-                "=*にニ"
-                "&ヌ"
-                "=*ぬヌ"
-                "&ネ"
-                "=*ねネ"
-                "&ノ"
-                "=*のノ"
-                "&ハ"
-                "=*はハ"
-                "&ヒ"
-                "=*ひヒ"
-                "&フ"
-                "=*ふフ"
-                "&ヘ"
-                "=*へヘ"
-                "&ホ"
-                "=*ほホ"
-                "&マ"
-                "=*まマ"
-                "&ミ"
-                "=*みミ"
-                "&ム"
-                "=*むム"
-                "&メ"
-                "=*めメ"
-                "&モ"
-                "=*もモ"
-                "&ャ"
-                "=*ゃャ"
-                "&ヤ"
-                "=*やヤ"
-                "&ュ"
-                "=*ゅュ"
-                "&ユ"
-                "=*ゆユ"
-                "&ョ"
-                "=*ょョ"
-                "&ヨ"
-                "=*よヨ"
-                "&ラ"
-                "=*らラ"
-                "&リ"
-                "=*りリ"
-                "&ル"
-                "=*るル"
-                "&レ"
-                "=*れレ"
-                "&ロ"
-                "=*ろロ"
-                "&ヮ"
-                "=ゎ"
-                "&ワ"
-                "=*わワ"
-                "&ヰ"
-                "=ゐ"
-                "&ヱ"
-                "=ゑ"
-                "&ヲ"
-                "=*をヲ"
-                "&ン"
-                "=*んン"
-                "&ヵ"
-                "=ゕ"
-                "&ヶ"
-                "=ゖ"
-                "&より"
-                "<<ゟ"
-                "&コト"
-                "<<ヿ"
-                "&'\u0020'"
-                "=*\u3000 ̄"
+                "[strength 3][reorder Latn Kana Hani]"
+                "
+                &ゝ<<<<ヽ # iteration marks \u309D, \u30FD
+
+                # The length mark sorts tertiary less-than the
+                # small version of the preceding vowel.
+                &[before 3]ぁ # A
+                <<<ぁ|ー=あ|ー=か|ー=ゕ|ー=が|ー=さ|ー=ざ|ー=た|ー=だ|ー=な|ー=は|ー=ば|ー=ぱ|ー=ま|ー=ゃ|ー=や|ー=ら|ー=ゎ|ー=わ|ー # Hiragana
+                <<<<ァ|ー=ァ|ー=ア|ー=ア|ー=カ|ー=カ|ー=ガ|ー # Katakana
+                =サ|ー=サ|ー=ザ|ー=タ|ー=タ|ー=ダ|ー=ナ|ー=ナ|ー=ハ|ー=ハ|ー=ㇵ|ー=バ|ー=パ|ー
+                =マ|ー=マ|ー=ャ|ー=ャ|ー=ヤ|ー=ヤ|ー=ラ|ー=ラ|ー=ㇻ|ー=ヮ|ー=ワ|ー=ワ|ー=ヵ|ー=ヷ|ー
+
+                &[before 3]ぃ # I
+                <<<ぃ|ー=い|ー=き|ー=ぎ|ー=し|ー=じ|ー=ち|ー=ぢ|ー=に|ー=ひ|ー=び|ー=ぴ|ー=み|ー=り|ー=ゐ|ー # Hiragana
+                <<<<ィ|ー=ィ|ー=イ|ー=イ|ー=キ|ー=キ|ー=ギ|ー=シ|ー=シ|ー=ㇱ|ー=ジ|ー # Katakana
+                =チ|ー=チ|ー=ヂ|ー=ニ|ー=ニ|ー=ヒ|ー=ヒ|ー=ㇶ|ー=ビ|ー=ピ|ー
+                =ミ|ー=ミ|ー=リ|ー=リ|ー=ㇼ|ー=ヰ|ー=ヸ|ー
+
+                &[before 3]ぅ # U
+                <<<ぅ|ー=う|ー=く|ー=ぐ|ー=す|ー=ず|ー=っ|ー=つ|ー=づ|ー=ぬ|ー=ふ|ー=ぶ|ー=ぷ|ー=む|ー=ゅ|ー=ゆ|ー=る|ー=ゔ|ー # Hiragana
+                <<<<ゥ|ー=ゥ|ー=ウ|ー=ウ|ー=ク|ー=ク|ー=ㇰ|ー=グ|ー # Katakana
+                =ス|ー=ス|ー=ㇲ|ー=ズ|ー=ッ|ー=ッ|ー=ツ|ー=ツ|ー=ヅ|ー=ヌ|ー=ヌ|ー=ㇴ|ー
+                =フ|ー=フ|ー=ㇷ|ー=ブ|ー=プ|ー=ム|ー=ム|ー=ㇺ|ー=ュ|ー=ュ|ー=ユ|ー=ユ|ー=ル|ー=ル|ー=ㇽ|ー=ヴ|ー
+
+                &[before 3]ぇ # E
+                <<<ぇ|ー=え|ー=け|ー=ゖ|ー=げ|ー=せ|ー=ぜ|ー=て|ー=で|ー=ね|ー=へ|ー=べ|ー=ぺ|ー=め|ー=れ|ー=ゑ|ー # Hiragana
+                <<<<ェ|ー=ェ|ー=エ|ー=エ|ー=ケ|ー=ケ|ー=ゲ|ー # Katakana
+                =セ|ー=セ|ー=ゼ|ー=テ|ー=テ|ー=デ|ー=ネ|ー=ネ|ー=ヘ|ー=ヘ|ー=ㇸ|ー=ベ|ー=ペ|ー
+                =メ|ー=メ|ー=レ|ー=レ|ー=ㇾ|ー=ヱ|ー=ヶ|ー=ヹ|ー
+
+                &[before 3]ぉ # O
+                <<<ぉ|ー=お|ー=こ|ー=ご|ー=そ|ー=ぞ|ー=と|ー=ど|ー=の|ー=ほ|ー=ぼ|ー=ぽ|ー=も|ー=ょ|ー=よ|ー=ろ|ー=を|ー # Hiragana
+                <<<<ォ|ー=ォ|ー=オ|ー=オ|ー=コ|ー=コ|ー=ゴ|ー=ソ|ー=ソ|ー=ゾ|ー=ト|ー=ト|ー=ㇳ|ー=ド|ー # Katakana
+                =ノ|ー=ノ|ー=ホ|ー=ホ|ー=ㇹ|ー=ボ|ー=ポ|ー=モ|ー=モ|ー=ョ|ー=ョ|ー=ヨ|ー=ヨ|ー
+                =ロ|ー=ロ|ー=ㇿ|ー=ヲ|ー=ヲ|ー=ヺ|ー
+
+                # The iteration mark sorts tertiary less-than the preceding character.
+                &[before 3]あ # A
+                <<<あ|ゝ=ぁ|ゝ
+                <<<<ア|ヽ=ア|ヽ=ァ|ヽ=ァ|ヽ
+                &[before 3]い # I
+                <<<い|ゝ=ぃ|ゝ
+                <<<<イ|ヽ=イ|ヽ=ィ|ヽ=ィ|ヽ
+                &[before 3]う # U
+                <<<う|ゝ=ぅ|ゝ=ゔ|ゝ=う|ゞ/゙=ぅ|ゞ/゙=ゔ|ゞ/゙
+                <<<<ウ|ヽ=ウ|ヽ=ゥ|ヽ=ゥ|ヽ=ヴ|ヽ=ウ|ヾ/゙=ウ|ヾ/゙=ゥ|ヾ/゙=ゥ|ヾ/゙=ヴ|ヾ/゙
+                &[before 3]え # E
+                <<<え|ゝ=ぇ|ゝ
+                <<<<エ|ヽ=エ|ヽ=ェ|ヽ=ェ|ヽ
+                &[before 3]お # O
+                <<<お|ゝ=ぉ|ゝ
+                <<<<オ|ヽ=オ|ヽ=ォ|ヽ=ォ|ヽ
+
+                &[before 3]か # KA
+                <<<か|ゝ=ゕ|ゝ
+                <<<<カ|ヽ=カ|ヽ=ヵ|ヽ
+                &[before 3]が # GA
+                <<<が|ゝ
+                <<<<ガ|ヽ
+
+                &[before 3]き # KI
+                <<<き|ゝ=ぎ|ゝ=き|ゞ/゙=ぎ|ゞ/゙
+                <<<<キ|ヽ=キ|ヽ=ギ|ヽ=キ|ヾ/゙=キ|ヾ/゙=ギ|ヾ/゙
+
+                &[before 3]く # KU
+                <<<く|ゝ=ぐ|ゝ=く|ゞ/゙=ぐ|ゞ/゙
+                <<<<ク|ヽ=ク|ヽ=ㇰ|ヽ=グ|ヽ=ク|ヾ/゙=ク|ヾ/゙=ㇰ|ヾ/゙=グ|ヾ/゙
+
+                &[before 3]け # KE
+                <<<け|ゝ=ゖ|ゝ
+                <<<<ケ|ヽ=ケ|ヽ=ヶ|ヽ
+                &[before 3]げ # GE
+                <<<げ|ゝ
+                <<<<ゲ|ヽ
+
+                &[before 3]こ # KO
+                <<<こ|ゝ=ご|ゝ=こ|ゞ/゙=ご|ゞ/゙
+                <<<<コ|ヽ=コ|ヽ=ゴ|ヽ=コ|ヾ/゙=コ|ヾ/゙=ゴ|ヾ/゙
+
+                &[before 3]さ # SA
+                <<<さ|ゝ=ざ|ゝ=さ|ゞ/゙=ざ|ゞ/゙
+                <<<<サ|ヽ=サ|ヽ=ザ|ヽ=サ|ヾ/゙=サ|ヾ/゙=ザ|ヾ/゙
+
+                &[before 3]し # SI
+                <<<し|ゝ=じ|ゝ=し|ゞ/゙=じ|ゞ/゙
+                <<<<シ|ヽ=シ|ヽ=ㇱ|ヽ=ジ|ヽ=シ|ヾ/゙=シ|ヾ/゙=ㇱ|ヾ/゙=ジ|ヾ/゙
+
+                &[before 3]す # SU
+                <<<す|ゝ=ず|ゝ=す|ゞ/゙=ず|ゞ/゙
+                <<<<ス|ヽ=ス|ヽ=ㇲ|ヽ=ズ|ヽ=ス|ヾ/゙=ス|ヾ/゙=ㇲ|ヾ/゙=ズ|ヾ/゙
+
+                &[before 3]せ # SE
+                <<<せ|ゝ=ぜ|ゝ=せ|ゞ/゙=ぜ|ゞ/゙
+                <<<<セ|ヽ=セ|ヽ=ゼ|ヽ=セ|ヾ/゙=セ|ヾ/゙=ゼ|ヾ/゙
+
+                &[before 3]そ # SO
+                <<<そ|ゝ=ぞ|ゝ=そ|ゞ/゙=ぞ|ゞ/゙
+                <<<<ソ|ヽ=ソ|ヽ=ゾ|ヽ=ソ|ヾ/゙=ソ|ヾ/゙=ゾ|ヾ/゙
+
+                &[before 3]た # TA
+                <<<た|ゝ=だ|ゝ=た|ゞ/゙=だ|ゞ/゙
+                <<<<タ|ヽ=タ|ヽ=ダ|ヽ=タ|ヾ/゙=タ|ヾ/゙=ダ|ヾ/゙
+
+                &[before 3]ち # TI
+                <<<ち|ゝ=ぢ|ゝ=ち|ゞ/゙=ぢ|ゞ/゙
+                <<<<チ|ヽ=チ|ヽ=ヂ|ヽ=チ|ヾ/゙=チ|ヾ/゙=ヂ|ヾ/゙
+
+                &[before 3]つ # TU
+                <<<つ|ゝ=っ|ゝ=づ|ゝ=つ|ゞ/゙=づ|ゞ/゙=つ|ゝ=っ|ゞ/゙=つ|ゞ/゙
+                <<<<ツ|ヽ=ツ|ヽ=ッ|ヽ=ッ|ヽ=ヅ|ヽ=ツ|ヾ/゙=ツ|ヾ/゙=ヅ|ヾ/゙=ツ|ヽ=ツ|ヽ=ッ|ヾ/゙=ッ|ヾ/゙=ツ|ヾ/゙=ツ|ヾ/゙
+
+                &[before 3]て # TE
+                <<<て|ゝ=で|ゝ=て|ゞ/゙=で|ゞ/゙
+                <<<<テ|ヽ=テ|ヽ=デ|ヽ=テ|ヾ/゙=テ|ヾ/゙=デ|ヾ/゙
+
+                &[before 3]と # TO
+                <<<と|ゝ=ど|ゝ=と|ゞ/゙=ど|ゞ/゙
+                <<<<ト|ヽ=ト|ヽ=ㇳ|ヽ=ド|ヽ=ト|ヾ/゙=ト|ヾ/゙=ㇳ|ヾ/゙=ド|ヾ/゙
+
+                &[before 3]な # NA
+                <<<な|ゝ
+                <<<<ナ|ヽ=ナ|ヽ
+
+                &[before 3]に # NI
+                <<<に|ゝ
+                <<<<ニ|ヽ=ニ|ヽ
+
+                &[before 3]ぬ # NU
+                <<<ぬ|ゝ
+                <<<<ヌ|ヽ=ヌ|ヽ=ㇴ|ヽ # \u31F4
+
+                &[before 3]ね # NE
+                <<<ね|ゝ
+                <<<<ネ|ヽ=ネ|ヽ
+
+                &[before 3]の # NO
+                <<<の|ゝ
+                <<<<ノ|ヽ=ノ|ヽ
+
+                &[before 3]は # HA
+                <<<は|ゝ=ば|ゝ=は|ゞ/゙=ば|ゞ/゙=ぱ|ゝ=ぱ|ゞ/゙
+                <<<<ハ|ヽ=ハ|ヽ=ㇵ|ヽ=バ|ヽ=ハ|ヾ/゙=ハ|ヾ/゙=ㇵ|ヾ/゙=バ|ヾ/゙=パ|ヽ=パ|ヾ/゙
+
+                &[before 3]ひ # HI
+                <<<ひ|ゝ=び|ゝ=ひ|ゞ/゙=び|ゞ/゙=ぴ|ゝ=ぴ|ゞ/゙
+                <<<<ヒ|ヽ=ヒ|ヽ=ㇶ|ヽ=ビ|ヽ=ヒ|ヾ/゙=ヒ|ヾ/゙=ㇶ|ヾ/゙=ビ|ヾ/゙=ピ|ヽ=ピ|ヾ/゙
+
+                &[before 3]ふ # HU
+                <<<ふ|ゝ=ぶ|ゝ=ふ|ゞ/゙=ぶ|ゞ/゙=ぷ|ゝ=ぷ|ゞ/゙
+                <<<<フ|ヽ=フ|ヽ=ㇷ|ヽ=ブ|ヽ=フ|ヾ/゙=フ|ヾ/゙=ㇷ|ヾ/゙=ブ|ヾ/゙=プ|ヽ=プ|ヾ/゙
+
+                &[before 3]へ # HE
+                <<<へ|ゝ=べ|ゝ=へ|ゞ/゙=べ|ゞ/゙=ぺ|ゝ=ぺ|ゞ/゙
+                <<<<ヘ|ヽ=ヘ|ヽ=ㇸ|ヽ=ベ|ヽ=ヘ|ヾ/゙=ヘ|ヾ/゙=ㇸ|ヾ/゙=ベ|ヾ/゙=ペ|ヽ=ペ|ヾ/゙
+
+                &[before 3]ほ # HO
+                <<<ほ|ゝ=ぼ|ゝ=ほ|ゞ/゙=ぼ|ゞ/゙=ぽ|ゝ=ぽ|ゞ/゙
+                <<<<ホ|ヽ=ホ|ヽ=ㇹ|ヽ=ボ|ヽ=ホ|ヾ/゙=ホ|ヾ/゙=ㇹ|ヾ/゙=ボ|ヾ/゙=ポ|ヽ=ポ|ヾ/゙
+
+                &[before 3]ま # MA
+                <<<ま|ゝ
+                <<<<マ|ヽ=マ|ヽ
+
+                &[before 3]み # MI
+                <<<み|ゝ
+                <<<<ミ|ヽ=ミ|ヽ
+
+                &[before 3]む # MU
+                <<<む|ゝ
+                <<<<ム|ヽ=ム|ヽ=ㇺ|ヽ # \u31FA
+
+                &[before 3]め # ME
+                <<<め|ゝ
+                <<<<メ|ヽ=メ|ヽ
+
+                &[before 3]も # MO
+                <<<も|ゝ
+                <<<<モ|ヽ=モ|ヽ
+
+                &[before 3]や # YA
+                <<<や|ゝ=ゃ|ゝ
+                <<<<ヤ|ヽ=ヤ|ヽ=ャ|ヽ=ャ|ヽ
+
+                &[before 3]ゆ # YU
+                <<<ゆ|ゝ=ゅ|ゝ
+                <<<<ユ|ヽ=ユ|ヽ=ュ|ヽ=ュ|ヽ
+
+                &[before 3]よ # YO
+                <<<よ|ゝ=ょ|ゝ
+                <<<<ヨ|ヽ=ヨ|ヽ=ョ|ヽ=ョ|ヽ
+
+                &[before 3]ら # RA
+                <<<ら|ゝ
+                <<<<ラ|ヽ=ラ|ヽ=ㇻ|ヽ # \u31FB
+
+                &[before 3]り # RI
+                <<<り|ゝ
+                <<<<リ|ヽ=リ|ヽ=ㇼ|ヽ # \u31FC
+
+                &[before 3]る # RU
+                <<<る|ゝ
+                <<<<ル|ヽ=ル|ヽ=ㇽ|ヽ # \u31FD
+
+                &[before 3]れ # RE
+                <<<れ|ゝ
+                <<<<レ|ヽ=レ|ヽ=ㇾ|ヽ # \u31FE
+
+                &[before 3]ろ # RO
+                <<<ろ|ゝ
+                <<<<ロ|ヽ=ロ|ヽ=ㇿ|ヽ # \u31FF
+
+                &[before 3]わ # WA
+                <<<わ|ゝ=ゎ|ゝ=わ|ゞ/゙=ゎ|ゞ/゙
+                <<<<ワ|ヽ=ワ|ヽ=ヮ|ヽ=ヷ|ヽ=ワ|ヾ/゙=ワ|ヾ/゙=ヷ|ヾ/゙=ヮ|ヾ/゙
+
+                &[before 3]ゐ # WI
+                <<<ゐ|ゝ=ゐ|ゞ/゙
+                <<<<ヰ|ヽ=ヸ|ヽ=ヰ|ヾ/゙=ヸ|ヾ/゙
+
+                &[before 3]ゑ # WE
+                <<<ゑ|ゝ=ゑ|ゞ/゙
+                <<<<ヱ|ヽ=ヹ|ヽ=ヱ|ヾ/゙=ヹ|ヾ/゙
+
+                &[before 3]を # WO
+                <<<を|ゝ=を|ゞ/゙
+                <<<<ヲ|ヽ=ヲ|ヽ=ヺ|ヽ=ヲ|ヾ/゙=ヲ|ヾ/゙=ヺ|ヾ/゙
+
+                &[before 3]ん # N
+                <<<ん|ゝ
+                <<<<ン|ヽ=ン|ヽ
+
+                &ぁ<<<<ァ=ァ # SMALL A
+                &あ<<<<ア=ア # A
+                &ぃ<<<<ィ=ィ # SMALL I
+                &い<<<<イ=イ # I
+                &ぅ<<<<ゥ=ゥ # SMALL U
+                &う<<<<ウ=ウ # U
+                &ぇ<<<<ェ=ェ # SMALL E
+                &え<<<<エ=エ # E
+                &ぉ<<<<ォ=ォ # SMALL O
+                &お<<<<オ=オ # O
+                &か<<<<カ=カ # KA
+                &き<<<<キ=キ # KI
+                &く<<<<ク=ク # KU
+                &け<<<<ケ=ケ # KE
+                &こ<<<<コ=コ # KO
+                &さ<<<<サ=サ # SA
+                &し<<<<シ=シ # SI
+                &す<<<<ス=ス # SU
+                &せ<<<<セ=セ # SE
+                &そ<<<<ソ=ソ # SO
+                &た<<<<タ=タ # TA
+                &ち<<<<チ=チ # TI
+                &っ<<<<ッ=ッ # SMALL TU
+                &つ<<<<ツ=ツ # TU
+                &て<<<<テ=テ # TE
+                &と<<<<ト=ト # TO
+                &な<<<<ナ=ナ # NA
+                &に<<<<ニ=ニ # NI
+                &ぬ<<<<ヌ=ヌ # NU
+                &ね<<<<ネ=ネ # NE
+                &の<<<<ノ=ノ # NO
+                &は<<<<ハ=ハ # HA
+                &ひ<<<<ヒ=ヒ # HI
+                &ふ<<<<フ=フ # HU
+                &へ<<<<ヘ=ヘ # HE
+                &ほ<<<<ホ=ホ # HO
+                &ま<<<<マ=マ # MA
+                &み<<<<ミ=ミ # MI
+                &む<<<<ム=ム # MU
+                &め<<<<メ=メ # ME
+                &も<<<<モ=モ # MO
+                &ゃ<<<<ャ=ャ # SMALL YA
+                &や<<<<ヤ=ヤ # YA
+                &ゅ<<<<ュ=ュ # SMALL YU
+                &ゆ<<<<ユ=ユ # YU
+                &ょ<<<<ョ=ョ # SMALL YO
+                &よ<<<<ヨ=ヨ # YO
+                &ら<<<<ラ=ラ # RA
+                &り<<<<リ=リ # RI
+                &る<<<<ル=ル # RU
+                &れ<<<<レ=レ # RE
+                &ろ<<<<ロ=ロ # RO
+                &ゎ<<<<ヮ # SMALL WA
+                &わ<<<<ワ=ワ # WA
+                &ゐ<<<<ヰ # WI
+                &ゑ<<<<ヱ # WE
+                &を<<<<ヲ=ヲ # WO
+                &ん<<<<ン=ン # N
+                &ゕ<<<<ヵ # SMALL KA
+                &ゖ<<<<ヶ # SMALL KE
+
+                &より # \u3088\u308A
+                <<ゟ # \u309F HIRAGANA DIGRAPH YORI
+                &コト # \u30B3\u30C8
+                <<ヿ # \u30FF KATAKANA DIGRAPH KOTO
+                "
+                "&'\u0020'=*'\u3000' ̄"
                 "&'!'=!"
                 "&'\u0022'=""
                 "&'\u0023'=#"
@@ -349,7 +371,7 @@ ja{
                 "&Y=Y"
                 "&Z=Z"
                 "&'['=["
-                "&'\\\\'=\"
+                "&'\\'=\"
                 "&']'=]"
                 "&'^'=^"
                 "&'_'=_"
@@ -459,282 +481,304 @@ ja{
         }
         unihan{
             Sequence{
-                "[strength 3][hiraganaQ on][reorder Latn Kana Hani]"
-                "&ヽ"
-                "=ゝ"
-                "&[before 3]ァ"
-                "<<<ァ|ー=ァ|ー=ぁ|ー=ア|ー=ア|ー=あ|ー=カ|ー=カ|ー=か|ー=ゕ|ー"
-                "=ガ|ー=が|ー=サ|ー=サ|ー=さ|ー=ザ|ー=ざ|ー=タ|ー=タ|ー=た|ー=ダ|ー=だ|ー=ナ|ー=ナ|ー=な|ー=ハ|ー=ハ|ー=ㇵ|ー"
-                "=は|ー=バ|ー=ば|ー=パ|ー=ぱ|ー=マ|ー=マ|ー=ま|ー=ャ|ー=ャ|ー=ゃ|ー=ヤ|ー=ヤ|ー=や|ー=ラ|ー=ラ|ー=ㇻ|ー"
-                "=ら|ー=ヮ|ー=ゎ|ー=ワ|ー=ワ|ー=わ|ー=ヵ|ー=ヷ|ー"
-                "&[before 3]ィ"
-                "<<<ィ|ー=ィ|ー=ぃ|ー=イ|ー=イ|ー=い|ー=キ|ー=キ|ー=き|ー=ギ|ー=ぎ|ー=シ|ー=シ|ー=ㇱ|ー"
-                "=し|ー=ジ|ー=じ|ー=チ|ー=チ|ー=ち|ー=ヂ|ー=ぢ|ー=ニ|ー=ニ|ー=に|ー=ヒ|ー=ヒ|ー=ㇶ|ー"
-                "=ひ|ー=ビ|ー=び|ー=ピ|ー=ぴ|ー=ミ|ー=ミ|ー=み|ー=リ|ー=リ|ー=ㇼ|ー"
-                "=り|ー=ヰ|ー=ゐ|ー=ヸ|ー"
-                "&[before 3]ゥ"
-                "<<<ゥ|ー=ゥ|ー=ぅ|ー=ウ|ー=ウ|ー=う|ー=ク|ー=ク|ー=ㇰ|ー"
-                "=く|ー=グ|ー=ぐ|ー=ス|ー=ス|ー=ㇲ|ー"
-                "=す|ー=ズ|ー=ず|ー=ッ|ー=ッ|ー=っ|ー=ツ|ー=ツ|ー=つ|ー=ヅ|ー=づ|ー=ヌ|ー=ヌ|ー=ㇴ|ー"
-                "=ぬ|ー=フ|ー=フ|ー=ㇷ|ー"
-                "=ふ|ー=ブ|ー=ぶ|ー=プ|ー=ぷ|ー=ム|ー=ム|ー=ㇺ|ー"
-                "=む|ー=ュ|ー=ュ|ー=ゅ|ー=ユ|ー=ユ|ー=ゆ|ー=ル|ー=ル|ー=ㇽ|ー"
-                "=る|ー=ヴ|ー=ゔ|ー"
-                "&[before 3]ェ"
-                "<<<ェ|ー=ェ|ー=ぇ|ー=エ|ー=エ|ー=え|ー=ケ|ー=ケ|ー=け|ー=ゖ|ー"
-                "=ゲ|ー=げ|ー=セ|ー=セ|ー=せ|ー=ゼ|ー=ぜ|ー=テ|ー=テ|ー=て|ー=デ|ー=で|ー=ネ|ー=ネ|ー=ね|ー=ヘ|ー=ヘ|ー=ㇸ|ー"
-                "=へ|ー=ベ|ー=べ|ー=ペ|ー=ぺ|ー=メ|ー=メ|ー=め|ー=レ|ー=レ|ー=ㇾ|ー"
-                "=れ|ー=ヱ|ー=ゑ|ー=ヶ|ー=ヹ|ー"
-                "&[before 3]ォ"
-                "<<<ォ|ー=ォ|ー=ぉ|ー=オ|ー=オ|ー=お|ー=コ|ー=コ|ー=こ|ー=ゴ|ー=ご|ー=ソ|ー=ソ|ー=そ|ー=ゾ|ー=ぞ|ー=ト|ー=ト|ー=ㇳ|ー"
-                "=と|ー=ド|ー=ど|ー=ノ|ー=ノ|ー=の|ー=ホ|ー=ホ|ー=ㇹ|ー"
-                "=ほ|ー=ボ|ー=ぼ|ー=ポ|ー=ぽ|ー=モ|ー=モ|ー=も|ー=ョ|ー=ョ|ー=ょ|ー=ヨ|ー=ヨ|ー=よ|ー=ロ|ー=ロ|ー=ㇿ|ー"
-                "=ろ|ー=ヲ|ー=ヲ|ー=を|ー=ヺ|ー"
-                "&[before 3]ア"
-                "<<<ア|ヽ=ア|ヽ=あ|ゝ=ァ|ヽ=ァ|ヽ=ぁ|ゝ"
-                "&[before 3]イ"
-                "<<<イ|ヽ=イ|ヽ=い|ゝ=ィ|ヽ=ィ|ヽ=ぃ|ゝ"
-                "&[before 3]ウ"
-                "<<<ウ|ヽ=ウ|ヽ=う|ゝ=ゥ|ヽ=ゥ|ヽ=ぅ|ゝ=ヴ|ヽ=ゔ|ゝ=ウ|ヾ/゙=ウ|ヾ/゙=う|ゞ/゙=ゥ|ヾ/゙=ゥ|ヾ/゙=ぅ|ゞ/゙=ヴ|ヾ/゙=ゔ|ゞ/゙"
-                "&[before 3]エ"
-                "<<<エ|ヽ=エ|ヽ=え|ゝ=ェ|ヽ=ェ|ヽ=ぇ|ゝ"
-                "&[before 3]オ"
-                "<<<オ|ヽ=オ|ヽ=お|ゝ=ォ|ヽ=ォ|ヽ=ぉ|ゝ"
-                "&[before 3]カ"
-                "<<<カ|ヽ=カ|ヽ=か|ゝ=ヵ|ヽ=ゕ|ゝ"
-                "&[before 3]ガ"
-                "<<<ガ|ヽ=が|ゝ"
-                "&[before 3]キ"
-                "<<<キ|ヽ=キ|ヽ=き|ゝ=ギ|ヽ=ぎ|ゝ=キ|ヾ/゙=キ|ヾ/゙=き|ゞ/゙=ギ|ヾ/゙=ぎ|ゞ/゙"
-                "&[before 3]ク"
-                "<<<ク|ヽ=ク|ヽ=く|ゝ=ㇰ|ヽ"
-                "=グ|ヽ=ぐ|ゝ=ク|ヾ/゙=ク|ヾ/゙=く|ゞ/゙=ㇰ|ヾ/゙"
-                "=グ|ヾ/゙=ぐ|ゞ/゙"
-                "&[before 3]ケ"
-                "<<<ケ|ヽ=ケ|ヽ=け|ゝ=ヶ|ヽ=ゖ|ゝ"
-                "&[before 3]ゲ"
-                "<<<ゲ|ヽ=げ|ゝ"
-                "&[before 3]コ"
-                "<<<コ|ヽ=コ|ヽ=こ|ゝ=ゴ|ヽ=ご|ゝ=コ|ヾ/゙=コ|ヾ/゙=こ|ゞ/゙=ゴ|ヾ/゙=ご|ゞ/゙"
-                "&[before 3]サ"
-                "<<<サ|ヽ=サ|ヽ=さ|ゝ=ザ|ヽ=ざ|ゝ=サ|ヾ/゙=サ|ヾ/゙=さ|ゞ/゙=ザ|ヾ/゙=ざ|ゞ/゙"
-                "&[before 3]シ"
-                "<<<シ|ヽ=シ|ヽ=し|ゝ=ㇱ|ヽ"
-                "=ジ|ヽ=じ|ゝ=シ|ヾ/゙=シ|ヾ/゙=し|ゞ/゙=ㇱ|ヾ/゙"
-                "=ジ|ヾ/゙=じ|ゞ/゙"
-                "&[before 3]ス"
-                "<<<ス|ヽ=ス|ヽ=す|ゝ=ㇲ|ヽ"
-                "=ズ|ヽ=ず|ゝ=ス|ヾ/゙=ス|ヾ/゙=す|ゞ/゙=ㇲ|ヾ/゙"
-                "=ズ|ヾ/゙=ず|ゞ/゙"
-                "&[before 3]セ"
-                "<<<セ|ヽ=セ|ヽ=せ|ゝ=ゼ|ヽ=ぜ|ゝ=セ|ヾ/゙=セ|ヾ/゙=せ|ゞ/゙=ゼ|ヾ/゙=ぜ|ゞ/゙"
-                "&[before 3]ソ"
-                "<<<ソ|ヽ=ソ|ヽ=そ|ゝ=ゾ|ヽ=ぞ|ゝ=ソ|ヾ/゙=ソ|ヾ/゙=そ|ゞ/゙=ゾ|ヾ/゙=ぞ|ゞ/゙"
-                "&[before 3]タ"
-                "<<<タ|ヽ=タ|ヽ=た|ゝ=ダ|ヽ=だ|ゝ=タ|ヾ/゙=タ|ヾ/゙=た|ゞ/゙=ダ|ヾ/゙=だ|ゞ/゙"
-                "&[before 3]チ"
-                "<<<チ|ヽ=チ|ヽ=ち|ゝ=ヂ|ヽ=ぢ|ゝ=チ|ヾ/゙=チ|ヾ/゙=ち|ゞ/゙=ヂ|ヾ/゙=ぢ|ゞ/゙"
-                "&[before 3]ツ"
-                "<<<ツ|ヽ=ツ|ヽ=つ|ゝ=ッ|ヽ=ッ|ヽ=っ|ゝ=ヅ|ヽ=づ|ゝ=ツ|ヾ/゙=ツ|ヾ/゙=つ|ゞ/゙=ヅ|ヾ/゙=づ|ゞ/゙=ツ|ヽ=ツ|ヽ=つ|ゝ=ッ|ヾ/゙"
-                "=ッ|ヾ/゙=っ|ゞ/゙=ツ|ヾ/゙=ツ|ヾ/゙=つ|ゞ/゙"
-                "&[before 3]テ"
-                "<<<テ|ヽ=テ|ヽ=て|ゝ=デ|ヽ=で|ゝ=テ|ヾ/゙=テ|ヾ/゙=て|ゞ/゙=デ|ヾ/゙=で|ゞ/゙"
-                "&[before 3]ト"
-                "<<<ト|ヽ=ト|ヽ=と|ゝ=ㇳ|ヽ"
-                "=ド|ヽ=ど|ゝ=ト|ヾ/゙=ト|ヾ/゙=と|ゞ/゙=ㇳ|ヾ/゙"
-                "=ド|ヾ/゙=ど|ゞ/゙"
-                "&[before 3]ナ"
-                "<<<ナ|ヽ=ナ|ヽ=な|ゝ"
-                "&[before 3]ニ"
-                "<<<ニ|ヽ=ニ|ヽ=に|ゝ"
-                "&[before 3]ヌ"
-                "<<<ヌ|ヽ=ヌ|ヽ=ぬ|ゝ=ㇴ|ヽ"
-                "&[before 3]ネ"
-                "<<<ネ|ヽ=ネ|ヽ=ね|ゝ"
-                "&[before 3]ノ<<<ノ|ヽ"
-                "=ノ|ヽ=の|ゝ"
-                "&[before 3]ハ"
-                "<<<ハ|ヽ=ハ|ヽ=は|ゝ=ㇵ|ヽ"
-                "=バ|ヽ=ば|ゝ=ハ|ヾ/゙=ハ|ヾ/゙=は|ゞ/゙=ㇵ|ヾ/゙"
-                "=バ|ヾ/゙=ば|ゞ/゙=パ|ヽ=ぱ|ゝ=パ|ヾ/゙=ぱ|ゞ/゙"
-                "&[before 3]ヒ"
-                "<<<ヒ|ヽ=ヒ|ヽ=ひ|ゝ=ㇶ|ヽ"
-                "=ビ|ヽ=び|ゝ=ヒ|ヾ/゙=ヒ|ヾ/゙=ひ|ゞ/゙=ㇶ|ヾ/゙"
-                "=ビ|ヾ/゙=び|ゞ/゙=ピ|ヽ=ぴ|ゝ=ピ|ヾ/゙=ぴ|ゞ/゙"
-                "&[before 3]フ"
-                "<<<フ|ヽ=フ|ヽ=ふ|ゝ=ㇷ|ヽ"
-                "=ブ|ヽ=ぶ|ゝ=フ|ヾ/゙=フ|ヾ/゙=ふ|ゞ/゙=ㇷ|ヾ/゙"
-                "=ブ|ヾ/゙=ぶ|ゞ/゙=プ|ヽ=ぷ|ゝ=プ|ヾ/゙=ぷ|ゞ/゙"
-                "&[before 3]ヘ"
-                "<<<ヘ|ヽ=ヘ|ヽ=へ|ゝ=ㇸ|ヽ"
-                "=ベ|ヽ=べ|ゝ=ヘ|ヾ/゙=ヘ|ヾ/゙=へ|ゞ/゙=ㇸ|ヾ/゙"
-                "=ベ|ヾ/゙=べ|ゞ/゙=ペ|ヽ=ぺ|ゝ=ペ|ヾ/゙=ぺ|ゞ/゙"
-                "&[before 3]ホ"
-                "<<<ホ|ヽ=ホ|ヽ=ほ|ゝ=ㇹ|ヽ"
-                "=ボ|ヽ=ぼ|ゝ=ホ|ヾ/゙=ホ|ヾ/゙=ほ|ゞ/゙=ㇹ|ヾ/゙"
-                "=ボ|ヾ/゙=ぼ|ゞ/゙=ポ|ヽ=ぽ|ゝ=ポ|ヾ/゙=ぽ|ゞ/゙"
-                "&[before 3]マ"
-                "<<<マ|ヽ=マ|ヽ=ま|ゝ"
-                "&[before 3]ミ"
-                "<<<ミ|ヽ=ミ|ヽ=み|ゝ"
-                "&[before 3]ム"
-                "<<<ム|ヽ=ム|ヽ=む|ゝ=ㇺ|ヽ"
-                "&[before 3]メ"
-                "<<<メ|ヽ=メ|ヽ=め|ゝ"
-                "&[before 3]モ"
-                "<<<モ|ヽ=モ|ヽ=も|ゝ"
-                "&[before 3]ヤ"
-                "<<<ヤ|ヽ=ヤ|ヽ=や|ゝ=ャ|ヽ=ャ|ヽ=ゃ|ゝ"
-                "&[before 3]ユ"
-                "<<<ユ|ヽ=ユ|ヽ=ゆ|ゝ=ュ|ヽ=ュ|ヽ=ゅ|ゝ"
-                "&[before 3]ヨ"
-                "<<<ヨ|ヽ=ヨ|ヽ=よ|ゝ=ョ|ヽ=ョ|ヽ=ょ|ゝ"
-                "&[before 3]ラ"
-                "<<<ラ|ヽ=ラ|ヽ=ら|ゝ=ㇻ|ヽ"
-                "&[before 3]リ"
-                "<<<リ|ヽ=リ|ヽ=り|ゝ=ㇼ|ヽ"
-                "&[before 3]ル"
-                "<<<ル|ヽ=ル|ヽ=る|ゝ=ㇽ|ヽ"
-                "&[before 3]レ"
-                "<<<レ|ヽ=レ|ヽ=れ|ゝ=ㇾ|ヽ"
-                "&[before 3]ロ"
-                "<<<ロ|ヽ=ロ|ヽ=ろ|ゝ=ㇿ|ヽ"
-                "&[before 3]ワ"
-                "<<<ワ|ヽ=ワ|ヽ=わ|ゝ=ヮ|ヽ=ゎ|ゝ=ヷ|ヽ=ワ|ヾ/゙=ワ|ヾ/゙=わ|ゞ/゙=ヷ|ヾ/゙=ヮ|ヾ/゙=ゎ|ゞ/゙"
-                "&[before 3]ヰ"
-                "<<<ヰ|ヽ=ゐ|ゝ=ヸ|ヽ=ヰ|ヾ/゙=ゐ|ゞ/゙=ヸ|ヾ/゙"
-                "&[before 3]ヱ"
-                "<<<ヱ|ヽ=ゑ|ゝ=ヹ|ヽ=ヱ|ヾ/゙=ゑ|ゞ/゙=ヹ|ヾ/゙"
-                "&[before 3]ヲ"
-                "<<<ヲ|ヽ=ヲ|ヽ=を|ゝ=ヺ|ヽ=ヲ|ヾ/゙=ヲ|ヾ/゙=を|ゞ/゙=ヺ|ヾ/゙"
-                "&[before 3]ン"
-                "<<<ン|ヽ=ン|ヽ=ん|ゝ"
-                "&ァ"
-                "=*ぁァ"
-                "&ア"
-                "=*あア"
-                "&ィ"
-                "=*ぃィ"
-                "&イ"
-                "=*いイ"
-                "&ゥ"
-                "=*ぅゥ"
-                "&ウ"
-                "=*うウ"
-                "&ェ"
-                "=*ぇェ"
-                "&エ"
-                "=*えエ"
-                "&ォ"
-                "=*ぉォ"
-                "&オ"
-                "=*おオ"
-                "&カ"
-                "=*かカ"
-                "&キ"
-                "=*きキ"
-                "&ク"
-                "=*くク"
-                "&ケ"
-                "=*けケ"
-                "&コ"
-                "=*こコ"
-                "&サ"
-                "=*さサ"
-                "&シ"
-                "=*しシ"
-                "&ス"
-                "=*すス"
-                "&セ"
-                "=*せセ"
-                "&ソ"
-                "=*そソ"
-                "&タ"
-                "=*たタ"
-                "&チ"
-                "=*ちチ"
-                "&ッ"
-                "=*っッ"
-                "&ツ"
-                "=*つツ"
-                "&テ"
-                "=*てテ"
-                "&ト"
-                "=*とト"
-                "&ナ"
-                "=*なナ"
-                "&ニ"
-                "=*にニ"
-                "&ヌ"
-                "=*ぬヌ"
-                "&ネ"
-                "=*ねネ"
-                "&ノ"
-                "=*のノ"
-                "&ハ"
-                "=*はハ"
-                "&ヒ"
-                "=*ひヒ"
-                "&フ"
-                "=*ふフ"
-                "&ヘ"
-                "=*へヘ"
-                "&ホ"
-                "=*ほホ"
-                "&マ"
-                "=*まマ"
-                "&ミ"
-                "=*みミ"
-                "&ム"
-                "=*むム"
-                "&メ"
-                "=*めメ"
-                "&モ"
-                "=*もモ"
-                "&ャ"
-                "=*ゃャ"
-                "&ヤ"
-                "=*やヤ"
-                "&ュ"
-                "=*ゅュ"
-                "&ユ"
-                "=*ゆユ"
-                "&ョ"
-                "=*ょョ"
-                "&ヨ"
-                "=*よヨ"
-                "&ラ"
-                "=*らラ"
-                "&リ"
-                "=*りリ"
-                "&ル"
-                "=*るル"
-                "&レ"
-                "=*れレ"
-                "&ロ"
-                "=*ろロ"
-                "&ヮ"
-                "=ゎ"
-                "&ワ"
-                "=*わワ"
-                "&ヰ"
-                "=ゐ"
-                "&ヱ"
-                "=ゑ"
-                "&ヲ"
-                "=*をヲ"
-                "&ン"
-                "=*んン"
-                "&ヵ"
-                "=ゕ"
-                "&ヶ"
-                "=ゖ"
-                "&より"
-                "<<ゟ"
-                "&コト"
-                "<<ヿ"
-                "&'\u0020'"
-                "=*\u3000 ̄"
+                "[strength 3][reorder Latn Kana Hani]"
+                "
+                &ゝ<<<<ヽ # iteration marks \u309D, \u30FD
+
+                # The length mark sorts tertiary less-than the
+                # small version of the preceding vowel.
+                &[before 3]ぁ # A
+                <<<ぁ|ー=あ|ー=か|ー=ゕ|ー=が|ー=さ|ー=ざ|ー=た|ー=だ|ー=な|ー=は|ー=ば|ー=ぱ|ー=ま|ー=ゃ|ー=や|ー=ら|ー=ゎ|ー=わ|ー # Hiragana
+                <<<<ァ|ー=ァ|ー=ア|ー=ア|ー=カ|ー=カ|ー=ガ|ー # Katakana
+                =サ|ー=サ|ー=ザ|ー=タ|ー=タ|ー=ダ|ー=ナ|ー=ナ|ー=ハ|ー=ハ|ー=ㇵ|ー=バ|ー=パ|ー
+                =マ|ー=マ|ー=ャ|ー=ャ|ー=ヤ|ー=ヤ|ー=ラ|ー=ラ|ー=ㇻ|ー=ヮ|ー=ワ|ー=ワ|ー=ヵ|ー=ヷ|ー
+
+                &[before 3]ぃ # I
+                <<<ぃ|ー=い|ー=き|ー=ぎ|ー=し|ー=じ|ー=ち|ー=ぢ|ー=に|ー=ひ|ー=び|ー=ぴ|ー=み|ー=り|ー=ゐ|ー # Hiragana
+                <<<<ィ|ー=ィ|ー=イ|ー=イ|ー=キ|ー=キ|ー=ギ|ー=シ|ー=シ|ー=ㇱ|ー=ジ|ー # Katakana
+                =チ|ー=チ|ー=ヂ|ー=ニ|ー=ニ|ー=ヒ|ー=ヒ|ー=ㇶ|ー=ビ|ー=ピ|ー
+                =ミ|ー=ミ|ー=リ|ー=リ|ー=ㇼ|ー=ヰ|ー=ヸ|ー
+
+                &[before 3]ぅ # U
+                <<<ぅ|ー=う|ー=く|ー=ぐ|ー=す|ー=ず|ー=っ|ー=つ|ー=づ|ー=ぬ|ー=ふ|ー=ぶ|ー=ぷ|ー=む|ー=ゅ|ー=ゆ|ー=る|ー=ゔ|ー # Hiragana
+                <<<<ゥ|ー=ゥ|ー=ウ|ー=ウ|ー=ク|ー=ク|ー=ㇰ|ー=グ|ー # Katakana
+                =ス|ー=ス|ー=ㇲ|ー=ズ|ー=ッ|ー=ッ|ー=ツ|ー=ツ|ー=ヅ|ー=ヌ|ー=ヌ|ー=ㇴ|ー
+                =フ|ー=フ|ー=ㇷ|ー=ブ|ー=プ|ー=ム|ー=ム|ー=ㇺ|ー=ュ|ー=ュ|ー=ユ|ー=ユ|ー=ル|ー=ル|ー=ㇽ|ー=ヴ|ー
+
+                &[before 3]ぇ # E
+                <<<ぇ|ー=え|ー=け|ー=ゖ|ー=げ|ー=せ|ー=ぜ|ー=て|ー=で|ー=ね|ー=へ|ー=べ|ー=ぺ|ー=め|ー=れ|ー=ゑ|ー # Hiragana
+                <<<<ェ|ー=ェ|ー=エ|ー=エ|ー=ケ|ー=ケ|ー=ゲ|ー # Katakana
+                =セ|ー=セ|ー=ゼ|ー=テ|ー=テ|ー=デ|ー=ネ|ー=ネ|ー=ヘ|ー=ヘ|ー=ㇸ|ー=ベ|ー=ペ|ー
+                =メ|ー=メ|ー=レ|ー=レ|ー=ㇾ|ー=ヱ|ー=ヶ|ー=ヹ|ー
+
+                &[before 3]ぉ # O
+                <<<ぉ|ー=お|ー=こ|ー=ご|ー=そ|ー=ぞ|ー=と|ー=ど|ー=の|ー=ほ|ー=ぼ|ー=ぽ|ー=も|ー=ょ|ー=よ|ー=ろ|ー=を|ー # Hiragana
+                <<<<ォ|ー=ォ|ー=オ|ー=オ|ー=コ|ー=コ|ー=ゴ|ー=ソ|ー=ソ|ー=ゾ|ー=ト|ー=ト|ー=ㇳ|ー=ド|ー # Katakana
+                =ノ|ー=ノ|ー=ホ|ー=ホ|ー=ㇹ|ー=ボ|ー=ポ|ー=モ|ー=モ|ー=ョ|ー=ョ|ー=ヨ|ー=ヨ|ー
+                =ロ|ー=ロ|ー=ㇿ|ー=ヲ|ー=ヲ|ー=ヺ|ー
+
+                # The iteration mark sorts tertiary less-than the preceding character.
+                &[before 3]あ # A
+                <<<あ|ゝ=ぁ|ゝ
+                <<<<ア|ヽ=ア|ヽ=ァ|ヽ=ァ|ヽ
+                &[before 3]い # I
+                <<<い|ゝ=ぃ|ゝ
+                <<<<イ|ヽ=イ|ヽ=ィ|ヽ=ィ|ヽ
+                &[before 3]う # U
+                <<<う|ゝ=ぅ|ゝ=ゔ|ゝ=う|ゞ/゙=ぅ|ゞ/゙=ゔ|ゞ/゙
+                <<<<ウ|ヽ=ウ|ヽ=ゥ|ヽ=ゥ|ヽ=ヴ|ヽ=ウ|ヾ/゙=ウ|ヾ/゙=ゥ|ヾ/゙=ゥ|ヾ/゙=ヴ|ヾ/゙
+                &[before 3]え # E
+                <<<え|ゝ=ぇ|ゝ
+                <<<<エ|ヽ=エ|ヽ=ェ|ヽ=ェ|ヽ
+                &[before 3]お # O
+                <<<お|ゝ=ぉ|ゝ
+                <<<<オ|ヽ=オ|ヽ=ォ|ヽ=ォ|ヽ
+
+                &[before 3]か # KA
+                <<<か|ゝ=ゕ|ゝ
+                <<<<カ|ヽ=カ|ヽ=ヵ|ヽ
+                &[before 3]が # GA
+                <<<が|ゝ
+                <<<<ガ|ヽ
+
+                &[before 3]き # KI
+                <<<き|ゝ=ぎ|ゝ=き|ゞ/゙=ぎ|ゞ/゙
+                <<<<キ|ヽ=キ|ヽ=ギ|ヽ=キ|ヾ/゙=キ|ヾ/゙=ギ|ヾ/゙
+
+                &[before 3]く # KU
+                <<<く|ゝ=ぐ|ゝ=く|ゞ/゙=ぐ|ゞ/゙
+                <<<<ク|ヽ=ク|ヽ=ㇰ|ヽ=グ|ヽ=ク|ヾ/゙=ク|ヾ/゙=ㇰ|ヾ/゙=グ|ヾ/゙
+
+                &[before 3]け # KE
+                <<<け|ゝ=ゖ|ゝ
+                <<<<ケ|ヽ=ケ|ヽ=ヶ|ヽ
+                &[before 3]げ # GE
+                <<<げ|ゝ
+                <<<<ゲ|ヽ
+
+                &[before 3]こ # KO
+                <<<こ|ゝ=ご|ゝ=こ|ゞ/゙=ご|ゞ/゙
+                <<<<コ|ヽ=コ|ヽ=ゴ|ヽ=コ|ヾ/゙=コ|ヾ/゙=ゴ|ヾ/゙
+
+                &[before 3]さ # SA
+                <<<さ|ゝ=ざ|ゝ=さ|ゞ/゙=ざ|ゞ/゙
+                <<<<サ|ヽ=サ|ヽ=ザ|ヽ=サ|ヾ/゙=サ|ヾ/゙=ザ|ヾ/゙
+
+                &[before 3]し # SI
+                <<<し|ゝ=じ|ゝ=し|ゞ/゙=じ|ゞ/゙
+                <<<<シ|ヽ=シ|ヽ=ㇱ|ヽ=ジ|ヽ=シ|ヾ/゙=シ|ヾ/゙=ㇱ|ヾ/゙=ジ|ヾ/゙
+
+                &[before 3]す # SU
+                <<<す|ゝ=ず|ゝ=す|ゞ/゙=ず|ゞ/゙
+                <<<<ス|ヽ=ス|ヽ=ㇲ|ヽ=ズ|ヽ=ス|ヾ/゙=ス|ヾ/゙=ㇲ|ヾ/゙=ズ|ヾ/゙
+
+                &[before 3]せ # SE
+                <<<せ|ゝ=ぜ|ゝ=せ|ゞ/゙=ぜ|ゞ/゙
+                <<<<セ|ヽ=セ|ヽ=ゼ|ヽ=セ|ヾ/゙=セ|ヾ/゙=ゼ|ヾ/゙
+
+                &[before 3]そ # SO
+                <<<そ|ゝ=ぞ|ゝ=そ|ゞ/゙=ぞ|ゞ/゙
+                <<<<ソ|ヽ=ソ|ヽ=ゾ|ヽ=ソ|ヾ/゙=ソ|ヾ/゙=ゾ|ヾ/゙
+
+                &[before 3]た # TA
+                <<<た|ゝ=だ|ゝ=た|ゞ/゙=だ|ゞ/゙
+                <<<<タ|ヽ=タ|ヽ=ダ|ヽ=タ|ヾ/゙=タ|ヾ/゙=ダ|ヾ/゙
+
+                &[before 3]ち # TI
+                <<<ち|ゝ=ぢ|ゝ=ち|ゞ/゙=ぢ|ゞ/゙
+                <<<<チ|ヽ=チ|ヽ=ヂ|ヽ=チ|ヾ/゙=チ|ヾ/゙=ヂ|ヾ/゙
+
+                &[before 3]つ # TU
+                <<<つ|ゝ=っ|ゝ=づ|ゝ=つ|ゞ/゙=づ|ゞ/゙=つ|ゝ=っ|ゞ/゙=つ|ゞ/゙
+                <<<<ツ|ヽ=ツ|ヽ=ッ|ヽ=ッ|ヽ=ヅ|ヽ=ツ|ヾ/゙=ツ|ヾ/゙=ヅ|ヾ/゙=ツ|ヽ=ツ|ヽ=ッ|ヾ/゙=ッ|ヾ/゙=ツ|ヾ/゙=ツ|ヾ/゙
+
+                &[before 3]て # TE
+                <<<て|ゝ=で|ゝ=て|ゞ/゙=で|ゞ/゙
+                <<<<テ|ヽ=テ|ヽ=デ|ヽ=テ|ヾ/゙=テ|ヾ/゙=デ|ヾ/゙
+
+                &[before 3]と # TO
+                <<<と|ゝ=ど|ゝ=と|ゞ/゙=ど|ゞ/゙
+                <<<<ト|ヽ=ト|ヽ=ㇳ|ヽ=ド|ヽ=ト|ヾ/゙=ト|ヾ/゙=ㇳ|ヾ/゙=ド|ヾ/゙
+
+                &[before 3]な # NA
+                <<<な|ゝ
+                <<<<ナ|ヽ=ナ|ヽ
+
+                &[before 3]に # NI
+                <<<に|ゝ
+                <<<<ニ|ヽ=ニ|ヽ
+
+                &[before 3]ぬ # NU
+                <<<ぬ|ゝ
+                <<<<ヌ|ヽ=ヌ|ヽ=ㇴ|ヽ # \u31F4
+
+                &[before 3]ね # NE
+                <<<ね|ゝ
+                <<<<ネ|ヽ=ネ|ヽ
+
+                &[before 3]の # NO
+                <<<の|ゝ
+                <<<<ノ|ヽ=ノ|ヽ
+
+                &[before 3]は # HA
+                <<<は|ゝ=ば|ゝ=は|ゞ/゙=ば|ゞ/゙=ぱ|ゝ=ぱ|ゞ/゙
+                <<<<ハ|ヽ=ハ|ヽ=ㇵ|ヽ=バ|ヽ=ハ|ヾ/゙=ハ|ヾ/゙=ㇵ|ヾ/゙=バ|ヾ/゙=パ|ヽ=パ|ヾ/゙
+
+                &[before 3]ひ # HI
+                <<<ひ|ゝ=び|ゝ=ひ|ゞ/゙=び|ゞ/゙=ぴ|ゝ=ぴ|ゞ/゙
+                <<<<ヒ|ヽ=ヒ|ヽ=ㇶ|ヽ=ビ|ヽ=ヒ|ヾ/゙=ヒ|ヾ/゙=ㇶ|ヾ/゙=ビ|ヾ/゙=ピ|ヽ=ピ|ヾ/゙
+
+                &[before 3]ふ # HU
+                <<<ふ|ゝ=ぶ|ゝ=ふ|ゞ/゙=ぶ|ゞ/゙=ぷ|ゝ=ぷ|ゞ/゙
+                <<<<フ|ヽ=フ|ヽ=ㇷ|ヽ=ブ|ヽ=フ|ヾ/゙=フ|ヾ/゙=ㇷ|ヾ/゙=ブ|ヾ/゙=プ|ヽ=プ|ヾ/゙
+
+                &[before 3]へ # HE
+                <<<へ|ゝ=べ|ゝ=へ|ゞ/゙=べ|ゞ/゙=ぺ|ゝ=ぺ|ゞ/゙
+                <<<<ヘ|ヽ=ヘ|ヽ=ㇸ|ヽ=ベ|ヽ=ヘ|ヾ/゙=ヘ|ヾ/゙=ㇸ|ヾ/゙=ベ|ヾ/゙=ペ|ヽ=ペ|ヾ/゙
+
+                &[before 3]ほ # HO
+                <<<ほ|ゝ=ぼ|ゝ=ほ|ゞ/゙=ぼ|ゞ/゙=ぽ|ゝ=ぽ|ゞ/゙
+                <<<<ホ|ヽ=ホ|ヽ=ㇹ|ヽ=ボ|ヽ=ホ|ヾ/゙=ホ|ヾ/゙=ㇹ|ヾ/゙=ボ|ヾ/゙=ポ|ヽ=ポ|ヾ/゙
+
+                &[before 3]ま # MA
+                <<<ま|ゝ
+                <<<<マ|ヽ=マ|ヽ
+
+                &[before 3]み # MI
+                <<<み|ゝ
+                <<<<ミ|ヽ=ミ|ヽ
+
+                &[before 3]む # MU
+                <<<む|ゝ
+                <<<<ム|ヽ=ム|ヽ=ㇺ|ヽ # \u31FA
+
+                &[before 3]め # ME
+                <<<め|ゝ
+                <<<<メ|ヽ=メ|ヽ
+
+                &[before 3]も # MO
+                <<<も|ゝ
+                <<<<モ|ヽ=モ|ヽ
+
+                &[before 3]や # YA
+                <<<や|ゝ=ゃ|ゝ
+                <<<<ヤ|ヽ=ヤ|ヽ=ャ|ヽ=ャ|ヽ
+
+                &[before 3]ゆ # YU
+                <<<ゆ|ゝ=ゅ|ゝ
+                <<<<ユ|ヽ=ユ|ヽ=ュ|ヽ=ュ|ヽ
+
+                &[before 3]よ # YO
+                <<<よ|ゝ=ょ|ゝ
+                <<<<ヨ|ヽ=ヨ|ヽ=ョ|ヽ=ョ|ヽ
+
+                &[before 3]ら # RA
+                <<<ら|ゝ
+                <<<<ラ|ヽ=ラ|ヽ=ㇻ|ヽ # \u31FB
+
+                &[before 3]り # RI
+                <<<り|ゝ
+                <<<<リ|ヽ=リ|ヽ=ㇼ|ヽ # \u31FC
+
+                &[before 3]る # RU
+                <<<る|ゝ
+                <<<<ル|ヽ=ル|ヽ=ㇽ|ヽ # \u31FD
+
+                &[before 3]れ # RE
+                <<<れ|ゝ
+                <<<<レ|ヽ=レ|ヽ=ㇾ|ヽ # \u31FE
+
+                &[before 3]ろ # RO
+                <<<ろ|ゝ
+                <<<<ロ|ヽ=ロ|ヽ=ㇿ|ヽ # \u31FF
+
+                &[before 3]わ # WA
+                <<<わ|ゝ=ゎ|ゝ=わ|ゞ/゙=ゎ|ゞ/゙
+                <<<<ワ|ヽ=ワ|ヽ=ヮ|ヽ=ヷ|ヽ=ワ|ヾ/゙=ワ|ヾ/゙=ヷ|ヾ/゙=ヮ|ヾ/゙
+
+                &[before 3]ゐ # WI
+                <<<ゐ|ゝ=ゐ|ゞ/゙
+                <<<<ヰ|ヽ=ヸ|ヽ=ヰ|ヾ/゙=ヸ|ヾ/゙
+
+                &[before 3]ゑ # WE
+                <<<ゑ|ゝ=ゑ|ゞ/゙
+                <<<<ヱ|ヽ=ヹ|ヽ=ヱ|ヾ/゙=ヹ|ヾ/゙
+
+                &[before 3]を # WO
+                <<<を|ゝ=を|ゞ/゙
+                <<<<ヲ|ヽ=ヲ|ヽ=ヺ|ヽ=ヲ|ヾ/゙=ヲ|ヾ/゙=ヺ|ヾ/゙
+
+                &[before 3]ん # N
+                <<<ん|ゝ
+                <<<<ン|ヽ=ン|ヽ
+
+                &ぁ<<<<ァ=ァ # SMALL A
+                &あ<<<<ア=ア # A
+                &ぃ<<<<ィ=ィ # SMALL I
+                &い<<<<イ=イ # I
+                &ぅ<<<<ゥ=ゥ # SMALL U
+                &う<<<<ウ=ウ # U
+                &ぇ<<<<ェ=ェ # SMALL E
+                &え<<<<エ=エ # E
+                &ぉ<<<<ォ=ォ # SMALL O
+                &お<<<<オ=オ # O
+                &か<<<<カ=カ # KA
+                &き<<<<キ=キ # KI
+                &く<<<<ク=ク # KU
+                &け<<<<ケ=ケ # KE
+                &こ<<<<コ=コ # KO
+                &さ<<<<サ=サ # SA
+                &し<<<<シ=シ # SI
+                &す<<<<ス=ス # SU
+                &せ<<<<セ=セ # SE
+                &そ<<<<ソ=ソ # SO
+                &た<<<<タ=タ # TA
+                &ち<<<<チ=チ # TI
+                &っ<<<<ッ=ッ # SMALL TU
+                &つ<<<<ツ=ツ # TU
+                &て<<<<テ=テ # TE
+                &と<<<<ト=ト # TO
+                &な<<<<ナ=ナ # NA
+                &に<<<<ニ=ニ # NI
+                &ぬ<<<<ヌ=ヌ # NU
+                &ね<<<<ネ=ネ # NE
+                &の<<<<ノ=ノ # NO
+                &は<<<<ハ=ハ # HA
+                &ひ<<<<ヒ=ヒ # HI
+                &ふ<<<<フ=フ # HU
+                &へ<<<<ヘ=ヘ # HE
+                &ほ<<<<ホ=ホ # HO
+                &ま<<<<マ=マ # MA
+                &み<<<<ミ=ミ # MI
+                &む<<<<ム=ム # MU
+                &め<<<<メ=メ # ME
+                &も<<<<モ=モ # MO
+                &ゃ<<<<ャ=ャ # SMALL YA
+                &や<<<<ヤ=ヤ # YA
+                &ゅ<<<<ュ=ュ # SMALL YU
+                &ゆ<<<<ユ=ユ # YU
+                &ょ<<<<ョ=ョ # SMALL YO
+                &よ<<<<ヨ=ヨ # YO
+                &ら<<<<ラ=ラ # RA
+                &り<<<<リ=リ # RI
+                &る<<<<ル=ル # RU
+                &れ<<<<レ=レ # RE
+                &ろ<<<<ロ=ロ # RO
+                &ゎ<<<<ヮ # SMALL WA
+                &わ<<<<ワ=ワ # WA
+                &ゐ<<<<ヰ # WI
+                &ゑ<<<<ヱ # WE
+                &を<<<<ヲ=ヲ # WO
+                &ん<<<<ン=ン # N
+                &ゕ<<<<ヵ # SMALL KA
+                &ゖ<<<<ヶ # SMALL KE
+
+                &より # \u3088\u308A
+                <<ゟ # \u309F HIRAGANA DIGRAPH YORI
+                &コト # \u30B3\u30C8
+                <<ヿ # \u30FF KATAKANA DIGRAPH KOTO
+                "
+                "&'\u0020'=*'\u3000' ̄"
                 "&'!'=!"
                 "&'\u0022'=""
                 "&'\u0023'=#"
@@ -794,7 +838,7 @@ ja{
                 "&Y=Y"
                 "&Z=Z"
                 "&'['=["
-                "&'\\\\'=\"
+                "&'\\'=\"
                 "&']'=]"
                 "&'^'=^"
                 "&'_'=_"
index 9cc1e68bfad6617ccf6ae1fe1c7eb307138af369..837e847543348242676a8e6714fa4eb3efa7eecf 100644 (file)
@@ -1,6 +1,6 @@
 // ***************************************************************************
 // *
-// * Copyright (C) 2013 International Business Machines
+// * Copyright (C) 2013-2014 International Business Machines
 // * Corporation and others. All Rights Reserved.
 // * Tool: org.unicode.cldr.icu.NewLdml2IcuConverter
 // * Source File: <path>/common/collation/ko.xml
@@ -486,23 +486,23 @@ ko{
                 "<<ᇂ"
                 "&ᄀ"
                 "<<ᄁ"
-                "=ᄀᄀ"
+                // patch for v2: removed "=ᄀᄀ"
                 "<<<ㄲ"
                 "&ᄃ"
                 "<<ᄄ"
-                "=ᄃᄃ"
+                // patch for v2: removed "=ᄃᄃ"
                 "<<<ㄸ"
                 "&ᄇ"
                 "<<ᄈ"
-                "=ᄇᄇ"
+                // patch for v2: removed "=ᄇᄇ"
                 "<<<ㅃ"
                 "&ᄉ"
                 "<<ᄊ"
-                "=ᄉᄉ"
+                // patch for v2: removed "=ᄉᄉ"
                 "<<<ㅆ"
                 "&ᄌ"
                 "<<ᄍ"
-                "=ᄌᄌ"
+                // patch for v2: removed "=ᄌᄌ"
                 "<<<ㅉ"
             }
             Version{"24"}
index 08a9019a43e4ddfb5f42ca81a0b835f56657e7af..b1d08e6f17e55f69a389165dd6269fe4e2417d04 100644 (file)
@@ -1,6 +1,6 @@
 // ***************************************************************************
 // *
-// * Copyright (C) 2013 International Business Machines
+// * Copyright (C) 2013-2014 International Business Machines
 // * Corporation and others. All Rights Reserved.
 // * Tool: org.unicode.cldr.icu.NewLdml2IcuConverter
 // * Source File: <path>/common/collation/ps.xml
@@ -17,7 +17,7 @@ ps{
                 "[normalization on][reorder Arab]"
                 "&َ<<ِ<<ُ<<ً<<ٍ<<ٌ"
                 "&[before 1]ا<آ"
-                "&ا<<*أٲٱإٳ<ء"
+                "&ا<<أ<<ٲ<<ٱ<<إ<<ٳ<ء"
                 "&ت<ټ<<ٹ"
                 "&ج<ځ<<حٔ"
                 "&چ<څ"
@@ -27,7 +27,7 @@ ps{
                 "&ک<<*ڪك"
                 "&ګ<<گ"
                 "&ڼ<<ڻ"
-                "&و<<*ؤۇۉ"
+                "&و<<ؤ<<ۇ<<ۉ"
                 "&ه<<<ۀ<<<هٔ<<*ەہھةۃ"
                 "&ی<<*ىےيېۍ<<یٔ<<<ىٔ<<<ئ"
                 "&\u00A0<<\u200C<<\u200D"
diff --git a/icu4c/source/data/in/coll/invuca.icu b/icu4c/source/data/in/coll/invuca.icu
deleted file mode 100644 (file)
index db939fa..0000000
Binary files a/icu4c/source/data/in/coll/invuca.icu and /dev/null differ
index d9f6bf2c78776720b7e1b222462c1b9966837af4..2cc711cff4cf8bda4e074e605362a8e1a4809d4e 100644 (file)
Binary files a/icu4c/source/data/in/coll/ucadata.icu and b/icu4c/source/data/in/coll/ucadata.icu differ
index 2455d9a97195415419394fcc94f033a886861384..8a784bbd40646bcf8b67c29942e7b78be76a9392 100644 (file)
@@ -1,5 +1,5 @@
 #**********************************************************************
-#* Copyright (C) 1999-2013, International Business Machines Corporation
+#* Copyright (C) 1999-2014, International Business Machines Corporation
 #* and others.  All Rights Reserved.
 #**********************************************************************
 # nmake file for creating data files on win32
@@ -602,14 +602,13 @@ icu4j-data-install :
        copy "$(ICUTMP)\$(ICUPKG).dat" "$(ICUOUT)\$(U_ICUDATA_NAME)$(U_ICUDATA_ENDIAN_SUFFIX).dat"
        -@erase "$(ICUTMP)\$(ICUPKG).dat"
 !ELSE
-"$(ICU_LIB_TARGET)" : $(COMMON_ICUDATA_DEPENDENCIES) $(CNV_FILES) $(CNV_FILES_SPECIAL) "$(ICUBLD_PKG)\unames.icu" "$(ICUBLD_PKG)\cnvalias.icu" "$(ICUBLD_PKG)\nfc.nrm" "$(ICUBLD_PKG)\nfkc.nrm" "$(ICUBLD_PKG)\nfkc_cf.nrm" "$(ICUBLD_PKG)\uts46.nrm" "$(ICUBLD_PKG)\$(ICUCOL)\ucadata.icu" "$(ICUBLD_PKG)\$(ICUCOL)\invuca.icu" $(CURR_RES_FILES) $(LANG_RES_FILES) $(REGION_RES_FILES) $(ZONE_RES_FILES) $(BRK_FILES) $(BRK_DICT_FILES) $(BRK_RES_FILES) $(ALL_RES) $(COL_COL_FILES) $(RBNF_RES_FILES) $(TRANSLIT_RES_FILES) $(SPREP_FILES) "$(ICUBLD_PKG)\confusables.cfu"
+"$(ICU_LIB_TARGET)" : $(COMMON_ICUDATA_DEPENDENCIES) $(CNV_FILES) $(CNV_FILES_SPECIAL) "$(ICUBLD_PKG)\unames.icu" "$(ICUBLD_PKG)\cnvalias.icu" "$(ICUBLD_PKG)\nfc.nrm" "$(ICUBLD_PKG)\nfkc.nrm" "$(ICUBLD_PKG)\nfkc_cf.nrm" "$(ICUBLD_PKG)\uts46.nrm" "$(ICUBLD_PKG)\$(ICUCOL)\ucadata.icu"  $(CURR_RES_FILES) $(LANG_RES_FILES) $(REGION_RES_FILES) $(ZONE_RES_FILES) $(BRK_FILES) $(BRK_DICT_FILES) $(BRK_RES_FILES) $(ALL_RES) $(COL_COL_FILES) $(RBNF_RES_FILES) $(TRANSLIT_RES_FILES) $(SPREP_FILES) "$(ICUBLD_PKG)\confusables.cfu"
        @echo Building icu data
        cd "$(ICUBLD_PKG)"
        "$(ICUPBIN)\pkgdata" $(COMMON_ICUDATA_ARGUMENTS) <<"$(ICUTMP)\icudata.lst"
 unames.icu
 confusables.cfu
 $(ICUCOL)\ucadata.icu
-$(ICUCOL)\invuca.icu
 cnvalias.icu
 nfc.nrm
 nfkc.nrm
@@ -976,9 +975,6 @@ res_index:table(nofallback) {
 "$(ICUBLD_PKG)\uts46.nrm": $(ICUSRCDATA_RELATIVE_PATH)\in\uts46.nrm
        "$(ICUPBIN)\icupkg" -tl $? $@
 
-"$(ICUBLD_PKG)\coll\invuca.icu": $(ICUSRCDATA_RELATIVE_PATH)\in\coll\invuca.icu
-       "$(ICUPBIN)\icupkg" -tl $? $@
-
 "$(ICUBLD_PKG)\coll\ucadata.icu": $(ICUSRCDATA_RELATIVE_PATH)\in\coll\ucadata.icu
        "$(ICUPBIN)\icupkg" -tl $? $@
 
index 945d9dfd80968c95bdf9520b4f31589acbeab499..32ea7999522cd6525ae3cb7b493dc943a14afcd3 100644 (file)
@@ -1,9 +1,269 @@
 # Fractional UCA Table, generated from standard UCA
-# 2012-08-15, 21:42:57 GMT [MD]
-# VERSION: UCA=6.2.0, UCD=6.2.0
-# For a description of the format and usage, see CollationAuxiliary.html
+# 2013-09-03 [MS]
+# VERSION: UCA=6.3.0, UCD=6.3.0
+# For a description of the format and usage, see
+#   http://www.unicode.org/reports/tr35/tr35-collation.html
 
-[UCA version = 6.2.0]
+[UCA version = 6.3.0]
+[Unified_Ideograph 4E00..9FCC FA0E..FA0F FA11 FA13..FA14 FA1F FA21 FA23..FA24 FA27..FA29 3400..4DB5 20000..2A6D6 2A700..2B734 2B740..2B81D]
+
+# Top Byte => Reordering Tokens
+[top_byte      00      TERMINATOR ]
+[top_byte      01      LEVEL-SEPARATOR ]
+[top_byte      02      FIELD-SEPARATOR ]
+[top_byte      03      SPACE ]  # 10 primary weights
+[top_byte      04      SPACE ]
+[top_byte      05      SPACE ]
+[top_byte      06      PUNCTUATION ]  # 522 primary weights
+[top_byte      07      PUNCTUATION ]
+[top_byte      08      PUNCTUATION ]
+[top_byte      09      PUNCTUATION ]
+[top_byte      0A      PUNCTUATION ]
+[top_byte      0B      PUNCTUATION ]
+[top_byte      0C      PUNCTUATION ]
+[top_byte      0D      SYMBOL ]  # 4314 primary weights
+[top_byte      0E      SYMBOL ]
+[top_byte      0F      CURRENCY ]  # 44 primary weights
+[top_byte      10      DIGIT ]  # 216 primary weights
+[top_byte      11      DIGIT ]
+[top_byte      12      DIGIT ]
+[top_byte      13      DIGIT ]
+[top_byte      14      DIGIT ]
+[top_byte      15      DIGIT ]
+[top_byte      16      DIGIT ]
+[top_byte      17      DIGIT ]
+[top_byte      18      DIGIT ]
+[top_byte      19      DIGIT ]
+[top_byte      1A      DIGIT ]
+[top_byte      1B      DIGIT ]
+[top_byte      1C      DIGIT ]
+[top_byte      1D      DIGIT ]
+[top_byte      1E      DIGIT ]
+[top_byte      1F      DIGIT ]
+[top_byte      20      DIGIT ]
+[top_byte      21      DIGIT ]
+[top_byte      22      DIGIT ]
+[top_byte      23      DIGIT ]
+[top_byte      24      DIGIT ]
+[top_byte      25      DIGIT ]
+[top_byte      26      DIGIT ]
+[top_byte      27      DIGIT ]
+[top_byte      28      Latn ]  # 332 primary weights
+[top_byte      29      Latn ]
+[top_byte      2A      Latn ]
+[top_byte      2B      Latn ]
+[top_byte      2C      Latn ]
+[top_byte      2D      Latn ]
+[top_byte      2E      Latn ]
+[top_byte      2F      Latn ]
+[top_byte      30      Latn ]
+[top_byte      31      Latn ]
+[top_byte      32      Latn ]
+[top_byte      33      Latn ]
+[top_byte      34      Latn ]
+[top_byte      35      Latn ]
+[top_byte      36      Latn ]
+[top_byte      37      Latn ]
+[top_byte      38      Latn ]
+[top_byte      39      Latn ]
+[top_byte      3A      Latn ]
+[top_byte      3B      Latn ]
+[top_byte      3C      Latn ]
+[top_byte      3D      Latn ]
+[top_byte      3E      Latn ]
+[top_byte      3F      Latn ]
+[top_byte      40      Latn ]
+[top_byte      41      Latn ]
+[top_byte      42      Latn ]
+[top_byte      43      Latn ]
+[top_byte      44      Latn ]
+[top_byte      45      Latn ]
+[top_byte      46      Latn ]
+[top_byte      47      Latn ]
+[top_byte      48      Latn ]
+[top_byte      49      Latn ]
+[top_byte      4A      Latn ]
+[top_byte      4B      Latn ]
+[top_byte      4C      Latn ]
+[top_byte      4D      Latn ]
+[top_byte      4E      Latn ]
+[top_byte      4F      Latn ]
+[top_byte      50      Latn ]
+[top_byte      51      Latn ]
+[top_byte      52      Latn ]
+[top_byte      53      Latn ]
+[top_byte      54      Latn ]
+[top_byte      55      Latn ]
+[top_byte      56      Latn ]
+[top_byte      57      Latn ]
+[top_byte      58      Latn ]
+[top_byte      59      Latn ]
+[top_byte      5A      Latn ]
+[top_byte      5B      Latn ]
+[top_byte      5C      Latn ]
+[top_byte      5D      Grek Copt       COMPRESS ]  # 106 primary weights
+[top_byte      5E      Cyrl Glag       COMPRESS ]  # 221 primary weights
+[top_byte      5F      Geor    COMPRESS ]  # 87 primary weights
+[top_byte      60      Armn    COMPRESS ]  # 40 primary weights
+[top_byte      61      Hebr Phnx Samr  COMPRESS ]  # 73 primary weights
+[top_byte      62      Arab Syrc Mand  COMPRESS ]  # 257 primary weights
+[top_byte      63      Thaa Nkoo Tfng  COMPRESS ]  # 142 primary weights
+[top_byte      64      Ethi    COMPRESS ]  # 454 primary weights
+[top_byte      65      Deva    COMPRESS ]  # 99 primary weights
+[top_byte      66      Beng    COMPRESS ]  # 65 primary weights
+[top_byte      67      Guru    COMPRESS ]  # 58 primary weights
+[top_byte      68      Gujr    COMPRESS ]  # 69 primary weights
+[top_byte      69      Orya    COMPRESS ]  # 68 primary weights
+[top_byte      6A      Taml    COMPRESS ]  # 51 primary weights
+[top_byte      6B      Telu    COMPRESS ]  # 73 primary weights
+[top_byte      6C      Knda    COMPRESS ]  # 74 primary weights
+[top_byte      6D      Mlym    COMPRESS ]  # 73 primary weights
+[top_byte      6E      Sinh Mtei Sylo Saur Kthi Shrd Takr Sund Brah Khar       COMPRESS ]  # 585 primary weights
+[top_byte      6F      Thai    COMPRESS ]  # 65 primary weights
+[top_byte      70      Laoo Tavt       COMPRESS ]  # 117 primary weights
+[top_byte      71      Tibt Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Batk Rjng Kali     COMPRESS ]  # 475 primary weights
+[top_byte      72      Mymr Cakm       COMPRESS ]  # 202 primary weights
+[top_byte      73      Khmr Tale Talu Lana Cham Bali Java Mong Olck    COMPRESS ]  # 626 primary weights
+[top_byte      74      Cher Cans Ogam Runr Orkh Vaii Bamu      COMPRESS ]  # 1826 primary weights
+[top_byte      75      Hang    COMPRESS ]  # 358 primary weights
+[top_byte      76      Hira Hrkt Kana  COMPRESS ]  # 51 primary weights
+[top_byte      77      Bopo Yiii Lisu Plrd Lyci Cari Lydi Ital Goth Dsrt Shaw Osma Sora Linb Cprt Sarb Avst Armi Prti Phli Ugar Xpeo Xsux Egyp Merc Mero       COMPRESS ]  # 4183 primary weights
+[top_byte      78      Hani Hans Hant ]
+[top_byte      79      Hani Hans Hant ]
+[top_byte      7A      Hani Hans Hant ]
+[top_byte      7B      Hani Hans Hant ]
+[top_byte      7C      Hani Hans Hant ]
+[top_byte      7D      Hani Hans Hant ]
+[top_byte      7E      Hani Hans Hant ]
+[top_byte      7F      Hani Hans Hant ]
+[top_byte      80      Hani Hans Hant ]
+[top_byte      81      Hani Hans Hant ]
+[top_byte      82      Hani Hans Hant ]
+[top_byte      83      Hani Hans Hant ]
+[top_byte      84      Hani Hans Hant ]
+[top_byte      85      Hani Hans Hant ]
+[top_byte      86      Hani Hans Hant ]
+[top_byte      87      Hani Hans Hant ]
+[top_byte      88      Hani Hans Hant ]
+[top_byte      89      Hani Hans Hant ]
+[top_byte      8A      Hani Hans Hant ]
+[top_byte      8B      Hani Hans Hant ]
+[top_byte      8C      Hani Hans Hant ]
+[top_byte      8D      Hani Hans Hant ]
+[top_byte      8E      Hani Hans Hant ]
+[top_byte      8F      Hani Hans Hant ]
+[top_byte      90      Hani Hans Hant ]
+[top_byte      91      Hani Hans Hant ]
+[top_byte      92      Hani Hans Hant ]
+[top_byte      93      Hani Hans Hant ]
+[top_byte      94      Hani Hans Hant ]
+[top_byte      95      Hani Hans Hant ]
+[top_byte      96      Hani Hans Hant ]
+[top_byte      97      Hani Hans Hant ]
+[top_byte      98      Hani Hans Hant ]
+[top_byte      99      Hani Hans Hant ]
+[top_byte      9A      Hani Hans Hant ]
+[top_byte      9B      Hani Hans Hant ]
+[top_byte      9C      Hani Hans Hant ]
+[top_byte      9D      Hani Hans Hant ]
+[top_byte      9E      Hani Hans Hant ]
+[top_byte      9F      Hani Hans Hant ]
+[top_byte      A0      Hani Hans Hant ]
+[top_byte      A1      Hani Hans Hant ]
+[top_byte      A2      Hani Hans Hant ]
+[top_byte      A3      Hani Hans Hant ]
+[top_byte      A4      Hani Hans Hant ]
+[top_byte      A5      Hani Hans Hant ]
+[top_byte      A6      Hani Hans Hant ]
+[top_byte      A7      Hani Hans Hant ]
+[top_byte      A8      Hani Hans Hant ]
+[top_byte      A9      Hani Hans Hant ]
+[top_byte      AA      Hani Hans Hant ]
+[top_byte      AB      Hani Hans Hant ]
+[top_byte      AC      Hani Hans Hant ]
+[top_byte      AD      Hani Hans Hant ]
+[top_byte      AE      Hani Hans Hant ]
+[top_byte      AF      Hani Hans Hant ]
+[top_byte      B0      Hani Hans Hant ]
+[top_byte      B1      Hani Hans Hant ]
+[top_byte      B2      Hani Hans Hant ]
+[top_byte      B3      Hani Hans Hant ]
+[top_byte      B4      Hani Hans Hant ]
+[top_byte      B5      Hani Hans Hant ]
+[top_byte      B6      Hani Hans Hant ]
+[top_byte      B7      Hani Hans Hant ]
+[top_byte      B8      Hani Hans Hant ]
+[top_byte      B9      Hani Hans Hant ]
+[top_byte      BA      Hani Hans Hant ]
+[top_byte      BB      Hani Hans Hant ]
+[top_byte      BC      Hani Hans Hant ]
+[top_byte      BD      Hani Hans Hant ]
+[top_byte      BE      Hani Hans Hant ]
+[top_byte      BF      Hani Hans Hant ]
+[top_byte      C0      Hani Hans Hant ]
+[top_byte      C1      Hani Hans Hant ]
+[top_byte      C2      Hani Hans Hant ]
+[top_byte      C3      Hani Hans Hant ]
+[top_byte      C4      Hani Hans Hant ]
+[top_byte      C5      Hani Hans Hant ]
+[top_byte      C6      Hani Hans Hant ]
+[top_byte      C7      Hani Hans Hant ]
+[top_byte      C8      Hani Hans Hant ]
+[top_byte      C9      Hani Hans Hant ]
+[top_byte      CA      Hani Hans Hant ]
+[top_byte      CB      Hani Hans Hant ]
+[top_byte      CC      Hani Hans Hant ]
+[top_byte      CD      Hani Hans Hant ]
+[top_byte      CE      Hani Hans Hant ]
+[top_byte      CF      Hani Hans Hant ]
+[top_byte      D0      Hani Hans Hant ]
+[top_byte      D1      Hani Hans Hant ]
+[top_byte      D2      Hani Hans Hant ]
+[top_byte      D3      Hani Hans Hant ]
+[top_byte      D4      Hani Hans Hant ]
+[top_byte      D5      Hani Hans Hant ]
+[top_byte      D6      Hani Hans Hant ]
+[top_byte      D7      Hani Hans Hant ]
+[top_byte      D8      Hani Hans Hant ]
+[top_byte      D9      Hani Hans Hant ]
+[top_byte      DA      Hani Hans Hant ]
+[top_byte      DB      Hani Hans Hant ]
+[top_byte      DC      Hani Hans Hant ]
+[top_byte      DD      Hani Hans Hant ]
+[top_byte      DE      Hani Hans Hant ]
+[top_byte      DF      Hani Hans Hant ]
+[top_byte      E0      IMPLICIT ]
+[top_byte      E1      IMPLICIT ]
+[top_byte      E2      IMPLICIT ]
+[top_byte      E3      IMPLICIT ]
+[top_byte      E4      IMPLICIT ]
+[top_byte      E5      TRAILING ]
+[top_byte      E6      TRAILING ]
+[top_byte      E7      TRAILING ]
+[top_byte      E8      TRAILING ]
+[top_byte      E9      TRAILING ]
+[top_byte      EA      TRAILING ]
+[top_byte      EB      TRAILING ]
+[top_byte      EC      TRAILING ]
+[top_byte      ED      TRAILING ]
+[top_byte      EE      TRAILING ]
+[top_byte      EF      TRAILING ]
+[top_byte      F0      SPECIAL ]
+[top_byte      F1      SPECIAL ]
+[top_byte      F2      SPECIAL ]
+[top_byte      F3      SPECIAL ]
+[top_byte      F4      SPECIAL ]
+[top_byte      F5      SPECIAL ]
+[top_byte      F6      SPECIAL ]
+[top_byte      F7      SPECIAL ]
+[top_byte      F8      SPECIAL ]
+[top_byte      F9      SPECIAL ]
+[top_byte      FA      SPECIAL ]
+[top_byte      FB      SPECIAL ]
+[top_byte      FC      SPECIAL ]
+[top_byte      FD      SPECIAL ]
+[top_byte      FE      SPECIAL ]
+[top_byte      FF      SPECIAL ]
 
 0000; [,,]
 0001; [,,]
 0618; [,,]
 0619; [,,]
 061A; [,,]
+061C; [,,]
 0640; [,,]
 06D6; [,,]
 06D7; [,,]
 180B; [,,]
 180C; [,,]
 180D; [,,]
+180E; [,,]
 1A7F; [,,]
 1B6B; [,,]
 1B6C; [,,]
 2062; [,,]
 2063; [,,]
 2064; [,,]
+2066; [,,]
+2067; [,,]
+2068; [,,]
+2069; [,,]
 206A; [,,]
 206B; [,,]
 206C; [,,]
@@ -659,40884 +925,40729 @@ FEFF; [,,]
 FFF9; [,,]
 FFFA; [,,]
 FFFB; [,,]
-0332; [, 87, 05]
-0313; [, 89, 05]
-0343; [, 89, 05]
-0486; [, 89, 05]
-2CF1; [, 89, 05]
-0314; [, 8B, 05]
-0485; [, 8B, 05]
-2CF0; [, 8B, 05]
-0301; [, 8D, 05]
-0341; [, 8D, 05]
-0954; [, 8D, 05]
-0300; [, 8F, 05]
-0340; [, 8F, 05]
-0953; [, 8F, 05]
-0306; [, 91, 05]
-0302; [, 93, 05]
-030C; [, 97, 05]
-030A; [, 99, 05]
-0342; [, 9B, 05]
-0308; [, 9D, 05]
-0344; [, 9D, 05][, 8D, 05]
-030B; [, 9F, 05]
-0303; [, A1, 05]
-0307; [, A3, 05]
-0338; [, A5, 05]
-0327; [, A7, 05]
-0328; [, A9, 05]
-0304; [, AB, 05]
-030D; [, AD, 05]
-030E; [, AD, 05]
-0312; [, AD, 05]
-0315; [, AD, 05]
-031A; [, AD, 05]
-033D; [, AD, 05]
-033E; [, AD, 05]
-033F; [, AD, 05]
-0346; [, AD, 05]
-034A; [, AD, 05]
-034B; [, AD, 05]
-034C; [, AD, 05]
-0350; [, AD, 05]
-0351; [, AD, 05]
-0352; [, AD, 05]
-0357; [, AD, 05]
-035B; [, AD, 05]
-035D; [, AD, 05]
-035E; [, AD, 05]
-0484; [, AD, 05]
-0487; [, AD, 05]
-0741; [, AD, 05]
-0745; [, AD, 05]
-17CB; [, AD, 05]
-17CC; [, AD, 05]
-17CD; [, AD, 05]
-17CE; [, AD, 05]
-17CF; [, AD, 05]
-17D0; [, AD, 05]
-17D1; [, AD, 05]
-17DD; [, AD, 05]
-1DC0; [, AD, 05]
-1DC1; [, AD, 05]
-1DC3; [, AD, 05]
-1DC4; [, AD, 05]
-1DC5; [, AD, 05]
-1DC6; [, AD, 05]
-1DC7; [, AD, 05]
-1DC8; [, AD, 05]
-1DC9; [, AD, 05]
-1DCB; [, AD, 05]
-1DCC; [, AD, 05]
-1DCD; [, AD, 05]
-1DCE; [, AD, 05]
-1DD1; [, AD, 05]
-1DFE; [, AD, 05]
-20F0; [, AD, 05]
-2CEF; [, AD, 05]
-A67C; [, AD, 05]
-A67D; [, AD, 05]
-0316; [, AF, 05]
-0317; [, AF, 05]
-0318; [, AF, 05]
-0319; [, AF, 05]
-031C; [, AF, 05]
-031D; [, AF, 05]
-031E; [, AF, 05]
-031F; [, AF, 05]
-0320; [, AF, 05]
-0329; [, AF, 05]
-032A; [, AF, 05]
-032B; [, AF, 05]
-032C; [, AF, 05]
-032F; [, AF, 05]
-0333; [, AF, 05]
-033A; [, AF, 05]
-033B; [, AF, 05]
-033C; [, AF, 05]
-0347; [, AF, 05]
-0348; [, AF, 05]
-0349; [, AF, 05]
-034D; [, AF, 05]
-034E; [, AF, 05]
-0353; [, AF, 05]
-0354; [, AF, 05]
-0355; [, AF, 05]
-0356; [, AF, 05]
-0359; [, AF, 05]
-035A; [, AF, 05]
-035C; [, AF, 05]
-035F; [, AF, 05]
-0362; [, AF, 05]
-0742; [, AF, 05]
-0746; [, AF, 05]
-0859; [, AF, 05]
-085A; [, AF, 05]
-085B; [, AF, 05]
-1DC2; [, AF, 05]
-1DCF; [, AF, 05]
-1DD0; [, AF, 05]
-1DFC; [, AF, 05]
-1DFD; [, AF, 05]
-1DFF; [, AF, 05]
-20EC; [, AF, 05]
-20ED; [, AF, 05]
-20EE; [, AF, 05]
-20EF; [, AF, 05]
-10A0D; [, AF, 05]
-0336; [, B1, 05]
-0337; [, B1, 05]
-20D8; [, B1, 05]
-20D9; [, B1, 05]
-20DA; [, B1, 05]
-20E5; [, B1, 05]
-20EA; [, B1, 05]
-20EB; [, B1, 05]
-20DD; [, B3, 05]
-20DE; [, B3, 05]
-20DF; [, B3, 05]
-20E0; [, B3, 05]
-20E2; [, B3, 05]
-20E3; [, B3, 05]
-20E4; [, B3, 05]
-0305; [, B5, 05]
-0309; [, B7, 05]
-030F; [, B9, 05]
-0310; [, BB, 05]
-0311; [, BD, 05]
-031B; [, BF, 05]
-0321; [, C1, 05]
-0322; [, C3, 05]
-0323; [, C5, 05]
-0324; [, C7, 05]
-0325; [, C9, 05]
-0326; [, CB, 05]
-032D; [, CD, 05]
-032E; [, CF, 05]
-0330; [, D0 0D, 05]
-0331; [, D0 1D, 05]
-0334; [, D0 2D, 05]
-0335; [, D0 3D, 05]
-0339; [, D0 4D, 05]
-0345; [, D0 5D, 05]
-0358; [, D0 6D, 05]
-0360; [, D0 7D, 05]
-FE22; [, D0 7D, 05]
-0361; [, D0 8D, 05]
-FE20; [, D0 8D, 05]
-0483; [, D0 9D, 05]
-A66F; [, D0 AD, 05]
-05B0; [, D0 BD, 05]
-05B1; [, D0 CD, 05]
-05B2; [, D0 DD, 05]
-05B3; [, D0 ED, 05]
-05B4; [, D0 FD, 05]
-05B5; [, D1 11, 05]
-05B6; [, D1 21, 05]
-05B7; [, D1 31, 05]
-05B8; [, D1 41, 05]
-05C7; [, D1 41, 05]
-05B9; [, D1 51, 05]
-05BA; [, D1 51, 05]
-05BB; [, D1 61, 05]
-05C2; [, D1 71, 05]
-05C1; [, D1 81, 05]
-05BC; [, D1 91, 05]
-05BF; [, D1 A1, 05]
-FB1E; [, D1 B1, 05]
-081C; [, D1 C1, 05]
-081D; [, D1 C1, 05]
-081E; [, D1 D1, 05]
-081F; [, D1 D1, 05]
-0820; [, D1 D1, 05]
-0821; [, D1 E1, 05]
-0822; [, D1 E1, 05]
-0823; [, D1 E1, 05]
-0824; [, D1 F1, 05]
-0825; [, D1 F1, 05]
-0826; [, D2 05, 05]
-0827; [, D2 05, 05]
-0828; [, D2 15, 05]
-0829; [, D2 15, 05]
-082A; [, D2 15, 05]
-082B; [, D2 25, 05]
-082C; [, D2 35, 05]
-0818; [, D2 45, 05]
-0819; [, D2 55, 05]
-082D; [, D2 65, 05]
-064B; [, D2 75, 05]
-FE71; [, D2 75, 2F]
-FE70; [, D2 75, 33]
-08F0; [, D2 85, 05]
-08E7; [, D2 95, 05]
-064C; [, D2 A5, 05]
-FE72; [, D2 A5, 33]
-FC5E; [, D2 A5, 33][, D3 A9, 33]
-08F1; [, D2 B5, 05]
-08E8; [, D2 C5, 05]
-064D; [, D2 D5, 05]
-FE74; [, D2 D5, 33]
-FC5F; [, D2 D5, 33][, D3 A9, 33]
-08F2; [, D2 E5, 05]
-08E9; [, D2 F5, 05]
-064E; [, D3 09, 05]
-FE77; [, D3 09, 2F]
-FE76; [, D3 09, 33]
-FCF2; [, D3 09, 2F][, D3 A9, 2F]
-FC60; [, D3 09, 33][, D3 A9, 33]
-08E4; [, D3 19, 05]
-08F4; [, D3 29, 05]
-08F5; [, D3 39, 05]
-064F; [, D3 49, 05]
-FE79; [, D3 49, 2F]
-FE78; [, D3 49, 33]
-FCF3; [, D3 49, 2F][, D3 A9, 2F]
-FC61; [, D3 49, 33][, D3 A9, 33]
-08E5; [, D3 59, 05]
-08FE; [, D3 69, 05]
-0650; [, D3 79, 05]
-FE7B; [, D3 79, 2F]
-FE7A; [, D3 79, 33]
-FCF4; [, D3 79, 2F][, D3 A9, 2F]
-FC62; [, D3 79, 33][, D3 A9, 33]
-08E6; [, D3 89, 05]
-08F6; [, D3 99, 05]
-0651; [, D3 A9, 05]
-FE7D; [, D3 A9, 2F]
-FE7C; [, D3 A9, 33]
-FC63; [, D3 A9, 33][, D5 11, 33]
-0652; [, D3 B9, 05]
-FE7F; [, D3 B9, 2F]
-FE7E; [, D3 B9, 33]
-0653; [, D3 C9, 05]
-0654; [, D3 D9, 05]
-0655; [, D3 E9, 05]
-065F; [, D3 F9, 05]
-0656; [, D4 0D, 05]
-0657; [, D4 1D, 05]
-0658; [, D4 2D, 05]
-0659; [, D4 3D, 05]
-065A; [, D4 4D, 05]
-065B; [, D4 5D, 05]
-065C; [, D4 6D, 05]
-065D; [, D4 7D, 05]
-065E; [, D4 8D, 05]
-08F7; [, D4 9D, 05]
-08F8; [, D4 AD, 05]
-08FD; [, D4 BD, 05]
-08FB; [, D4 CD, 05]
-08FC; [, D4 DD, 05]
-08F9; [, D4 ED, 05]
-08FA; [, D4 FD, 05]
-0670; [, D5 11, 05]
-0711; [, D5 21, 05]
-0730; [, D5 31, 05]
-0731; [, D5 41, 05]
-0732; [, D5 51, 05]
-0733; [, D5 61, 05]
-0734; [, D5 71, 05]
-0735; [, D5 81, 05]
-0736; [, D5 91, 05]
-0737; [, D5 A1, 05]
-0738; [, D5 B1, 05]
-0739; [, D5 C1, 05]
-073A; [, D5 D1, 05]
-073B; [, D5 E1, 05]
-073C; [, D5 F1, 05]
-073D; [, D6 05, 05]
-073E; [, D6 15, 05]
-073F; [, D6 25, 05]
-07EB; [, D6 35, 05]
-07EC; [, D6 45, 05]
-07ED; [, D6 55, 05]
-07EE; [, D6 65, 05]
-07EF; [, D6 75, 05]
-07F0; [, D6 85, 05]
-07F1; [, D6 95, 05]
-07F2; [, D6 A5, 05]
-07F3; [, D6 B5, 05]
-135F; [, D6 C5, 05]
-135E; [, D6 D5, 05]
-135D; [, D6 E5, 05]
-A6F0; [, D6 F5, 05]
-A6F1; [, D7 09, 05]
-093C; [, D7 19, 05]
-09BC; [, D7 19, 05]
-0A3C; [, D7 19, 05]
-0ABC; [, D7 19, 05]
-0B3C; [, D7 19, 05]
-0CBC; [, D7 19, 05]
-1B34; [, D7 19, 05]
-1BE6; [, D7 19, 05]
-1C37; [, D7 19, 05]
-A9B3; [, D7 19, 05]
-110BA; [, D7 19, 05]
-116B7; [, D7 19, 05]
-0900; [, D7 29, 05]
-0901; [, D7 29, 05]
-0981; [, D7 29, 05]
-0A01; [, D7 29, 05]
-0A81; [, D7 29, 05]
-0B01; [, D7 29, 05]
-0C01; [, D7 29, 05]
-1B00; [, D7 29, 05]
-1B01; [, D7 29, 05]
-A980; [, D7 29, 05]
-11000; [, D7 29, 05]
-11080; [, D7 29, 05]
-11100; [, D7 29, 05]
-11180; [, D7 29, 05]
-0902; [, D7 39, 05]
-0982; [, D7 39, 05]
-0A02; [, D7 39, 05]
-0A82; [, D7 39, 05]
-0B02; [, D7 39, 05]
-0B82; [, D7 39, 05]
-0C02; [, D7 39, 05]
-0C82; [, D7 39, 05]
-0D02; [, D7 39, 05]
-0D82; [, D7 39, 05]
-0F7E; [, D7 39, 05]
-1036; [, D7 39, 05]
-17C6; [, D7 39, 05]
-1A74; [, D7 39, 05]
-1B02; [, D7 39, 05]
-1B80; [, D7 39, 05]
-1CED; [, D7 39, 05]
-A80B; [, D7 39, 05]
-A880; [, D7 39, 05]
-A981; [, D7 39, 05]
-10A0E; [, D7 39, 05]
-11001; [, D7 39, 05]
-11081; [, D7 39, 05]
-11101; [, D7 39, 05]
-11181; [, D7 39, 05]
-116AB; [, D7 39, 05]
-0903; [, D7 49, 05]
-0983; [, D7 49, 05]
-0A03; [, D7 49, 05]
-0A83; [, D7 49, 05]
-0B03; [, D7 49, 05]
-0C03; [, D7 49, 05]
-0C83; [, D7 49, 05]
-0D03; [, D7 49, 05]
-0D83; [, D7 49, 05]
-0F7F; [, D7 49, 05]
-1038; [, D7 49, 05]
-17C7; [, D7 49, 05]
-1B04; [, D7 49, 05]
-1B82; [, D7 49, 05]
-1CF2; [, D7 49, 05]
-1CF3; [, D7 49, 05]
-A881; [, D7 49, 05]
-A983; [, D7 49, 05]
-10A0F; [, D7 49, 05]
-11002; [, D7 49, 05]
-11082; [, D7 49, 05]
-11102; [, D7 49, 05]
-11182; [, D7 49, 05]
-116AC; [, D7 49, 05]
-0A70; [, D7 59, 05]
-0A71; [, D7 69, 05]
-1B03; [, D7 79, 05]
-A982; [, D7 89, 05]
-1B81; [, D7 99, 05]
-ABEC; [, D7 A9, 05]
-10A38; [, D7 B9, 05]
-10A39; [, D7 C9, 05]
-10A3A; [, D7 D9, 05]
-0E4E; [, D7 E9, 05]
-0E47; [, D7 F9, 05]
-0E48; [, D8 0D, 05]
-0E49; [, D8 1D, 05]
-0E4A; [, D8 2D, 05]
-0E4B; [, D8 3D, 05]
-0E4C; [, D8 4D, 05]
-0E4D; [, D8 5D, 05]
-0EC8; [, D8 6D, 05]
-0EC9; [, D8 7D, 05]
-0ECA; [, D8 8D, 05]
-0ECB; [, D8 9D, 05]
-0ECC; [, D8 AD, 05]
-0ECD; [, D8 BD, 05]
-AABF; [, D8 CD, 05]
-AAC1; [, D8 DD, 05]
-0F39; [, D8 ED, 05]
-A92B; [, D8 FD, 05]
-A92C; [, D9 11, 05]
-A92D; [, D9 21, 05]
-1037; [, D9 31, 05]
-108D; [, D9 41, 05]
-17C8; [, D9 51, 05]
-17C9; [, D9 61, 05]
-17CA; [, D9 71, 05]
-1A75; [, D9 81, 05]
-1A76; [, D9 91, 05]
-1A77; [, D9 A1, 05]
-1A78; [, D9 B1, 05]
-1A79; [, D9 C1, 05]
-1A7A; [, D9 D1, 05]
-1A7B; [, D9 E1, 05]
-1A7C; [, D9 F1, 05]
-1939; [, DA 05, 05]
-193A; [, DA 15, 05]
-193B; [, DA 25, 05]
-302A; [, DA 35, 05]
-302B; [, DA 45, 05]
-302C; [, DA 55, 05]
-302D; [, DA 65, 05]
-302E; [, DA 75, 05]
-302F; [, DA 85, 05]
-3099; [, DA 95, 05]
-FF9E; [, DA 95, A3]
-309A; [, DA A5, 05]
-FF9F; [, DA A5, A3]
-20D0; [, DA B5, 05]
-20D1; [, DA C5, 05]
-20D2; [, DA D5, 05]
-20D3; [, DA D5, 05]
-20D4; [, DA E5, 05]
-20D5; [, DA F5, 05]
-20D6; [, DB 09, 05]
-20D7; [, DB 19, 05]
-20DB; [, DB 29, 05]
-20DC; [, DB 39, 05]
-20E1; [, DB 49, 05]
-20E6; [, DB 59, 05]
-20E7; [, DB 69, 05]
-20E8; [, DB 79, 05]
-20E9; [, DB 89, 05]
-101FD; [, DB 99, 05]
-
-0009; [03 40, 05, 05]
-
-000A; [03 42, 05, 05]
-
-000B; [03 44, 05, 05]
-
-000C; [03 46, 05, 05]
-
-000D; [03 48, 05, 05]
-
-0085; [03 4A, 05, 05]
-
-180E; [03 4C, 05, 05]
-
-2028; [03 4E, 05, 05]
-
-2029; [03 50, 05, 05]
+0332; [, 82, 05]
+0313; [, 84, 05]
+0343; [, 84, 05]
+0486; [, 84, 05]
+2CF1; [, 84, 05]
+0314; [, 86, 05]
+0485; [, 86, 05]
+2CF0; [, 86, 05]
+0301; [, 88, 05]
+0341; [, 88, 05]
+0954; [, 88, 05]
+0300; [, 8A, 05]
+0340; [, 8A, 05]
+0953; [, 8A, 05]
+0306; [, 8C, 05]
+0302; [, 8E, 05]
+030C; [, 90, 05]
+030A; [, 92, 05]
+0342; [, 94, 05]
+0308; [, 96, 05]
+0344; [, 96, 05][, 88, 05]
+030B; [, 98, 05]
+0303; [, 9A, 05]
+0307; [, 9C, 05]
+0338; [, 9E, 05]
+0327; [, A0, 05]
+0328; [, A2, 05]
+0304; [, A4, 05]
+030D; [, A6, 05]
+030E; [, A6, 05]
+0312; [, A6, 05]
+0315; [, A6, 05]
+031A; [, A6, 05]
+033D; [, A6, 05]
+033E; [, A6, 05]
+033F; [, A6, 05]
+0346; [, A6, 05]
+034A; [, A6, 05]
+034B; [, A6, 05]
+034C; [, A6, 05]
+0350; [, A6, 05]
+0351; [, A6, 05]
+0352; [, A6, 05]
+0357; [, A6, 05]
+035B; [, A6, 05]
+035D; [, A6, 05]
+035E; [, A6, 05]
+0484; [, A6, 05]
+0487; [, A6, 05]
+0741; [, A6, 05]
+0745; [, A6, 05]
+17CB; [, A6, 05]
+17CC; [, A6, 05]
+17CD; [, A6, 05]
+17CE; [, A6, 05]
+17CF; [, A6, 05]
+17D0; [, A6, 05]
+17D1; [, A6, 05]
+17DD; [, A6, 05]
+1DC0; [, A6, 05]
+1DC1; [, A6, 05]
+1DC3; [, A6, 05]
+1DC4; [, A6, 05]
+1DC5; [, A6, 05]
+1DC6; [, A6, 05]
+1DC7; [, A6, 05]
+1DC8; [, A6, 05]
+1DC9; [, A6, 05]
+1DCB; [, A6, 05]
+1DCC; [, A6, 05]
+1DCD; [, A6, 05]
+1DCE; [, A6, 05]
+1DD1; [, A6, 05]
+1DFE; [, A6, 05]
+20F0; [, A6, 05]
+2CEF; [, A6, 05]
+A67C; [, A6, 05]
+A67D; [, A6, 05]
+0316; [, A8, 05]
+0317; [, A8, 05]
+0318; [, A8, 05]
+0319; [, A8, 05]
+031C; [, A8, 05]
+031D; [, A8, 05]
+031E; [, A8, 05]
+031F; [, A8, 05]
+0320; [, A8, 05]
+0329; [, A8, 05]
+032A; [, A8, 05]
+032B; [, A8, 05]
+032C; [, A8, 05]
+032F; [, A8, 05]
+0333; [, A8, 05]
+033A; [, A8, 05]
+033B; [, A8, 05]
+033C; [, A8, 05]
+0347; [, A8, 05]
+0348; [, A8, 05]
+0349; [, A8, 05]
+034D; [, A8, 05]
+034E; [, A8, 05]
+0353; [, A8, 05]
+0354; [, A8, 05]
+0355; [, A8, 05]
+0356; [, A8, 05]
+0359; [, A8, 05]
+035A; [, A8, 05]
+035C; [, A8, 05]
+035F; [, A8, 05]
+0362; [, A8, 05]
+0742; [, A8, 05]
+0746; [, A8, 05]
+0859; [, A8, 05]
+085A; [, A8, 05]
+085B; [, A8, 05]
+1DC2; [, A8, 05]
+1DCF; [, A8, 05]
+1DD0; [, A8, 05]
+1DFC; [, A8, 05]
+1DFD; [, A8, 05]
+1DFF; [, A8, 05]
+20EC; [, A8, 05]
+20ED; [, A8, 05]
+20EE; [, A8, 05]
+20EF; [, A8, 05]
+10A0D; [, A8, 05]
+0336; [, AA, 05]
+0337; [, AA, 05]
+20D8; [, AA, 05]
+20D9; [, AA, 05]
+20DA; [, AA, 05]
+20E5; [, AA, 05]
+20EA; [, AA, 05]
+20EB; [, AA, 05]
+20DD; [, AC, 05]
+20DE; [, AC, 05]
+20DF; [, AC, 05]
+20E0; [, AC, 05]
+20E2; [, AC, 05]
+20E3; [, AC, 05]
+20E4; [, AC, 05]
+3099; [, AE, 05]
+FF9E; [, AE, A0]
+309A; [, B0, 05]
+FF9F; [, B0, A0]
+0335; [, B2, 05]
+0305; [, B4, 05]
+0309; [, B6, 05]
+030F; [, B8, 05]
+0310; [, BA, 05]
+0311; [, BC, 05]
+031B; [, BE, 05]
+0321; [, C0, 05]
+0322; [, C2, 05]
+0323; [, C4, 05]
+0324; [, C6, 05]
+0325; [, C8, 05]
+0326; [, CA, 05]
+032D; [, CC, 05]
+032E; [, CE, 05]
+0330; [, D0, 05]
+0331; [, D2, 05]
+0334; [, D4, 05]
+0339; [, D6, 05]
+0345; [, D8, 05]
+0358; [, DA, 05]
+0360; [, DC, 05]
+FE22; [, DC, 05]
+0361; [, DE, 05]
+FE20; [, DE, 05]
+0483; [, E0, 05]
+A66F; [, E2, 05]
+05B0; [, E4, 05]
+05B1; [, E6 02, 05]
+05B2; [, E6 22, 05]
+05B3; [, E6 42, 05]
+05B4; [, E6 62, 05]
+05B5; [, E6 82, 05]
+05B6; [, E6 A2, 05]
+05B7; [, E6 C2, 05]
+05B8; [, E6 E2, 05]
+05C7; [, E6 E2, 05]
+05B9; [, E7 04, 05]
+05BA; [, E7 04, 05]
+05BB; [, E7 24, 05]
+05C2; [, E7 44, 05]
+05C1; [, E7 64, 05]
+05BC; [, E7 84, 05]
+05BF; [, E7 A4, 05]
+FB1E; [, E7 C4, 05]
+081C; [, E7 E4, 05]
+081D; [, E7 E4, 05]
+081E; [, E8 06, 05]
+081F; [, E8 06, 05]
+0820; [, E8 06, 05]
+0821; [, E8 26, 05]
+0822; [, E8 26, 05]
+0823; [, E8 26, 05]
+0824; [, E8 46, 05]
+0825; [, E8 46, 05]
+0826; [, E8 66, 05]
+0827; [, E8 66, 05]
+0828; [, E8 86, 05]
+0829; [, E8 86, 05]
+082A; [, E8 86, 05]
+082B; [, E8 A6, 05]
+082C; [, E8 C6, 05]
+0818; [, E8 E6, 05]
+0819; [, E9 08, 05]
+082D; [, E9 28, 05]
+064B; [, E9 48, 05]
+FE71; [, E9 48, 10]
+FE70; [, E9 48, 2C]
+08F0; [, E9 68, 05]
+08E7; [, E9 88, 05]
+064C; [, E9 A8, 05]
+FE72; [, E9 A8, 20]
+FC5E; [, E9 A8, 20][, EB AC, 2E]
+08F1; [, E9 C8, 05]
+08E8; [, E9 E8, 05]
+064D; [, EA 0A, 05]
+FE74; [, EA 0A, 20]
+FC5F; [, EA 0A, 20][, EB AC, 2E]
+08F2; [, EA 2A, 05]
+08E9; [, EA 4A, 05]
+064E; [, EA 6A, 05]
+FE77; [, EA 6A, 20]
+FE76; [, EA 6A, 2E]
+FCF2; [, EA 6A, 20][, EB AC, 20]
+FC60; [, EA 6A, 2E][, EB AC, 2E]
+08E4; [, EA 8A, 05]
+08F4; [, EA AA, 05]
+08F5; [, EA CA, 05]
+064F; [, EA EA, 05]
+FE79; [, EA EA, 20]
+FE78; [, EA EA, 2E]
+FCF3; [, EA EA, 20][, EB AC, 20]
+FC61; [, EA EA, 2E][, EB AC, 2E]
+08E5; [, EB 0C, 05]
+08FE; [, EB 2C, 05]
+0650; [, EB 4C, 05]
+FE7B; [, EB 4C, 20]
+FE7A; [, EB 4C, 2E]
+FCF4; [, EB 4C, 20][, EB AC, 20]
+FC62; [, EB 4C, 2E][, EB AC, 2E]
+08E6; [, EB 6C, 05]
+08F6; [, EB 8C, 05]
+0651; [, EB AC, 05]
+FE7D; [, EB AC, 20]
+FE7C; [, EB AC, 2E]
+FC63; [, EB AC, 2E][, EE 72, 2C]
+0652; [, EB CC, 05]
+FE7F; [, EB CC, 20]
+FE7E; [, EB CC, 2E]
+0653; [, EB EC, 05]
+0654; [, EC 0E, 05]
+0655; [, EC 2E, 05]
+065F; [, EC 4E, 05]
+0656; [, EC 6E, 05]
+0657; [, EC 8E, 05]
+0658; [, EC AE, 05]
+0659; [, EC CE, 05]
+065A; [, EC EE, 05]
+065B; [, ED 10, 05]
+065C; [, ED 30, 05]
+065D; [, ED 50, 05]
+065E; [, ED 70, 05]
+08F7; [, ED 90, 05]
+08F8; [, ED B0, 05]
+08FD; [, ED D0, 05]
+08FB; [, ED F0, 05]
+08FC; [, EE 12, 05]
+08F9; [, EE 32, 05]
+08FA; [, EE 52, 05]
+0670; [, EE 72, 05]
+0711; [, EE 92, 05]
+0730; [, EE B2, 05]
+0731; [, EE D2, 05]
+0732; [, EE F2, 05]
+0733; [, EF 14, 05]
+0734; [, EF 34, 05]
+0735; [, EF 54, 05]
+0736; [, EF 74, 05]
+0737; [, EF 94, 05]
+0738; [, EF B4, 05]
+0739; [, EF D4, 05]
+073A; [, EF F4, 05]
+073B; [, F0 16, 05]
+073C; [, F0 36, 05]
+073D; [, F0 56, 05]
+073E; [, F0 76, 05]
+073F; [, F0 96, 05]
+07EB; [, F0 B6, 05]
+07EC; [, F0 D6, 05]
+07ED; [, F0 F6, 05]
+07EE; [, F1 18, 05]
+07EF; [, F1 38, 05]
+07F0; [, F1 58, 05]
+07F1; [, F1 78, 05]
+07F2; [, F1 98, 05]
+07F3; [, F1 B8, 05]
+135F; [, F1 D8, 05]
+135E; [, F1 F8, 05]
+135D; [, F2 1A, 05]
+A6F0; [, F2 3A, 05]
+A6F1; [, F2 5A, 05]
+093C; [, F2 7A, 05]
+09BC; [, F2 7A, 05]
+0A3C; [, F2 7A, 05]
+0ABC; [, F2 7A, 05]
+0B3C; [, F2 7A, 05]
+0CBC; [, F2 7A, 05]
+1B34; [, F2 7A, 05]
+1BE6; [, F2 7A, 05]
+1C37; [, F2 7A, 05]
+A9B3; [, F2 7A, 05]
+110BA; [, F2 7A, 05]
+116B7; [, F2 7A, 05]
+0900; [, F2 9A, 05]
+0901; [, F2 9A, 05]
+0981; [, F2 9A, 05]
+0A01; [, F2 9A, 05]
+0A81; [, F2 9A, 05]
+0B01; [, F2 9A, 05]
+0C01; [, F2 9A, 05]
+1B00; [, F2 9A, 05]
+1B01; [, F2 9A, 05]
+A980; [, F2 9A, 05]
+11000; [, F2 9A, 05]
+11080; [, F2 9A, 05]
+11100; [, F2 9A, 05]
+11180; [, F2 9A, 05]
+0902; [, F2 BA, 05]
+0982; [, F2 BA, 05]
+0A02; [, F2 BA, 05]
+0A82; [, F2 BA, 05]
+0B02; [, F2 BA, 05]
+0B82; [, F2 BA, 05]
+0C02; [, F2 BA, 05]
+0C82; [, F2 BA, 05]
+0D02; [, F2 BA, 05]
+0D82; [, F2 BA, 05]
+0F7E; [, F2 BA, 05]
+1036; [, F2 BA, 05]
+17C6; [, F2 BA, 05]
+1A74; [, F2 BA, 05]
+1B02; [, F2 BA, 05]
+1B80; [, F2 BA, 05]
+1CED; [, F2 BA, 05]
+A80B; [, F2 BA, 05]
+A880; [, F2 BA, 05]
+A981; [, F2 BA, 05]
+10A0E; [, F2 BA, 05]
+11001; [, F2 BA, 05]
+11081; [, F2 BA, 05]
+11101; [, F2 BA, 05]
+11181; [, F2 BA, 05]
+116AB; [, F2 BA, 05]
+0903; [, F2 DA, 05]
+0983; [, F2 DA, 05]
+0A03; [, F2 DA, 05]
+0A83; [, F2 DA, 05]
+0B03; [, F2 DA, 05]
+0C03; [, F2 DA, 05]
+0C83; [, F2 DA, 05]
+0D03; [, F2 DA, 05]
+0D83; [, F2 DA, 05]
+0F7F; [, F2 DA, 05]
+1038; [, F2 DA, 05]
+17C7; [, F2 DA, 05]
+1B04; [, F2 DA, 05]
+1B82; [, F2 DA, 05]
+1CF2; [, F2 DA, 05]
+1CF3; [, F2 DA, 05]
+A881; [, F2 DA, 05]
+A983; [, F2 DA, 05]
+10A0F; [, F2 DA, 05]
+11002; [, F2 DA, 05]
+11082; [, F2 DA, 05]
+11102; [, F2 DA, 05]
+11182; [, F2 DA, 05]
+116AC; [, F2 DA, 05]
+0A70; [, F2 FA, 05]
+0A71; [, F3 1C, 05]
+1B03; [, F3 3C, 05]
+A982; [, F3 5C, 05]
+1B81; [, F3 7C, 05]
+ABEC; [, F3 9C, 05]
+10A38; [, F3 BC, 05]
+10A39; [, F3 DC, 05]
+10A3A; [, F3 FC, 05]
+0E4E; [, F4 1E, 05]
+0E47; [, F4 3E, 05]
+0E48; [, F4 5E, 05]
+0E49; [, F4 7E, 05]
+0E4A; [, F4 9E, 05]
+0E4B; [, F4 BE, 05]
+0E4C; [, F4 DE, 05]
+0E4D; [, F4 FE, 05]
+0EC8; [, F5 20, 05]
+0EC9; [, F5 40, 05]
+0ECA; [, F5 60, 05]
+0ECB; [, F5 80, 05]
+0ECC; [, F5 A0, 05]
+0ECD; [, F5 C0, 05]
+AABF; [, F5 E0, 05]
+AAC1; [, F6 02, 05]
+0F39; [, F6 22, 05]
+A92B; [, F6 42, 05]
+A92C; [, F6 62, 05]
+A92D; [, F6 82, 05]
+1037; [, F6 A2, 05]
+108D; [, F6 C2, 05]
+17C8; [, F6 E2, 05]
+17C9; [, F7 04, 05]
+17CA; [, F7 24, 05]
+1A75; [, F7 44, 05]
+1A76; [, F7 64, 05]
+1A77; [, F7 84, 05]
+1A78; [, F7 A4, 05]
+1A79; [, F7 C4, 05]
+1A7A; [, F7 E4, 05]
+1A7B; [, F8 06, 05]
+1A7C; [, F8 26, 05]
+1939; [, F8 46, 05]
+193A; [, F8 66, 05]
+193B; [, F8 86, 05]
+302A; [, F8 A6, 05]
+302B; [, F8 C6, 05]
+302C; [, F8 E6, 05]
+302D; [, F9 08, 05]
+302E; [, F9 28, 05]
+302F; [, F9 48, 05]
+20D0; [, F9 68, 05]
+20D1; [, F9 88, 05]
+20D2; [, F9 A8, 05]
+20D3; [, F9 A8, 05]
+20D4; [, F9 C8, 05]
+20D5; [, F9 E8, 05]
+20D6; [, FA 0A, 05]
+20D7; [, FA 2A, 05]
+20DB; [, FA 4A, 05]
+20DC; [, FA 6A, 05]
+20E1; [, FA 8A, 05]
+20E6; [, FA AA, 05]
+20E7; [, FA CA, 05]
+20E8; [, FA EA, 05]
+20E9; [, FB 0C, 05]
+101FD; [, FB 2C, 05]
+004C | 00B7; [, FB 4C, 05]
+006C | 00B7; [, FB 4C, 05]
+004C | 0387; [, FB 4C, 05]
+006C | 0387; [, FB 4C, 05]
+
+FDD1 00A0;     [03 02 02, 05, 05]      # SPACE first primary starts reordering group
+
+0009; [03 07, 05, 05]
+
+000A; [03 09, 05, 05]
+
+000B; [03 0B, 05, 05]
+
+000C; [03 0D, 05, 05]
+
+000D; [03 0F, 05, 05]
+
+0085; [03 11, 05, 05]
+
+2028; [03 13, 05, 05]
+
+2029; [03 15, 05, 05]
 
 0020; [04, 05, 05]
-3000; [04, 05, 07]
-1680; [04, 05, 09]
-2000; [04, 05, 09]
-2001; [04, 05, 09]
-2002; [04, 05, 09]
-2003; [04, 05, 09]
-2004; [04, 05, 09]
-2005; [04, 05, 09]
-2006; [04, 05, 09]
-2008; [04, 05, 09]
-2009; [04, 05, 09]
-200A; [04, 05, 09]
-205F; [04, 05, 09]
-00A0; [04, 05, 35]
-2007; [04, 05, 35]
-202F; [04, 05, 35]
+3000; [04, 05, 10]
+1680; [04, 05, 1B]
+2000; [04, 05, 1B]
+2001; [04, 05, 1B]
+2002; [04, 05, 1B]
+2003; [04, 05, 1B]
+2004; [04, 05, 1B]
+2005; [04, 05, 1B]
+2006; [04, 05, 1B]
+2008; [04, 05, 1B]
+2009; [04, 05, 1B]
+200A; [04, 05, 1B]
+205F; [04, 05, 1B]
+00A0; [04, 05, 31]
+2007; [04, 05, 31]
+202F; [04, 05, 31]
 
-203E; [06 40, 05, 05]
-FE49; [06 40, 05, 09]
-FE4A; [06 40, 05, 09]
-FE4B; [06 40, 05, 09]
-FE4C; [06 40, 05, 09]
+FDD1 201C;     [06 02 02, 05, 05]      # PUNCTUATION first primary starts reordering group
 
-005F; [06 42, 05, 05]
-FF3F; [06 42, 05, 07]
-FE4D; [06 42, 05, 09]
-FE4E; [06 42, 05, 09]
-FE4F; [06 42, 05, 09]
-FE33; [06 42, 05, 2B]
-FE34; [06 42, 05, 2B]
+203E; [06 07, 05, 05]
+FE49; [06 07, 05, 20]
+FE4A; [06 07, 05, 20]
+FE4B; [06 07, 05, 20]
+FE4C; [06 07, 05, 20]
 
-2017; [06 44, 05, 05]
+005F; [06 09, 05, 05]
+FF3F; [06 09, 05, 10]
+FE4D; [06 09, 05, 1E]
+FE4E; [06 09, 05, 1E]
+FE4F; [06 09, 05, 1E]
+FE33; [06 09, 05, 2C]
+FE34; [06 09, 05, 2C]
 
-002D; [06 46, 05, 05]
-FF0D; [06 46, 05, 07]
-FE63; [06 46, 05, 1D]
+2017; [06 0B, 05, 05]
 
-058A; [06 48, 05, 05]
+002D; [06 0D, 05, 05]
+FF0D; [06 0D, 05, 20]
+FE63; [06 0D, 05, 2E]
 
-1400; [06 4A 04, 05, 05]
+058A; [06 0F, 05, 05]
 
-1B60; [06 4A 0C, 05, 05]
+1400; [06 11 02, 05, 05]
 
-1806; [06 4A 14, 05, 05]
+1B60; [06 11 0A, 05, 05]
 
-1807; [06 4A 1C, 05, 05]
+1806; [06 11 12, 05, 05]
 
-2010; [06 4B, 05, 05]
-2011; [06 4B, 05, 35]
+1807; [06 11 1A, 05, 05]
 
-2012; [06 4D, 05, 05]
+2010; [06 13, 05, 05]
+2011; [06 13, 05, 20]
 
-2013; [06 4F, 05, 05]
-FE32; [06 4F, 05, 2B]
+2012; [06 15, 05, 05]
 
-2014; [06 51, 05, 05]
-FE58; [06 51, 05, 1D]
-FE31; [06 51, 05, 2B]
+2013; [06 17, 05, 05]
+FE32; [06 17, 05, 20]
 
-2015; [06 53, 05, 05]
+2014; [06 19, 05, 05]
+FE58; [06 19, 05, 20]
+FE31; [06 19, 05, 2E]
 
-2E3A; [06 55, 05, 05]
+2015; [06 1B, 05, 05]
 
-2E3B; [06 57, 05, 05]
+2E3A; [06 1D, 05, 05]
 
-2053; [06 59, 05, 05]
+2E3B; [06 1F, 05, 05]
 
-2E17; [06 5B, 05, 05]
+2053; [06 21, 05, 05]
 
-301C; [06 5D, 05, 05]
+2E17; [06 23, 05, 05]
 
-3030; [06 5F, 05, 05]
+301C; [06 25, 05, 05]
 
-30A0; [06 61, 05, 05]
+3030; [06 27, 05, 05]
 
-30FB; [06 63, 05, 05]
-FF65; [06 63, 05, A3]
+30A0; [06 29, 05, 05]
+
+30FB; [06 2B, 05, 05]
+FF65; [06 2B, 05, A0]
 
 002C; [07, 05, 05]
-FF0C; [07, 05, 07]
-FE50; [07, 05, 1D]
-FE10; [07, 05, 2B]
+FF0C; [07, 05, 10]
+FE50; [07, 05, 26]
+FE10; [07, 05, 31]
 
-2E34; [08 40, 05, 05]
+2E34; [08 06, 05, 05]
 
-2E32; [08 42, 05, 05]
+2E32; [08 08, 05, 05]
 
-055D; [08 44, 05, 05]
+055D; [08 0A, 05, 05]
 
-060C; [08 46, 05, 05]
+060C; [08 0C, 05, 05]
 
-060D; [08 48, 05, 05]
+060D; [08 0E, 05, 05]
 
-066B; [08 4A, 05, 05]
+066B; [08 10, 05, 05]
 
-066C; [08 4C, 05, 05]
+066C; [08 12, 05, 05]
 
-07F8; [08 4E 04, 05, 05]
+07F8; [08 14, 05, 05]
 
-1802; [08 4F, 05, 05]
+1802; [08 16, 05, 05]
 
-1808; [08 51 04, 05, 05]
+1808; [08 18 02, 05, 05]
 
-A4FE; [08 51 0C, 05, 05]
+A4FE; [08 18 0A, 05, 05]
 
-A60D; [08 51 14, 05, 05]
+A60D; [08 18 12, 05, 05]
 
-A6F5; [08 51 1C, 05, 05]
+A6F5; [08 18 1A, 05, 05]
 
-3001; [08 52, 05, 05]
-FE51; [08 52, 05, 1D]
-FF64; [08 52, 05, A3]
-FE11; [08 52, 05, 2B]
+3001; [08 1A, 05, 05]
+FE51; [08 1A, 05, 10]
+FF64; [08 1A, 05, 9E]
+FE11; [08 1A, 05, 2C]
 
-FE45; [08 54, 05, 05]
+FE45; [08 1C, 05, 05]
 
-FE46; [08 56, 05, 05]
+FE46; [08 1E, 05, 05]
 
-003B; [08 58, 05, 05]
-037E; [08 58, 05, 05]
-FF1B; [08 58, 05, 07]
-FE54; [08 58, 05, 1D]
-FE14; [08 58, 05, 2B]
+003B; [08 20, 05, 05]
+037E; [08 20, 05, 05]
+FF1B; [08 20, 05, 10]
+FE54; [08 20, 05, 1E]
+FE14; [08 20, 05, 2C]
 
-061B; [08 5A, 05, 05]
+061B; [08 22, 05, 05]
 
-204F; [08 5C, 05, 05]
+204F; [08 24, 05, 05]
 
-2E35; [08 5E, 05, 05]
+2E35; [08 26, 05, 05]
 
-A6F6; [08 60 04, 05, 05]
+A6F6; [08 28, 05, 05]
 
-003A; [08 61, 05, 05]
-FF1A; [08 61, 05, 07]
-FE55; [08 61, 05, 1D]
-FE13; [08 61, 05, 2B]
-2A74; [08 61, 05, 09][08 61, 05, 09][0D 69, 05, 3D]
+003A; [08 2A, 05, 05]
+FF1A; [08 2A, 05, 10]
+FE55; [08 2A, 05, 26]
+FE13; [08 2A, 05, 31]
+2A74; [08 2A, 05, 1B][08 2A, 05, 1B][0D 72, 05, 18]
 
-0589; [08 63, 05, 05]
+0589; [08 2C, 05, 05]
 
-061E; [08 65, 05, 05]
+061E; [08 2E, 05, 05]
 
-0703; [08 67 04, 05, 05]
+0703; [08 30 02, 05, 05]
 
-0704; [08 67 0C, 05, 05]
+0704; [08 30 0A, 05, 05]
 
-0705; [08 67 14, 05, 05]
+0705; [08 30 12, 05, 05]
 
-0706; [08 67 1C, 05, 05]
+0706; [08 30 1A, 05, 05]
 
-0707; [08 67 24, 05, 05]
+0707; [08 30 22, 05, 05]
 
-0708; [08 67 2C, 05, 05]
+0708; [08 30 2A, 05, 05]
 
-0830; [08 67 34, 05, 05]
+0830; [08 30 32, 05, 05]
 
-0831; [08 67 3C, 05, 05]
+0831; [08 30 3A, 05, 05]
 
-0832; [08 67 44, 05, 05]
+0832; [08 30 42, 05, 05]
 
-0833; [08 67 4C, 05, 05]
+0833; [08 30 4A, 05, 05]
 
-0834; [08 67 54, 05, 05]
+0834; [08 30 52, 05, 05]
 
-0835; [08 67 5C, 05, 05]
+0835; [08 30 5A, 05, 05]
 
-0836; [08 67 64, 05, 05]
+0836; [08 30 62, 05, 05]
 
-0837; [08 67 6C, 05, 05]
+0837; [08 30 6A, 05, 05]
 
-0838; [08 67 74, 05, 05]
+0838; [08 30 72, 05, 05]
 
-0839; [08 67 7C, 05, 05]
+0839; [08 30 7A, 05, 05]
 
-083A; [08 67 84, 05, 05]
+083A; [08 30 82, 05, 05]
 
-083B; [08 67 8C, 05, 05]
+083B; [08 30 8A, 05, 05]
 
-083C; [08 67 94, 05, 05]
+083C; [08 30 92, 05, 05]
 
-083D; [08 67 9C, 05, 05]
+083D; [08 30 9A, 05, 05]
 
-083E; [08 67 A4, 05, 05]
+083E; [08 30 A2, 05, 05]
 
-1361; [08 68, 05, 05]
+1361; [08 32, 05, 05]
 
-1363; [08 6A, 05, 05]
+1363; [08 34, 05, 05]
 
-1364; [08 6C, 05, 05]
+1364; [08 36, 05, 05]
 
-1365; [08 6E, 05, 05]
+1365; [08 38, 05, 05]
 
-1366; [08 70, 05, 05]
+1366; [08 3A, 05, 05]
 
-1804; [08 72 04, 05, 05]
+1804; [08 3C, 05, 05]
 
-1805; [08 73, 05, 05]
+1805; [08 3E, 05, 05]
 
-0F14; [08 75, 05, 05]
+0F14; [08 40, 05, 05]
 
-17D6; [08 77, 05, 05]
+17D6; [08 42, 05, 05]
 
-1B5D; [08 79 04, 05, 05]
+1B5D; [08 44 02, 05, 05]
 
-A9C7; [08 79 0C, 05, 05]
+A9C7; [08 44 0A, 05, 05]
 
-16EB; [08 7A, 05, 05]
+16EB; [08 46, 05, 05]
 
-16EC; [08 7C, 05, 05]
+16EC; [08 48, 05, 05]
 
-16ED; [08 7E, 05, 05]
+16ED; [08 4A, 05, 05]
 
-A6F4; [08 80 04, 05, 05]
+A6F4; [08 4C, 05, 05]
 
-0021; [08 81, 05, 05]
-FF01; [08 81, 05, 07]
-FE57; [08 81, 05, 1D]
-FE15; [08 81, 05, 2B]
-203C; [08 81, 05, 09][08 81, 05, 3D]
-2049; [08 81, 05, 09][08 88, 05, 3D]
+0021; [08 4E, 05, 05]
+FF01; [08 4E, 05, 10]
+FE57; [08 4E, 05, 20]
+FE15; [08 4E, 05, 28]
+203C; [08 4E, 05, 18][08 4E, 05, 18]
+2049; [08 4E, 05, 18][08 56, 05, 1B]
 
-00A1; [08 83, 05, 05]
+00A1; [08 50, 05, 05]
 
-055C; [08 85, 05, 05]
+055C; [08 52, 05, 05]
 
-07F9; [08 87 04, 05, 05]
+07F9; [08 54 02, 05, 05]
 
-1944; [08 87 0C, 05, 05]
+1944; [08 54 0A, 05, 05]
 
-003F; [08 88, 05, 05]
-FF1F; [08 88, 05, 07]
-FE56; [08 88, 05, 1D]
-FE16; [08 88, 05, 2B]
-2048; [08 88, 05, 09][08 81, 05, 3D]
-2047; [08 88, 05, 09][08 88, 05, 3D]
+003F; [08 56, 05, 05]
+FF1F; [08 56, 05, 10]
+FE56; [08 56, 05, 26]
+FE16; [08 56, 05, 31]
+2048; [08 56, 05, 1B][08 4E, 05, 18]
+2047; [08 56, 05, 1B][08 56, 05, 1B]
 
-00BF; [08 8A, 05, 05]
+00BF; [08 58, 05, 05]
 
-2E2E; [08 8C, 05, 05]
+2E2E; [08 5A, 05, 05]
 
-055E; [08 8E, 05, 05]
+055E; [08 5C, 05, 05]
 
-061F; [08 90, 05, 05]
+061F; [08 5E, 05, 05]
 
-0709; [08 92 04, 05, 05]
+0709; [08 60, 05, 05]
 
-1367; [08 93, 05, 05]
+1367; [08 62, 05, 05]
 
-1945; [08 95 04, 05, 05]
+1945; [08 64 02, 05, 05]
 
-2CFA; [08 95 0C, 05, 05]
+2CFA; [08 64 0A, 05, 05]
 
-2CFB; [08 95 14, 05, 05]
+2CFB; [08 64 12, 05, 05]
 
-A60F; [08 95 1C, 05, 05]
+A60F; [08 64 1A, 05, 05]
 
-A6F7; [08 95 24, 05, 05]
+A6F7; [08 64 22, 05, 05]
 
-AAF1; [08 95 2C, 05, 05]
+AAF1; [08 64 2A, 05, 05]
 
-11143; [08 95 34, 05, 05]
+11143; [08 64 32, 05, 05]
 
-203D; [08 96, 05, 05]
+203D; [08 66, 05, 05]
 
-2E18; [08 98, 05, 05]
+2E18; [08 68, 05, 05]
 
 002E; [09, 05, 05]
-FF0E; [09, 05, 07]
-2024; [09, 05, 09]
-FE52; [09, 05, 1D]
-2025; [09, 05, 09][09, 05, 3D]
-FE30; [09, 05, 2B][09, 05, 3D]
-2026; [09, 05, 09][09, 05, 09][09, 05, 3D]
-FE19; [09, 05, 2B][09, 05, 2B][09, 05, 3D]
+FF0E; [09, 05, 10]
+2024; [09, 05, 18]
+FE52; [09, 05, 20]
+2025; [09, 05, 18][09, 05, 18]
+FE30; [09, 05, 28][09, 05, 28]
+2026; [09, 05, 18][09, 05, 18][09, 05, 18]
+FE19; [09, 05, 28][09, 05, 28][09, 05, 28]
+
+1801; [0A 06, 05, 05]
+
+06D4; [0A 08, 05, 05]
+
+0701; [0A 0A 02, 05, 05]
+
+0702; [0A 0A 0A, 05, 05]
 
-1801; [0A 40 04, 05, 05]
+1362; [0A 0C, 05, 05]
 
-06D4; [0A 41, 05, 05]
+1803; [0A 0E, 05, 05]
 
-0701; [0A 43 04, 05, 05]
+1809; [0A 10 02, 05, 05]
 
-0702; [0A 43 0C, 05, 05]
+166E; [0A 10 0A, 05, 05]
 
-1362; [0A 44, 05, 05]
+1B5C; [0A 10 12, 05, 05]
 
-1803; [0A 46, 05, 05]
+2CF9; [0A 10 1A, 05, 05]
 
-1809; [0A 48 04, 05, 05]
+2CFE; [0A 10 22, 05, 05]
 
-166E; [0A 48 0C, 05, 05]
+2E30; [0A 12, 05, 05]
 
-1B5C; [0A 48 14, 05, 05]
+A4FF; [0A 14 02, 05, 05]
 
-2CF9; [0A 48 1C, 05, 05]
+A60E; [0A 14 0A, 05, 05]
 
-2CFE; [0A 48 24, 05, 05]
+A6F3; [0A 14 12, 05, 05]
 
-2E30; [0A 49, 05, 05]
+3002; [0A 16, 05, 05]
+FF61; [0A 16, 05, A0]
+FE12; [0A 16, 05, 2E]
 
-A4FF; [0A 4B 04, 05, 05]
+00B7; [0A 18, 05, 05]
+0387; [0A 18, 05, 05]
 
-A60E; [0A 4B 0C, 05, 05]
+2E31; [0A 1A, 05, 05]
 
-A6F3; [0A 4B 14, 05, 05]
+2E33; [0A 1C, 05, 05]
 
-3002; [0A 4C, 05, 05]
-FF61; [0A 4C, 05, A3]
-FE12; [0A 4C, 05, 2B]
+0964; [0A 1E, 05, 05]
 
-00B7; [0A 4E, 05, 05]
-0387; [0A 4E, 05, 05]
+0965; [0A 20, 05, 05]
 
-2E31; [0A 50, 05, 05]
+A8CE; [0A 22 02, 05, 05]
 
-2E33; [0A 52, 05, 05]
+A8CF; [0A 22 0A, 05, 05]
 
-0964; [0A 54, 05, 05]
+1C3B; [0A 22 12, 05, 05]
 
-0965; [0A 56, 05, 05]
+1C3C; [0A 22 1A, 05, 05]
 
-A8CE; [0A 58 04, 05, 05]
+A876; [0A 22 22, 05, 05]
 
-A8CF; [0A 58 0C, 05, 05]
+A877; [0A 22 2A, 05, 05]
 
-1C3B; [0A 58 14, 05, 05]
+1735; [0A 24, 05, 05]
 
-1C3C; [0A 58 1C, 05, 05]
+1736; [0A 26, 05, 05]
 
-A876; [0A 58 24, 05, 05]
+A92F; [0A 28, 05, 05]
 
-A877; [0A 58 2C, 05, 05]
+104A; [0A 2A, 05, 05]
 
-1735; [0A 59, 05, 05]
+104B; [0A 2C, 05, 05]
 
-1736; [0A 5B, 05, 05]
+17D4; [0A 2E, 05, 05]
 
-A92F; [0A 5D 04, 05, 05]
+17D5; [0A 30, 05, 05]
 
-104A; [0A 5E, 05, 05]
+1AA8; [0A 32 02, 05, 05]
 
-104B; [0A 60, 05, 05]
+1AA9; [0A 32 0A, 05, 05]
 
-17D4; [0A 62, 05, 05]
+1AAA; [0A 32 12, 05, 05]
 
-17D5; [0A 64, 05, 05]
+1AAB; [0A 32 1A, 05, 05]
 
-1AA8; [0A 66 04, 05, 05]
+1B5E; [0A 32 22, 05, 05]
 
-1AA9; [0A 66 0C, 05, 05]
+1B5F; [0A 32 2A, 05, 05]
 
-1AAA; [0A 66 14, 05, 05]
+A9C8; [0A 32 32, 05, 05]
 
-1AAB; [0A 66 1C, 05, 05]
+A9C9; [0A 32 3A, 05, 05]
 
-1B5E; [0A 66 24, 05, 05]
+AA5D; [0A 32 42, 05, 05]
 
-1B5F; [0A 66 2C, 05, 05]
+AA5E; [0A 32 4A, 05, 05]
 
-A9C8; [0A 66 34, 05, 05]
+AA5F; [0A 32 52, 05, 05]
 
-A9C9; [0A 66 3C, 05, 05]
+AAF0; [0A 32 5A, 05, 05]
 
-AA5D; [0A 66 44, 05, 05]
+ABEB; [0A 32 62, 05, 05]
 
-AA5E; [0A 66 4C, 05, 05]
+10A56; [0A 32 6A, 05, 05]
 
-AA5F; [0A 66 54, 05, 05]
+10A57; [0A 32 72, 05, 05]
 
-AAF0; [0A 66 5C, 05, 05]
+11047; [0A 32 7A, 05, 05]
 
-ABEB; [0A 66 64, 05, 05]
+11048; [0A 32 82, 05, 05]
 
-10A56; [0A 66 6C, 05, 05]
+110C0; [0A 32 8A, 05, 05]
 
-10A57; [0A 66 74, 05, 05]
+110C1; [0A 32 92, 05, 05]
 
-11047; [0A 66 7C, 05, 05]
+11141; [0A 32 9A, 05, 05]
 
-11048; [0A 66 84, 05, 05]
+11142; [0A 32 A2, 05, 05]
 
-110C0; [0A 66 8C, 05, 05]
+111C5; [0A 32 AA, 05, 05]
 
-110C1; [0A 66 94, 05, 05]
+111C6; [0A 32 B2, 05, 05]
 
-11141; [0A 66 9C, 05, 05]
+1C7E; [0A 32 BA, 05, 05]
 
-11142; [0A 66 A4, 05, 05]
+1C7F; [0A 32 C2, 05, 05]
 
-111C5; [0A 66 AC, 05, 05]
+0700; [0A 32 CA, 05, 05]
 
-111C6; [0A 66 B4, 05, 05]
+07F7; [0A 32 D2, 05, 05]
 
-1C7E; [0A 66 BC, 05, 05]
+10FB; [0A 34, 05, 05]
 
-1C7F; [0A 66 C4, 05, 05]
+1360; [0A 36, 05, 05]
 
-0700; [0A 66 CC, 05, 05]
+1368; [0A 38, 05, 05]
 
-07F7; [0A 66 D4, 05, 05]
+1A1E; [0A 3A 02, 05, 05]
 
-10FB; [0A 67, 05, 05]
+1A1F; [0A 3A 0A, 05, 05]
 
-1360; [0A 69, 05, 05]
+1B5A; [0A 3A 12, 05, 05]
 
-1368; [0A 6B, 05, 05]
+1B5B; [0A 3A 1A, 05, 05]
 
-1A1E; [0A 6D 04, 05, 05]
+A9C1; [0A 3A 22, 05, 05]
 
-1A1F; [0A 6D 0C, 05, 05]
+A9C2; [0A 3A 2A, 05, 05]
 
-1B5A; [0A 6D 14, 05, 05]
+A9C3; [0A 3A 32, 05, 05]
 
-1B5B; [0A 6D 1C, 05, 05]
+A9C4; [0A 3A 3A, 05, 05]
 
-A9C1; [0A 6D 24, 05, 05]
+A9C5; [0A 3A 42, 05, 05]
 
-A9C2; [0A 6D 2C, 05, 05]
+A9C6; [0A 3A 4A, 05, 05]
 
-A9C3; [0A 6D 34, 05, 05]
+A9CA; [0A 3A 52, 05, 05]
 
-A9C4; [0A 6D 3C, 05, 05]
+A9CB; [0A 3A 5A, 05, 05]
 
-A9C5; [0A 6D 44, 05, 05]
+A9CC; [0A 3A 62, 05, 05]
 
-A9C6; [0A 6D 4C, 05, 05]
+A9CD; [0A 3A 6A, 05, 05]
 
-A9CA; [0A 6D 54, 05, 05]
+A6F2; [0A 3A 72, 05, 05]
 
-A9CB; [0A 6D 5C, 05, 05]
+A95F; [0A 3A 7A, 05, 05]
 
-A9CC; [0A 6D 64, 05, 05]
+10857; [0A 3A 82, 05, 05]
 
-A9CD; [0A 6D 6C, 05, 05]
+10B3A; [0A 3A 8A, 05, 05]
 
-A6F2; [0A 6D 74, 05, 05]
+10B3B; [0A 3A 92, 05, 05]
 
-A95F; [0A 6D 7C, 05, 05]
+10B3C; [0A 3A 9A, 05, 05]
 
-10857; [0A 6D 84, 05, 05]
+10B3D; [0A 3A A2, 05, 05]
 
-10B3A; [0A 6D 8C, 05, 05]
+10B3E; [0A 3A AA, 05, 05]
 
-10B3B; [0A 6D 94, 05, 05]
+10B3F; [0A 3A B2, 05, 05]
 
-10B3C; [0A 6D 9C, 05, 05]
+110BE; [0A 3A BA, 05, 05]
 
-10B3D; [0A 6D A4, 05, 05]
+110BF; [0A 3A C2, 05, 05]
 
-10B3E; [0A 6D AC, 05, 05]
+11140; [0A 3A CA, 05, 05]
 
-10B3F; [0A 6D B4, 05, 05]
+111C8; [0A 3A D2, 05, 05]
 
-110BE; [0A 6D BC, 05, 05]
+2055; [0A 3C, 05, 05]
 
-110BF; [0A 6D C4, 05, 05]
+2056; [0A 3E, 05, 05]
 
-11140; [0A 6D CC, 05, 05]
+2058; [0A 40, 05, 05]
 
-111C8; [0A 6D D4, 05, 05]
+2059; [0A 42, 05, 05]
 
-2055; [0A 6E, 05, 05]
+205A; [0A 44, 05, 05]
 
-2056; [0A 70, 05, 05]
+205B; [0A 46, 05, 05]
 
-2058; [0A 72, 05, 05]
+205C; [0A 48, 05, 05]
 
-2059; [0A 74, 05, 05]
+205D; [0A 4A, 05, 05]
 
-205A; [0A 76, 05, 05]
+205E; [0A 4C, 05, 05]
 
-205B; [0A 78, 05, 05]
+2E2A; [0A 4E, 05, 05]
 
-205C; [0A 7A, 05, 05]
+2E2B; [0A 50, 05, 05]
 
-205D; [0A 7C, 05, 05]
+2E2C; [0A 52, 05, 05]
 
-205E; [0A 7E, 05, 05]
+2E2D; [0A 54, 05, 05]
 
-2E2A; [0A 80, 05, 05]
+2CFC; [0A 56 02, 05, 05]
 
-2E2B; [0A 82, 05, 05]
+2CFF; [0A 56 0A, 05, 05]
 
-2E2C; [0A 84, 05, 05]
+2E19; [0A 58, 05, 05]
 
-2E2D; [0A 86, 05, 05]
+1093F; [0A 5A, 05, 05]
 
-2CFC; [0A 88 04, 05, 05]
+10100; [0A 5C, 05, 05]
 
-2CFF; [0A 88 0C, 05, 05]
+10101; [0A 5E, 05, 05]
 
-2E19; [0A 89, 05, 05]
+10102; [0A 60, 05, 05]
 
-1093F; [0A 8B 04, 05, 05]
+1039F; [0A 62 02, 05, 05]
 
-10100; [0A 8C, 05, 05]
+103D0; [0A 62 0A, 05, 05]
 
-10101; [0A 8E, 05, 05]
+1091F; [0A 62 12, 05, 05]
 
-10102; [0A 90, 05, 05]
+12470; [0A 62 1A, 05, 05]
 
-1039F; [0A 92 04, 05, 05]
+12471; [0A 62 22, 05, 05]
 
-103D0; [0A 92 0C, 05, 05]
+12472; [0A 62 2A, 05, 05]
 
-1091F; [0A 92 14, 05, 05]
+12473; [0A 62 32, 05, 05]
 
-12470; [0A 92 1C, 05, 05]
+0027; [0A 64, 05, 05]
+FF07; [0A 64, 05, 20]
 
-12471; [0A 92 24, 05, 05]
+2018; [0A 66, 05, 05]
 
-12472; [0A 92 2C, 05, 05]
+2019; [0A 68, 05, 05]
 
-12473; [0A 92 34, 05, 05]
+201A; [0A 6A, 05, 05]
 
-0027; [0A 93, 05, 05]
-FF07; [0A 93, 05, 07]
+201B; [0A 6C, 05, 05]
 
-2018; [0A 95, 05, 05]
+2039; [0A 6E, 05, 05]
 
-2019; [0A 97, 05, 05]
+203A; [0A 70, 05, 05]
 
-201A; [0A 99, 05, 05]
+0022; [0A 72, 05, 05]
+FF02; [0A 72, 05, 20]
 
-201B; [0A 9B, 05, 05]
+201C; [0A 74, 05, 05]
 
-2039; [0A 9D, 05, 05]
+201D; [0A 76, 05, 05]
 
-203A; [0A 9F, 05, 05]
+201E; [0A 78, 05, 05]
 
-0022; [0A A1, 05, 05]
-FF02; [0A A1, 05, 07]
+201F; [0A 7A, 05, 05]
 
-201C; [0A A3, 05, 05]
+301D; [0A 7C, 05, 05]
 
-201D; [0A A5, 05, 05]
+301E; [0A 7E, 05, 05]
 
-201E; [0A A7, 05, 05]
+301F; [0A 80, 05, 05]
 
-201F; [0A A9, 05, 05]
+00AB; [0A 82, 05, 05]
 
-301D; [0A AB, 05, 05]
+00BB; [0A 84, 05, 05]
 
-301E; [0A AD, 05, 05]
+0028; [0A 86, 05, 05]
+FF08; [0A 86, 05, 10]
+FE59; [0A 86, 05, 1E]
+207D; [0A 86, 05, 25]
+208D; [0A 86, 05, 2C]
+FE35; [0A 86, 05, 33]
+2474; [0A 86, 05, 17][16, 05, 16][0A 88, 05, 17]
+247D; [0A 86, 05, 17][16, 05, 16][14, 05, 16][0A 88, 05, 17]
+247E; [0A 86, 05, 17][16, 05, 16][16, 05, 16][0A 88, 05, 17]
+247F; [0A 86, 05, 17][16, 05, 16][18, 05, 15][0A 88, 05, 17]
+2480; [0A 86, 05, 17][16, 05, 16][1A, 05, 15][0A 88, 05, 17]
+2481; [0A 86, 05, 17][16, 05, 16][1C, 05, 16][0A 88, 05, 17]
+2482; [0A 86, 05, 17][16, 05, 16][1E, 05, 16][0A 88, 05, 17]
+2483; [0A 86, 05, 17][16, 05, 16][20, 05, 16][0A 88, 05, 17]
+2484; [0A 86, 05, 17][16, 05, 16][22, 05, 16][0A 88, 05, 17]
+2485; [0A 86, 05, 17][16, 05, 16][24, 05, 16][0A 88, 05, 17]
+2486; [0A 86, 05, 17][16, 05, 16][26, 05, 16][0A 88, 05, 17]
+2475; [0A 86, 05, 17][18, 05, 15][0A 88, 05, 17]
+2487; [0A 86, 05, 17][18, 05, 15][14, 05, 16][0A 88, 05, 17]
+2476; [0A 86, 05, 17][1A, 05, 15][0A 88, 05, 17]
+2477; [0A 86, 05, 17][1C, 05, 16][0A 88, 05, 17]
+2478; [0A 86, 05, 17][1E, 05, 16][0A 88, 05, 17]
+2479; [0A 86, 05, 17][20, 05, 16][0A 88, 05, 17]
+247A; [0A 86, 05, 17][22, 05, 16][0A 88, 05, 17]
+247B; [0A 86, 05, 17][24, 05, 16][0A 88, 05, 17]
+247C; [0A 86, 05, 17][26, 05, 16][0A 88, 05, 17]
+249C; [0A 86, 05, 17][29, 05, 13][0A 88, 05, 17]
+1F110; [0A 86, 05, 17][29, 05, A2][0A 88, 05, 17]
+249D; [0A 86, 05, 17][2B, 05, 13][0A 88, 05, 17]
+1F111; [0A 86, 05, 17][2B, 05, A2][0A 88, 05, 17]
+249E; [0A 86, 05, 17][2D, 05, 13][0A 88, 05, 17]
+1F112; [0A 86, 05, 17][2D, 05, A2][0A 88, 05, 17]
+249F; [0A 86, 05, 17][2F, 05, 13][0A 88, 05, 17]
+1F113; [0A 86, 05, 17][2F, 05, A2][0A 88, 05, 17]
+24A0; [0A 86, 05, 17][31, 05, 13][0A 88, 05, 17]
+1F114; [0A 86, 05, 17][31, 05, A2][0A 88, 05, 17]
+24A1; [0A 86, 05, 17][33, 05, 13][0A 88, 05, 17]
+1F115; [0A 86, 05, 17][33, 05, A2][0A 88, 05, 17]
+24A2; [0A 86, 05, 17][35, 05, 13][0A 88, 05, 17]
+1F116; [0A 86, 05, 17][35, 05, A2][0A 88, 05, 17]
+24A3; [0A 86, 05, 17][37, 05, 13][0A 88, 05, 17]
+1F117; [0A 86, 05, 17][37, 05, A2][0A 88, 05, 17]
+24A4; [0A 86, 05, 17][39, 05, 13][0A 88, 05, 17]
+1F118; [0A 86, 05, 17][39, 05, A2][0A 88, 05, 17]
+24A5; [0A 86, 05, 17][3B, 05, 13][0A 88, 05, 17]
+1F119; [0A 86, 05, 17][3B, 05, A2][0A 88, 05, 17]
+24A6; [0A 86, 05, 17][3D, 05, 13][0A 88, 05, 17]
+1F11A; [0A 86, 05, 17][3D, 05, A2][0A 88, 05, 17]
+24A7; [0A 86, 05, 17][3F, 05, 13][0A 88, 05, 17]
+1F11B; [0A 86, 05, 17][3F, 05, A2][0A 88, 05, 17]
+24A8; [0A 86, 05, 17][41, 05, 13][0A 88, 05, 17]
+1F11C; [0A 86, 05, 17][41, 05, A2][0A 88, 05, 17]
+24A9; [0A 86, 05, 17][43, 05, 13][0A 88, 05, 17]
+1F11D; [0A 86, 05, 17][43, 05, A2][0A 88, 05, 17]
+24AA; [0A 86, 05, 17][45, 05, 13][0A 88, 05, 17]
+1F11E; [0A 86, 05, 17][45, 05, A2][0A 88, 05, 17]
+24AB; [0A 86, 05, 17][47, 05, 13][0A 88, 05, 17]
+1F11F; [0A 86, 05, 17][47, 05, A2][0A 88, 05, 17]
+24AC; [0A 86, 05, 17][49, 05, 14][0A 88, 05, 17]
+1F120; [0A 86, 05, 17][49, 05, A8][0A 88, 05, 17]
+24AD; [0A 86, 05, 17][4B, 05, 13][0A 88, 05, 17]
+1F121; [0A 86, 05, 17][4B, 05, A2][0A 88, 05, 17]
+24AE; [0A 86, 05, 17][4D, 05, 13][0A 88, 05, 17]
+1F122; [0A 86, 05, 17][4D, 05, A2][0A 88, 05, 17]
+24AF; [0A 86, 05, 17][4F, 05, 13][0A 88, 05, 17]
+1F123; [0A 86, 05, 17][4F, 05, A2][0A 88, 05, 17]
+24B0; [0A 86, 05, 17][51, 05, 13][0A 88, 05, 17]
+1F124; [0A 86, 05, 17][51, 05, A2][0A 88, 05, 17]
+24B1; [0A 86, 05, 17][53, 05, 13][0A 88, 05, 17]
+1F125; [0A 86, 05, 17][53, 05, A2][0A 88, 05, 17]
+24B2; [0A 86, 05, 17][55, 05, 14][0A 88, 05, 17]
+1F126; [0A 86, 05, 17][55, 05, A8][0A 88, 05, 17]
+24B3; [0A 86, 05, 17][57, 05, 13][0A 88, 05, 17]
+1F127; [0A 86, 05, 17][57, 05, A2][0A 88, 05, 17]
+24B4; [0A 86, 05, 17][59, 05, 13][0A 88, 05, 17]
+1F128; [0A 86, 05, 17][59, 05, A2][0A 88, 05, 17]
+24B5; [0A 86, 05, 17][5B, 05, 13][0A 88, 05, 17]
+1F129; [0A 86, 05, 17][5B, 05, A2][0A 88, 05, 17]
+3200; [0A 86, 05, 17][75 09, 05, 10][0A 88, 05, 17]
+320E; [0A 86, 05, 17][75 09, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+3201; [0A 86, 05, 17][75 0D, 05, 10][0A 88, 05, 17]
+320F; [0A 86, 05, 17][75 0D, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+3202; [0A 86, 05, 17][75 0F, 05, 10][0A 88, 05, 17]
+3210; [0A 86, 05, 17][75 0F, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+3203; [0A 86, 05, 17][75 13, 05, 10][0A 88, 05, 17]
+3211; [0A 86, 05, 17][75 13, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+3204; [0A 86, 05, 17][75 15, 05, 10][0A 88, 05, 17]
+3212; [0A 86, 05, 17][75 15, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+3205; [0A 86, 05, 17][75 17, 05, 10][0A 88, 05, 17]
+3213; [0A 86, 05, 17][75 17, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+3206; [0A 86, 05, 17][75 1B, 05, 10][0A 88, 05, 17]
+3214; [0A 86, 05, 17][75 1B, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+3207; [0A 86, 05, 17][75 1F, 05, 10][0A 88, 05, 17]
+3215; [0A 86, 05, 17][75 1F, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+321D; [0A 86, 05, 17][75 1F, 05, 10][75 44, 05, 10][75 21, 05, 10][75 3C, 05, 20][75 68, 05, 20][0A 88, 05, 17]
+321E; [0A 86, 05, 17][75 1F, 05, 10][75 44, 05, 10][75 2D, 05, 10][75 4E, 05, 10][0A 88, 05, 17]
+3208; [0A 86, 05, 17][75 21, 05, 10][0A 88, 05, 17]
+3216; [0A 86, 05, 17][75 21, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+321C; [0A 86, 05, 17][75 21, 05, 10][75 4E, 05, 10][0A 88, 05, 17]
+3209; [0A 86, 05, 17][75 25, 05, 10][0A 88, 05, 17]
+3217; [0A 86, 05, 17][75 25, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+320A; [0A 86, 05, 17][75 27, 05, 10][0A 88, 05, 17]
+3218; [0A 86, 05, 17][75 27, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+320B; [0A 86, 05, 17][75 29, 05, 10][0A 88, 05, 17]
+3219; [0A 86, 05, 17][75 29, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+320C; [0A 86, 05, 17][75 2B, 05, 10][0A 88, 05, 17]
+321A; [0A 86, 05, 17][75 2B, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+320D; [0A 86, 05, 17][75 2D, 05, 10][0A 88, 05, 17]
+321B; [0A 86, 05, 17][75 2D, 05, 10][75 34, 05, 10][0A 88, 05, 17]
+3220; [0A 86, 05, 17][U+4E00, 10][0A 88, 05, 17]
+3226; [0A 86, 05, 17][U+4E03, 10][0A 88, 05, 17]
+3222; [0A 86, 05, 17][U+4E09, 10][0A 88, 05, 17]
+3228; [0A 86, 05, 17][U+4E5D, 10][0A 88, 05, 17]
+3221; [0A 86, 05, 17][U+4E8C, 10][0A 88, 05, 17]
+3224; [0A 86, 05, 17][U+4E94, 10][0A 88, 05, 17]
+3239; [0A 86, 05, 17][U+4EE3, 10][0A 88, 05, 17]
+323D; [0A 86, 05, 17][U+4F01, 10][0A 88, 05, 17]
+3241; [0A 86, 05, 17][U+4F11, 10][0A 88, 05, 17]
+3227; [0A 86, 05, 17][U+516B, 10][0A 88, 05, 17]
+3225; [0A 86, 05, 17][U+516D, 10][0A 88, 05, 17]
+3238; [0A 86, 05, 17][U+52B4, 10][0A 88, 05, 17]
+3229; [0A 86, 05, 17][U+5341, 10][0A 88, 05, 17]
+323F; [0A 86, 05, 17][U+5354, 10][0A 88, 05, 17]
+3234; [0A 86, 05, 17][U+540D, 10][0A 88, 05, 17]
+323A; [0A 86, 05, 17][U+547C, 10][0A 88, 05, 17]
+3223; [0A 86, 05, 17][U+56DB, 10][0A 88, 05, 17]
+322F; [0A 86, 05, 17][U+571F, 10][0A 88, 05, 17]
+323B; [0A 86, 05, 17][U+5B66, 10][0A 88, 05, 17]
+3230; [0A 86, 05, 17][U+65E5, 10][0A 88, 05, 17]
+322A; [0A 86, 05, 17][U+6708, 10][0A 88, 05, 17]
+3232; [0A 86, 05, 17][U+6709, 10][0A 88, 05, 17]
+322D; [0A 86, 05, 17][U+6728, 10][0A 88, 05, 17]
+3231; [0A 86, 05, 17][U+682A, 10][0A 88, 05, 17]
+322C; [0A 86, 05, 17][U+6C34, 10][0A 88, 05, 17]
+322B; [0A 86, 05, 17][U+706B, 10][0A 88, 05, 17]
+3235; [0A 86, 05, 17][U+7279, 10][0A 88, 05, 17]
+323C; [0A 86, 05, 17][U+76E3, 10][0A 88, 05, 17]
+3233; [0A 86, 05, 17][U+793E, 10][0A 88, 05, 17]
+3237; [0A 86, 05, 17][U+795D, 10][0A 88, 05, 17]
+3240; [0A 86, 05, 17][U+796D, 10][0A 88, 05, 17]
+3242; [0A 86, 05, 17][U+81EA, 10][0A 88, 05, 17]
+3243; [0A 86, 05, 17][U+81F3, 10][0A 88, 05, 17]
+3236; [0A 86, 05, 17][U+8CA1, 10][0A 88, 05, 17]
+323E; [0A 86, 05, 17][U+8CC7, 10][0A 88, 05, 17]
+322E; [0A 86, 05, 17][U+91D1, 10][0A 88, 05, 17]
+
+0029; [0A 88, 05, 05]
+FF09; [0A 88, 05, 10]
+FE5A; [0A 88, 05, 1E]
+207E; [0A 88, 05, 25]
+208E; [0A 88, 05, 2C]
+FE36; [0A 88, 05, 33]
+
+005B; [0A 8A, 05, 05]
+FF3B; [0A 8A, 05, 20]
+FE47; [0A 8A, 05, 2E]
+
+005D; [0A 8C, 05, 05]
+FF3D; [0A 8C, 05, 20]
+FE48; [0A 8C, 05, 2E]
 
-301F; [0A AF, 05, 05]
+007B; [0A 8E, 05, 05]
+FF5B; [0A 8E, 05, 10]
+FE5B; [0A 8E, 05, 1E]
+FE37; [0A 8E, 05, 2C]
 
-00AB; [0A B1, 05, 05]
+007D; [0A 90, 05, 05]
+FF5D; [0A 90, 05, 10]
+FE5C; [0A 90, 05, 1E]
+FE38; [0A 90, 05, 2C]
 
-00BB; [0A B3, 05, 05]
+0F3A; [0A 92, 05, 05]
 
-0028; [0A B5, 05, 05]
-FF08; [0A B5, 05, 07]
-FE59; [0A B5, 05, 1D]
-207D; [0A B5, 05, 27]
-208D; [0A B5, 05, 29]
-FE35; [0A B5, 05, 2B]
-2474; [0A B5, 05, 09][14, 05, 09][0A B7, 05, 3D]
-247D; [0A B5, 05, 09][14, 05, 09][12, 05, 09][0A B7, 05, 3D]
-247E; [0A B5, 05, 09][14, 05, 09][14, 05, 09][0A B7, 05, 3D]
-247F; [0A B5, 05, 09][14, 05, 09][16, 05, 09][0A B7, 05, 3D]
-2480; [0A B5, 05, 09][14, 05, 09][18, 05, 09][0A B7, 05, 3D]
-2481; [0A B5, 05, 09][14, 05, 09][1A, 05, 09][0A B7, 05, 3D]
-2482; [0A B5, 05, 09][14, 05, 09][1C, 05, 09][0A B7, 05, 3D]
-2483; [0A B5, 05, 09][14, 05, 09][1E, 05, 09][0A B7, 05, 3D]
-2484; [0A B5, 05, 09][14, 05, 09][20, 05, 09][0A B7, 05, 3D]
-2485; [0A B5, 05, 09][14, 05, 09][22, 05, 09][0A B7, 05, 3D]
-2486; [0A B5, 05, 09][14, 05, 09][24, 05, 09][0A B7, 05, 3D]
-2475; [0A B5, 05, 09][16, 05, 09][0A B7, 05, 3D]
-2487; [0A B5, 05, 09][16, 05, 09][12, 05, 09][0A B7, 05, 3D]
-2476; [0A B5, 05, 09][18, 05, 09][0A B7, 05, 3D]
-2477; [0A B5, 05, 09][1A, 05, 09][0A B7, 05, 3D]
-2478; [0A B5, 05, 09][1C, 05, 09][0A B7, 05, 3D]
-2479; [0A B5, 05, 09][1E, 05, 09][0A B7, 05, 3D]
-247A; [0A B5, 05, 09][20, 05, 09][0A B7, 05, 3D]
-247B; [0A B5, 05, 09][22, 05, 09][0A B7, 05, 3D]
-247C; [0A B5, 05, 09][24, 05, 09][0A B7, 05, 3D]
-249C; [0A B5, 05, 09][27, 05, 09][0A B7, 05, 3D]
-1F110; [0A B5, 05, 09][27, 05, 93][0A B7, 05, 3D]
-249D; [0A B5, 05, 09][29, 05, 09][0A B7, 05, 3D]
-1F111; [0A B5, 05, 09][29, 05, 93][0A B7, 05, 3D]
-249E; [0A B5, 05, 09][2B, 05, 09][0A B7, 05, 3D]
-1F112; [0A B5, 05, 09][2B, 05, 93][0A B7, 05, 3D]
-249F; [0A B5, 05, 09][2D, 05, 09][0A B7, 05, 3D]
-1F113; [0A B5, 05, 09][2D, 05, 93][0A B7, 05, 3D]
-24A0; [0A B5, 05, 09][2F, 05, 09][0A B7, 05, 3D]
-1F114; [0A B5, 05, 09][2F, 05, 93][0A B7, 05, 3D]
-24A1; [0A B5, 05, 09][31, 05, 09][0A B7, 05, 3D]
-1F115; [0A B5, 05, 09][31, 05, 93][0A B7, 05, 3D]
-24A2; [0A B5, 05, 09][33, 05, 09][0A B7, 05, 3D]
-1F116; [0A B5, 05, 09][33, 05, 93][0A B7, 05, 3D]
-24A3; [0A B5, 05, 09][35, 05, 09][0A B7, 05, 3D]
-1F117; [0A B5, 05, 09][35, 05, 93][0A B7, 05, 3D]
-24A4; [0A B5, 05, 09][37, 05, 09][0A B7, 05, 3D]
-1F118; [0A B5, 05, 09][37, 05, 93][0A B7, 05, 3D]
-24A5; [0A B5, 05, 09][39, 05, 09][0A B7, 05, 3D]
-1F119; [0A B5, 05, 09][39, 05, 93][0A B7, 05, 3D]
-24A6; [0A B5, 05, 09][3B, 05, 09][0A B7, 05, 3D]
-1F11A; [0A B5, 05, 09][3B, 05, 93][0A B7, 05, 3D]
-24A7; [0A B5, 05, 09][3D, 05, 09][0A B7, 05, 3D]
-1F11B; [0A B5, 05, 09][3D, 05, 93][0A B7, 05, 3D]
-24A8; [0A B5, 05, 09][3F, 05, 09][0A B7, 05, 3D]
-1F11C; [0A B5, 05, 09][3F, 05, 93][0A B7, 05, 3D]
-24A9; [0A B5, 05, 09][41, 05, 09][0A B7, 05, 3D]
-1F11D; [0A B5, 05, 09][41, 05, 93][0A B7, 05, 3D]
-24AA; [0A B5, 05, 09][43, 05, 09][0A B7, 05, 3D]
-1F11E; [0A B5, 05, 09][43, 05, 93][0A B7, 05, 3D]
-24AB; [0A B5, 05, 09][45, 05, 09][0A B7, 05, 3D]
-1F11F; [0A B5, 05, 09][45, 05, 93][0A B7, 05, 3D]
-24AC; [0A B5, 05, 09][47, 05, 09][0A B7, 05, 3D]
-1F120; [0A B5, 05, 09][47, 05, 93][0A B7, 05, 3D]
-24AD; [0A B5, 05, 09][49, 05, 09][0A B7, 05, 3D]
-1F121; [0A B5, 05, 09][49, 05, 93][0A B7, 05, 3D]
-24AE; [0A B5, 05, 09][4B, 05, 09][0A B7, 05, 3D]
-1F122; [0A B5, 05, 09][4B, 05, 93][0A B7, 05, 3D]
-24AF; [0A B5, 05, 09][4D, 05, 09][0A B7, 05, 3D]
-1F123; [0A B5, 05, 09][4D, 05, 93][0A B7, 05, 3D]
-24B0; [0A B5, 05, 09][4F, 05, 09][0A B7, 05, 3D]
-1F124; [0A B5, 05, 09][4F, 05, 93][0A B7, 05, 3D]
-24B1; [0A B5, 05, 09][51, 05, 09][0A B7, 05, 3D]
-1F125; [0A B5, 05, 09][51, 05, 93][0A B7, 05, 3D]
-24B2; [0A B5, 05, 09][53, 05, 09][0A B7, 05, 3D]
-1F126; [0A B5, 05, 09][53, 05, 93][0A B7, 05, 3D]
-24B3; [0A B5, 05, 09][55, 05, 09][0A B7, 05, 3D]
-1F127; [0A B5, 05, 09][55, 05, 93][0A B7, 05, 3D]
-24B4; [0A B5, 05, 09][57, 05, 09][0A B7, 05, 3D]
-1F128; [0A B5, 05, 09][57, 05, 93][0A B7, 05, 3D]
-24B5; [0A B5, 05, 09][59, 05, 09][0A B7, 05, 3D]
-1F129; [0A B5, 05, 09][59, 05, 93][0A B7, 05, 3D]
-3200; [0A B5, 05, 09][78 0A, 05, 09][0A B7, 05, 3D]
-320E; [0A B5, 05, 09][78 0A, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-3201; [0A B5, 05, 09][78 0E, 05, 09][0A B7, 05, 3D]
-320F; [0A B5, 05, 09][78 0E, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-3202; [0A B5, 05, 09][78 10, 05, 09][0A B7, 05, 3D]
-3210; [0A B5, 05, 09][78 10, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-3203; [0A B5, 05, 09][78 14, 05, 09][0A B7, 05, 3D]
-3211; [0A B5, 05, 09][78 14, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-3204; [0A B5, 05, 09][78 16, 05, 09][0A B7, 05, 3D]
-3212; [0A B5, 05, 09][78 16, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-3205; [0A B5, 05, 09][78 18, 05, 09][0A B7, 05, 3D]
-3213; [0A B5, 05, 09][78 18, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-3206; [0A B5, 05, 09][78 1C, 05, 09][0A B7, 05, 3D]
-3214; [0A B5, 05, 09][78 1C, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-3207; [0A B5, 05, 09][78 20, 05, 09][0A B7, 05, 3D]
-3215; [0A B5, 05, 09][78 20, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-321D; [0A B5, 05, 09][78 20, 05, 09][78 44, 05, 09][78 22, 05, 09][78 3C, 05, 09][78 67, 05, 09][0A B7, 05, 3D]
-321E; [0A B5, 05, 09][78 20, 05, 09][78 44, 05, 09][78 2E, 05, 09][78 4E, 05, 09][0A B7, 05, 3D]
-3208; [0A B5, 05, 09][78 22, 05, 09][0A B7, 05, 3D]
-3216; [0A B5, 05, 09][78 22, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-321C; [0A B5, 05, 09][78 22, 05, 09][78 4E, 05, 09][0A B7, 05, 3D]
-3209; [0A B5, 05, 09][78 26, 05, 09][0A B7, 05, 3D]
-3217; [0A B5, 05, 09][78 26, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-320A; [0A B5, 05, 09][78 28, 05, 09][0A B7, 05, 3D]
-3218; [0A B5, 05, 09][78 28, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-320B; [0A B5, 05, 09][78 2A, 05, 09][0A B7, 05, 3D]
-3219; [0A B5, 05, 09][78 2A, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-320C; [0A B5, 05, 09][78 2C, 05, 09][0A B7, 05, 3D]
-321A; [0A B5, 05, 09][78 2C, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-320D; [0A B5, 05, 09][78 2E, 05, 09][0A B7, 05, 3D]
-321B; [0A B5, 05, 09][78 2E, 05, 09][78 34, 05, 09][0A B7, 05, 3D]
-3220; [0A B5, 05, 09][E0 04 06, 05, 09][0A B7, 05, 3D]
-3226; [0A B5, 05, 09][E0 04 0C, 05, 09][0A B7, 05, 3D]
-3222; [0A B5, 05, 09][E0 04 18, 05, 09][0A B7, 05, 3D]
-3228; [0A B5, 05, 09][E0 04 C0, 05, 09][0A B7, 05, 3D]
-3221; [0A B5, 05, 09][E0 05 24, 05, 09][0A B7, 05, 3D]
-3224; [0A B5, 05, 09][E0 05 34, 05, 09][0A B7, 05, 3D]
-3239; [0A B5, 05, 09][E0 05 D2, 05, 09][0A B7, 05, 3D]
-323D; [0A B5, 05, 09][E0 06 14, 05, 09][0A B7, 05, 3D]
-3241; [0A B5, 05, 09][E0 06 34, 05, 09][0A B7, 05, 3D]
-3227; [0A B5, 05, 09][E0 0B 06, 05, 09][0A B7, 05, 3D]
-3225; [0A B5, 05, 09][E0 0B 0A, 05, 09][0A B7, 05, 3D]
-3238; [0A B5, 05, 09][E0 0D A4, 05, 09][0A B7, 05, 3D]
-3229; [0A B5, 05, 09][E0 0E C4, 05, 09][0A B7, 05, 3D]
-323F; [0A B5, 05, 09][E0 0E EA, 05, 09][0A B7, 05, 3D]
-3234; [0A B5, 05, 09][E0 10 68, 05, 09][0A B7, 05, 3D]
-323A; [0A B5, 05, 09][E0 11 4C, 05, 09][0A B7, 05, 3D]
-3223; [0A B5, 05, 09][E0 16 28, 05, 09][0A B7, 05, 3D]
-322F; [0A B5, 05, 09][E0 16 B0, 05, 09][0A B7, 05, 3D]
-323B; [0A B5, 05, 09][E0 1F 74, 05, 09][0A B7, 05, 3D]
-3230; [0A B5, 05, 09][E0 34 F0, 05, 09][0A B7, 05, 3D]
-322A; [0A B5, 05, 09][E0 37 48, 05, 09][0A B7, 05, 3D]
-3232; [0A B5, 05, 09][E0 37 4A, 05, 09][0A B7, 05, 3D]
-322D; [0A B5, 05, 09][E0 37 88, 05, 09][0A B7, 05, 3D]
-3231; [0A B5, 05, 09][E0 39 98, 05, 09][0A B7, 05, 3D]
-322C; [0A B5, 05, 09][E0 41 DC, 05, 09][0A B7, 05, 3D]
-322B; [0A B5, 05, 09][E0 4A 80, 05, 09][0A B7, 05, 3D]
-3235; [0A B5, 05, 09][E0 4E B4, 05, 09][0A B7, 05, 3D]
-323C; [0A B5, 05, 09][E0 57 BE, 05, 09][0A B7, 05, 3D]
-3233; [0A B5, 05, 09][E0 5C 92, 05, 09][0A B7, 05, 3D]
-3237; [0A B5, 05, 09][E0 5C D0, 05, 09][0A B7, 05, 3D]
-3240; [0A B5, 05, 09][E0 5C F0, 05, 09][0A B7, 05, 3D]
-3242; [0A B5, 05, 09][E0 6E 56, 05, 09][0A B7, 05, 3D]
-3243; [0A B5, 05, 09][E0 6E 68, 05, 09][0A B7, 05, 3D]
-3236; [0A B5, 05, 09][E0 84 48, 05, 09][0A B7, 05, 3D]
-323E; [0A B5, 05, 09][E0 84 94, 05, 09][0A B7, 05, 3D]
-322E; [0A B5, 05, 09][E0 8E E4, 05, 09][0A B7, 05, 3D]
-
-0029; [0A B7, 05, 05]
-FF09; [0A B7, 05, 07]
-FE5A; [0A B7, 05, 1D]
-207E; [0A B7, 05, 27]
-208E; [0A B7, 05, 29]
-FE36; [0A B7, 05, 2B]
-
-005B; [0A B9, 05, 05]
-FF3B; [0A B9, 05, 07]
-FE47; [0A B9, 05, 2B]
-
-005D; [0A BB, 05, 05]
-FF3D; [0A BB, 05, 07]
-FE48; [0A BB, 05, 2B]
+0F3B; [0A 94, 05, 05]
 
-007B; [0A BD, 05, 05]
-FF5B; [0A BD, 05, 07]
-FE5B; [0A BD, 05, 1D]
-FE37; [0A BD, 05, 2B]
+0F3C; [0A 96, 05, 05]
 
-007D; [0A BF, 05, 05]
-FF5D; [0A BF, 05, 07]
-FE5C; [0A BF, 05, 1D]
-FE38; [0A BF, 05, 2B]
+0F3D; [0A 98, 05, 05]
 
-0F3A; [0A C1, 05, 05]
+169B; [0A 9A 02, 05, 05]
 
-0F3B; [0A C3, 05, 05]
+169C; [0A 9A 0A, 05, 05]
 
-0F3C; [0A C5, 05, 05]
+2045; [0A 9C, 05, 05]
 
-0F3D; [0A C7, 05, 05]
+2046; [0A 9E, 05, 05]
 
-169B; [0A C9 04, 05, 05]
+2308; [0A A0, 05, 05]
 
-169C; [0A C9 0C, 05, 05]
+2309; [0A A2, 05, 05]
 
-2045; [0A CA, 05, 05]
+230A; [0A A4, 05, 05]
 
-2046; [0A CC, 05, 05]
+230B; [0A A6, 05, 05]
 
-29FC; [0A CE, 05, 05]
+29FC; [0A A8, 05, 05]
 
-29FD; [0A D0, 05, 05]
+29FD; [0A AA, 05, 05]
 
-2983; [0A D2, 05, 05]
+2983; [0A AC, 05, 05]
 
-2984; [0A D4, 05, 05]
+2984; [0A AE, 05, 05]
 
-2985; [0A D6, 05, 05]
-FF5F; [0A D6, 05, 07]
+2985; [0A B0, 05, 05]
+FF5F; [0A B0, 05, 20]
 
-2986; [0A D8, 05, 05]
-FF60; [0A D8, 05, 07]
+2986; [0A B2, 05, 05]
+FF60; [0A B2, 05, 20]
 
-2987; [0A DA, 05, 05]
+2987; [0A B4, 05, 05]
 
-2988; [0A DC, 05, 05]
+2988; [0A B6, 05, 05]
 
-2989; [0A DE, 05, 05]
+2989; [0A B8, 05, 05]
 
-298A; [0A E0, 05, 05]
+298A; [0A BA, 05, 05]
 
-298B; [0A E2, 05, 05]
+298B; [0A BC, 05, 05]
 
-298C; [0A E4, 05, 05]
+298C; [0A BE, 05, 05]
 
-298D; [0A E6, 05, 05]
+298D; [0A C0, 05, 05]
 
-298E; [0A E8, 05, 05]
+298E; [0A C2, 05, 05]
 
-298F; [0A EA, 05, 05]
+298F; [0A C4, 05, 05]
 
-2990; [0A EC, 05, 05]
+2990; [0A C6, 05, 05]
 
-2991; [0A EE, 05, 05]
+2991; [0A C8, 05, 05]
 
-2992; [0A F0, 05, 05]
+2992; [0A CA, 05, 05]
 
-2993; [0A F2, 05, 05]
+2993; [0A CC, 05, 05]
 
-2994; [0A F4, 05, 05]
+2994; [0A CE, 05, 05]
 
-2995; [0A F6, 05, 05]
+2995; [0A D0, 05, 05]
 
-2996; [0A F8, 05, 05]
+2996; [0A D2, 05, 05]
 
-2997; [0A FA, 05, 05]
+2997; [0A D4, 05, 05]
 
-2998; [0B 05, 05, 05]
+2998; [0A D6, 05, 05]
 
-27C5; [0B 07, 05, 05]
+27C5; [0A D8, 05, 05]
 
-27C6; [0B 09, 05, 05]
+27C6; [0A DA, 05, 05]
 
-27E6; [0B 0B, 05, 05]
+27E6; [0A DC, 05, 05]
 
-27E7; [0B 0D, 05, 05]
+27E7; [0A DE, 05, 05]
 
-27E8; [0B 0F, 05, 05]
+27E8; [0A E0, 05, 05]
 
-27E9; [0B 11, 05, 05]
+27E9; [0A E2, 05, 05]
 
-27EA; [0B 13, 05, 05]
+27EA; [0A E4, 05, 05]
 
-27EB; [0B 15, 05, 05]
+27EB; [0A E6, 05, 05]
 
-27EC; [0B 17, 05, 05]
+27EC; [0A E8, 05, 05]
 
-27ED; [0B 19, 05, 05]
+27ED; [0A EA, 05, 05]
 
-27EE; [0B 1B, 05, 05]
+27EE; [0A EC, 05, 05]
 
-27EF; [0B 1D, 05, 05]
+27EF; [0A EE, 05, 05]
 
-2768; [0B 1F, 05, 05]
+2768; [0A F0, 05, 05]
 
-2769; [0B 21, 05, 05]
+2769; [0A F2, 05, 05]
 
-276A; [0B 23, 05, 05]
+276A; [0A F4, 05, 05]
 
-276B; [0B 25, 05, 05]
+276B; [0A F6, 05, 05]
 
-276C; [0B 27, 05, 05]
+276C; [0A F8, 05, 05]
 
-276D; [0B 29, 05, 05]
+276D; [0A FA, 05, 05]
 
-276E; [0B 2B, 05, 05]
+276E; [0A FC, 05, 05]
 
-276F; [0B 2D, 05, 05]
+276F; [0A FE, 05, 05]
 
-2770; [0B 2F, 05, 05]
+2770; [0B 02, 05, 05]
 
-2771; [0B 31, 05, 05]
+2771; [0B 04, 05, 05]
 
-2772; [0B 33, 05, 05]
+2772; [0B 06, 05, 05]
 
-2773; [0B 35, 05, 05]
+2773; [0B 08, 05, 05]
 
-2774; [0B 37, 05, 05]
+2774; [0B 0A, 05, 05]
 
-2775; [0B 39, 05, 05]
+2775; [0B 0C, 05, 05]
 
-2E02; [0B 3B, 05, 05]
+2E02; [0B 0E, 05, 05]
 
-2E03; [0B 3D, 05, 05]
+2E03; [0B 10, 05, 05]
 
-2E04; [0B 3F, 05, 05]
+2E04; [0B 12, 05, 05]
 
-2E05; [0B 41, 05, 05]
+2E05; [0B 14, 05, 05]
 
-2E09; [0B 43, 05, 05]
+2E09; [0B 16, 05, 05]
 
-2E0A; [0B 45, 05, 05]
+2E0A; [0B 18, 05, 05]
 
-2E0C; [0B 47, 05, 05]
+2E0C; [0B 1A, 05, 05]
 
-2E0D; [0B 49, 05, 05]
+2E0D; [0B 1C, 05, 05]
 
-2E1C; [0B 4B, 05, 05]
+2E1C; [0B 1E, 05, 05]
 
-2E1D; [0B 4D, 05, 05]
+2E1D; [0B 20, 05, 05]
 
-2E20; [0B 4F, 05, 05]
+2E20; [0B 22, 05, 05]
 
-2E21; [0B 51, 05, 05]
+2E21; [0B 24, 05, 05]
 
-2E22; [0B 53, 05, 05]
+2E22; [0B 26, 05, 05]
 
-2E23; [0B 55, 05, 05]
+2E23; [0B 28, 05, 05]
 
-2E24; [0B 57, 05, 05]
+2E24; [0B 2A, 05, 05]
 
-2E25; [0B 59, 05, 05]
+2E25; [0B 2C, 05, 05]
 
-2E26; [0B 5B, 05, 05]
+2E26; [0B 2E, 05, 05]
 
-2E27; [0B 5D, 05, 05]
+2E27; [0B 30, 05, 05]
 
-2E28; [0B 5F, 05, 05]
+2E28; [0B 32, 05, 05]
 
-2E29; [0B 61, 05, 05]
+2E29; [0B 34, 05, 05]
 
-2329; [0B 63, 05, 05]
-3008; [0B 63, 05, 05]
-FE3F; [0B 63, 05, 2B]
+2329; [0B 36, 05, 05]
+3008; [0B 36, 05, 05]
+FE3F; [0B 36, 05, 20]
 
-232A; [0B 65, 05, 05]
-3009; [0B 65, 05, 05]
-FE40; [0B 65, 05, 2B]
+232A; [0B 38, 05, 05]
+3009; [0B 38, 05, 05]
+FE40; [0B 38, 05, 20]
 
-300A; [0B 67, 05, 05]
-FE3D; [0B 67, 05, 2B]
+300A; [0B 3A, 05, 05]
+FE3D; [0B 3A, 05, 20]
 
-300B; [0B 69, 05, 05]
-FE3E; [0B 69, 05, 2B]
+300B; [0B 3C, 05, 05]
+FE3E; [0B 3C, 05, 20]
 
-300C; [0B 6B, 05, 05]
-FF62; [0B 6B, 05, A3]
-FE41; [0B 6B, 05, 2B]
+300C; [0B 3E, 05, 05]
+FF62; [0B 3E, 05, A0]
+FE41; [0B 3E, 05, 2E]
 
-300D; [0B 6D, 05, 05]
-FF63; [0B 6D, 05, A3]
-FE42; [0B 6D, 05, 2B]
+300D; [0B 40, 05, 05]
+FF63; [0B 40, 05, A0]
+FE42; [0B 40, 05, 2E]
 
-300E; [0B 6F, 05, 05]
-FE43; [0B 6F, 05, 2B]
+300E; [0B 42, 05, 05]
+FE43; [0B 42, 05, 20]
 
-300F; [0B 71, 05, 05]
-FE44; [0B 71, 05, 2B]
+300F; [0B 44, 05, 05]
+FE44; [0B 44, 05, 20]
 
-3010; [0B 73, 05, 05]
-FE3B; [0B 73, 05, 2B]
+3010; [0B 46, 05, 05]
+FE3B; [0B 46, 05, 20]
 
-3011; [0B 75, 05, 05]
-FE3C; [0B 75, 05, 2B]
+3011; [0B 48, 05, 05]
+FE3C; [0B 48, 05, 20]
 
-3014; [0B 77, 05, 05]
-FE5D; [0B 77, 05, 1D]
-FE39; [0B 77, 05, 2B]
-1F12A; [0B 77, 05, 09][4B, 05, 93][0B 79, 05, 3D]
-1F241; [0B 77, 05, 09][E0 04 18, 05, 09][0B 79, 05, 3D]
-1F242; [0B 77, 05, 09][E0 05 24, 05, 09][0B 79, 05, 3D]
-1F247; [0B 77, 05, 09][E0 0D F6, 05, 09][0B 79, 05, 3D]
-1F243; [0B 77, 05, 09][E0 1F BA, 05, 09][0B 79, 05, 3D]
-1F245; [0B 77, 05, 09][E0 2D A2, 05, 09][0B 79, 05, 3D]
-1F248; [0B 77, 05, 09][E0 33 CE, 05, 09][0B 79, 05, 3D]
-1F240; [0B 77, 05, 09][E0 37 90, 05, 09][0B 79, 05, 3D]
-1F244; [0B 77, 05, 09][E0 4B 22, 05, 09][0B 79, 05, 3D]
-1F246; [0B 77, 05, 09][E0 57 A6, 05, 09][0B 79, 05, 3D]
+3014; [0B 4A, 05, 05]
+FE5D; [0B 4A, 05, 1E]
+FE39; [0B 4A, 05, 2C]
+1F12A; [0B 4A, 05, 10][4D, 05, A2][0B 4C, 05, 10]
+1F241; [0B 4A, 05, 10][U+4E09, 10][0B 4C, 05, 10]
+1F242; [0B 4A, 05, 10][U+4E8C, 10][0B 4C, 05, 10]
+1F247; [0B 4A, 05, 10][U+52DD, 10][0B 4C, 05, 10]
+1F243; [0B 4A, 05, 10][U+5B89, 10][0B 4C, 05, 10]
+1F245; [0B 4A, 05, 10][U+6253, 10][0B 4C, 05, 10]
+1F248; [0B 4A, 05, 10][U+6557, 10][0B 4C, 05, 10]
+1F240; [0B 4A, 05, 10][U+672C, 10][0B 4C, 05, 10]
+1F244; [0B 4A, 05, 10][U+70B9, 10][0B 4C, 05, 10]
+1F246; [0B 4A, 05, 10][U+76D7, 10][0B 4C, 05, 10]
 
-3015; [0B 79, 05, 05]
-FE5E; [0B 79, 05, 1D]
-FE3A; [0B 79, 05, 2B]
+3015; [0B 4C, 05, 05]
+FE5E; [0B 4C, 05, 1E]
+FE3A; [0B 4C, 05, 2C]
 
-3016; [0B 7B, 05, 05]
-FE17; [0B 7B, 05, 2B]
+3016; [0B 4E, 05, 05]
+FE17; [0B 4E, 05, 20]
 
-3017; [0B 7D, 05, 05]
-FE18; [0B 7D, 05, 2B]
+3017; [0B 50, 05, 05]
+FE18; [0B 50, 05, 20]
 
-3018; [0B 7F, 05, 05]
+3018; [0B 52, 05, 05]
 
-3019; [0B 81, 05, 05]
+3019; [0B 54, 05, 05]
 
-301A; [0B 83, 05, 05]
+301A; [0B 56, 05, 05]
 
-301B; [0B 85, 05, 05]
+301B; [0B 58, 05, 05]
 
-FD3E; [0B 87, 05, 05]
+FD3E; [0B 5A, 05, 05]
 
-FD3F; [0B 89, 05, 05]
+FD3F; [0B 5C, 05, 05]
 
-2016; [0B 8B, 05, 05]
+2016; [0B 5E, 05, 05]
 
-29D8; [0B 8D, 05, 05]
+29D8; [0B 60, 05, 05]
 
-29D9; [0B 8F, 05, 05]
+29D9; [0B 62, 05, 05]
 
-29DA; [0B 91, 05, 05]
+29DA; [0B 64, 05, 05]
 
-29DB; [0B 93, 05, 05]
+29DB; [0B 66, 05, 05]
 
-00A7; [0B 95, 05, 05]
+00A7; [0B 68, 05, 05]
 
-2E39; [0B 97, 05, 05]
+2E39; [0B 6A, 05, 05]
 
-00B6; [0B 99, 05, 05]
+00B6; [0B 6C, 05, 05]
 
-204B; [0B 9B, 05, 05]
+204B; [0B 6E, 05, 05]
 
-0040; [0B 9D, 05, 05]
-FF20; [0B 9D, 05, 07]
-FE6B; [0B 9D, 05, 1D]
+0040; [0B 70, 05, 05]
+FF20; [0B 70, 05, 20]
+FE6B; [0B 70, 05, 2E]
 
-002A; [0B 9F, 05, 05]
-FF0A; [0B 9F, 05, 07]
-FE61; [0B 9F, 05, 1D]
+002A; [0B 72, 05, 05]
+FF0A; [0B 72, 05, 20]
+FE61; [0B 72, 05, 2E]
 
-204E; [0B A1, 05, 05]
+204E; [0B 74, 05, 05]
 
-2051; [0B A3, 05, 05]
+2051; [0B 76, 05, 05]
 
-066D; [0B A5, 05, 05]
+066D; [0B 78, 05, 05]
 
-A673; [0B A7, 05, 05]
+A673; [0B 7A, 05, 05]
 
-002F; [0B A9, 05, 05]
-FF0F; [0B A9, 05, 07]
+002F; [0B 7C, 05, 05]
+FF0F; [0B 7C, 05, 20]
 
-005C; [0B AB, 05, 05]
-FF3C; [0B AB, 05, 07]
-FE68; [0B AB, 05, 1D]
+005C; [0B 7E, 05, 05]
+FF3C; [0B 7E, 05, 20]
+FE68; [0B 7E, 05, 2E]
 
-0026; [0B AD, 05, 05]
-FF06; [0B AD, 05, 07]
-FE60; [0B AD, 05, 1D]
+0026; [0B 80, 05, 05]
+FF06; [0B 80, 05, 20]
+FE60; [0B 80, 05, 2E]
 
-204A; [0B AF, 05, 05]
+204A; [0B 82, 05, 05]
 
-0023; [0B B1, 05, 05]
-FF03; [0B B1, 05, 07]
-FE5F; [0B B1, 05, 1D]
+0023; [0B 84, 05, 05]
+FF03; [0B 84, 05, 20]
+FE5F; [0B 84, 05, 2E]
 
-0025; [0B B3, 05, 05]
-FF05; [0B B3, 05, 07]
-FE6A; [0B B3, 05, 1D]
+0025; [0B 86, 05, 05]
+FF05; [0B 86, 05, 20]
+FE6A; [0B 86, 05, 2E]
 
-066A; [0B B5, 05, 05]
+066A; [0B 88, 05, 05]
 
-2030; [0B B7, 05, 05]
+2030; [0B 8A, 05, 05]
 
-0609; [0B B9, 05, 05]
+0609; [0B 8C, 05, 05]
 
-2031; [0B BB, 05, 05]
+2031; [0B 8E, 05, 05]
 
-060A; [0B BD, 05, 05]
+060A; [0B 90, 05, 05]
 
-2020; [0B BF, 05, 05]
+2020; [0B 92, 05, 05]
 
-2021; [0B C1, 05, 05]
+2021; [0B 94, 05, 05]
 
-2E36; [0B C3, 05, 05]
+2E36; [0B 96, 05, 05]
 
-2E37; [0B C5, 05, 05]
+2E37; [0B 98, 05, 05]
 
-2E38; [0B C7, 05, 05]
+2E38; [0B 9A, 05, 05]
 
-2022; [0B C9, 05, 05]
+2022; [0B 9C, 05, 05]
 
-2023; [0B CB, 05, 05]
+2023; [0B 9E, 05, 05]
 
-2027; [0B CD, 05, 05]
+2027; [0B A0, 05, 05]
 
-2043; [0B CF, 05, 05]
+2043; [0B A2, 05, 05]
 
-204C; [0B D1, 05, 05]
+204C; [0B A4, 05, 05]
 
-204D; [0B D3, 05, 05]
+204D; [0B A6, 05, 05]
 
-2032; [0B D5, 05, 05]
-2033; [0B D5, 05, 09][0B D5, 05, 3D]
-2034; [0B D5, 05, 09][0B D5, 05, 09][0B D5, 05, 3D]
-2057; [0B D5, 05, 09][0B D5, 05, 09][0B D5, 05, 09][0B D5, 05, 3D]
+2032; [0B A8, 05, 05]
+2033; [0B A8, 05, 20][0B A8, 05, 20]
+2034; [0B A8, 05, 20][0B A8, 05, 20][0B A8, 05, 20]
+2057; [0B A8, 05, 20][0B A8, 05, 20][0B A8, 05, 20][0B A8, 05, 20]
 
-2035; [0B D7, 05, 05]
-2036; [0B D7, 05, 09][0B D7, 05, 3D]
-2037; [0B D7, 05, 09][0B D7, 05, 09][0B D7, 05, 3D]
+2035; [0B AA, 05, 05]
+2036; [0B AA, 05, 20][0B AA, 05, 20]
+2037; [0B AA, 05, 20][0B AA, 05, 20][0B AA, 05, 20]
 
-3003; [0B D9, 05, 05]
+3003; [0B AC, 05, 05]
 
-303D; [0B DB, 05, 05]
+303D; [0B AE, 05, 05]
 
-2038; [0B DD, 05, 05]
+2038; [0B B0, 05, 05]
 
-203B; [0B DF, 05, 05]
+203B; [0B B2, 05, 05]
 
-203F; [0B E1, 05, 05]
+203F; [0B B4, 05, 05]
 
-2054; [0B E3, 05, 05]
+2054; [0B B6, 05, 05]
 
-2040; [0B E5, 05, 05]
+2040; [0B B8, 05, 05]
 
-2050; [0B E7, 05, 05]
+2050; [0B BA, 05, 05]
 
-2041; [0B E9, 05, 05]
+2041; [0B BC, 05, 05]
 
-2042; [0B EB, 05, 05]
+2042; [0B BE, 05, 05]
 
-2E00; [0B ED, 05, 05]
+2E00; [0B C0, 05, 05]
 
-2E01; [0B EF, 05, 05]
+2E01; [0B C2, 05, 05]
 
-2E06; [0B F1, 05, 05]
+2E06; [0B C4, 05, 05]
 
-2E07; [0B F3, 05, 05]
+2E07; [0B C6, 05, 05]
 
-2E08; [0B F5, 05, 05]
+2E08; [0B C8, 05, 05]
 
-2E0B; [0B F7, 05, 05]
+2E0B; [0B CA, 05, 05]
 
-2E0E; [0B F9, 05, 05]
+2E0E; [0B CC, 05, 05]
 
-2E0F; [0B FB, 05, 05]
+2E0F; [0B CE, 05, 05]
 
-2E10; [0C 06, 05, 05]
+2E10; [0B D0, 05, 05]
 
-2E11; [0C 08, 05, 05]
+2E11; [0B D2, 05, 05]
 
-2E12; [0C 0A, 05, 05]
+2E12; [0B D4, 05, 05]
 
-2E13; [0C 0C, 05, 05]
+2E13; [0B D6, 05, 05]
 
-2E14; [0C 0E, 05, 05]
+2E14; [0B D8, 05, 05]
 
-2E15; [0C 10, 05, 05]
+2E15; [0B DA, 05, 05]
 
-2E16; [0C 12, 05, 05]
+2E16; [0B DC, 05, 05]
 
-2E1A; [0C 14, 05, 05]
+2E1A; [0B DE, 05, 05]
 
-2E1B; [0C 16, 05, 05]
+2E1B; [0B E0, 05, 05]
 
-2E1E; [0C 18, 05, 05]
+2E1E; [0B E2, 05, 05]
 
-2E1F; [0C 1A, 05, 05]
+2E1F; [0B E4, 05, 05]
 
-A67E; [0C 1C, 05, 05]
+A67E; [0B E6, 05, 05]
 
-055A; [0C 1E, 05, 05]
+055A; [0B E8, 05, 05]
 
-055B; [0C 20, 05, 05]
+055B; [0B EA, 05, 05]
 
-055F; [0C 22, 05, 05]
+055F; [0B EC, 05, 05]
 
-05BE; [0C 24, 05, 05]
+05BE; [0B EE, 05, 05]
 
-05C0; [0C 26, 05, 05]
+05C0; [0B F0, 05, 05]
 
-05C3; [0C 28, 05, 05]
+05C3; [0B F2, 05, 05]
 
-05C6; [0C 2A, 05, 05]
+05C6; [0B F4, 05, 05]
 
-05F3; [0C 2C, 05, 05]
+05F3; [0B F6, 05, 05]
 
-05F4; [0C 2E, 05, 05]
+05F4; [0B F8, 05, 05]
 
-070A; [0C 30 04, 05, 05]
+070A; [0B FA 02, 05, 05]
 
-070B; [0C 30 0C, 05, 05]
+070B; [0B FA 0A, 05, 05]
 
-070C; [0C 30 14, 05, 05]
+070C; [0B FA 12, 05, 05]
 
-070D; [0C 30 1C, 05, 05]
+070D; [0B FA 1A, 05, 05]
 
-085E; [0C 30 24, 05, 05]
+085E; [0B FA 22, 05, 05]
 
-1800; [0C 30 2C, 05, 05]
+1800; [0B FA 2A, 05, 05]
 
-0970; [0C 31, 05, 05]
+0970; [0B FC, 05, 05]
 
-A8F8; [0C 33, 05, 05]
+A8F8; [0B FE, 05, 05]
 
-A8F9; [0C 35, 05, 05]
+A8F9; [0C 02, 05, 05]
 
-A8FA; [0C 37, 05, 05]
+A8FA; [0C 04, 05, 05]
 
-0AF0; [0C 39, 05, 05]
+0AF0; [0C 06, 05, 05]
 
-0DF4; [0C 3B, 05, 05]
+0DF4; [0C 08, 05, 05]
 
-0E4F; [0C 3D, 05, 05]
+0E4F; [0C 0A, 05, 05]
 
-0E5A; [0C 3F, 05, 05]
+0E5A; [0C 0C, 05, 05]
 
-0E5B; [0C 41, 05, 05]
+0E5B; [0C 0E, 05, 05]
 
-AADE; [0C 43 04, 05, 05]
+AADE; [0C 10 02, 05, 05]
 
-AADF; [0C 43 0C, 05, 05]
+AADF; [0C 10 0A, 05, 05]
 
-0F04; [0C 44, 05, 05]
+0F04; [0C 12, 05, 05]
 
-0F05; [0C 46, 05, 05]
+0F05; [0C 14, 05, 05]
 
-0F06; [0C 48, 05, 05]
+0F06; [0C 16, 05, 05]
 
-0F07; [0C 4A, 05, 05]
+0F07; [0C 18, 05, 05]
 
-0F08; [0C 4C, 05, 05]
+0F08; [0C 1A, 05, 05]
 
-0F09; [0C 4E, 05, 05]
+0F09; [0C 1C, 05, 05]
 
-0F0A; [0C 50, 05, 05]
+0F0A; [0C 1E, 05, 05]
 
-0FD0; [0C 52, 05, 05]
+0FD0; [0C 20, 05, 05]
 
-0FD1; [0C 54, 05, 05]
+0FD1; [0C 22, 05, 05]
 
-0F0B; [0C 56, 05, 05]
-0F0C; [0C 56, 05, 35]
+0F0B; [0C 24, 05, 05]
+0F0C; [0C 24, 05, 20]
 
-0F0D; [0C 58, 05, 05]
+0F0D; [0C 26, 05, 05]
 
-0F0E; [0C 5A, 05, 05]
+0F0E; [0C 28, 05, 05]
 
-0F0F; [0C 5C, 05, 05]
+0F0F; [0C 2A, 05, 05]
 
-0F10; [0C 5E, 05, 05]
+0F10; [0C 2C, 05, 05]
 
-0F11; [0C 60, 05, 05]
+0F11; [0C 2E, 05, 05]
 
-0F12; [0C 62, 05, 05]
+0F12; [0C 30, 05, 05]
 
-0F85; [0C 64, 05, 05]
+0F85; [0C 32, 05, 05]
 
-0FD2; [0C 66, 05, 05]
+0FD2; [0C 34, 05, 05]
 
-0FD3; [0C 68, 05, 05]
+0FD3; [0C 36, 05, 05]
 
-0FD4; [0C 6A, 05, 05]
+0FD4; [0C 38, 05, 05]
 
-0FD9; [0C 6C, 05, 05]
+0FD9; [0C 3A, 05, 05]
 
-0FDA; [0C 6E, 05, 05]
+0FDA; [0C 3C, 05, 05]
 
-1C3D; [0C 70 04, 05, 05]
+1C3D; [0C 3E 02, 05, 05]
 
-1C3E; [0C 70 0C, 05, 05]
+1C3E; [0C 3E 0A, 05, 05]
 
-1C3F; [0C 70 14, 05, 05]
+1C3F; [0C 3E 12, 05, 05]
 
-104C; [0C 71, 05, 05]
+104C; [0C 40, 05, 05]
 
-104D; [0C 73, 05, 05]
+104D; [0C 42, 05, 05]
 
-104E; [0C 75, 05, 05]
+104E; [0C 44, 05, 05]
 
-104F; [0C 77, 05, 05]
+104F; [0C 46, 05, 05]
 
-17D8; [0C 79, 05, 05]
+17D8; [0C 48, 05, 05]
 
-17D9; [0C 7B, 05, 05]
+17D9; [0C 4A, 05, 05]
 
-17DA; [0C 7D, 05, 05]
+17DA; [0C 4C, 05, 05]
 
-1AA0; [0C 7F 04, 05, 05]
+1AA0; [0C 4E 02, 05, 05]
 
-1AA1; [0C 7F 0C, 05, 05]
+1AA1; [0C 4E 0A, 05, 05]
 
-1AA2; [0C 7F 14, 05, 05]
+1AA2; [0C 4E 12, 05, 05]
 
-1AA3; [0C 7F 1C, 05, 05]
+1AA3; [0C 4E 1A, 05, 05]
 
-1AA4; [0C 7F 24, 05, 05]
+1AA4; [0C 4E 22, 05, 05]
 
-1AA5; [0C 7F 2C, 05, 05]
+1AA5; [0C 4E 2A, 05, 05]
 
-1AA6; [0C 7F 34, 05, 05]
+1AA6; [0C 4E 32, 05, 05]
 
-1AAC; [0C 7F 3C, 05, 05]
+1AAC; [0C 4E 3A, 05, 05]
 
-1AAD; [0C 7F 44, 05, 05]
+1AAD; [0C 4E 42, 05, 05]
 
-166D; [0C 7F 4C, 05, 05]
+166D; [0C 4E 4A, 05, 05]
 
-1CC0; [0C 7F 54, 05, 05]
+1CC0; [0C 4E 52, 05, 05]
 
-1CC1; [0C 7F 5C, 05, 05]
+1CC1; [0C 4E 5A, 05, 05]
 
-1CC2; [0C 7F 64, 05, 05]
+1CC2; [0C 4E 62, 05, 05]
 
-1CC3; [0C 7F 6C, 05, 05]
+1CC3; [0C 4E 6A, 05, 05]
 
-1CC4; [0C 7F 74, 05, 05]
+1CC4; [0C 4E 72, 05, 05]
 
-1CC5; [0C 7F 7C, 05, 05]
+1CC5; [0C 4E 7A, 05, 05]
 
-1CC6; [0C 7F 84, 05, 05]
+1CC6; [0C 4E 82, 05, 05]
 
-1CC7; [0C 7F 8C, 05, 05]
+1CC7; [0C 4E 8A, 05, 05]
 
-2D70; [0C 7F 94, 05, 05]
+2D70; [0C 4E 92, 05, 05]
 
-A874; [0C 7F 9C, 05, 05]
+A874; [0C 4E 9A, 05, 05]
 
-A875; [0C 7F A4, 05, 05]
+A875; [0C 4E A2, 05, 05]
 
-1BFC; [0C 7F AC, 05, 05]
+1BFC; [0C 4E AA, 05, 05]
 
-1BFD; [0C 7F B4, 05, 05]
+1BFD; [0C 4E B2, 05, 05]
 
-1BFE; [0C 7F BC, 05, 05]
+1BFE; [0C 4E BA, 05, 05]
 
-1BFF; [0C 7F C4, 05, 05]
+1BFF; [0C 4E C2, 05, 05]
 
-A92E; [0C 7F CC, 05, 05]
+A92E; [0C 4E CA, 05, 05]
 
-A9DE; [0C 7F D4, 05, 05]
+A9DE; [0C 4E D2, 05, 05]
 
-A9DF; [0C 7F DC, 05, 05]
+A9DF; [0C 4E DA, 05, 05]
 
-AA5C; [0C 7F E4, 05, 05]
+AA5C; [0C 4E E2, 05, 05]
 
-11049; [0C 7F EC, 05, 05]
+11049; [0C 4E EA, 05, 05]
 
-1104A; [0C 7F F4, 05, 05]
+1104A; [0C 4E F2, 05, 05]
 
-1104B; [0C 7F FC, 05, 05]
+1104B; [0C 4E FA, 05, 05]
 
-1104C; [0C 80 0A, 05, 05]
+1104C; [0C 4F 04, 05, 05]
 
-1104D; [0C 80 12, 05, 05]
+1104D; [0C 4F 0C, 05, 05]
 
-10A50; [0C 80 1A, 05, 05]
+10A50; [0C 4F 14, 05, 05]
 
-10A51; [0C 80 22, 05, 05]
+10A51; [0C 4F 1C, 05, 05]
 
-10A52; [0C 80 2A, 05, 05]
+10A52; [0C 4F 24, 05, 05]
 
-10A53; [0C 80 32, 05, 05]
+10A53; [0C 4F 2C, 05, 05]
 
-10A54; [0C 80 3A, 05, 05]
+10A54; [0C 4F 34, 05, 05]
 
-10A55; [0C 80 42, 05, 05]
+10A55; [0C 4F 3C, 05, 05]
 
-10A58; [0C 80 4A, 05, 05]
+10A58; [0C 4F 44, 05, 05]
 
-10B39; [0C 80 52, 05, 05]
+10B39; [0C 4F 4C, 05, 05]
 
-110BB; [0C 80 5A, 05, 05]
+110BB; [0C 4F 54, 05, 05]
 
-110BC; [0C 80 62, 05, 05]
+110BC; [0C 4F 5C, 05, 05]
 
-111C7; [0C 80 6A, 05, 05]
+111C7; [0C 4F 64, 05, 05]
 
-10A7F; [0C 80 72, 05, 05]
+10A7F; [0C 4F 6C, 05, 05]
 
-0060; [0D 0A, 05, 05]
-1FEF; [0D 0A, 05, 05]
-FF40; [0D 0A, 05, 07]
+FDD1 263A;     [0D 02 02, 05, 05]      # SYMBOL first primary starts reordering group
 
-00B4; [0D 0C, 05, 05]
-0384; [0D 0C, 05, 05]
-1FFD; [0D 0C, 05, 05]
+0060; [0D 07, 05, 05]
+1FEF; [0D 07, 05, 05]
+FF40; [0D 07, 05, 20]
 
-02DC; [0D 0E 04, 05, 05]
+00B4; [0D 09, 05, 05]
+0384; [0D 09, 05, 05]
+1FFD; [0D 09, 05, 05]
 
-005E; [0D 0F, 05, 05]
-FF3E; [0D 0F, 05, 07]
+02DC; [0D 0B, 05, 05]
 
-00AF; [0D 11, 05, 05]
-FFE3; [0D 11, 05, 07]
+005E; [0D 0D, 05, 05]
+FF3E; [0D 0D, 05, 20]
 
-02D8; [0D 13 04, 05, 05]
+00AF; [0D 0F, 05, 05]
+FFE3; [0D 0F, 05, 20]
 
-02D9; [0D 13 0C, 05, 05]
+02D8; [0D 11 02, 05, 05]
 
-00A8; [0D 14, 05, 05]
-0385; [0D 14, 05, 05][, 8D, 05]
-1FEE; [0D 14, 05, 05][, 8D, 05]
-1FED; [0D 14, 05, 05][, 8F, 05]
-1FC1; [0D 14, 05, 05][, 9B, 05]
+02D9; [0D 11 0A, 05, 05]
 
-02DA; [0D 16 04, 05, 05]
+00A8; [0D 13, 05, 05]
+0385; [0D 13, 05, 05][, 88, 05]
+1FEE; [0D 13, 05, 05][, 88, 05]
+1FED; [0D 13, 05, 05][, 8A, 05]
+1FC1; [0D 13, 05, 05][, 94, 05]
 
-02DD; [0D 16 0C, 05, 05]
+02DA; [0D 15 02, 05, 05]
+
+02DD; [0D 15 0A, 05, 05]
 
 00B8; [0D 17, 05, 05]
 
-02DB; [0D 19 04, 05, 05]
+02DB; [0D 19 02, 05, 05]
+
+1FBD; [0D 19 0A, 05, 05]
+1FBF; [0D 19 0A, 05, 05]
+1FCE; [0D 19 0A, 05, 05][, 88, 05]
+1FCD; [0D 19 0A, 05, 05][, 8A, 05]
+1FCF; [0D 19 0A, 05, 05][, 94, 05]
+
+1FFE; [0D 19 12, 05, 05]
+1FDE; [0D 19 12, 05, 05][, 88, 05]
+1FDD; [0D 19 12, 05, 05][, 8A, 05]
+1FDF; [0D 19 12, 05, 05][, 94, 05]
+
+1FC0; [0D 19 1A, 05, 05]
+
+309B; [0D 19 22, 05, 05]
+
+309C; [0D 19 2A, 05, 05]
+
+02B9; [0D 1B, 05, 05]
+0374; [0D 1B, 05, 05]
+
+0375; [0D 1D, 05, 05]
+
+02BA; [0D 1F, 05, 05]
+
+02C2; [0D 21 02, 05, 05]
+
+02C3; [0D 21 0A, 05, 05]
+
+02C4; [0D 21 12, 05, 05]
+
+02C5; [0D 21 1A, 05, 05]
+
+02C6; [0D 23, 05, 05]
+
+02C7; [0D 25, 05, 05]
+
+02C8; [0D 27, 05, 05]
+
+02C9; [0D 29, 05, 05]
+
+02CA; [0D 2B, 05, 05]
+
+02CB; [0D 2D, 05, 05]
+
+02CC; [0D 2F, 05, 05]
+
+02CD; [0D 31, 05, 05]
+
+02CE; [0D 33, 05, 05]
+
+02CF; [0D 35, 05, 05]
+
+02D2; [0D 37 02, 05, 05]
+
+02D3; [0D 37 0A, 05, 05]
+
+02D4; [0D 37 12, 05, 05]
+
+02D5; [0D 37 1A, 05, 05]
+
+02D6; [0D 37 22, 05, 05]
+
+02D7; [0D 37 2A, 05, 05]
+
+02DE; [0D 37 32, 05, 05]
+
+02DF; [0D 37 3A, 05, 05]
+
+02E5; [0D 37 42, 05, 05]
+
+02E6; [0D 37 4A, 05, 05]
+
+02E7; [0D 37 52, 05, 05]
+
+02E8; [0D 37 5A, 05, 05]
+
+02E9; [0D 37 62, 05, 05]
+
+02EA; [0D 37 6A, 05, 05]
+
+02EB; [0D 37 72, 05, 05]
+
+02EC; [0D 39, 05, 05]
+
+02ED; [0D 3B 02, 05, 05]
+
+02EF; [0D 3B 0A, 05, 05]
+
+02F0; [0D 3B 12, 05, 05]
+
+02F1; [0D 3B 1A, 05, 05]
+
+02F2; [0D 3B 22, 05, 05]
+
+02F3; [0D 3B 2A, 05, 05]
+
+02F4; [0D 3B 32, 05, 05]
+
+02F5; [0D 3B 3A, 05, 05]
 
-1FBD; [0D 19 0C, 05, 05]
-1FBF; [0D 19 0C, 05, 05]
-1FCE; [0D 19 0C, 05, 05][, 8D, 05]
-1FCD; [0D 19 0C, 05, 05][, 8F, 05]
-1FCF; [0D 19 0C, 05, 05][, 9B, 05]
+02F6; [0D 3B 42, 05, 05]
 
-1FFE; [0D 19 14, 05, 05]
-1FDE; [0D 19 14, 05, 05][, 8D, 05]
-1FDD; [0D 19 14, 05, 05][, 8F, 05]
-1FDF; [0D 19 14, 05, 05][, 9B, 05]
+02F7; [0D 3B 4A, 05, 05]
 
-1FC0; [0D 19 1C, 05, 05]
+02F8; [0D 3B 52, 05, 05]
 
-309B; [0D 19 24, 05, 05]
+02F9; [0D 3B 5A, 05, 05]
 
-309C; [0D 19 2C, 05, 05]
+02FA; [0D 3B 62, 05, 05]
 
-02B9; [0D 1A, 05, 05]
-0374; [0D 1A, 05, 05]
+02FB; [0D 3B 6A, 05, 05]
 
-0375; [0D 1C 04, 05, 05]
+02FC; [0D 3B 72, 05, 05]
 
-02BA; [0D 1D, 05, 05]
+02FD; [0D 3B 7A, 05, 05]
 
-02C2; [0D 1F 04, 05, 05]
+02FE; [0D 3B 82, 05, 05]
 
-02C3; [0D 1F 0C, 05, 05]
+02FF; [0D 3B 8A, 05, 05]
 
-02C4; [0D 1F 14, 05, 05]
+1390; [0D 3B 92, 05, 05]
 
-02C5; [0D 1F 1C, 05, 05]
+1391; [0D 3B 9A, 05, 05]
 
-02C6; [0D 20, 05, 05]
+1392; [0D 3B A2, 05, 05]
 
-02C7; [0D 22, 05, 05]
+1393; [0D 3B AA, 05, 05]
 
-02C8; [0D 24, 05, 05]
+1394; [0D 3B B2, 05, 05]
 
-02C9; [0D 26, 05, 05]
+1395; [0D 3B BA, 05, 05]
 
-02CA; [0D 28, 05, 05]
+1396; [0D 3B C2, 05, 05]
 
-02CB; [0D 2A, 05, 05]
+1397; [0D 3B CA, 05, 05]
 
-02CC; [0D 2C, 05, 05]
+1398; [0D 3B D2, 05, 05]
 
-02CD; [0D 2E, 05, 05]
+1399; [0D 3B DA, 05, 05]
 
-02CE; [0D 30, 05, 05]
+A700; [0D 3B E2, 05, 05]
 
-02CF; [0D 32, 05, 05]
+A701; [0D 3B EA, 05, 05]
 
-02D2; [0D 34 04, 05, 05]
+A702; [0D 3B F2, 05, 05]
 
-02D3; [0D 34 0C, 05, 05]
+A703; [0D 3B FA, 05, 05]
 
-02D4; [0D 34 14, 05, 05]
+A704; [0D 3C 04, 05, 05]
 
-02D5; [0D 34 1C, 05, 05]
+A705; [0D 3C 0C, 05, 05]
 
-02D6; [0D 34 24, 05, 05]
+A706; [0D 3C 14, 05, 05]
 
-02D7; [0D 34 2C, 05, 05]
+A707; [0D 3C 1C, 05, 05]
 
-02DE; [0D 34 34, 05, 05]
+A708; [0D 3C 24, 05, 05]
 
-02DF; [0D 34 3C, 05, 05]
+A709; [0D 3C 2C, 05, 05]
 
-02E5; [0D 34 44, 05, 05]
+A70A; [0D 3C 34, 05, 05]
 
-02E6; [0D 34 4C, 05, 05]
+A70B; [0D 3C 3C, 05, 05]
 
-02E7; [0D 34 54, 05, 05]
+A70C; [0D 3C 44, 05, 05]
 
-02E8; [0D 34 5C, 05, 05]
+A70D; [0D 3C 4C, 05, 05]
 
-02E9; [0D 34 64, 05, 05]
+A70E; [0D 3C 54, 05, 05]
 
-02EA; [0D 34 6C, 05, 05]
+A70F; [0D 3C 5C, 05, 05]
 
-02EB; [0D 34 74, 05, 05]
+A710; [0D 3C 64, 05, 05]
 
-02EC; [0D 35, 05, 05]
+A711; [0D 3C 6C, 05, 05]
 
-02ED; [0D 37 04, 05, 05]
+A712; [0D 3C 74, 05, 05]
 
-02EF; [0D 37 0C, 05, 05]
+A713; [0D 3C 7C, 05, 05]
 
-02F0; [0D 37 14, 05, 05]
+A714; [0D 3C 84, 05, 05]
 
-02F1; [0D 37 1C, 05, 05]
+A715; [0D 3C 8C, 05, 05]
 
-02F2; [0D 37 24, 05, 05]
+A716; [0D 3C 94, 05, 05]
 
-02F3; [0D 37 2C, 05, 05]
+A717; [0D 3E, 05, 05]
 
-02F4; [0D 37 34, 05, 05]
+A718; [0D 40, 05, 05]
 
-02F5; [0D 37 3C, 05, 05]
+A719; [0D 42, 05, 05]
 
-02F6; [0D 37 44, 05, 05]
+A71A; [0D 44, 05, 05]
 
-02F7; [0D 37 4C, 05, 05]
+A71B; [0D 46, 05, 05]
 
-02F8; [0D 37 54, 05, 05]
+A71C; [0D 48, 05, 05]
 
-02F9; [0D 37 5C, 05, 05]
+A71D; [0D 4A, 05, 05]
 
-02FA; [0D 37 64, 05, 05]
+A71E; [0D 4C, 05, 05]
 
-02FB; [0D 37 6C, 05, 05]
+A71F; [0D 4E, 05, 05]
 
-02FC; [0D 37 74, 05, 05]
+A720; [0D 50 02, 05, 05]
 
-02FD; [0D 37 7C, 05, 05]
+A721; [0D 50 0A, 05, 05]
 
-02FE; [0D 37 84, 05, 05]
+A788; [0D 52, 05, 05]
 
-02FF; [0D 37 8C, 05, 05]
+A789; [0D 54 02, 05, 05]
 
-1390; [0D 37 94, 05, 05]
+A78A; [0D 54 0A, 05, 05]
 
-1391; [0D 37 9C, 05, 05]
+00B0; [0D 56, 05, 05]
+2103; [0D 56, 05, 20][2D, 05, A2]
+2109; [0D 56, 05, 20][33, 05, A2]
 
-1392; [0D 37 A4, 05, 05]
+0482; [0D 58 02, 05, 05]
 
-1393; [0D 37 AC, 05, 05]
+0608; [0D 58 0A, 05, 05]
 
-1394; [0D 37 B4, 05, 05]
+1EEF0; [0D 58 12, 05, 05]
 
-1395; [0D 37 BC, 05, 05]
+1EEF1; [0D 58 1A, 05, 05]
 
-1396; [0D 37 C4, 05, 05]
+060E; [0D 58 22, 05, 05]
 
-1397; [0D 37 CC, 05, 05]
+060F; [0D 58 2A, 05, 05]
 
-1398; [0D 37 D4, 05, 05]
+06DE; [0D 58 32, 05, 05]
 
-1399; [0D 37 DC, 05, 05]
+06E9; [0D 58 3A, 05, 05]
 
-A700; [0D 37 E4, 05, 05]
+FDFD; [0D 58 42, 05, 05]
 
-A701; [0D 37 EC, 05, 05]
+FBB2; [0D 58 4A, 05, 05]
 
-A702; [0D 37 F4, 05, 05]
+FBB3; [0D 58 52, 05, 05]
 
-A703; [0D 37 FC, 05, 05]
+FBB4; [0D 58 5A, 05, 05]
 
-A704; [0D 38 0A, 05, 05]
+FBB5; [0D 58 62, 05, 05]
 
-A705; [0D 38 12, 05, 05]
+FBB6; [0D 58 6A, 05, 05]
 
-A706; [0D 38 1A, 05, 05]
+FBB7; [0D 58 72, 05, 05]
 
-A707; [0D 38 22, 05, 05]
+FBB8; [0D 58 7A, 05, 05]
 
-A708; [0D 38 2A, 05, 05]
+FBB9; [0D 58 82, 05, 05]
 
-A709; [0D 38 32, 05, 05]
+FBBA; [0D 58 8A, 05, 05]
 
-A70A; [0D 38 3A, 05, 05]
+FBBB; [0D 58 92, 05, 05]
 
-A70B; [0D 38 42, 05, 05]
+FBBC; [0D 58 9A, 05, 05]
 
-A70C; [0D 38 4A, 05, 05]
+FBBD; [0D 58 A2, 05, 05]
 
-A70D; [0D 38 52, 05, 05]
+FBBE; [0D 58 AA, 05, 05]
 
-A70E; [0D 38 5A, 05, 05]
+FBBF; [0D 58 B2, 05, 05]
 
-A70F; [0D 38 62, 05, 05]
+FBC0; [0D 58 BA, 05, 05]
 
-A710; [0D 38 6A, 05, 05]
+FBC1; [0D 58 C2, 05, 05]
 
-A711; [0D 38 72, 05, 05]
+07F6; [0D 58 CA, 05, 05]
 
-A712; [0D 38 7A, 05, 05]
+09FA; [0D 58 D2, 05, 05]
 
-A713; [0D 38 82, 05, 05]
+0B70; [0D 58 DA, 05, 05]
 
-A714; [0D 38 8A, 05, 05]
+0BF3; [0D 58 E2, 05, 05]
 
-A715; [0D 38 92, 05, 05]
+0BF4; [0D 58 EA, 05, 05]
 
-A716; [0D 38 9A, 05, 05]
+0BF5; [0D 58 F2, 05, 05]
 
-A717; [0D 39, 05, 05]
+0BF6; [0D 58 FA, 05, 05]
 
-A718; [0D 3B, 05, 05]
+0BF7; [0D 59 04, 05, 05]
 
-A719; [0D 3D, 05, 05]
+0BF8; [0D 59 0C, 05, 05]
 
-A71A; [0D 3F, 05, 05]
+0BFA; [0D 59 14, 05, 05]
 
-A71B; [0D 41, 05, 05]
+0C7F; [0D 59 1C, 05, 05]
 
-A71C; [0D 43, 05, 05]
+0D79; [0D 59 24, 05, 05]
 
-A71D; [0D 45, 05, 05]
+A828; [0D 59 2C, 05, 05]
 
-A71E; [0D 47, 05, 05]
+A829; [0D 59 34, 05, 05]
 
-A71F; [0D 49, 05, 05]
+A82A; [0D 59 3C, 05, 05]
 
-A720; [0D 4B 04, 05, 05]
+A82B; [0D 59 44, 05, 05]
 
-A721; [0D 4B 0C, 05, 05]
+A836; [0D 59 4C, 05, 05]
 
-A788; [0D 4C, 05, 05]
+A837; [0D 59 54, 05, 05]
 
-A789; [0D 4E 04, 05, 05]
+A839; [0D 59 5C, 05, 05]
 
-A78A; [0D 4E 0C, 05, 05]
+0F01; [0D 59 64, 05, 05]
 
-00B0; [0D 4F, 05, 05]
-2103; [0D 4F, 05, 09][2B, 05, 93]
-2109; [0D 4F, 05, 09][31, 05, 93]
+0F02; [0D 59 6C, 05, 05]
 
-0482; [0D 51 04, 05, 05]
+0F03; [0D 59 74, 05, 05]
 
-0608; [0D 51 0C, 05, 05]
+0F13; [0D 59 7C, 05, 05]
 
-1EEF0; [0D 51 14, 05, 05]
+0F15; [0D 59 84, 05, 05]
 
-1EEF1; [0D 51 1C, 05, 05]
+0F16; [0D 59 8C, 05, 05]
 
-060E; [0D 51 24, 05, 05]
+0F17; [0D 59 94, 05, 05]
 
-060F; [0D 51 2C, 05, 05]
+0F1A; [0D 59 9C, 05, 05]
 
-06DE; [0D 51 34, 05, 05]
+0F1B; [0D 59 A4, 05, 05]
 
-06E9; [0D 51 3C, 05, 05]
+0F1C; [0D 59 AC, 05, 05]
 
-FDFD; [0D 51 44, 05, 05]
+0F1D; [0D 59 B4, 05, 05]
 
-FBB2; [0D 51 4C, 05, 05]
+0F1E; [0D 59 BC, 05, 05]
 
-FBB3; [0D 51 54, 05, 05]
+0F1F; [0D 59 C4, 05, 05]
 
-FBB4; [0D 51 5C, 05, 05]
+0F34; [0D 59 CC, 05, 05]
 
-FBB5; [0D 51 64, 05, 05]
+0F36; [0D 59 D4, 05, 05]
 
-FBB6; [0D 51 6C, 05, 05]
+0F38; [0D 59 DC, 05, 05]
 
-FBB7; [0D 51 74, 05, 05]
+0FBE; [0D 59 E4, 05, 05]
 
-FBB8; [0D 51 7C, 05, 05]
+0FBF; [0D 59 EC, 05, 05]
 
-FBB9; [0D 51 84, 05, 05]
+0FC0; [0D 59 F4, 05, 05]
 
-FBBA; [0D 51 8C, 05, 05]
+0FC1; [0D 59 FC, 05, 05]
 
-FBBB; [0D 51 94, 05, 05]
+0FC2; [0D 5A 06, 05, 05]
 
-FBBC; [0D 51 9C, 05, 05]
+0FC3; [0D 5A 0E, 05, 05]
 
-FBBD; [0D 51 A4, 05, 05]
+0FC4; [0D 5A 16, 05, 05]
 
-FBBE; [0D 51 AC, 05, 05]
+0FC5; [0D 5A 1E, 05, 05]
 
-FBBF; [0D 51 B4, 05, 05]
+0FC7; [0D 5A 26, 05, 05]
 
-FBC0; [0D 51 BC, 05, 05]
+0FC8; [0D 5A 2E, 05, 05]
 
-FBC1; [0D 51 C4, 05, 05]
+0FC9; [0D 5A 36, 05, 05]
 
-07F6; [0D 51 CC, 05, 05]
+0FCA; [0D 5A 3E, 05, 05]
 
-09FA; [0D 51 D4, 05, 05]
+0FCB; [0D 5A 46, 05, 05]
 
-0B70; [0D 51 DC, 05, 05]
+0FCC; [0D 5A 4E, 05, 05]
 
-0BF3; [0D 51 E4, 05, 05]
+0FCE; [0D 5A 56, 05, 05]
 
-0BF4; [0D 51 EC, 05, 05]
+0FCF; [0D 5A 5E, 05, 05]
 
-0BF5; [0D 51 F4, 05, 05]
+0FD5; [0D 5A 66, 05, 05]
 
-0BF6; [0D 51 FC, 05, 05]
+0FD6; [0D 5A 6E, 05, 05]
 
-0BF7; [0D 52 0A, 05, 05]
+0FD7; [0D 5A 76, 05, 05]
 
-0BF8; [0D 52 12, 05, 05]
+0FD8; [0D 5A 7E, 05, 05]
 
-0BFA; [0D 52 1A, 05, 05]
+1940; [0D 5A 86, 05, 05]
 
-0C7F; [0D 52 22, 05, 05]
+109E; [0D 5A 8E, 05, 05]
 
-0D79; [0D 52 2A, 05, 05]
+109F; [0D 5A 96, 05, 05]
 
-A828; [0D 52 32, 05, 05]
+AA77; [0D 5A 9E, 05, 05]
 
-A829; [0D 52 3A, 05, 05]
+AA78; [0D 5A A6, 05, 05]
 
-A82A; [0D 52 42, 05, 05]
+AA79; [0D 5A AE, 05, 05]
 
-A82B; [0D 52 4A, 05, 05]
+19E0; [0D 5A B6, 05, 05]
 
-A836; [0D 52 52, 05, 05]
+19E1; [0D 5A BE, 05, 05]
 
-A837; [0D 52 5A, 05, 05]
+19E2; [0D 5A C6, 05, 05]
 
-A839; [0D 52 62, 05, 05]
+19E3; [0D 5A CE, 05, 05]
 
-0F01; [0D 52 6A, 05, 05]
+19E4; [0D 5A D6, 05, 05]
 
-0F02; [0D 52 72, 05, 05]
+19E5; [0D 5A DE, 05, 05]
 
-0F03; [0D 52 7A, 05, 05]
+19E6; [0D 5A E6, 05, 05]
 
-0F13; [0D 52 82, 05, 05]
+19E7; [0D 5A EE, 05, 05]
 
-0F15; [0D 52 8A, 05, 05]
+19E8; [0D 5A F6, 05, 05]
 
-0F16; [0D 52 92, 05, 05]
+19E9; [0D 5A FE, 05, 05]
 
-0F17; [0D 52 9A, 05, 05]
+19EA; [0D 5B 08, 05, 05]
 
-0F1A; [0D 52 A2, 05, 05]
+19EB; [0D 5B 10, 05, 05]
 
-0F1B; [0D 52 AA, 05, 05]
+19EC; [0D 5B 18, 05, 05]
 
-0F1C; [0D 52 B2, 05, 05]
+19ED; [0D 5B 20, 05, 05]
 
-0F1D; [0D 52 BA, 05, 05]
+19EE; [0D 5B 28, 05, 05]
 
-0F1E; [0D 52 C2, 05, 05]
+19EF; [0D 5B 30, 05, 05]
 
-0F1F; [0D 52 CA, 05, 05]
+19F0; [0D 5B 38, 05, 05]
 
-0F34; [0D 52 D2, 05, 05]
+19F1; [0D 5B 40, 05, 05]
 
-0F36; [0D 52 DA, 05, 05]
+19F2; [0D 5B 48, 05, 05]
 
-0F38; [0D 52 E2, 05, 05]
+19F3; [0D 5B 50, 05, 05]
 
-0FBE; [0D 52 EA, 05, 05]
+19F4; [0D 5B 58, 05, 05]
 
-0FBF; [0D 52 F2, 05, 05]
+19F5; [0D 5B 60, 05, 05]
 
-0FC0; [0D 52 FA, 05, 05]
+19F6; [0D 5B 68, 05, 05]
 
-0FC1; [0D 53 08, 05, 05]
+19F7; [0D 5B 70, 05, 05]
 
-0FC2; [0D 53 10, 05, 05]
+19F8; [0D 5B 78, 05, 05]
 
-0FC3; [0D 53 18, 05, 05]
+19F9; [0D 5B 80, 05, 05]
 
-0FC4; [0D 53 20, 05, 05]
+19FA; [0D 5B 88, 05, 05]
 
-0FC5; [0D 53 28, 05, 05]
+19FB; [0D 5B 90, 05, 05]
 
-0FC7; [0D 53 30, 05, 05]
+19FC; [0D 5B 98, 05, 05]
 
-0FC8; [0D 53 38, 05, 05]
+19FD; [0D 5B A0, 05, 05]
 
-0FC9; [0D 53 40, 05, 05]
+19FE; [0D 5B A8, 05, 05]
 
-0FCA; [0D 53 48, 05, 05]
+19FF; [0D 5B B0, 05, 05]
 
-0FCB; [0D 53 50, 05, 05]
+1B61; [0D 5B B8, 05, 05]
 
-0FCC; [0D 53 58, 05, 05]
+1B62; [0D 5B C0, 05, 05]
 
-0FCE; [0D 53 60, 05, 05]
+1B63; [0D 5B C8, 05, 05]
 
-0FCF; [0D 53 68, 05, 05]
+1B64; [0D 5B D0, 05, 05]
 
-0FD5; [0D 53 70, 05, 05]
+1B65; [0D 5B D8, 05, 05]
 
-0FD6; [0D 53 78, 05, 05]
+1B66; [0D 5B E0, 05, 05]
 
-0FD7; [0D 53 80, 05, 05]
+1B67; [0D 5B E8, 05, 05]
 
-0FD8; [0D 53 88, 05, 05]
+1B68; [0D 5B F0, 05, 05]
 
-1940; [0D 53 90, 05, 05]
+1B69; [0D 5B F8, 05, 05]
 
-109E; [0D 53 98, 05, 05]
+1B6A; [0D 5C 02, 05, 05]
 
-109F; [0D 53 A0, 05, 05]
+1B74; [0D 5C 0A, 05, 05]
 
-AA77; [0D 53 A8, 05, 05]
+1B75; [0D 5C 12, 05, 05]
 
-AA78; [0D 53 B0, 05, 05]
+1B76; [0D 5C 1A, 05, 05]
 
-AA79; [0D 53 B8, 05, 05]
+1B77; [0D 5C 22, 05, 05]
 
-19E0; [0D 53 C0, 05, 05]
+1B78; [0D 5C 2A, 05, 05]
 
-19E1; [0D 53 C8, 05, 05]
+1B79; [0D 5C 32, 05, 05]
 
-19E2; [0D 53 D0, 05, 05]
+1B7A; [0D 5C 3A, 05, 05]
 
-19E3; [0D 53 D8, 05, 05]
+1B7B; [0D 5C 42, 05, 05]
 
-19E4; [0D 53 E0, 05, 05]
+1B7C; [0D 5C 4A, 05, 05]
 
-19E5; [0D 53 E8, 05, 05]
+00A9; [0D 5E, 05, 05]
 
-19E6; [0D 53 F0, 05, 05]
+00AE; [0D 60, 05, 05]
 
-19E7; [0D 53 F8, 05, 05]
+2104; [0D 62 02, 05, 05]
 
-19E8; [0D 54 06, 05, 05]
+2108; [0D 62 0A, 05, 05]
 
-19E9; [0D 54 0E, 05, 05]
+2114; [0D 62 12, 05, 05]
 
-19EA; [0D 54 16, 05, 05]
+2117; [0D 62 1A, 05, 05]
 
-19EB; [0D 54 1E, 05, 05]
+2118; [0D 62 22, 05, 05]
 
-19EC; [0D 54 26, 05, 05]
+211E; [0D 62 2A, 05, 05]
 
-19ED; [0D 54 2E, 05, 05]
+211F; [0D 62 32, 05, 05]
 
-19EE; [0D 54 36, 05, 05]
+2123; [0D 62 3A, 05, 05]
 
-19EF; [0D 54 3E, 05, 05]
+2125; [0D 62 42, 05, 05]
 
-19F0; [0D 54 46, 05, 05]
+2127; [0D 62 4A, 05, 05]
 
-19F1; [0D 54 4E, 05, 05]
+2129; [0D 62 52, 05, 05]
 
-19F2; [0D 54 56, 05, 05]
+212E; [0D 62 5A, 05, 05]
 
-19F3; [0D 54 5E, 05, 05]
+213A; [0D 62 62, 05, 05]
 
-19F4; [0D 54 66, 05, 05]
+2141; [0D 62 6A, 05, 05]
 
-19F5; [0D 54 6E, 05, 05]
+2142; [0D 62 72, 05, 05]
 
-19F6; [0D 54 76, 05, 05]
+2143; [0D 62 7A, 05, 05]
 
-19F7; [0D 54 7E, 05, 05]
+2144; [0D 62 82, 05, 05]
 
-19F8; [0D 54 86, 05, 05]
+214A; [0D 62 8A, 05, 05]
 
-19F9; [0D 54 8E, 05, 05]
+214C; [0D 62 92, 05, 05]
 
-19FA; [0D 54 96, 05, 05]
+214F; [0D 62 9A, 05, 05]
 
-19FB; [0D 54 9E, 05, 05]
+2190; [0D 62 A2, 05, 05]
+FFE9; [0D 62 A2, 05, A0]
+219A; [0D 62 A2, 05, 05][, 9E, 05]
 
-19FC; [0D 54 A6, 05, 05]
+2192; [0D 62 AA, 05, 05]
+FFEB; [0D 62 AA, 05, A0]
+219B; [0D 62 AA, 05, 05][, 9E, 05]
 
-19FD; [0D 54 AE, 05, 05]
+2191; [0D 62 B2, 05, 05]
+FFEA; [0D 62 B2, 05, A0]
 
-19FE; [0D 54 B6, 05, 05]
+2193; [0D 62 BA, 05, 05]
+FFEC; [0D 62 BA, 05, A0]
 
-19FF; [0D 54 BE, 05, 05]
+2194; [0D 62 C2, 05, 05]
+21AE; [0D 62 C2, 05, 05][, 9E, 05]
 
-1B61; [0D 54 C6, 05, 05]
+2195; [0D 62 CA, 05, 05]
 
-1B62; [0D 54 CE, 05, 05]
+2196; [0D 62 D2, 05, 05]
 
-1B63; [0D 54 D6, 05, 05]
+2197; [0D 62 DA, 05, 05]
 
-1B64; [0D 54 DE, 05, 05]
+2198; [0D 62 E2, 05, 05]
 
-1B65; [0D 54 E6, 05, 05]
+2199; [0D 62 EA, 05, 05]
 
-1B66; [0D 54 EE, 05, 05]
+219C; [0D 62 F2, 05, 05]
 
-1B67; [0D 54 F6, 05, 05]
+219D; [0D 62 FA, 05, 05]
 
-1B68; [0D 55 04, 05, 05]
+219E; [0D 63 04, 05, 05]
 
-1B69; [0D 55 0C, 05, 05]
+219F; [0D 63 0C, 05, 05]
 
-1B6A; [0D 55 14, 05, 05]
+21A0; [0D 63 14, 05, 05]
 
-1B74; [0D 55 1C, 05, 05]
+21A1; [0D 63 1C, 05, 05]
 
-1B75; [0D 55 24, 05, 05]
+21A2; [0D 63 24, 05, 05]
 
-1B76; [0D 55 2C, 05, 05]
+21A3; [0D 63 2C, 05, 05]
 
-1B77; [0D 55 34, 05, 05]
+21A4; [0D 63 34, 05, 05]
 
-1B78; [0D 55 3C, 05, 05]
+21A5; [0D 63 3C, 05, 05]
 
-1B79; [0D 55 44, 05, 05]
+21A6; [0D 63 44, 05, 05]
 
-1B7A; [0D 55 4C, 05, 05]
+21A7; [0D 63 4C, 05, 05]
 
-1B7B; [0D 55 54, 05, 05]
+21A8; [0D 63 54, 05, 05]
 
-1B7C; [0D 55 5C, 05, 05]
+21A9; [0D 63 5C, 05, 05]
 
-00A9; [0D 56, 05, 05]
+21AA; [0D 63 64, 05, 05]
 
-00AE; [0D 58, 05, 05]
+21AB; [0D 63 6C, 05, 05]
 
-2104; [0D 5A 04, 05, 05]
+21AC; [0D 63 74, 05, 05]
 
-2108; [0D 5A 0C, 05, 05]
+21AD; [0D 63 7C, 05, 05]
 
-2114; [0D 5A 14, 05, 05]
+21AF; [0D 63 84, 05, 05]
 
-2117; [0D 5A 1C, 05, 05]
+21B0; [0D 63 8C, 05, 05]
 
-2118; [0D 5A 24, 05, 05]
+21B1; [0D 63 94, 05, 05]
 
-211E; [0D 5A 2C, 05, 05]
+21B2; [0D 63 9C, 05, 05]
 
-211F; [0D 5A 34, 05, 05]
+21B3; [0D 63 A4, 05, 05]
 
-2123; [0D 5A 3C, 05, 05]
+21B4; [0D 63 AC, 05, 05]
 
-2125; [0D 5A 44, 05, 05]
+21B5; [0D 63 B4, 05, 05]
 
-2127; [0D 5A 4C, 05, 05]
+21B6; [0D 63 BC, 05, 05]
 
-2129; [0D 5A 54, 05, 05]
+21B7; [0D 63 C4, 05, 05]
 
-212E; [0D 5A 5C, 05, 05]
+21B8; [0D 63 CC, 05, 05]
 
-213A; [0D 5A 64, 05, 05]
+21B9; [0D 63 D4, 05, 05]
 
-2141; [0D 5A 6C, 05, 05]
+21BA; [0D 63 DC, 05, 05]
 
-2142; [0D 5A 74, 05, 05]
+21BB; [0D 63 E4, 05, 05]
 
-2143; [0D 5A 7C, 05, 05]
+21BC; [0D 63 EC, 05, 05]
 
-2144; [0D 5A 84, 05, 05]
+21BD; [0D 63 F4, 05, 05]
 
-214A; [0D 5A 8C, 05, 05]
+21BE; [0D 63 FC, 05, 05]
 
-214C; [0D 5A 94, 05, 05]
+21BF; [0D 64 06, 05, 05]
 
-214F; [0D 5A 9C, 05, 05]
+21C0; [0D 64 0E, 05, 05]
 
-2190; [0D 5A A4, 05, 05]
-FFE9; [0D 5A A4, 05, A3]
-219A; [0D 5A A4, 05, 05][, A5, 05]
+21C1; [0D 64 16, 05, 05]
 
-2192; [0D 5A AC, 05, 05]
-FFEB; [0D 5A AC, 05, A3]
-219B; [0D 5A AC, 05, 05][, A5, 05]
+21C2; [0D 64 1E, 05, 05]
 
-2191; [0D 5A B4, 05, 05]
-FFEA; [0D 5A B4, 05, A3]
+21C3; [0D 64 26, 05, 05]
 
-2193; [0D 5A BC, 05, 05]
-FFEC; [0D 5A BC, 05, A3]
+21C4; [0D 64 2E, 05, 05]
 
-2194; [0D 5A C4, 05, 05]
-21AE; [0D 5A C4, 05, 05][, A5, 05]
+21C5; [0D 64 36, 05, 05]
 
-2195; [0D 5A CC, 05, 05]
+21C6; [0D 64 3E, 05, 05]
 
-2196; [0D 5A D4, 05, 05]
+21C7; [0D 64 46, 05, 05]
 
-2197; [0D 5A DC, 05, 05]
+21C8; [0D 64 4E, 05, 05]
 
-2198; [0D 5A E4, 05, 05]
+21C9; [0D 64 56, 05, 05]
 
-2199; [0D 5A EC, 05, 05]
+21CA; [0D 64 5E, 05, 05]
 
-219C; [0D 5A F4, 05, 05]
+21CB; [0D 64 66, 05, 05]
 
-219D; [0D 5A FC, 05, 05]
+21CC; [0D 64 6E, 05, 05]
 
-219E; [0D 5B 0A, 05, 05]
+21D0; [0D 64 76, 05, 05]
+21CD; [0D 64 76, 05, 05][, 9E, 05]
 
-219F; [0D 5B 12, 05, 05]
+21D1; [0D 64 7E, 05, 05]
 
-21A0; [0D 5B 1A, 05, 05]
+21D2; [0D 64 86, 05, 05]
+21CF; [0D 64 86, 05, 05][, 9E, 05]
 
-21A1; [0D 5B 22, 05, 05]
+21D3; [0D 64 8E, 05, 05]
 
-21A2; [0D 5B 2A, 05, 05]
+21D4; [0D 64 96, 05, 05]
+21CE; [0D 64 96, 05, 05][, 9E, 05]
 
-21A3; [0D 5B 32, 05, 05]
+21D5; [0D 64 9E, 05, 05]
 
-21A4; [0D 5B 3A, 05, 05]
+21D6; [0D 64 A6, 05, 05]
 
-21A5; [0D 5B 42, 05, 05]
+21D7; [0D 64 AE, 05, 05]
 
-21A6; [0D 5B 4A, 05, 05]
+21D8; [0D 64 B6, 05, 05]
 
-21A7; [0D 5B 52, 05, 05]
+21D9; [0D 64 BE, 05, 05]
 
-21A8; [0D 5B 5A, 05, 05]
+21DA; [0D 64 C6, 05, 05]
 
-21A9; [0D 5B 62, 05, 05]
+21DB; [0D 64 CE, 05, 05]
 
-21AA; [0D 5B 6A, 05, 05]
+21DC; [0D 64 D6, 05, 05]
 
-21AB; [0D 5B 72, 05, 05]
+21DD; [0D 64 DE, 05, 05]
 
-21AC; [0D 5B 7A, 05, 05]
+21DE; [0D 64 E6, 05, 05]
 
-21AD; [0D 5B 82, 05, 05]
+21DF; [0D 64 EE, 05, 05]
 
-21AF; [0D 5B 8A, 05, 05]
+21E0; [0D 64 F6, 05, 05]
 
-21B0; [0D 5B 92, 05, 05]
+21E1; [0D 64 FE, 05, 05]
 
-21B1; [0D 5B 9A, 05, 05]
+21E2; [0D 65 08, 05, 05]
 
-21B2; [0D 5B A2, 05, 05]
+21E3; [0D 65 10, 05, 05]
 
-21B3; [0D 5B AA, 05, 05]
+21E4; [0D 65 18, 05, 05]
 
-21B4; [0D 5B B2, 05, 05]
+21E5; [0D 65 20, 05, 05]
 
-21B5; [0D 5B BA, 05, 05]
+21E6; [0D 65 28, 05, 05]
 
-21B6; [0D 5B C2, 05, 05]
+21E7; [0D 65 30, 05, 05]
 
-21B7; [0D 5B CA, 05, 05]
+21E8; [0D 65 38, 05, 05]
 
-21B8; [0D 5B D2, 05, 05]
+21E9; [0D 65 40, 05, 05]
 
-21B9; [0D 5B DA, 05, 05]
+21EA; [0D 65 48, 05, 05]
 
-21BA; [0D 5B E2, 05, 05]
+21EB; [0D 65 50, 05, 05]
 
-21BB; [0D 5B EA, 05, 05]
+21EC; [0D 65 58, 05, 05]
 
-21BC; [0D 5B F2, 05, 05]
+21ED; [0D 65 60, 05, 05]
 
-21BD; [0D 5B FA, 05, 05]
+21EE; [0D 65 68, 05, 05]
 
-21BE; [0D 5C 08, 05, 05]
+21EF; [0D 65 70, 05, 05]
 
-21BF; [0D 5C 10, 05, 05]
+21F0; [0D 65 78, 05, 05]
 
-21C0; [0D 5C 18, 05, 05]
+21F1; [0D 65 80, 05, 05]
 
-21C1; [0D 5C 20, 05, 05]
+21F2; [0D 65 88, 05, 05]
 
-21C2; [0D 5C 28, 05, 05]
+21F3; [0D 65 90, 05, 05]
 
-21C3; [0D 5C 30, 05, 05]
+21F4; [0D 65 98, 05, 05]
 
-21C4; [0D 5C 38, 05, 05]
+21F5; [0D 65 A0, 05, 05]
 
-21C5; [0D 5C 40, 05, 05]
+21F6; [0D 65 A8, 05, 05]
 
-21C6; [0D 5C 48, 05, 05]
+21F7; [0D 65 B0, 05, 05]
 
-21C7; [0D 5C 50, 05, 05]
+21F8; [0D 65 B8, 05, 05]
 
-21C8; [0D 5C 58, 05, 05]
+21F9; [0D 65 C0, 05, 05]
 
-21C9; [0D 5C 60, 05, 05]
+21FA; [0D 65 C8, 05, 05]
 
-21CA; [0D 5C 68, 05, 05]
+21FB; [0D 65 D0, 05, 05]
 
-21CB; [0D 5C 70, 05, 05]
+21FC; [0D 65 D8, 05, 05]
 
-21CC; [0D 5C 78, 05, 05]
+21FD; [0D 65 E0, 05, 05]
 
-21D0; [0D 5C 80, 05, 05]
-21CD; [0D 5C 80, 05, 05][, A5, 05]
+21FE; [0D 65 E8, 05, 05]
 
-21D1; [0D 5C 88, 05, 05]
+21FF; [0D 65 F0, 05, 05]
 
-21D2; [0D 5C 90, 05, 05]
-21CF; [0D 5C 90, 05, 05][, A5, 05]
+2200; [0D 65 F8, 05, 05]
 
-21D3; [0D 5C 98, 05, 05]
+2201; [0D 66 02, 05, 05]
 
-21D4; [0D 5C A0, 05, 05]
-21CE; [0D 5C A0, 05, 05][, A5, 05]
+2202; [0D 66 0A, 05, 05]
+1D6DB; [0D 66 0A, 05, 20]
+1D715; [0D 66 0A, 05, 20]
+1D74F; [0D 66 0A, 05, 20]
+1D789; [0D 66 0A, 05, 20]
+1D7C3; [0D 66 0A, 05, 20]
 
-21D5; [0D 5C A8, 05, 05]
+2203; [0D 66 12, 05, 05]
+2204; [0D 66 12, 05, 05][, 9E, 05]
 
-21D6; [0D 5C B0, 05, 05]
+2205; [0D 66 1A, 05, 05]
 
-21D7; [0D 5C B8, 05, 05]
+2206; [0D 66 22, 05, 05]
 
-21D8; [0D 5C C0, 05, 05]
+2207; [0D 66 2A, 05, 05]
+1D6C1; [0D 66 2A, 05, 20]
+1D6FB; [0D 66 2A, 05, 20]
+1D735; [0D 66 2A, 05, 20]
+1D76F; [0D 66 2A, 05, 20]
+1D7A9; [0D 66 2A, 05, 20]
 
-21D9; [0D 5C C8, 05, 05]
+2208; [0D 66 32, 05, 05]
+2209; [0D 66 32, 05, 05][, 9E, 05]
 
-21DA; [0D 5C D0, 05, 05]
+220A; [0D 66 3A, 05, 05]
 
-21DB; [0D 5C D8, 05, 05]
+220B; [0D 66 42, 05, 05]
+220C; [0D 66 42, 05, 05][, 9E, 05]
 
-21DC; [0D 5C E0, 05, 05]
+220D; [0D 66 4A, 05, 05]
 
-21DD; [0D 5C E8, 05, 05]
+03F6; [0D 66 52, 05, 05]
 
-21DE; [0D 5C F0, 05, 05]
+220E; [0D 66 5A, 05, 05]
 
-21DF; [0D 5C F8, 05, 05]
+220F; [0D 66 62, 05, 05]
 
-21E0; [0D 5D 06, 05, 05]
+2210; [0D 66 6A, 05, 05]
 
-21E1; [0D 5D 0E, 05, 05]
+2211; [0D 66 72, 05, 05]
+2140; [0D 66 72, 05, 20]
 
-21E2; [0D 5D 16, 05, 05]
+002B; [0D 68, 05, 05]
+FF0B; [0D 68, 05, 10]
+FB29; [0D 68, 05, 18]
+FE62; [0D 68, 05, 20]
+207A; [0D 68, 05, 28]
+208A; [0D 68, 05, 30]
 
-21E3; [0D 5D 1E, 05, 05]
+00B1; [0D 6A, 05, 05]
 
-21E4; [0D 5D 26, 05, 05]
+00F7; [0D 6C, 05, 05]
 
-21E5; [0D 5D 2E, 05, 05]
+00D7; [0D 6E, 05, 05]
 
-21E6; [0D 5D 36, 05, 05]
+003C; [0D 70, 05, 05]
+FF1C; [0D 70, 05, 20]
+FE64; [0D 70, 05, 2E]
+226E; [0D 70, 05, 05][, 9E, 05]
 
-21E7; [0D 5D 3E, 05, 05]
+003D; [0D 72, 05, 05]
+FF1D; [0D 72, 05, 10]
+FE66; [0D 72, 05, 20]
+207C; [0D 72, 05, 28]
+208C; [0D 72, 05, 30]
+2260; [0D 72, 05, 05][, 9E, 05]
+2A75; [0D 72, 05, 18][0D 72, 05, 18]
+2A76; [0D 72, 05, 18][0D 72, 05, 18][0D 72, 05, 18]
 
-21E8; [0D 5D 46, 05, 05]
+003E; [0D 74, 05, 05]
+FF1E; [0D 74, 05, 20]
+FE65; [0D 74, 05, 2E]
+226F; [0D 74, 05, 05][, 9E, 05]
 
-21E9; [0D 5D 4E, 05, 05]
+00AC; [0D 76, 05, 05]
+FFE2; [0D 76, 05, 20]
 
-21EA; [0D 5D 56, 05, 05]
+007C; [0D 78, 05, 05]
+FF5C; [0D 78, 05, 20]
 
-21EB; [0D 5D 5E, 05, 05]
+00A6; [0D 7A, 05, 05]
+FFE4; [0D 7A, 05, 20]
 
-21EC; [0D 5D 66, 05, 05]
+007E; [0D 7C, 05, 05]
+FF5E; [0D 7C, 05, 20]
 
-21ED; [0D 5D 6E, 05, 05]
+2212; [0D 7E 02, 05, 05]
+207B; [0D 7E 02, 05, 20]
+208B; [0D 7E 02, 05, 2E]
 
-21EE; [0D 5D 76, 05, 05]
+2052; [0D 7E 0A, 05, 05]
 
-21EF; [0D 5D 7E, 05, 05]
+2213; [0D 7E 12, 05, 05]
 
-21F0; [0D 5D 86, 05, 05]
+2214; [0D 7E 1A, 05, 05]
 
-21F1; [0D 5D 8E, 05, 05]
+2215; [0D 7E 22, 05, 05]
 
-21F2; [0D 5D 96, 05, 05]
+2044; [0D 7E 2A, 05, 05]
 
-21F3; [0D 5D 9E, 05, 05]
+2216; [0D 7E 32, 05, 05]
 
-21F4; [0D 5D A6, 05, 05]
+2217; [0D 7E 3A, 05, 05]
 
-21F5; [0D 5D AE, 05, 05]
+2218; [0D 7E 42, 05, 05]
 
-21F6; [0D 5D B6, 05, 05]
+2219; [0D 7E 4A, 05, 05]
 
-21F7; [0D 5D BE, 05, 05]
+221A; [0D 7E 52, 05, 05]
 
-21F8; [0D 5D C6, 05, 05]
+221B; [0D 7E 5A, 05, 05]
 
-21F9; [0D 5D CE, 05, 05]
+0606; [0D 7E 62, 05, 05]
 
-21FA; [0D 5D D6, 05, 05]
+221C; [0D 7E 6A, 05, 05]
 
-21FB; [0D 5D DE, 05, 05]
+0607; [0D 7E 72, 05, 05]
 
-21FC; [0D 5D E6, 05, 05]
+221D; [0D 7E 7A, 05, 05]
 
-21FD; [0D 5D EE, 05, 05]
+221E; [0D 7E 82, 05, 05]
 
-21FE; [0D 5D F6, 05, 05]
+221F; [0D 7E 8A, 05, 05]
 
-21FF; [0D 5E 04, 05, 05]
+2220; [0D 7E 92, 05, 05]
 
-2200; [0D 5E 0C, 05, 05]
+2221; [0D 7E 9A, 05, 05]
 
-2201; [0D 5E 14, 05, 05]
+2222; [0D 7E A2, 05, 05]
 
-2202; [0D 5E 1C, 05, 05]
-1D6DB; [0D 5E 1C, 05, 0B]
-1D715; [0D 5E 1C, 05, 0B]
-1D74F; [0D 5E 1C, 05, 0B]
-1D789; [0D 5E 1C, 05, 0B]
-1D7C3; [0D 5E 1C, 05, 0B]
+2223; [0D 7E AA, 05, 05]
+2224; [0D 7E AA, 05, 05][, 9E, 05]
 
-2203; [0D 5E 24, 05, 05]
-2204; [0D 5E 24, 05, 05][, A5, 05]
+2225; [0D 7E B2, 05, 05]
+2226; [0D 7E B2, 05, 05][, 9E, 05]
 
-2205; [0D 5E 2C, 05, 05]
+2227; [0D 7E BA, 05, 05]
 
-2206; [0D 5E 34, 05, 05]
+2228; [0D 7E C2, 05, 05]
 
-2207; [0D 5E 3C, 05, 05]
-1D6C1; [0D 5E 3C, 05, 0B]
-1D6FB; [0D 5E 3C, 05, 0B]
-1D735; [0D 5E 3C, 05, 0B]
-1D76F; [0D 5E 3C, 05, 0B]
-1D7A9; [0D 5E 3C, 05, 0B]
+2229; [0D 7E CA, 05, 05]
 
-2208; [0D 5E 44, 05, 05]
-2209; [0D 5E 44, 05, 05][, A5, 05]
+222A; [0D 7E D2, 05, 05]
 
-220A; [0D 5E 4C, 05, 05]
+222B; [0D 7E DA, 05, 05]
+222C; [0D 7E DA, 05, 20][0D 7E DA, 05, 20]
+222D; [0D 7E DA, 05, 20][0D 7E DA, 05, 20][0D 7E DA, 05, 20]
+2A0C; [0D 7E DA, 05, 20][0D 7E DA, 05, 20][0D 7E DA, 05, 20][0D 7E DA, 05, 20]
 
-220B; [0D 5E 54, 05, 05]
-220C; [0D 5E 54, 05, 05][, A5, 05]
+222E; [0D 7E E2, 05, 05]
+222F; [0D 7E E2, 05, 20][0D 7E E2, 05, 20]
+2230; [0D 7E E2, 05, 20][0D 7E E2, 05, 20][0D 7E E2, 05, 20]
 
-220D; [0D 5E 5C, 05, 05]
+2231; [0D 7E EA, 05, 05]
 
-03F6; [0D 5E 64, 05, 05]
+2232; [0D 7E F2, 05, 05]
 
-220E; [0D 5E 6C, 05, 05]
+2233; [0D 7E FA, 05, 05]
 
-220F; [0D 5E 74, 05, 05]
+2234; [0D 7F 04, 05, 05]
 
-2210; [0D 5E 7C, 05, 05]
+2235; [0D 7F 0C, 05, 05]
 
-2211; [0D 5E 84, 05, 05]
-2140; [0D 5E 84, 05, 0B]
+2236; [0D 7F 14, 05, 05]
 
-002B; [0D 5F, 05, 05]
-FF0B; [0D 5F, 05, 07]
-FB29; [0D 5F, 05, 0B]
-FE62; [0D 5F, 05, 1D]
-207A; [0D 5F, 05, 27]
-208A; [0D 5F, 05, 29]
+2237; [0D 7F 1C, 05, 05]
 
-00B1; [0D 61, 05, 05]
+2238; [0D 7F 24, 05, 05]
 
-00F7; [0D 63, 05, 05]
+2239; [0D 7F 2C, 05, 05]
 
-00D7; [0D 65, 05, 05]
+223A; [0D 7F 34, 05, 05]
 
-003C; [0D 67, 05, 05]
-FF1C; [0D 67, 05, 07]
-FE64; [0D 67, 05, 1D]
-226E; [0D 67, 05, 05][, A5, 05]
+223B; [0D 7F 3C, 05, 05]
 
-003D; [0D 69, 05, 05]
-FF1D; [0D 69, 05, 07]
-FE66; [0D 69, 05, 1D]
-207C; [0D 69, 05, 27]
-208C; [0D 69, 05, 29]
-2260; [0D 69, 05, 05][, A5, 05]
-2A75; [0D 69, 05, 09][0D 69, 05, 3D]
-2A76; [0D 69, 05, 09][0D 69, 05, 09][0D 69, 05, 3D]
+223C; [0D 7F 44, 05, 05]
+2241; [0D 7F 44, 05, 05][, 9E, 05]
 
-003E; [0D 6B, 05, 05]
-FF1E; [0D 6B, 05, 07]
-FE65; [0D 6B, 05, 1D]
-226F; [0D 6B, 05, 05][, A5, 05]
+223D; [0D 7F 4C, 05, 05]
 
-00AC; [0D 6D, 05, 05]
-FFE2; [0D 6D, 05, 07]
+223E; [0D 7F 54, 05, 05]
 
-007C; [0D 6F, 05, 05]
-FF5C; [0D 6F, 05, 07]
+223F; [0D 7F 5C, 05, 05]
 
-00A6; [0D 71, 05, 05]
-FFE4; [0D 71, 05, 07]
+2240; [0D 7F 64, 05, 05]
 
-007E; [0D 73, 05, 05]
-FF5E; [0D 73, 05, 07]
+2242; [0D 7F 6C, 05, 05]
 
-2212; [0D 75 04, 05, 05]
-207B; [0D 75 04, 05, 27]
-208B; [0D 75 04, 05, 29]
+2243; [0D 7F 74, 05, 05]
+2244; [0D 7F 74, 05, 05][, 9E, 05]
 
-2052; [0D 75 0C, 05, 05]
+2245; [0D 7F 7C, 05, 05]
+2247; [0D 7F 7C, 05, 05][, 9E, 05]
 
-2213; [0D 75 14, 05, 05]
+2246; [0D 7F 84, 05, 05]
 
-2214; [0D 75 1C, 05, 05]
+2248; [0D 7F 8C, 05, 05]
+2249; [0D 7F 8C, 05, 05][, 9E, 05]
 
-2215; [0D 75 24, 05, 05]
+224A; [0D 7F 94, 05, 05]
 
-2044; [0D 75 2C, 05, 05]
+224B; [0D 7F 9C, 05, 05]
 
-2216; [0D 75 34, 05, 05]
+224C; [0D 7F A4, 05, 05]
 
-2217; [0D 75 3C, 05, 05]
+224D; [0D 7F AC, 05, 05]
+226D; [0D 7F AC, 05, 05][, 9E, 05]
 
-2218; [0D 75 44, 05, 05]
+224E; [0D 7F B4, 05, 05]
 
-2219; [0D 75 4C, 05, 05]
+224F; [0D 7F BC, 05, 05]
 
-221A; [0D 75 54, 05, 05]
+2250; [0D 7F C4, 05, 05]
 
-221B; [0D 75 5C, 05, 05]
+2251; [0D 7F CC, 05, 05]
 
-0606; [0D 75 64, 05, 05]
+2252; [0D 7F D4, 05, 05]
 
-221C; [0D 75 6C, 05, 05]
+2253; [0D 7F DC, 05, 05]
 
-0607; [0D 75 74, 05, 05]
+2254; [0D 7F E4, 05, 05]
 
-221D; [0D 75 7C, 05, 05]
+2255; [0D 7F EC, 05, 05]
 
-221E; [0D 75 84, 05, 05]
+2256; [0D 7F F4, 05, 05]
 
-221F; [0D 75 8C, 05, 05]
+2257; [0D 7F FC, 05, 05]
 
-2220; [0D 75 94, 05, 05]
+2258; [0D 80 06, 05, 05]
 
-2221; [0D 75 9C, 05, 05]
+2259; [0D 80 0E, 05, 05]
 
-2222; [0D 75 A4, 05, 05]
+225A; [0D 80 16, 05, 05]
 
-2223; [0D 75 AC, 05, 05]
-2224; [0D 75 AC, 05, 05][, A5, 05]
+225B; [0D 80 1E, 05, 05]
 
-2225; [0D 75 B4, 05, 05]
-2226; [0D 75 B4, 05, 05][, A5, 05]
+225C; [0D 80 26, 05, 05]
 
-2227; [0D 75 BC, 05, 05]
+225D; [0D 80 2E, 05, 05]
 
-2228; [0D 75 C4, 05, 05]
+225E; [0D 80 36, 05, 05]
 
-2229; [0D 75 CC, 05, 05]
+225F; [0D 80 3E, 05, 05]
 
-222A; [0D 75 D4, 05, 05]
+2261; [0D 80 46, 05, 05]
+2262; [0D 80 46, 05, 05][, 9E, 05]
 
-222B; [0D 75 DC, 05, 05]
-222C; [0D 75 DC, 05, 09][0D 75 DC, 05, 3D]
-222D; [0D 75 DC, 05, 09][0D 75 DC, 05, 09][0D 75 DC, 05, 3D]
-2A0C; [0D 75 DC, 05, 09][0D 75 DC, 05, 09][0D 75 DC, 05, 09][0D 75 DC, 05, 3D]
+2263; [0D 80 4E, 05, 05]
 
-222E; [0D 75 E4, 05, 05]
-222F; [0D 75 E4, 05, 09][0D 75 E4, 05, 3D]
-2230; [0D 75 E4, 05, 09][0D 75 E4, 05, 09][0D 75 E4, 05, 3D]
+2264; [0D 80 56, 05, 05]
+2270; [0D 80 56, 05, 05][, 9E, 05]
 
-2231; [0D 75 EC, 05, 05]
+2265; [0D 80 5E, 05, 05]
+2271; [0D 80 5E, 05, 05][, 9E, 05]
 
-2232; [0D 75 F4, 05, 05]
+2266; [0D 80 66, 05, 05]
 
-2233; [0D 75 FC, 05, 05]
+2267; [0D 80 6E, 05, 05]
 
-2234; [0D 76 0A, 05, 05]
+2268; [0D 80 76, 05, 05]
 
-2235; [0D 76 12, 05, 05]
+2269; [0D 80 7E, 05, 05]
 
-2236; [0D 76 1A, 05, 05]
+226A; [0D 80 86, 05, 05]
 
-2237; [0D 76 22, 05, 05]
+226B; [0D 80 8E, 05, 05]
 
-2238; [0D 76 2A, 05, 05]
+226C; [0D 80 96, 05, 05]
 
-2239; [0D 76 32, 05, 05]
+2272; [0D 80 9E, 05, 05]
+2274; [0D 80 9E, 05, 05][, 9E, 05]
 
-223A; [0D 76 3A, 05, 05]
+2273; [0D 80 A6, 05, 05]
+2275; [0D 80 A6, 05, 05][, 9E, 05]
 
-223B; [0D 76 42, 05, 05]
+2276; [0D 80 AE, 05, 05]
+2278; [0D 80 AE, 05, 05][, 9E, 05]
 
-223C; [0D 76 4A, 05, 05]
-2241; [0D 76 4A, 05, 05][, A5, 05]
+2277; [0D 80 B6, 05, 05]
+2279; [0D 80 B6, 05, 05][, 9E, 05]
 
-223D; [0D 76 52, 05, 05]
+227A; [0D 80 BE, 05, 05]
+2280; [0D 80 BE, 05, 05][, 9E, 05]
 
-223E; [0D 76 5A, 05, 05]
+227B; [0D 80 C6, 05, 05]
+2281; [0D 80 C6, 05, 05][, 9E, 05]
 
-223F; [0D 76 62, 05, 05]
+227C; [0D 80 CE, 05, 05]
+22E0; [0D 80 CE, 05, 05][, 9E, 05]
 
-2240; [0D 76 6A, 05, 05]
+227D; [0D 80 D6, 05, 05]
+22E1; [0D 80 D6, 05, 05][, 9E, 05]
 
-2242; [0D 76 72, 05, 05]
+227E; [0D 80 DE, 05, 05]
 
-2243; [0D 76 7A, 05, 05]
-2244; [0D 76 7A, 05, 05][, A5, 05]
+227F; [0D 80 E6, 05, 05]
 
-2245; [0D 76 82, 05, 05]
-2247; [0D 76 82, 05, 05][, A5, 05]
+2282; [0D 80 EE, 05, 05]
+2284; [0D 80 EE, 05, 05][, 9E, 05]
 
-2246; [0D 76 8A, 05, 05]
+2283; [0D 80 F6, 05, 05]
+2285; [0D 80 F6, 05, 05][, 9E, 05]
 
-2248; [0D 76 92, 05, 05]
-2249; [0D 76 92, 05, 05][, A5, 05]
+2286; [0D 80 FE, 05, 05]
+2288; [0D 80 FE, 05, 05][, 9E, 05]
 
-224A; [0D 76 9A, 05, 05]
+2287; [0D 81 08, 05, 05]
+2289; [0D 81 08, 05, 05][, 9E, 05]
 
-224B; [0D 76 A2, 05, 05]
+228A; [0D 81 10, 05, 05]
 
-224C; [0D 76 AA, 05, 05]
+228B; [0D 81 18, 05, 05]
 
-224D; [0D 76 B2, 05, 05]
-226D; [0D 76 B2, 05, 05][, A5, 05]
+228C; [0D 81 20, 05, 05]
 
-224E; [0D 76 BA, 05, 05]
+228D; [0D 81 28, 05, 05]
 
-224F; [0D 76 C2, 05, 05]
+228E; [0D 81 30, 05, 05]
 
-2250; [0D 76 CA, 05, 05]
+228F; [0D 81 38, 05, 05]
 
-2251; [0D 76 D2, 05, 05]
+2290; [0D 81 40, 05, 05]
 
-2252; [0D 76 DA, 05, 05]
+2291; [0D 81 48, 05, 05]
+22E2; [0D 81 48, 05, 05][, 9E, 05]
 
-2253; [0D 76 E2, 05, 05]
+2292; [0D 81 50, 05, 05]
+22E3; [0D 81 50, 05, 05][, 9E, 05]
 
-2254; [0D 76 EA, 05, 05]
+2293; [0D 81 58, 05, 05]
 
-2255; [0D 76 F2, 05, 05]
+2294; [0D 81 60, 05, 05]
 
-2256; [0D 76 FA, 05, 05]
+2295; [0D 81 68, 05, 05]
 
-2257; [0D 77 08, 05, 05]
+2296; [0D 81 70, 05, 05]
 
-2258; [0D 77 10, 05, 05]
+2297; [0D 81 78, 05, 05]
 
-2259; [0D 77 18, 05, 05]
+2298; [0D 81 80, 05, 05]
 
-225A; [0D 77 20, 05, 05]
+2299; [0D 81 88, 05, 05]
 
-225B; [0D 77 28, 05, 05]
+229A; [0D 81 90, 05, 05]
 
-225C; [0D 77 30, 05, 05]
+229B; [0D 81 98, 05, 05]
 
-225D; [0D 77 38, 05, 05]
+229C; [0D 81 A0, 05, 05]
 
-225E; [0D 77 40, 05, 05]
+229D; [0D 81 A8, 05, 05]
 
-225F; [0D 77 48, 05, 05]
+229E; [0D 81 B0, 05, 05]
 
-2261; [0D 77 50, 05, 05]
-2262; [0D 77 50, 05, 05][, A5, 05]
+229F; [0D 81 B8, 05, 05]
 
-2263; [0D 77 58, 05, 05]
+22A0; [0D 81 C0, 05, 05]
 
-2264; [0D 77 60, 05, 05]
-2270; [0D 77 60, 05, 05][, A5, 05]
+22A1; [0D 81 C8, 05, 05]
 
-2265; [0D 77 68, 05, 05]
-2271; [0D 77 68, 05, 05][, A5, 05]
+22A2; [0D 81 D0, 05, 05]
+22AC; [0D 81 D0, 05, 05][, 9E, 05]
 
-2266; [0D 77 70, 05, 05]
+22A3; [0D 81 D8, 05, 05]
 
-2267; [0D 77 78, 05, 05]
+22A4; [0D 81 E0, 05, 05]
 
-2268; [0D 77 80, 05, 05]
+22A5; [0D 81 E8, 05, 05]
 
-2269; [0D 77 88, 05, 05]
+22A6; [0D 81 F0, 05, 05]
 
-226A; [0D 77 90, 05, 05]
+22A7; [0D 81 F8, 05, 05]
 
-226B; [0D 77 98, 05, 05]
+22A8; [0D 82 02, 05, 05]
+22AD; [0D 82 02, 05, 05][, 9E, 05]
 
-226C; [0D 77 A0, 05, 05]
+22A9; [0D 82 0A, 05, 05]
+22AE; [0D 82 0A, 05, 05][, 9E, 05]
 
-2272; [0D 77 A8, 05, 05]
-2274; [0D 77 A8, 05, 05][, A5, 05]
+22AA; [0D 82 12, 05, 05]
 
-2273; [0D 77 B0, 05, 05]
-2275; [0D 77 B0, 05, 05][, A5, 05]
+22AB; [0D 82 1A, 05, 05]
+22AF; [0D 82 1A, 05, 05][, 9E, 05]
 
-2276; [0D 77 B8, 05, 05]
-2278; [0D 77 B8, 05, 05][, A5, 05]
+22B0; [0D 82 22, 05, 05]
 
-2277; [0D 77 C0, 05, 05]
-2279; [0D 77 C0, 05, 05][, A5, 05]
+22B1; [0D 82 2A, 05, 05]
 
-227A; [0D 77 C8, 05, 05]
-2280; [0D 77 C8, 05, 05][, A5, 05]
+22B2; [0D 82 32, 05, 05]
+22EA; [0D 82 32, 05, 05][, 9E, 05]
 
-227B; [0D 77 D0, 05, 05]
-2281; [0D 77 D0, 05, 05][, A5, 05]
+22B3; [0D 82 3A, 05, 05]
+22EB; [0D 82 3A, 05, 05][, 9E, 05]
 
-227C; [0D 77 D8, 05, 05]
-22E0; [0D 77 D8, 05, 05][, A5, 05]
+22B4; [0D 82 42, 05, 05]
+22EC; [0D 82 42, 05, 05][, 9E, 05]
 
-227D; [0D 77 E0, 05, 05]
-22E1; [0D 77 E0, 05, 05][, A5, 05]
+22B5; [0D 82 4A, 05, 05]
+22ED; [0D 82 4A, 05, 05][, 9E, 05]
 
-227E; [0D 77 E8, 05, 05]
+22B6; [0D 82 52, 05, 05]
 
-227F; [0D 77 F0, 05, 05]
+22B7; [0D 82 5A, 05, 05]
 
-2282; [0D 77 F8, 05, 05]
-2284; [0D 77 F8, 05, 05][, A5, 05]
+22B8; [0D 82 62, 05, 05]
 
-2283; [0D 78 06, 05, 05]
-2285; [0D 78 06, 05, 05][, A5, 05]
+22B9; [0D 82 6A, 05, 05]
 
-2286; [0D 78 0E, 05, 05]
-2288; [0D 78 0E, 05, 05][, A5, 05]
+22BA; [0D 82 72, 05, 05]
 
-2287; [0D 78 16, 05, 05]
-2289; [0D 78 16, 05, 05][, A5, 05]
+22BB; [0D 82 7A, 05, 05]
 
-228A; [0D 78 1E, 05, 05]
+22BC; [0D 82 82, 05, 05]
 
-228B; [0D 78 26, 05, 05]
+214B; [0D 82 8A, 05, 05]
 
-228C; [0D 78 2E, 05, 05]
+22BD; [0D 82 92, 05, 05]
 
-228D; [0D 78 36, 05, 05]
+22BE; [0D 82 9A, 05, 05]
 
-228E; [0D 78 3E, 05, 05]
+22BF; [0D 82 A2, 05, 05]
 
-228F; [0D 78 46, 05, 05]
+22C0; [0D 82 AA, 05, 05]
 
-2290; [0D 78 4E, 05, 05]
+22C1; [0D 82 B2, 05, 05]
 
-2291; [0D 78 56, 05, 05]
-22E2; [0D 78 56, 05, 05][, A5, 05]
+22C2; [0D 82 BA, 05, 05]
 
-2292; [0D 78 5E, 05, 05]
-22E3; [0D 78 5E, 05, 05][, A5, 05]
+22C3; [0D 82 C2, 05, 05]
 
-2293; [0D 78 66, 05, 05]
+22C4; [0D 82 CA, 05, 05]
 
-2294; [0D 78 6E, 05, 05]
+22C5; [0D 82 D2, 05, 05]
 
-2295; [0D 78 76, 05, 05]
+22C6; [0D 82 DA, 05, 05]
 
-2296; [0D 78 7E, 05, 05]
+22C7; [0D 82 E2, 05, 05]
 
-2297; [0D 78 86, 05, 05]
+22C8; [0D 82 EA, 05, 05]
 
-2298; [0D 78 8E, 05, 05]
+22C9; [0D 82 F2, 05, 05]
 
-2299; [0D 78 96, 05, 05]
+22CA; [0D 82 FA, 05, 05]
 
-229A; [0D 78 9E, 05, 05]
+22CB; [0D 83 04, 05, 05]
 
-229B; [0D 78 A6, 05, 05]
+22CC; [0D 83 0C, 05, 05]
 
-229C; [0D 78 AE, 05, 05]
+22CD; [0D 83 14, 05, 05]
 
-229D; [0D 78 B6, 05, 05]
+22CE; [0D 83 1C, 05, 05]
 
-229E; [0D 78 BE, 05, 05]
+22CF; [0D 83 24, 05, 05]
 
-229F; [0D 78 C6, 05, 05]
+22D0; [0D 83 2C, 05, 05]
 
-22A0; [0D 78 CE, 05, 05]
+22D1; [0D 83 34, 05, 05]
 
-22A1; [0D 78 D6, 05, 05]
+22D2; [0D 83 3C, 05, 05]
 
-22A2; [0D 78 DE, 05, 05]
-22AC; [0D 78 DE, 05, 05][, A5, 05]
+22D3; [0D 83 44, 05, 05]
 
-22A3; [0D 78 E6, 05, 05]
+22D4; [0D 83 4C, 05, 05]
 
-22A4; [0D 78 EE, 05, 05]
+22D5; [0D 83 54, 05, 05]
 
-22A5; [0D 78 F6, 05, 05]
+22D6; [0D 83 5C, 05, 05]
 
-22A6; [0D 79 04, 05, 05]
+22D7; [0D 83 64, 05, 05]
 
-22A7; [0D 79 0C, 05, 05]
+22D8; [0D 83 6C, 05, 05]
 
-22A8; [0D 79 14, 05, 05]
-22AD; [0D 79 14, 05, 05][, A5, 05]
+22D9; [0D 83 74, 05, 05]
 
-22A9; [0D 79 1C, 05, 05]
-22AE; [0D 79 1C, 05, 05][, A5, 05]
+22DA; [0D 83 7C, 05, 05]
 
-22AA; [0D 79 24, 05, 05]
+22DB; [0D 83 84, 05, 05]
 
-22AB; [0D 79 2C, 05, 05]
-22AF; [0D 79 2C, 05, 05][, A5, 05]
+22DC; [0D 83 8C, 05, 05]
 
-22B0; [0D 79 34, 05, 05]
+22DD; [0D 83 94, 05, 05]
 
-22B1; [0D 79 3C, 05, 05]
+22DE; [0D 83 9C, 05, 05]
 
-22B2; [0D 79 44, 05, 05]
-22EA; [0D 79 44, 05, 05][, A5, 05]
+22DF; [0D 83 A4, 05, 05]
 
-22B3; [0D 79 4C, 05, 05]
-22EB; [0D 79 4C, 05, 05][, A5, 05]
+22E4; [0D 83 AC, 05, 05]
 
-22B4; [0D 79 54, 05, 05]
-22EC; [0D 79 54, 05, 05][, A5, 05]
+22E5; [0D 83 B4, 05, 05]
 
-22B5; [0D 79 5C, 05, 05]
-22ED; [0D 79 5C, 05, 05][, A5, 05]
+22E6; [0D 83 BC, 05, 05]
 
-22B6; [0D 79 64, 05, 05]
+22E7; [0D 83 C4, 05, 05]
 
-22B7; [0D 79 6C, 05, 05]
+22E8; [0D 83 CC, 05, 05]
 
-22B8; [0D 79 74, 05, 05]
+22E9; [0D 83 D4, 05, 05]
 
-22B9; [0D 79 7C, 05, 05]
+22EE; [0D 83 DC, 05, 05]
 
-22BA; [0D 79 84, 05, 05]
+22EF; [0D 83 E4, 05, 05]
 
-22BB; [0D 79 8C, 05, 05]
+22F0; [0D 83 EC, 05, 05]
 
-22BC; [0D 79 94, 05, 05]
+22F1; [0D 83 F4, 05, 05]
 
-214B; [0D 79 9C, 05, 05]
+22F2; [0D 83 FC, 05, 05]
 
-22BD; [0D 79 A4, 05, 05]
+22F3; [0D 84 06, 05, 05]
 
-22BE; [0D 79 AC, 05, 05]
+22F4; [0D 84 0E, 05, 05]
 
-22BF; [0D 79 B4, 05, 05]
+22F5; [0D 84 16, 05, 05]
 
-22C0; [0D 79 BC, 05, 05]
+22F6; [0D 84 1E, 05, 05]
 
-22C1; [0D 79 C4, 05, 05]
+22F7; [0D 84 26, 05, 05]
 
-22C2; [0D 79 CC, 05, 05]
+22F8; [0D 84 2E, 05, 05]
 
-22C3; [0D 79 D4, 05, 05]
+22F9; [0D 84 36, 05, 05]
 
-22C4; [0D 79 DC, 05, 05]
+22FA; [0D 84 3E, 05, 05]
 
-22C5; [0D 79 E4, 05, 05]
+22FB; [0D 84 46, 05, 05]
 
-22C6; [0D 79 EC, 05, 05]
+22FC; [0D 84 4E, 05, 05]
 
-22C7; [0D 79 F4, 05, 05]
+22FD; [0D 84 56, 05, 05]
 
-22C8; [0D 79 FC, 05, 05]
+22FE; [0D 84 5E, 05, 05]
 
-22C9; [0D 7A 0A, 05, 05]
+22FF; [0D 84 66, 05, 05]
 
-22CA; [0D 7A 12, 05, 05]
+2300; [0D 84 6E, 05, 05]
 
-22CB; [0D 7A 1A, 05, 05]
+2301; [0D 84 76, 05, 05]
 
-22CC; [0D 7A 22, 05, 05]
+2302; [0D 84 7E, 05, 05]
 
-22CD; [0D 7A 2A, 05, 05]
+2303; [0D 84 86, 05, 05]
 
-22CE; [0D 7A 32, 05, 05]
+2304; [0D 84 8E, 05, 05]
 
-22CF; [0D 7A 3A, 05, 05]
+2305; [0D 84 96, 05, 05]
 
-22D0; [0D 7A 42, 05, 05]
+2306; [0D 84 9E, 05, 05]
 
-22D1; [0D 7A 4A, 05, 05]
+2307; [0D 84 A6, 05, 05]
 
-22D2; [0D 7A 52, 05, 05]
+230C; [0D 84 AE, 05, 05]
 
-22D3; [0D 7A 5A, 05, 05]
+230D; [0D 84 B6, 05, 05]
 
-22D4; [0D 7A 62, 05, 05]
+230E; [0D 84 BE, 05, 05]
 
-22D5; [0D 7A 6A, 05, 05]
+230F; [0D 84 C6, 05, 05]
 
-22D6; [0D 7A 72, 05, 05]
+2310; [0D 84 CE, 05, 05]
 
-22D7; [0D 7A 7A, 05, 05]
+2311; [0D 84 D6, 05, 05]
 
-22D8; [0D 7A 82, 05, 05]
+2312; [0D 84 DE, 05, 05]
 
-22D9; [0D 7A 8A, 05, 05]
+2313; [0D 84 E6, 05, 05]
 
-22DA; [0D 7A 92, 05, 05]
+2314; [0D 84 EE, 05, 05]
 
-22DB; [0D 7A 9A, 05, 05]
+2315; [0D 84 F6, 05, 05]
 
-22DC; [0D 7A A2, 05, 05]
+2316; [0D 84 FE, 05, 05]
 
-22DD; [0D 7A AA, 05, 05]
+2317; [0D 85 08, 05, 05]
 
-22DE; [0D 7A B2, 05, 05]
+2318; [0D 85 10, 05, 05]
 
-22DF; [0D 7A BA, 05, 05]
+2319; [0D 85 18, 05, 05]
 
-22E4; [0D 7A C2, 05, 05]
+231A; [0D 85 20, 05, 05]
 
-22E5; [0D 7A CA, 05, 05]
+231B; [0D 85 28, 05, 05]
 
-22E6; [0D 7A D2, 05, 05]
+231C; [0D 85 30, 05, 05]
 
-22E7; [0D 7A DA, 05, 05]
+231D; [0D 85 38, 05, 05]
 
-22E8; [0D 7A E2, 05, 05]
+231E; [0D 85 40, 05, 05]
 
-22E9; [0D 7A EA, 05, 05]
+231F; [0D 85 48, 05, 05]
 
-22EE; [0D 7A F2, 05, 05]
+2320; [0D 85 50, 05, 05]
 
-22EF; [0D 7A FA, 05, 05]
+2321; [0D 85 58, 05, 05]
 
-22F0; [0D 7B 08, 05, 05]
+2322; [0D 85 60, 05, 05]
 
-22F1; [0D 7B 10, 05, 05]
+2323; [0D 85 68, 05, 05]
 
-22F2; [0D 7B 18, 05, 05]
+2324; [0D 85 70, 05, 05]
 
-22F3; [0D 7B 20, 05, 05]
+2325; [0D 85 78, 05, 05]
 
-22F4; [0D 7B 28, 05, 05]
+2326; [0D 85 80, 05, 05]
 
-22F5; [0D 7B 30, 05, 05]
+2327; [0D 85 88, 05, 05]
 
-22F6; [0D 7B 38, 05, 05]
+2328; [0D 85 90, 05, 05]
 
-22F7; [0D 7B 40, 05, 05]
+232B; [0D 85 98, 05, 05]
 
-22F8; [0D 7B 48, 05, 05]
+232C; [0D 85 A0, 05, 05]
 
-22F9; [0D 7B 50, 05, 05]
+232D; [0D 85 A8, 05, 05]
 
-22FA; [0D 7B 58, 05, 05]
+232E; [0D 85 B0, 05, 05]
 
-22FB; [0D 7B 60, 05, 05]
+232F; [0D 85 B8, 05, 05]
 
-22FC; [0D 7B 68, 05, 05]
+2330; [0D 85 C0, 05, 05]
 
-22FD; [0D 7B 70, 05, 05]
+2331; [0D 85 C8, 05, 05]
 
-22FE; [0D 7B 78, 05, 05]
+2332; [0D 85 D0, 05, 05]
 
-22FF; [0D 7B 80, 05, 05]
+2333; [0D 85 D8, 05, 05]
 
-2300; [0D 7B 88, 05, 05]
+2334; [0D 85 E0, 05, 05]
 
-2301; [0D 7B 90, 05, 05]
+2335; [0D 85 E8, 05, 05]
 
-2302; [0D 7B 98, 05, 05]
+2336; [0D 85 F0, 05, 05]
 
-2303; [0D 7B A0, 05, 05]
+2337; [0D 85 F8, 05, 05]
 
-2304; [0D 7B A8, 05, 05]
+2338; [0D 86 02, 05, 05]
 
-2305; [0D 7B B0, 05, 05]
+2339; [0D 86 0A, 05, 05]
 
-2306; [0D 7B B8, 05, 05]
+233A; [0D 86 12, 05, 05]
 
-2307; [0D 7B C0, 05, 05]
+233B; [0D 86 1A, 05, 05]
 
-2308; [0D 7B C8, 05, 05]
+233C; [0D 86 22, 05, 05]
 
-2309; [0D 7B D0, 05, 05]
+233D; [0D 86 2A, 05, 05]
 
-230A; [0D 7B D8, 05, 05]
+233E; [0D 86 32, 05, 05]
 
-230B; [0D 7B E0, 05, 05]
+233F; [0D 86 3A, 05, 05]
 
-230C; [0D 7B E8, 05, 05]
+2340; [0D 86 42, 05, 05]
 
-230D; [0D 7B F0, 05, 05]
+2341; [0D 86 4A, 05, 05]
 
-230E; [0D 7B F8, 05, 05]
+2342; [0D 86 52, 05, 05]
 
-230F; [0D 7C 06, 05, 05]
+2343; [0D 86 5A, 05, 05]
 
-2310; [0D 7C 0E, 05, 05]
+2344; [0D 86 62, 05, 05]
 
-2311; [0D 7C 16, 05, 05]
+2345; [0D 86 6A, 05, 05]
 
-2312; [0D 7C 1E, 05, 05]
+2346; [0D 86 72, 05, 05]
 
-2313; [0D 7C 26, 05, 05]
+2347; [0D 86 7A, 05, 05]
 
-2314; [0D 7C 2E, 05, 05]
+2348; [0D 86 82, 05, 05]
 
-2315; [0D 7C 36, 05, 05]
+2349; [0D 86 8A, 05, 05]
 
-2316; [0D 7C 3E, 05, 05]
+234A; [0D 86 92, 05, 05]
 
-2317; [0D 7C 46, 05, 05]
+234B; [0D 86 9A, 05, 05]
 
-2318; [0D 7C 4E, 05, 05]
+234C; [0D 86 A2, 05, 05]
 
-2319; [0D 7C 56, 05, 05]
+234D; [0D 86 AA, 05, 05]
 
-231A; [0D 7C 5E, 05, 05]
+234E; [0D 86 B2, 05, 05]
 
-231B; [0D 7C 66, 05, 05]
+234F; [0D 86 BA, 05, 05]
 
-231C; [0D 7C 6E, 05, 05]
+2350; [0D 86 C2, 05, 05]
 
-231D; [0D 7C 76, 05, 05]
+2351; [0D 86 CA, 05, 05]
 
-231E; [0D 7C 7E, 05, 05]
+2352; [0D 86 D2, 05, 05]
 
-231F; [0D 7C 86, 05, 05]
+2353; [0D 86 DA, 05, 05]
 
-2320; [0D 7C 8E, 05, 05]
+2354; [0D 86 E2, 05, 05]
 
-2321; [0D 7C 96, 05, 05]
+2355; [0D 86 EA, 05, 05]
 
-2322; [0D 7C 9E, 05, 05]
+2356; [0D 86 F2, 05, 05]
 
-2323; [0D 7C A6, 05, 05]
+2357; [0D 86 FA, 05, 05]
 
-2324; [0D 7C AE, 05, 05]
+2358; [0D 87 04, 05, 05]
 
-2325; [0D 7C B6, 05, 05]
+2359; [0D 87 0C, 05, 05]
 
-2326; [0D 7C BE, 05, 05]
+235A; [0D 87 14, 05, 05]
 
-2327; [0D 7C C6, 05, 05]
+235B; [0D 87 1C, 05, 05]
 
-2328; [0D 7C CE, 05, 05]
+235C; [0D 87 24, 05, 05]
 
-232B; [0D 7C D6, 05, 05]
+235D; [0D 87 2C, 05, 05]
 
-232C; [0D 7C DE, 05, 05]
+235E; [0D 87 34, 05, 05]
 
-232D; [0D 7C E6, 05, 05]
+235F; [0D 87 3C, 05, 05]
 
-232E; [0D 7C EE, 05, 05]
+2360; [0D 87 44, 05, 05]
 
-232F; [0D 7C F6, 05, 05]
+2361; [0D 87 4C, 05, 05]
 
-2330; [0D 7D 04, 05, 05]
+2362; [0D 87 54, 05, 05]
 
-2331; [0D 7D 0C, 05, 05]
+2363; [0D 87 5C, 05, 05]
 
-2332; [0D 7D 14, 05, 05]
+2364; [0D 87 64, 05, 05]
 
-2333; [0D 7D 1C, 05, 05]
+2365; [0D 87 6C, 05, 05]
 
-2334; [0D 7D 24, 05, 05]
+2366; [0D 87 74, 05, 05]
 
-2335; [0D 7D 2C, 05, 05]
+2367; [0D 87 7C, 05, 05]
 
-2336; [0D 7D 34, 05, 05]
+2368; [0D 87 84, 05, 05]
 
-2337; [0D 7D 3C, 05, 05]
+2369; [0D 87 8C, 05, 05]
 
-2338; [0D 7D 44, 05, 05]
+236A; [0D 87 94, 05, 05]
 
-2339; [0D 7D 4C, 05, 05]
+236B; [0D 87 9C, 05, 05]
 
-233A; [0D 7D 54, 05, 05]
+236C; [0D 87 A4, 05, 05]
 
-233B; [0D 7D 5C, 05, 05]
+236D; [0D 87 AC, 05, 05]
 
-233C; [0D 7D 64, 05, 05]
+236E; [0D 87 B4, 05, 05]
 
-233D; [0D 7D 6C, 05, 05]
+236F; [0D 87 BC, 05, 05]
 
-233E; [0D 7D 74, 05, 05]
+2370; [0D 87 C4, 05, 05]
 
-233F; [0D 7D 7C, 05, 05]
+2371; [0D 87 CC, 05, 05]
 
-2340; [0D 7D 84, 05, 05]
+2372; [0D 87 D4, 05, 05]
 
-2341; [0D 7D 8C, 05, 05]
+2373; [0D 87 DC, 05, 05]
 
-2342; [0D 7D 94, 05, 05]
+2374; [0D 87 E4, 05, 05]
 
-2343; [0D 7D 9C, 05, 05]
+2375; [0D 87 EC, 05, 05]
 
-2344; [0D 7D A4, 05, 05]
+2376; [0D 87 F4, 05, 05]
 
-2345; [0D 7D AC, 05, 05]
+2377; [0D 87 FC, 05, 05]
 
-2346; [0D 7D B4, 05, 05]
+2378; [0D 88 06, 05, 05]
 
-2347; [0D 7D BC, 05, 05]
+2379; [0D 88 0E, 05, 05]
 
-2348; [0D 7D C4, 05, 05]
+237A; [0D 88 16, 05, 05]
 
-2349; [0D 7D CC, 05, 05]
+237B; [0D 88 1E, 05, 05]
 
-234A; [0D 7D D4, 05, 05]
+237C; [0D 88 26, 05, 05]
 
-234B; [0D 7D DC, 05, 05]
+237D; [0D 88 2E, 05, 05]
 
-234C; [0D 7D E4, 05, 05]
+237E; [0D 88 36, 05, 05]
 
-234D; [0D 7D EC, 05, 05]
+237F; [0D 88 3E, 05, 05]
 
-234E; [0D 7D F4, 05, 05]
+2380; [0D 88 46, 05, 05]
 
-234F; [0D 7D FC, 05, 05]
+2381; [0D 88 4E, 05, 05]
 
-2350; [0D 7E 0A, 05, 05]
+2382; [0D 88 56, 05, 05]
 
-2351; [0D 7E 12, 05, 05]
+2383; [0D 88 5E, 05, 05]
 
-2352; [0D 7E 1A, 05, 05]
+2384; [0D 88 66, 05, 05]
 
-2353; [0D 7E 22, 05, 05]
+2385; [0D 88 6E, 05, 05]
 
-2354; [0D 7E 2A, 05, 05]
+2386; [0D 88 76, 05, 05]
 
-2355; [0D 7E 32, 05, 05]
+2387; [0D 88 7E, 05, 05]
 
-2356; [0D 7E 3A, 05, 05]
+2388; [0D 88 86, 05, 05]
 
-2357; [0D 7E 42, 05, 05]
+2389; [0D 88 8E, 05, 05]
 
-2358; [0D 7E 4A, 05, 05]
+238A; [0D 88 96, 05, 05]
 
-2359; [0D 7E 52, 05, 05]
+238B; [0D 88 9E, 05, 05]
 
-235A; [0D 7E 5A, 05, 05]
+238C; [0D 88 A6, 05, 05]
 
-235B; [0D 7E 62, 05, 05]
+238D; [0D 88 AE, 05, 05]
 
-235C; [0D 7E 6A, 05, 05]
+238E; [0D 88 B6, 05, 05]
 
-235D; [0D 7E 72, 05, 05]
+238F; [0D 88 BE, 05, 05]
 
-235E; [0D 7E 7A, 05, 05]
+2390; [0D 88 C6, 05, 05]
 
-235F; [0D 7E 82, 05, 05]
+2391; [0D 88 CE, 05, 05]
 
-2360; [0D 7E 8A, 05, 05]
+2392; [0D 88 D6, 05, 05]
 
-2361; [0D 7E 92, 05, 05]
+2393; [0D 88 DE, 05, 05]
 
-2362; [0D 7E 9A, 05, 05]
+2394; [0D 88 E6, 05, 05]
 
-2363; [0D 7E A2, 05, 05]
+2395; [0D 88 EE, 05, 05]
 
-2364; [0D 7E AA, 05, 05]
+2396; [0D 88 F6, 05, 05]
 
-2365; [0D 7E B2, 05, 05]
+2397; [0D 88 FE, 05, 05]
 
-2366; [0D 7E BA, 05, 05]
+2398; [0D 89 08, 05, 05]
 
-2367; [0D 7E C2, 05, 05]
+2399; [0D 89 10, 05, 05]
 
-2368; [0D 7E CA, 05, 05]
+239A; [0D 89 18, 05, 05]
 
-2369; [0D 7E D2, 05, 05]
+239B; [0D 89 20, 05, 05]
 
-236A; [0D 7E DA, 05, 05]
+239C; [0D 89 28, 05, 05]
 
-236B; [0D 7E E2, 05, 05]
+239D; [0D 89 30, 05, 05]
 
-236C; [0D 7E EA, 05, 05]
+239E; [0D 89 38, 05, 05]
 
-236D; [0D 7E F2, 05, 05]
+239F; [0D 89 40, 05, 05]
 
-236E; [0D 7E FA, 05, 05]
+23A0; [0D 89 48, 05, 05]
 
-236F; [0D 7F 08, 05, 05]
+23A1; [0D 89 50, 05, 05]
 
-2370; [0D 7F 10, 05, 05]
+23A2; [0D 89 58, 05, 05]
 
-2371; [0D 7F 18, 05, 05]
+23A3; [0D 89 60, 05, 05]
 
-2372; [0D 7F 20, 05, 05]
+23A4; [0D 89 68, 05, 05]
 
-2373; [0D 7F 28, 05, 05]
+23A5; [0D 89 70, 05, 05]
 
-2374; [0D 7F 30, 05, 05]
+23A6; [0D 89 78, 05, 05]
 
-2375; [0D 7F 38, 05, 05]
+23A7; [0D 89 80, 05, 05]
 
-2376; [0D 7F 40, 05, 05]
+23A8; [0D 89 88, 05, 05]
 
-2377; [0D 7F 48, 05, 05]
+23A9; [0D 89 90, 05, 05]
 
-2378; [0D 7F 50, 05, 05]
+23AA; [0D 89 98, 05, 05]
 
-2379; [0D 7F 58, 05, 05]
+23AB; [0D 89 A0, 05, 05]
 
-237A; [0D 7F 60, 05, 05]
+23AC; [0D 89 A8, 05, 05]
 
-237B; [0D 7F 68, 05, 05]
+23AD; [0D 89 B0, 05, 05]
 
-237C; [0D 7F 70, 05, 05]
+23AE; [0D 89 B8, 05, 05]
 
-237D; [0D 7F 78, 05, 05]
+23AF; [0D 89 C0, 05, 05]
 
-237E; [0D 7F 80, 05, 05]
+23B0; [0D 89 C8, 05, 05]
 
-237F; [0D 7F 88, 05, 05]
+23B1; [0D 89 D0, 05, 05]
 
-2380; [0D 7F 90, 05, 05]
+23B2; [0D 89 D8, 05, 05]
 
-2381; [0D 7F 98, 05, 05]
+23B3; [0D 89 E0, 05, 05]
 
-2382; [0D 7F A0, 05, 05]
+23B4; [0D 89 E8, 05, 05]
 
-2383; [0D 7F A8, 05, 05]
+23B5; [0D 89 F0, 05, 05]
 
-2384; [0D 7F B0, 05, 05]
+23B6; [0D 89 F8, 05, 05]
 
-2385; [0D 7F B8, 05, 05]
+23B7; [0D 8A 02, 05, 05]
 
-2386; [0D 7F C0, 05, 05]
+23B8; [0D 8A 0A, 05, 05]
 
-2387; [0D 7F C8, 05, 05]
+23B9; [0D 8A 12, 05, 05]
 
-2388; [0D 7F D0, 05, 05]
+23BA; [0D 8A 1A, 05, 05]
 
-2389; [0D 7F D8, 05, 05]
+23BB; [0D 8A 22, 05, 05]
 
-238A; [0D 7F E0, 05, 05]
+23BC; [0D 8A 2A, 05, 05]
 
-238B; [0D 7F E8, 05, 05]
+23BD; [0D 8A 32, 05, 05]
 
-238C; [0D 7F F0, 05, 05]
+23BE; [0D 8A 3A, 05, 05]
 
-238D; [0D 7F F8, 05, 05]
+23BF; [0D 8A 42, 05, 05]
 
-238E; [0D 80 06, 05, 05]
+23C0; [0D 8A 4A, 05, 05]
 
-238F; [0D 80 0E, 05, 05]
+23C1; [0D 8A 52, 05, 05]
 
-2390; [0D 80 16, 05, 05]
+23C2; [0D 8A 5A, 05, 05]
 
-2391; [0D 80 1E, 05, 05]
+23C3; [0D 8A 62, 05, 05]
 
-2392; [0D 80 26, 05, 05]
+23C4; [0D 8A 6A, 05, 05]
 
-2393; [0D 80 2E, 05, 05]
+23C5; [0D 8A 72, 05, 05]
 
-2394; [0D 80 36, 05, 05]
+23C6; [0D 8A 7A, 05, 05]
 
-2395; [0D 80 3E, 05, 05]
+23C7; [0D 8A 82, 05, 05]
 
-2396; [0D 80 46, 05, 05]
+23C8; [0D 8A 8A, 05, 05]
 
-2397; [0D 80 4E, 05, 05]
+23C9; [0D 8A 92, 05, 05]
 
-2398; [0D 80 56, 05, 05]
+23CA; [0D 8A 9A, 05, 05]
 
-2399; [0D 80 5E, 05, 05]
+23CB; [0D 8A A2, 05, 05]
 
-239A; [0D 80 66, 05, 05]
+23CC; [0D 8A AA, 05, 05]
 
-239B; [0D 80 6E, 05, 05]
+23CD; [0D 8A B2, 05, 05]
 
-239C; [0D 80 76, 05, 05]
+23CE; [0D 8A BA, 05, 05]
 
-239D; [0D 80 7E, 05, 05]
+23CF; [0D 8A C2, 05, 05]
 
-239E; [0D 80 86, 05, 05]
+23D0; [0D 8A CA, 05, 05]
 
-239F; [0D 80 8E, 05, 05]
+23D1; [0D 8A D2, 05, 05]
 
-23A0; [0D 80 96, 05, 05]
+23D2; [0D 8A DA, 05, 05]
 
-23A1; [0D 80 9E, 05, 05]
+23D3; [0D 8A E2, 05, 05]
 
-23A2; [0D 80 A6, 05, 05]
+23D4; [0D 8A EA, 05, 05]
 
-23A3; [0D 80 AE, 05, 05]
+23D5; [0D 8A F2, 05, 05]
 
-23A4; [0D 80 B6, 05, 05]
+23D6; [0D 8A FA, 05, 05]
 
-23A5; [0D 80 BE, 05, 05]
+23D7; [0D 8B 04, 05, 05]
 
-23A6; [0D 80 C6, 05, 05]
+23D8; [0D 8B 0C, 05, 05]
 
-23A7; [0D 80 CE, 05, 05]
+23D9; [0D 8B 14, 05, 05]
 
-23A8; [0D 80 D6, 05, 05]
+23DA; [0D 8B 1C, 05, 05]
 
-23A9; [0D 80 DE, 05, 05]
+23DB; [0D 8B 24, 05, 05]
 
-23AA; [0D 80 E6, 05, 05]
+23DC; [0D 8B 2C, 05, 05]
 
-23AB; [0D 80 EE, 05, 05]
+23DD; [0D 8B 34, 05, 05]
 
-23AC; [0D 80 F6, 05, 05]
+23DE; [0D 8B 3C, 05, 05]
 
-23AD; [0D 81 04, 05, 05]
+23DF; [0D 8B 44, 05, 05]
 
-23AE; [0D 81 0C, 05, 05]
+23E0; [0D 8B 4C, 05, 05]
 
-23AF; [0D 81 14, 05, 05]
+23E1; [0D 8B 54, 05, 05]
 
-23B0; [0D 81 1C, 05, 05]
+23E2; [0D 8B 5C, 05, 05]
 
-23B1; [0D 81 24, 05, 05]
+23E3; [0D 8B 64, 05, 05]
 
-23B2; [0D 81 2C, 05, 05]
+23E4; [0D 8B 6C, 05, 05]
 
-23B3; [0D 81 34, 05, 05]
+23E5; [0D 8B 74, 05, 05]
 
-23B4; [0D 81 3C, 05, 05]
+23E6; [0D 8B 7C, 05, 05]
 
-23B5; [0D 81 44, 05, 05]
+23E7; [0D 8B 84, 05, 05]
 
-23B6; [0D 81 4C, 05, 05]
+23E8; [0D 8B 8C, 05, 05]
 
-23B7; [0D 81 54, 05, 05]
+23E9; [0D 8B 94, 05, 05]
 
-23B8; [0D 81 5C, 05, 05]
+23EA; [0D 8B 9C, 05, 05]
 
-23B9; [0D 81 64, 05, 05]
+23EB; [0D 8B A4, 05, 05]
 
-23BA; [0D 81 6C, 05, 05]
+23EC; [0D 8B AC, 05, 05]
 
-23BB; [0D 81 74, 05, 05]
+23ED; [0D 8B B4, 05, 05]
 
-23BC; [0D 81 7C, 05, 05]
+23EE; [0D 8B BC, 05, 05]
 
-23BD; [0D 81 84, 05, 05]
+23EF; [0D 8B C4, 05, 05]
 
-23BE; [0D 81 8C, 05, 05]
+23F0; [0D 8B CC, 05, 05]
 
-23BF; [0D 81 94, 05, 05]
+23F1; [0D 8B D4, 05, 05]
 
-23C0; [0D 81 9C, 05, 05]
+23F2; [0D 8B DC, 05, 05]
 
-23C1; [0D 81 A4, 05, 05]
+23F3; [0D 8B E4, 05, 05]
 
-23C2; [0D 81 AC, 05, 05]
+2400; [0D 8B EC, 05, 05]
 
-23C3; [0D 81 B4, 05, 05]
+2401; [0D 8B F4, 05, 05]
 
-23C4; [0D 81 BC, 05, 05]
+2402; [0D 8B FC, 05, 05]
 
-23C5; [0D 81 C4, 05, 05]
+2403; [0D 8C 06, 05, 05]
 
-23C6; [0D 81 CC, 05, 05]
+2404; [0D 8C 0E, 05, 05]
 
-23C7; [0D 81 D4, 05, 05]
+2405; [0D 8C 16, 05, 05]
 
-23C8; [0D 81 DC, 05, 05]
+2406; [0D 8C 1E, 05, 05]
 
-23C9; [0D 81 E4, 05, 05]
+2407; [0D 8C 26, 05, 05]
 
-23CA; [0D 81 EC, 05, 05]
+2408; [0D 8C 2E, 05, 05]
 
-23CB; [0D 81 F4, 05, 05]
+2409; [0D 8C 36, 05, 05]
 
-23CC; [0D 81 FC, 05, 05]
+240A; [0D 8C 3E, 05, 05]
 
-23CD; [0D 82 0A, 05, 05]
+240B; [0D 8C 46, 05, 05]
 
-23CE; [0D 82 12, 05, 05]
+240C; [0D 8C 4E, 05, 05]
 
-23CF; [0D 82 1A, 05, 05]
+240D; [0D 8C 56, 05, 05]
 
-23D0; [0D 82 22, 05, 05]
+240E; [0D 8C 5E, 05, 05]
 
-23D1; [0D 82 2A, 05, 05]
+240F; [0D 8C 66, 05, 05]
 
-23D2; [0D 82 32, 05, 05]
+2410; [0D 8C 6E, 05, 05]
 
-23D3; [0D 82 3A, 05, 05]
+2411; [0D 8C 76, 05, 05]
 
-23D4; [0D 82 42, 05, 05]
+2412; [0D 8C 7E, 05, 05]
 
-23D5; [0D 82 4A, 05, 05]
+2413; [0D 8C 86, 05, 05]
 
-23D6; [0D 82 52, 05, 05]
+2414; [0D 8C 8E, 05, 05]
 
-23D7; [0D 82 5A, 05, 05]
+2415; [0D 8C 96, 05, 05]
 
-23D8; [0D 82 62, 05, 05]
+2416; [0D 8C 9E, 05, 05]
 
-23D9; [0D 82 6A, 05, 05]
+2417; [0D 8C A6, 05, 05]
 
-23DA; [0D 82 72, 05, 05]
+2418; [0D 8C AE, 05, 05]
 
-23DB; [0D 82 7A, 05, 05]
+2419; [0D 8C B6, 05, 05]
 
-23DC; [0D 82 82, 05, 05]
+241A; [0D 8C BE, 05, 05]
 
-23DD; [0D 82 8A, 05, 05]
+241B; [0D 8C C6, 05, 05]
 
-23DE; [0D 82 92, 05, 05]
+241C; [0D 8C CE, 05, 05]
 
-23DF; [0D 82 9A, 05, 05]
+241D; [0D 8C D6, 05, 05]
 
-23E0; [0D 82 A2, 05, 05]
+241E; [0D 8C DE, 05, 05]
 
-23E1; [0D 82 AA, 05, 05]
+241F; [0D 8C E6, 05, 05]
 
-23E2; [0D 82 B2, 05, 05]
+2420; [0D 8C EE, 05, 05]
 
-23E3; [0D 82 BA, 05, 05]
+2421; [0D 8C F6, 05, 05]
 
-23E4; [0D 82 C2, 05, 05]
+2422; [0D 8C FE, 05, 05]
 
-23E5; [0D 82 CA, 05, 05]
+2423; [0D 8D 08, 05, 05]
 
-23E6; [0D 82 D2, 05, 05]
+2424; [0D 8D 10, 05, 05]
 
-23E7; [0D 82 DA, 05, 05]
+2425; [0D 8D 18, 05, 05]
 
-23E8; [0D 82 E2, 05, 05]
+2426; [0D 8D 20, 05, 05]
 
-23E9; [0D 82 EA, 05, 05]
+2440; [0D 8D 28, 05, 05]
 
-23EA; [0D 82 F2, 05, 05]
+2441; [0D 8D 30, 05, 05]
 
-23EB; [0D 82 FA, 05, 05]
+2442; [0D 8D 38, 05, 05]
 
-23EC; [0D 83 08, 05, 05]
+2443; [0D 8D 40, 05, 05]
 
-23ED; [0D 83 10, 05, 05]
+2444; [0D 8D 48, 05, 05]
 
-23EE; [0D 83 18, 05, 05]
+2445; [0D 8D 50, 05, 05]
 
-23EF; [0D 83 20, 05, 05]
+2446; [0D 8D 58, 05, 05]
 
-23F0; [0D 83 28, 05, 05]
+2447; [0D 8D 60, 05, 05]
 
-23F1; [0D 83 30, 05, 05]
+2448; [0D 8D 68, 05, 05]
 
-23F2; [0D 83 38, 05, 05]
+2449; [0D 8D 70, 05, 05]
 
-23F3; [0D 83 40, 05, 05]
+244A; [0D 8D 78, 05, 05]
 
-2400; [0D 83 48, 05, 05]
+2500; [0D 8D 80, 05, 05]
 
-2401; [0D 83 50, 05, 05]
+2501; [0D 8D 88, 05, 05]
 
-2402; [0D 83 58, 05, 05]
+2502; [0D 8D 90, 05, 05]
+FFE8; [0D 8D 90, 05, A0]
 
-2403; [0D 83 60, 05, 05]
+2503; [0D 8D 98, 05, 05]
 
-2404; [0D 83 68, 05, 05]
+2504; [0D 8D A0, 05, 05]
 
-2405; [0D 83 70, 05, 05]
+2505; [0D 8D A8, 05, 05]
 
-2406; [0D 83 78, 05, 05]
+2506; [0D 8D B0, 05, 05]
 
-2407; [0D 83 80, 05, 05]
+2507; [0D 8D B8, 05, 05]
 
-2408; [0D 83 88, 05, 05]
+2508; [0D 8D C0, 05, 05]
 
-2409; [0D 83 90, 05, 05]
+2509; [0D 8D C8, 05, 05]
 
-240A; [0D 83 98, 05, 05]
+250A; [0D 8D D0, 05, 05]
 
-240B; [0D 83 A0, 05, 05]
+250B; [0D 8D D8, 05, 05]
 
-240C; [0D 83 A8, 05, 05]
+250C; [0D 8D E0, 05, 05]
 
-240D; [0D 83 B0, 05, 05]
+250D; [0D 8D E8, 05, 05]
 
-240E; [0D 83 B8, 05, 05]
+250E; [0D 8D F0, 05, 05]
 
-240F; [0D 83 C0, 05, 05]
+250F; [0D 8D F8, 05, 05]
 
-2410; [0D 83 C8, 05, 05]
+2510; [0D 8E 02, 05, 05]
 
-2411; [0D 83 D0, 05, 05]
+2511; [0D 8E 0A, 05, 05]
 
-2412; [0D 83 D8, 05, 05]
+2512; [0D 8E 12, 05, 05]
 
-2413; [0D 83 E0, 05, 05]
+2513; [0D 8E 1A, 05, 05]
 
-2414; [0D 83 E8, 05, 05]
+2514; [0D 8E 22, 05, 05]
 
-2415; [0D 83 F0, 05, 05]
+2515; [0D 8E 2A, 05, 05]
 
-2416; [0D 83 F8, 05, 05]
+2516; [0D 8E 32, 05, 05]
 
-2417; [0D 84 06, 05, 05]
+2517; [0D 8E 3A, 05, 05]
 
-2418; [0D 84 0E, 05, 05]
+2518; [0D 8E 42, 05, 05]
 
-2419; [0D 84 16, 05, 05]
+2519; [0D 8E 4A, 05, 05]
 
-241A; [0D 84 1E, 05, 05]
+251A; [0D 8E 52, 05, 05]
 
-241B; [0D 84 26, 05, 05]
+251B; [0D 8E 5A, 05, 05]
 
-241C; [0D 84 2E, 05, 05]
+251C; [0D 8E 62, 05, 05]
 
-241D; [0D 84 36, 05, 05]
+251D; [0D 8E 6A, 05, 05]
 
-241E; [0D 84 3E, 05, 05]
+251E; [0D 8E 72, 05, 05]
 
-241F; [0D 84 46, 05, 05]
+251F; [0D 8E 7A, 05, 05]
 
-2420; [0D 84 4E, 05, 05]
+2520; [0D 8E 82, 05, 05]
 
-2421; [0D 84 56, 05, 05]
+2521; [0D 8E 8A, 05, 05]
 
-2422; [0D 84 5E, 05, 05]
+2522; [0D 8E 92, 05, 05]
 
-2423; [0D 84 66, 05, 05]
+2523; [0D 8E 9A, 05, 05]
 
-2424; [0D 84 6E, 05, 05]
+2524; [0D 8E A2, 05, 05]
 
-2425; [0D 84 76, 05, 05]
+2525; [0D 8E AA, 05, 05]
 
-2426; [0D 84 7E, 05, 05]
+2526; [0D 8E B2, 05, 05]
 
-2440; [0D 84 86, 05, 05]
+2527; [0D 8E BA, 05, 05]
 
-2441; [0D 84 8E, 05, 05]
+2528; [0D 8E C2, 05, 05]
 
-2442; [0D 84 96, 05, 05]
+2529; [0D 8E CA, 05, 05]
 
-2443; [0D 84 9E, 05, 05]
+252A; [0D 8E D2, 05, 05]
 
-2444; [0D 84 A6, 05, 05]
+252B; [0D 8E DA, 05, 05]
 
-2445; [0D 84 AE, 05, 05]
+252C; [0D 8E E2, 05, 05]
 
-2446; [0D 84 B6, 05, 05]
+252D; [0D 8E EA, 05, 05]
 
-2447; [0D 84 BE, 05, 05]
+252E; [0D 8E F2, 05, 05]
 
-2448; [0D 84 C6, 05, 05]
+252F; [0D 8E FA, 05, 05]
 
-2449; [0D 84 CE, 05, 05]
+2530; [0D 8F 04, 05, 05]
 
-244A; [0D 84 D6, 05, 05]
+2531; [0D 8F 0C, 05, 05]
 
-2500; [0D 84 DE, 05, 05]
+2532; [0D 8F 14, 05, 05]
 
-2501; [0D 84 E6, 05, 05]
+2533; [0D 8F 1C, 05, 05]
 
-2502; [0D 84 EE, 05, 05]
-FFE8; [0D 84 EE, 05, A3]
+2534; [0D 8F 24, 05, 05]
 
-2503; [0D 84 F6, 05, 05]
+2535; [0D 8F 2C, 05, 05]
 
-2504; [0D 85 04, 05, 05]
+2536; [0D 8F 34, 05, 05]
 
-2505; [0D 85 0C, 05, 05]
+2537; [0D 8F 3C, 05, 05]
 
-2506; [0D 85 14, 05, 05]
+2538; [0D 8F 44, 05, 05]
 
-2507; [0D 85 1C, 05, 05]
+2539; [0D 8F 4C, 05, 05]
 
-2508; [0D 85 24, 05, 05]
+253A; [0D 8F 54, 05, 05]
 
-2509; [0D 85 2C, 05, 05]
+253B; [0D 8F 5C, 05, 05]
 
-250A; [0D 85 34, 05, 05]
+253C; [0D 8F 64, 05, 05]
 
-250B; [0D 85 3C, 05, 05]
+253D; [0D 8F 6C, 05, 05]
 
-250C; [0D 85 44, 05, 05]
+253E; [0D 8F 74, 05, 05]
 
-250D; [0D 85 4C, 05, 05]
+253F; [0D 8F 7C, 05, 05]
 
-250E; [0D 85 54, 05, 05]
+2540; [0D 8F 84, 05, 05]
 
-250F; [0D 85 5C, 05, 05]
+2541; [0D 8F 8C, 05, 05]
 
-2510; [0D 85 64, 05, 05]
+2542; [0D 8F 94, 05, 05]
 
-2511; [0D 85 6C, 05, 05]
+2543; [0D 8F 9C, 05, 05]
 
-2512; [0D 85 74, 05, 05]
+2544; [0D 8F A4, 05, 05]
 
-2513; [0D 85 7C, 05, 05]
+2545; [0D 8F AC, 05, 05]
 
-2514; [0D 85 84, 05, 05]
+2546; [0D 8F B4, 05, 05]
 
-2515; [0D 85 8C, 05, 05]
+2547; [0D 8F BC, 05, 05]
 
-2516; [0D 85 94, 05, 05]
+2548; [0D 8F C4, 05, 05]
 
-2517; [0D 85 9C, 05, 05]
+2549; [0D 8F CC, 05, 05]
 
-2518; [0D 85 A4, 05, 05]
+254A; [0D 8F D4, 05, 05]
 
-2519; [0D 85 AC, 05, 05]
+254B; [0D 8F DC, 05, 05]
 
-251A; [0D 85 B4, 05, 05]
+254C; [0D 8F E4, 05, 05]
 
-251B; [0D 85 BC, 05, 05]
+254D; [0D 8F EC, 05, 05]
 
-251C; [0D 85 C4, 05, 05]
+254E; [0D 8F F4, 05, 05]
 
-251D; [0D 85 CC, 05, 05]
+254F; [0D 8F FC, 05, 05]
 
-251E; [0D 85 D4, 05, 05]
+2550; [0D 90 06, 05, 05]
 
-251F; [0D 85 DC, 05, 05]
+2551; [0D 90 0E, 05, 05]
 
-2520; [0D 85 E4, 05, 05]
+2552; [0D 90 16, 05, 05]
 
-2521; [0D 85 EC, 05, 05]
+2553; [0D 90 1E, 05, 05]
 
-2522; [0D 85 F4, 05, 05]
+2554; [0D 90 26, 05, 05]
 
-2523; [0D 85 FC, 05, 05]
+2555; [0D 90 2E, 05, 05]
 
-2524; [0D 86 0A, 05, 05]
+2556; [0D 90 36, 05, 05]
 
-2525; [0D 86 12, 05, 05]
+2557; [0D 90 3E, 05, 05]
 
-2526; [0D 86 1A, 05, 05]
+2558; [0D 90 46, 05, 05]
 
-2527; [0D 86 22, 05, 05]
+2559; [0D 90 4E, 05, 05]
 
-2528; [0D 86 2A, 05, 05]
+255A; [0D 90 56, 05, 05]
 
-2529; [0D 86 32, 05, 05]
+255B; [0D 90 5E, 05, 05]
 
-252A; [0D 86 3A, 05, 05]
+255C; [0D 90 66, 05, 05]
 
-252B; [0D 86 42, 05, 05]
+255D; [0D 90 6E, 05, 05]
 
-252C; [0D 86 4A, 05, 05]
+255E; [0D 90 76, 05, 05]
 
-252D; [0D 86 52, 05, 05]
+255F; [0D 90 7E, 05, 05]
 
-252E; [0D 86 5A, 05, 05]
+2560; [0D 90 86, 05, 05]
 
-252F; [0D 86 62, 05, 05]
+2561; [0D 90 8E, 05, 05]
 
-2530; [0D 86 6A, 05, 05]
+2562; [0D 90 96, 05, 05]
 
-2531; [0D 86 72, 05, 05]
+2563; [0D 90 9E, 05, 05]
 
-2532; [0D 86 7A, 05, 05]
+2564; [0D 90 A6, 05, 05]
 
-2533; [0D 86 82, 05, 05]
+2565; [0D 90 AE, 05, 05]
 
-2534; [0D 86 8A, 05, 05]
+2566; [0D 90 B6, 05, 05]
 
-2535; [0D 86 92, 05, 05]
+2567; [0D 90 BE, 05, 05]
 
-2536; [0D 86 9A, 05, 05]
+2568; [0D 90 C6, 05, 05]
 
-2537; [0D 86 A2, 05, 05]
+2569; [0D 90 CE, 05, 05]
 
-2538; [0D 86 AA, 05, 05]
+256A; [0D 90 D6, 05, 05]
 
-2539; [0D 86 B2, 05, 05]
+256B; [0D 90 DE, 05, 05]
 
-253A; [0D 86 BA, 05, 05]
+256C; [0D 90 E6, 05, 05]
 
-253B; [0D 86 C2, 05, 05]
+256D; [0D 90 EE, 05, 05]
 
-253C; [0D 86 CA, 05, 05]
+256E; [0D 90 F6, 05, 05]
 
-253D; [0D 86 D2, 05, 05]
+256F; [0D 90 FE, 05, 05]
 
-253E; [0D 86 DA, 05, 05]
+2570; [0D 91 08, 05, 05]
 
-253F; [0D 86 E2, 05, 05]
+2571; [0D 91 10, 05, 05]
 
-2540; [0D 86 EA, 05, 05]
+2572; [0D 91 18, 05, 05]
 
-2541; [0D 86 F2, 05, 05]
+2573; [0D 91 20, 05, 05]
 
-2542; [0D 86 FA, 05, 05]
+2574; [0D 91 28, 05, 05]
 
-2543; [0D 87 08, 05, 05]
+2575; [0D 91 30, 05, 05]
 
-2544; [0D 87 10, 05, 05]
+2576; [0D 91 38, 05, 05]
 
-2545; [0D 87 18, 05, 05]
+2577; [0D 91 40, 05, 05]
 
-2546; [0D 87 20, 05, 05]
+2578; [0D 91 48, 05, 05]
 
-2547; [0D 87 28, 05, 05]
+2579; [0D 91 50, 05, 05]
 
-2548; [0D 87 30, 05, 05]
+257A; [0D 91 58, 05, 05]
 
-2549; [0D 87 38, 05, 05]
+257B; [0D 91 60, 05, 05]
 
-254A; [0D 87 40, 05, 05]
+257C; [0D 91 68, 05, 05]
 
-254B; [0D 87 48, 05, 05]
+257D; [0D 91 70, 05, 05]
 
-254C; [0D 87 50, 05, 05]
+257E; [0D 91 78, 05, 05]
 
-254D; [0D 87 58, 05, 05]
+257F; [0D 91 80, 05, 05]
 
-254E; [0D 87 60, 05, 05]
+2580; [0D 91 88, 05, 05]
 
-254F; [0D 87 68, 05, 05]
+2581; [0D 91 90, 05, 05]
 
-2550; [0D 87 70, 05, 05]
+2582; [0D 91 98, 05, 05]
 
-2551; [0D 87 78, 05, 05]
+2583; [0D 91 A0, 05, 05]
 
-2552; [0D 87 80, 05, 05]
+2584; [0D 91 A8, 05, 05]
 
-2553; [0D 87 88, 05, 05]
+2585; [0D 91 B0, 05, 05]
 
-2554; [0D 87 90, 05, 05]
+2586; [0D 91 B8, 05, 05]
 
-2555; [0D 87 98, 05, 05]
+2587; [0D 91 C0, 05, 05]
 
-2556; [0D 87 A0, 05, 05]
+2588; [0D 91 C8, 05, 05]
 
-2557; [0D 87 A8, 05, 05]
+2589; [0D 91 D0, 05, 05]
 
-2558; [0D 87 B0, 05, 05]
+258A; [0D 91 D8, 05, 05]
 
-2559; [0D 87 B8, 05, 05]
+258B; [0D 91 E0, 05, 05]
 
-255A; [0D 87 C0, 05, 05]
+258C; [0D 91 E8, 05, 05]
 
-255B; [0D 87 C8, 05, 05]
+258D; [0D 91 F0, 05, 05]
 
-255C; [0D 87 D0, 05, 05]
+258E; [0D 91 F8, 05, 05]
 
-255D; [0D 87 D8, 05, 05]
+258F; [0D 92 02, 05, 05]
 
-255E; [0D 87 E0, 05, 05]
+2590; [0D 92 0A, 05, 05]
 
-255F; [0D 87 E8, 05, 05]
+2591; [0D 92 12, 05, 05]
 
-2560; [0D 87 F0, 05, 05]
+2592; [0D 92 1A, 05, 05]
 
-2561; [0D 87 F8, 05, 05]
+2593; [0D 92 22, 05, 05]
 
-2562; [0D 88 06, 05, 05]
+2594; [0D 92 2A, 05, 05]
 
-2563; [0D 88 0E, 05, 05]
+2595; [0D 92 32, 05, 05]
 
-2564; [0D 88 16, 05, 05]
+2596; [0D 92 3A, 05, 05]
 
-2565; [0D 88 1E, 05, 05]
+2597; [0D 92 42, 05, 05]
 
-2566; [0D 88 26, 05, 05]
+2598; [0D 92 4A, 05, 05]
 
-2567; [0D 88 2E, 05, 05]
+2599; [0D 92 52, 05, 05]
 
-2568; [0D 88 36, 05, 05]
+259A; [0D 92 5A, 05, 05]
 
-2569; [0D 88 3E, 05, 05]
+259B; [0D 92 62, 05, 05]
 
-256A; [0D 88 46, 05, 05]
+259C; [0D 92 6A, 05, 05]
 
-256B; [0D 88 4E, 05, 05]
+259D; [0D 92 72, 05, 05]
 
-256C; [0D 88 56, 05, 05]
+259E; [0D 92 7A, 05, 05]
 
-256D; [0D 88 5E, 05, 05]
+259F; [0D 92 82, 05, 05]
 
-256E; [0D 88 66, 05, 05]
+25A0; [0D 92 8A, 05, 05]
+FFED; [0D 92 8A, 05, A0]
 
-256F; [0D 88 6E, 05, 05]
+25A1; [0D 92 92, 05, 05]
 
-2570; [0D 88 76, 05, 05]
+25A2; [0D 92 9A, 05, 05]
 
-2571; [0D 88 7E, 05, 05]
+25A3; [0D 92 A2, 05, 05]
 
-2572; [0D 88 86, 05, 05]
+25A4; [0D 92 AA, 05, 05]
 
-2573; [0D 88 8E, 05, 05]
+25A5; [0D 92 B2, 05, 05]
 
-2574; [0D 88 96, 05, 05]
+25A6; [0D 92 BA, 05, 05]
 
-2575; [0D 88 9E, 05, 05]
+25A7; [0D 92 C2, 05, 05]
 
-2576; [0D 88 A6, 05, 05]
+25A8; [0D 92 CA, 05, 05]
 
-2577; [0D 88 AE, 05, 05]
+25A9; [0D 92 D2, 05, 05]
 
-2578; [0D 88 B6, 05, 05]
+25AA; [0D 92 DA, 05, 05]
 
-2579; [0D 88 BE, 05, 05]
+25AB; [0D 92 E2, 05, 05]
 
-257A; [0D 88 C6, 05, 05]
+25AC; [0D 92 EA, 05, 05]
 
-257B; [0D 88 CE, 05, 05]
+25AD; [0D 92 F2, 05, 05]
 
-257C; [0D 88 D6, 05, 05]
+25AE; [0D 92 FA, 05, 05]
 
-257D; [0D 88 DE, 05, 05]
+25AF; [0D 93 04, 05, 05]
 
-257E; [0D 88 E6, 05, 05]
+25B0; [0D 93 0C, 05, 05]
 
-257F; [0D 88 EE, 05, 05]
+25B1; [0D 93 14, 05, 05]
 
-2580; [0D 88 F6, 05, 05]
+25B2; [0D 93 1C, 05, 05]
 
-2581; [0D 89 04, 05, 05]
+25B3; [0D 93 24, 05, 05]
 
-2582; [0D 89 0C, 05, 05]
+25B4; [0D 93 2C, 05, 05]
 
-2583; [0D 89 14, 05, 05]
+25B5; [0D 93 34, 05, 05]
 
-2584; [0D 89 1C, 05, 05]
+25B6; [0D 93 3C, 05, 05]
 
-2585; [0D 89 24, 05, 05]
+25B7; [0D 93 44, 05, 05]
 
-2586; [0D 89 2C, 05, 05]
+25B8; [0D 93 4C, 05, 05]
 
-2587; [0D 89 34, 05, 05]
+25B9; [0D 93 54, 05, 05]
 
-2588; [0D 89 3C, 05, 05]
+25BA; [0D 93 5C, 05, 05]
 
-2589; [0D 89 44, 05, 05]
+25BB; [0D 93 64, 05, 05]
 
-258A; [0D 89 4C, 05, 05]
+25BC; [0D 93 6C, 05, 05]
 
-258B; [0D 89 54, 05, 05]
+25BD; [0D 93 74, 05, 05]
 
-258C; [0D 89 5C, 05, 05]
+25BE; [0D 93 7C, 05, 05]
 
-258D; [0D 89 64, 05, 05]
+25BF; [0D 93 84, 05, 05]
 
-258E; [0D 89 6C, 05, 05]
+25C0; [0D 93 8C, 05, 05]
 
-258F; [0D 89 74, 05, 05]
+25C1; [0D 93 94, 05, 05]
 
-2590; [0D 89 7C, 05, 05]
+25C2; [0D 93 9C, 05, 05]
 
-2591; [0D 89 84, 05, 05]
+25C3; [0D 93 A4, 05, 05]
 
-2592; [0D 89 8C, 05, 05]
+25C4; [0D 93 AC, 05, 05]
 
-2593; [0D 89 94, 05, 05]
+25C5; [0D 93 B4, 05, 05]
 
-2594; [0D 89 9C, 05, 05]
+25C6; [0D 93 BC, 05, 05]
 
-2595; [0D 89 A4, 05, 05]
+25C7; [0D 93 C4, 05, 05]
 
-2596; [0D 89 AC, 05, 05]
+25C8; [0D 93 CC, 05, 05]
 
-2597; [0D 89 B4, 05, 05]
+25C9; [0D 93 D4, 05, 05]
 
-2598; [0D 89 BC, 05, 05]
+25CA; [0D 93 DC, 05, 05]
 
-2599; [0D 89 C4, 05, 05]
+25CB; [0D 93 E4, 05, 05]
+FFEE; [0D 93 E4, 05, A0]
 
-259A; [0D 89 CC, 05, 05]
+25CC; [0D 93 EC, 05, 05]
 
-259B; [0D 89 D4, 05, 05]
+25CD; [0D 93 F4, 05, 05]
 
-259C; [0D 89 DC, 05, 05]
+25CE; [0D 93 FC, 05, 05]
 
-259D; [0D 89 E4, 05, 05]
+25CF; [0D 94 06, 05, 05]
 
-259E; [0D 89 EC, 05, 05]
+25D0; [0D 94 0E, 05, 05]
 
-259F; [0D 89 F4, 05, 05]
+25D1; [0D 94 16, 05, 05]
 
-25A0; [0D 89 FC, 05, 05]
-FFED; [0D 89 FC, 05, A3]
+25D2; [0D 94 1E, 05, 05]
 
-25A1; [0D 8A 0A, 05, 05]
+25D3; [0D 94 26, 05, 05]
 
-25A2; [0D 8A 12, 05, 05]
+25D4; [0D 94 2E, 05, 05]
 
-25A3; [0D 8A 1A, 05, 05]
+25D5; [0D 94 36, 05, 05]
 
-25A4; [0D 8A 22, 05, 05]
+25D6; [0D 94 3E, 05, 05]
 
-25A5; [0D 8A 2A, 05, 05]
+25D7; [0D 94 46, 05, 05]
 
-25A6; [0D 8A 32, 05, 05]
+25D8; [0D 94 4E, 05, 05]
 
-25A7; [0D 8A 3A, 05, 05]
+25D9; [0D 94 56, 05, 05]
 
-25A8; [0D 8A 42, 05, 05]
+25DA; [0D 94 5E, 05, 05]
 
-25A9; [0D 8A 4A, 05, 05]
+25DB; [0D 94 66, 05, 05]
 
-25AA; [0D 8A 52, 05, 05]
+25DC; [0D 94 6E, 05, 05]
 
-25AB; [0D 8A 5A, 05, 05]
+25DD; [0D 94 76, 05, 05]
 
-25AC; [0D 8A 62, 05, 05]
+25DE; [0D 94 7E, 05, 05]
 
-25AD; [0D 8A 6A, 05, 05]
+25DF; [0D 94 86, 05, 05]
 
-25AE; [0D 8A 72, 05, 05]
+25E0; [0D 94 8E, 05, 05]
 
-25AF; [0D 8A 7A, 05, 05]
+25E1; [0D 94 96, 05, 05]
 
-25B0; [0D 8A 82, 05, 05]
+25E2; [0D 94 9E, 05, 05]
 
-25B1; [0D 8A 8A, 05, 05]
+25E3; [0D 94 A6, 05, 05]
 
-25B2; [0D 8A 92, 05, 05]
+25E4; [0D 94 AE, 05, 05]
 
-25B3; [0D 8A 9A, 05, 05]
+25E5; [0D 94 B6, 05, 05]
 
-25B4; [0D 8A A2, 05, 05]
+25E6; [0D 94 BE, 05, 05]
 
-25B5; [0D 8A AA, 05, 05]
+25E7; [0D 94 C6, 05, 05]
 
-25B6; [0D 8A B2, 05, 05]
+25E8; [0D 94 CE, 05, 05]
 
-25B7; [0D 8A BA, 05, 05]
+25E9; [0D 94 D6, 05, 05]
 
-25B8; [0D 8A C2, 05, 05]
+25EA; [0D 94 DE, 05, 05]
 
-25B9; [0D 8A CA, 05, 05]
+25EB; [0D 94 E6, 05, 05]
 
-25BA; [0D 8A D2, 05, 05]
+25EC; [0D 94 EE, 05, 05]
 
-25BB; [0D 8A DA, 05, 05]
+25ED; [0D 94 F6, 05, 05]
 
-25BC; [0D 8A E2, 05, 05]
+25EE; [0D 94 FE, 05, 05]
 
-25BD; [0D 8A EA, 05, 05]
+25EF; [0D 95 08, 05, 05]
 
-25BE; [0D 8A F2, 05, 05]
+25F0; [0D 95 10, 05, 05]
 
-25BF; [0D 8A FA, 05, 05]
+25F1; [0D 95 18, 05, 05]
 
-25C0; [0D 8B 08, 05, 05]
+25F2; [0D 95 20, 05, 05]
 
-25C1; [0D 8B 10, 05, 05]
+25F3; [0D 95 28, 05, 05]
 
-25C2; [0D 8B 18, 05, 05]
+25F4; [0D 95 30, 05, 05]
 
-25C3; [0D 8B 20, 05, 05]
+25F5; [0D 95 38, 05, 05]
 
-25C4; [0D 8B 28, 05, 05]
+25F6; [0D 95 40, 05, 05]
 
-25C5; [0D 8B 30, 05, 05]
+25F7; [0D 95 48, 05, 05]
 
-25C6; [0D 8B 38, 05, 05]
+25F8; [0D 95 50, 05, 05]
 
-25C7; [0D 8B 40, 05, 05]
+25F9; [0D 95 58, 05, 05]
 
-25C8; [0D 8B 48, 05, 05]
+25FA; [0D 95 60, 05, 05]
 
-25C9; [0D 8B 50, 05, 05]
+25FB; [0D 95 68, 05, 05]
 
-25CA; [0D 8B 58, 05, 05]
+25FC; [0D 95 70, 05, 05]
 
-25CB; [0D 8B 60, 05, 05]
-FFEE; [0D 8B 60, 05, A3]
+25FD; [0D 95 78, 05, 05]
 
-25CC; [0D 8B 68, 05, 05]
+25FE; [0D 95 80, 05, 05]
 
-25CD; [0D 8B 70, 05, 05]
+25FF; [0D 95 88, 05, 05]
 
-25CE; [0D 8B 78, 05, 05]
+2600; [0D 95 90, 05, 05]
 
-25CF; [0D 8B 80, 05, 05]
+2601; [0D 95 98, 05, 05]
 
-25D0; [0D 8B 88, 05, 05]
+2602; [0D 95 A0, 05, 05]
 
-25D1; [0D 8B 90, 05, 05]
+2603; [0D 95 A8, 05, 05]
 
-25D2; [0D 8B 98, 05, 05]
+2604; [0D 95 B0, 05, 05]
 
-25D3; [0D 8B A0, 05, 05]
+2605; [0D 95 B8, 05, 05]
 
-25D4; [0D 8B A8, 05, 05]
+2606; [0D 95 C0, 05, 05]
 
-25D5; [0D 8B B0, 05, 05]
+2607; [0D 95 C8, 05, 05]
 
-25D6; [0D 8B B8, 05, 05]
+2608; [0D 95 D0, 05, 05]
 
-25D7; [0D 8B C0, 05, 05]
+2609; [0D 95 D8, 05, 05]
 
-25D8; [0D 8B C8, 05, 05]
+260A; [0D 95 E0, 05, 05]
 
-25D9; [0D 8B D0, 05, 05]
+260B; [0D 95 E8, 05, 05]
 
-25DA; [0D 8B D8, 05, 05]
+260C; [0D 95 F0, 05, 05]
 
-25DB; [0D 8B E0, 05, 05]
+260D; [0D 95 F8, 05, 05]
 
-25DC; [0D 8B E8, 05, 05]
+260E; [0D 96 02, 05, 05]
 
-25DD; [0D 8B F0, 05, 05]
+260F; [0D 96 0A, 05, 05]
 
-25DE; [0D 8B F8, 05, 05]
+2610; [0D 96 12, 05, 05]
 
-25DF; [0D 8C 06, 05, 05]
+2611; [0D 96 1A, 05, 05]
 
-25E0; [0D 8C 0E, 05, 05]
+2612; [0D 96 22, 05, 05]
 
-25E1; [0D 8C 16, 05, 05]
+2613; [0D 96 2A, 05, 05]
 
-25E2; [0D 8C 1E, 05, 05]
+2614; [0D 96 32, 05, 05]
 
-25E3; [0D 8C 26, 05, 05]
+2615; [0D 96 3A, 05, 05]
 
-25E4; [0D 8C 2E, 05, 05]
+2616; [0D 96 42, 05, 05]
 
-25E5; [0D 8C 36, 05, 05]
+2617; [0D 96 4A, 05, 05]
 
-25E6; [0D 8C 3E, 05, 05]
+2618; [0D 96 52, 05, 05]
 
-25E7; [0D 8C 46, 05, 05]
+2619; [0D 96 5A, 05, 05]
 
-25E8; [0D 8C 4E, 05, 05]
+261A; [0D 96 62, 05, 05]
 
-25E9; [0D 8C 56, 05, 05]
+261B; [0D 96 6A, 05, 05]
 
-25EA; [0D 8C 5E, 05, 05]
+261C; [0D 96 72, 05, 05]
 
-25EB; [0D 8C 66, 05, 05]
+261D; [0D 96 7A, 05, 05]
 
-25EC; [0D 8C 6E, 05, 05]
+261E; [0D 96 82, 05, 05]
 
-25ED; [0D 8C 76, 05, 05]
+261F; [0D 96 8A, 05, 05]
 
-25EE; [0D 8C 7E, 05, 05]
+2620; [0D 96 92, 05, 05]
 
-25EF; [0D 8C 86, 05, 05]
+2621; [0D 96 9A, 05, 05]
 
-25F0; [0D 8C 8E, 05, 05]
+2622; [0D 96 A2, 05, 05]
 
-25F1; [0D 8C 96, 05, 05]
+2623; [0D 96 AA, 05, 05]
 
-25F2; [0D 8C 9E, 05, 05]
+2624; [0D 96 B2, 05, 05]
 
-25F3; [0D 8C A6, 05, 05]
+2625; [0D 96 BA, 05, 05]
 
-25F4; [0D 8C AE, 05, 05]
+2626; [0D 96 C2, 05, 05]
 
-25F5; [0D 8C B6, 05, 05]
+2627; [0D 96 CA, 05, 05]
 
-25F6; [0D 8C BE, 05, 05]
+2628; [0D 96 D2, 05, 05]
 
-25F7; [0D 8C C6, 05, 05]
+2629; [0D 96 DA, 05, 05]
 
-25F8; [0D 8C CE, 05, 05]
+262A; [0D 96 E2, 05, 05]
 
-25F9; [0D 8C D6, 05, 05]
+262B; [0D 96 EA, 05, 05]
 
-25FA; [0D 8C DE, 05, 05]
+262C; [0D 96 F2, 05, 05]
 
-25FB; [0D 8C E6, 05, 05]
+262D; [0D 96 FA, 05, 05]
 
-25FC; [0D 8C EE, 05, 05]
+262E; [0D 97 04, 05, 05]
 
-25FD; [0D 8C F6, 05, 05]
+262F; [0D 97 0C, 05, 05]
 
-25FE; [0D 8D 04, 05, 05]
+2638; [0D 97 14, 05, 05]
 
-25FF; [0D 8D 0C, 05, 05]
+2639; [0D 97 1C, 05, 05]
 
-2600; [0D 8D 14, 05, 05]
+263A; [0D 97 24, 05, 05]
 
-2601; [0D 8D 1C, 05, 05]
+263B; [0D 97 2C, 05, 05]
 
-2602; [0D 8D 24, 05, 05]
+263C; [0D 97 34, 05, 05]
 
-2603; [0D 8D 2C, 05, 05]
+263D; [0D 97 3C, 05, 05]
 
-2604; [0D 8D 34, 05, 05]
+263E; [0D 97 44, 05, 05]
 
-2605; [0D 8D 3C, 05, 05]
+263F; [0D 97 4C, 05, 05]
 
-2606; [0D 8D 44, 05, 05]
+2640; [0D 97 54, 05, 05]
 
-2607; [0D 8D 4C, 05, 05]
+2641; [0D 97 5C, 05, 05]
 
-2608; [0D 8D 54, 05, 05]
+2642; [0D 97 64, 05, 05]
 
-2609; [0D 8D 5C, 05, 05]
+2643; [0D 97 6C, 05, 05]
 
-260A; [0D 8D 64, 05, 05]
+2644; [0D 97 74, 05, 05]
 
-260B; [0D 8D 6C, 05, 05]
+2645; [0D 97 7C, 05, 05]
 
-260C; [0D 8D 74, 05, 05]
+2646; [0D 97 84, 05, 05]
 
-260D; [0D 8D 7C, 05, 05]
+2647; [0D 97 8C, 05, 05]
 
-260E; [0D 8D 84, 05, 05]
+2648; [0D 97 94, 05, 05]
 
-260F; [0D 8D 8C, 05, 05]
+2649; [0D 97 9C, 05, 05]
 
-2610; [0D 8D 94, 05, 05]
+264A; [0D 97 A4, 05, 05]
 
-2611; [0D 8D 9C, 05, 05]
+264B; [0D 97 AC, 05, 05]
 
-2612; [0D 8D A4, 05, 05]
+264C; [0D 97 B4, 05, 05]
 
-2613; [0D 8D AC, 05, 05]
+264D; [0D 97 BC, 05, 05]
 
-2614; [0D 8D B4, 05, 05]
+264E; [0D 97 C4, 05, 05]
 
-2615; [0D 8D BC, 05, 05]
+264F; [0D 97 CC, 05, 05]
 
-2616; [0D 8D C4, 05, 05]
+2650; [0D 97 D4, 05, 05]
 
-2617; [0D 8D CC, 05, 05]
+2651; [0D 97 DC, 05, 05]
 
-2618; [0D 8D D4, 05, 05]
+2652; [0D 97 E4, 05, 05]
 
-2619; [0D 8D DC, 05, 05]
+2653; [0D 97 EC, 05, 05]
 
-261A; [0D 8D E4, 05, 05]
+2654; [0D 97 F4, 05, 05]
 
-261B; [0D 8D EC, 05, 05]
+2655; [0D 97 FC, 05, 05]
 
-261C; [0D 8D F4, 05, 05]
+2656; [0D 98 06, 05, 05]
 
-261D; [0D 8D FC, 05, 05]
+2657; [0D 98 0E, 05, 05]
 
-261E; [0D 8E 0A, 05, 05]
+2658; [0D 98 16, 05, 05]
 
-261F; [0D 8E 12, 05, 05]
+2659; [0D 98 1E, 05, 05]
 
-2620; [0D 8E 1A, 05, 05]
+265A; [0D 98 26, 05, 05]
 
-2621; [0D 8E 22, 05, 05]
+265B; [0D 98 2E, 05, 05]
 
-2622; [0D 8E 2A, 05, 05]
+265C; [0D 98 36, 05, 05]
 
-2623; [0D 8E 32, 05, 05]
+265D; [0D 98 3E, 05, 05]
 
-2624; [0D 8E 3A, 05, 05]
+265E; [0D 98 46, 05, 05]
 
-2625; [0D 8E 42, 05, 05]
+265F; [0D 98 4E, 05, 05]
 
-2626; [0D 8E 4A, 05, 05]
+2660; [0D 98 56, 05, 05]
 
-2627; [0D 8E 52, 05, 05]
+2661; [0D 98 5E, 05, 05]
 
-2628; [0D 8E 5A, 05, 05]
+2662; [0D 98 66, 05, 05]
 
-2629; [0D 8E 62, 05, 05]
+2663; [0D 98 6E, 05, 05]
 
-262A; [0D 8E 6A, 05, 05]
+2664; [0D 98 76, 05, 05]
 
-262B; [0D 8E 72, 05, 05]
+2665; [0D 98 7E, 05, 05]
 
-262C; [0D 8E 7A, 05, 05]
+2666; [0D 98 86, 05, 05]
 
-262D; [0D 8E 82, 05, 05]
+2667; [0D 98 8E, 05, 05]
 
-262E; [0D 8E 8A, 05, 05]
+2668; [0D 98 96, 05, 05]
 
-262F; [0D 8E 92, 05, 05]
+2669; [0D 98 9E, 05, 05]
 
-2638; [0D 8E 9A, 05, 05]
+266A; [0D 98 A6, 05, 05]
 
-2639; [0D 8E A2, 05, 05]
+266B; [0D 98 AE, 05, 05]
 
-263A; [0D 8E AA, 05, 05]
+266C; [0D 98 B6, 05, 05]
 
-263B; [0D 8E B2, 05, 05]
+2670; [0D 98 BE, 05, 05]
 
-263C; [0D 8E BA, 05, 05]
+2671; [0D 98 C6, 05, 05]
 
-263D; [0D 8E C2, 05, 05]
+2672; [0D 98 CE, 05, 05]
 
-263E; [0D 8E CA, 05, 05]
+2673; [0D 98 D6, 05, 05]
 
-263F; [0D 8E D2, 05, 05]
+2674; [0D 98 DE, 05, 05]
 
-2640; [0D 8E DA, 05, 05]
+2675; [0D 98 E6, 05, 05]
 
-2641; [0D 8E E2, 05, 05]
+2676; [0D 98 EE, 05, 05]
 
-2642; [0D 8E EA, 05, 05]
+2677; [0D 98 F6, 05, 05]
 
-2643; [0D 8E F2, 05, 05]
+2678; [0D 98 FE, 05, 05]
 
-2644; [0D 8E FA, 05, 05]
+2679; [0D 99 08, 05, 05]
 
-2645; [0D 8F 08, 05, 05]
+267A; [0D 99 10, 05, 05]
 
-2646; [0D 8F 10, 05, 05]
+267B; [0D 99 18, 05, 05]
 
-2647; [0D 8F 18, 05, 05]
+267C; [0D 99 20, 05, 05]
 
-2648; [0D 8F 20, 05, 05]
+267D; [0D 99 28, 05, 05]
 
-2649; [0D 8F 28, 05, 05]
+267E; [0D 99 30, 05, 05]
 
-264A; [0D 8F 30, 05, 05]
+267F; [0D 99 38, 05, 05]
 
-264B; [0D 8F 38, 05, 05]
+2680; [0D 99 40, 05, 05]
 
-264C; [0D 8F 40, 05, 05]
+2681; [0D 99 48, 05, 05]
 
-264D; [0D 8F 48, 05, 05]
+2682; [0D 99 50, 05, 05]
 
-264E; [0D 8F 50, 05, 05]
+2683; [0D 99 58, 05, 05]
 
-264F; [0D 8F 58, 05, 05]
+2684; [0D 99 60, 05, 05]
 
-2650; [0D 8F 60, 05, 05]
+2685; [0D 99 68, 05, 05]
 
-2651; [0D 8F 68, 05, 05]
+2686; [0D 99 70, 05, 05]
 
-2652; [0D 8F 70, 05, 05]
+2687; [0D 99 78, 05, 05]
 
-2653; [0D 8F 78, 05, 05]
+2688; [0D 99 80, 05, 05]
 
-2654; [0D 8F 80, 05, 05]
+2689; [0D 99 88, 05, 05]
 
-2655; [0D 8F 88, 05, 05]
+2690; [0D 99 90, 05, 05]
 
-2656; [0D 8F 90, 05, 05]
+2691; [0D 99 98, 05, 05]
 
-2657; [0D 8F 98, 05, 05]
+2692; [0D 99 A0, 05, 05]
 
-2658; [0D 8F A0, 05, 05]
+2693; [0D 99 A8, 05, 05]
 
-2659; [0D 8F A8, 05, 05]
+2694; [0D 99 B0, 05, 05]
 
-265A; [0D 8F B0, 05, 05]
+2695; [0D 99 B8, 05, 05]
 
-265B; [0D 8F B8, 05, 05]
+2696; [0D 99 C0, 05, 05]
 
-265C; [0D 8F C0, 05, 05]
+2697; [0D 99 C8, 05, 05]
 
-265D; [0D 8F C8, 05, 05]
+2698; [0D 99 D0, 05, 05]
 
-265E; [0D 8F D0, 05, 05]
+2699; [0D 99 D8, 05, 05]
 
-265F; [0D 8F D8, 05, 05]
+269A; [0D 99 E0, 05, 05]
 
-2660; [0D 8F E0, 05, 05]
+269B; [0D 99 E8, 05, 05]
 
-2661; [0D 8F E8, 05, 05]
+269C; [0D 99 F0, 05, 05]
 
-2662; [0D 8F F0, 05, 05]
+269D; [0D 99 F8, 05, 05]
 
-2663; [0D 8F F8, 05, 05]
+269E; [0D 9A 02, 05, 05]
 
-2664; [0D 90 06, 05, 05]
+269F; [0D 9A 0A, 05, 05]
 
-2665; [0D 90 0E, 05, 05]
+26A0; [0D 9A 12, 05, 05]
 
-2666; [0D 90 16, 05, 05]
+26A1; [0D 9A 1A, 05, 05]
 
-2667; [0D 90 1E, 05, 05]
+26A2; [0D 9A 22, 05, 05]
 
-2668; [0D 90 26, 05, 05]
+26A3; [0D 9A 2A, 05, 05]
 
-2669; [0D 90 2E, 05, 05]
+26A4; [0D 9A 32, 05, 05]
 
-266A; [0D 90 36, 05, 05]
+26A5; [0D 9A 3A, 05, 05]
 
-266B; [0D 90 3E, 05, 05]
+26A6; [0D 9A 42, 05, 05]
 
-266C; [0D 90 46, 05, 05]
+26A7; [0D 9A 4A, 05, 05]
 
-2670; [0D 90 4E, 05, 05]
+26A8; [0D 9A 52, 05, 05]
 
-2671; [0D 90 56, 05, 05]
+26A9; [0D 9A 5A, 05, 05]
 
-2672; [0D 90 5E, 05, 05]
+26AA; [0D 9A 62, 05, 05]
 
-2673; [0D 90 66, 05, 05]
+26AB; [0D 9A 6A, 05, 05]
 
-2674; [0D 90 6E, 05, 05]
+26AC; [0D 9A 72, 05, 05]
 
-2675; [0D 90 76, 05, 05]
+26AD; [0D 9A 7A, 05, 05]
 
-2676; [0D 90 7E, 05, 05]
+26AE; [0D 9A 82, 05, 05]
 
-2677; [0D 90 86, 05, 05]
+26AF; [0D 9A 8A, 05, 05]
 
-2678; [0D 90 8E, 05, 05]
+26B0; [0D 9A 92, 05, 05]
 
-2679; [0D 90 96, 05, 05]
+26B1; [0D 9A 9A, 05, 05]
 
-267A; [0D 90 9E, 05, 05]
+26B2; [0D 9A A2, 05, 05]
 
-267B; [0D 90 A6, 05, 05]
+26B3; [0D 9A AA, 05, 05]
 
-267C; [0D 90 AE, 05, 05]
+26B4; [0D 9A B2, 05, 05]
 
-267D; [0D 90 B6, 05, 05]
+26B5; [0D 9A BA, 05, 05]
 
-267E; [0D 90 BE, 05, 05]
+26B6; [0D 9A C2, 05, 05]
 
-267F; [0D 90 C6, 05, 05]
+26B7; [0D 9A CA, 05, 05]
 
-2680; [0D 90 CE, 05, 05]
+26B8; [0D 9A D2, 05, 05]
 
-2681; [0D 90 D6, 05, 05]
+26B9; [0D 9A DA, 05, 05]
 
-2682; [0D 90 DE, 05, 05]
+26BA; [0D 9A E2, 05, 05]
 
-2683; [0D 90 E6, 05, 05]
+26BB; [0D 9A EA, 05, 05]
 
-2684; [0D 90 EE, 05, 05]
+26BC; [0D 9A F2, 05, 05]
 
-2685; [0D 90 F6, 05, 05]
+26BD; [0D 9A FA, 05, 05]
 
-2686; [0D 91 04, 05, 05]
+26BE; [0D 9B 04, 05, 05]
 
-2687; [0D 91 0C, 05, 05]
+26BF; [0D 9B 0C, 05, 05]
 
-2688; [0D 91 14, 05, 05]
+26C0; [0D 9B 14, 05, 05]
 
-2689; [0D 91 1C, 05, 05]
+26C1; [0D 9B 1C, 05, 05]
 
-2690; [0D 91 24, 05, 05]
+26C2; [0D 9B 24, 05, 05]
 
-2691; [0D 91 2C, 05, 05]
+26C3; [0D 9B 2C, 05, 05]
 
-2692; [0D 91 34, 05, 05]
+26C4; [0D 9B 34, 05, 05]
 
-2693; [0D 91 3C, 05, 05]
+26C5; [0D 9B 3C, 05, 05]
 
-2694; [0D 91 44, 05, 05]
+26C6; [0D 9B 44, 05, 05]
 
-2695; [0D 91 4C, 05, 05]
+26C7; [0D 9B 4C, 05, 05]
 
-2696; [0D 91 54, 05, 05]
+26C8; [0D 9B 54, 05, 05]
 
-2697; [0D 91 5C, 05, 05]
+26C9; [0D 9B 5C, 05, 05]
 
-2698; [0D 91 64, 05, 05]
+26CA; [0D 9B 64, 05, 05]
 
-2699; [0D 91 6C, 05, 05]
+26CB; [0D 9B 6C, 05, 05]
 
-269A; [0D 91 74, 05, 05]
+26CC; [0D 9B 74, 05, 05]
 
-269B; [0D 91 7C, 05, 05]
+26CD; [0D 9B 7C, 05, 05]
 
-269C; [0D 91 84, 05, 05]
+26CE; [0D 9B 84, 05, 05]
 
-269D; [0D 91 8C, 05, 05]
+26CF; [0D 9B 8C, 05, 05]
 
-269E; [0D 91 94, 05, 05]
+26D0; [0D 9B 94, 05, 05]
 
-269F; [0D 91 9C, 05, 05]
+26D1; [0D 9B 9C, 05, 05]
 
-26A0; [0D 91 A4, 05, 05]
+26D2; [0D 9B A4, 05, 05]
 
-26A1; [0D 91 AC, 05, 05]
+26D3; [0D 9B AC, 05, 05]
 
-26A2; [0D 91 B4, 05, 05]
+26D4; [0D 9B B4, 05, 05]
 
-26A3; [0D 91 BC, 05, 05]
+26D5; [0D 9B BC, 05, 05]
 
-26A4; [0D 91 C4, 05, 05]
+26D6; [0D 9B C4, 05, 05]
 
-26A5; [0D 91 CC, 05, 05]
+26D7; [0D 9B CC, 05, 05]
 
-26A6; [0D 91 D4, 05, 05]
+26D8; [0D 9B D4, 05, 05]
 
-26A7; [0D 91 DC, 05, 05]
+26D9; [0D 9B DC, 05, 05]
 
-26A8; [0D 91 E4, 05, 05]
+26DA; [0D 9B E4, 05, 05]
 
-26A9; [0D 91 EC, 05, 05]
+26DB; [0D 9B EC, 05, 05]
 
-26AA; [0D 91 F4, 05, 05]
+26DC; [0D 9B F4, 05, 05]
 
-26AB; [0D 91 FC, 05, 05]
+26DD; [0D 9B FC, 05, 05]
 
-26AC; [0D 92 0A, 05, 05]
+26DE; [0D 9C 06, 05, 05]
 
-26AD; [0D 92 12, 05, 05]
+26DF; [0D 9C 0E, 05, 05]
 
-26AE; [0D 92 1A, 05, 05]
+26E0; [0D 9C 16, 05, 05]
 
-26AF; [0D 92 22, 05, 05]
+26E1; [0D 9C 1E, 05, 05]
 
-26B0; [0D 92 2A, 05, 05]
+26E2; [0D 9C 26, 05, 05]
 
-26B1; [0D 92 32, 05, 05]
+26E3; [0D 9C 2E, 05, 05]
 
-26B2; [0D 92 3A, 05, 05]
+26E4; [0D 9C 36, 05, 05]
 
-26B3; [0D 92 42, 05, 05]
+26E5; [0D 9C 3E, 05, 05]
 
-26B4; [0D 92 4A, 05, 05]
+26E6; [0D 9C 46, 05, 05]
 
-26B5; [0D 92 52, 05, 05]
+26E7; [0D 9C 4E, 05, 05]
 
-26B6; [0D 92 5A, 05, 05]
+26E8; [0D 9C 56, 05, 05]
 
-26B7; [0D 92 62, 05, 05]
+26E9; [0D 9C 5E, 05, 05]
 
-26B8; [0D 92 6A, 05, 05]
+26EA; [0D 9C 66, 05, 05]
 
-26B9; [0D 92 72, 05, 05]
+26EB; [0D 9C 6E, 05, 05]
 
-26BA; [0D 92 7A, 05, 05]
+26EC; [0D 9C 76, 05, 05]
 
-26BB; [0D 92 82, 05, 05]
+26ED; [0D 9C 7E, 05, 05]
 
-26BC; [0D 92 8A, 05, 05]
+26EE; [0D 9C 86, 05, 05]
 
-26BD; [0D 92 92, 05, 05]
+26EF; [0D 9C 8E, 05, 05]
 
-26BE; [0D 92 9A, 05, 05]
+26F0; [0D 9C 96, 05, 05]
 
-26BF; [0D 92 A2, 05, 05]
+26F1; [0D 9C 9E, 05, 05]
 
-26C0; [0D 92 AA, 05, 05]
+26F2; [0D 9C A6, 05, 05]
 
-26C1; [0D 92 B2, 05, 05]
+26F3; [0D 9C AE, 05, 05]
 
-26C2; [0D 92 BA, 05, 05]
+26F4; [0D 9C B6, 05, 05]
 
-26C3; [0D 92 C2, 05, 05]
+26F5; [0D 9C BE, 05, 05]
 
-26C4; [0D 92 CA, 05, 05]
+26F6; [0D 9C C6, 05, 05]
 
-26C5; [0D 92 D2, 05, 05]
+26F7; [0D 9C CE, 05, 05]
 
-26C6; [0D 92 DA, 05, 05]
+26F8; [0D 9C D6, 05, 05]
 
-26C7; [0D 92 E2, 05, 05]
+26F9; [0D 9C DE, 05, 05]
 
-26C8; [0D 92 EA, 05, 05]
+26FA; [0D 9C E6, 05, 05]
 
-26C9; [0D 92 F2, 05, 05]
+26FB; [0D 9C EE, 05, 05]
 
-26CA; [0D 92 FA, 05, 05]
+26FC; [0D 9C F6, 05, 05]
 
-26CB; [0D 93 08, 05, 05]
+26FD; [0D 9C FE, 05, 05]
 
-26CC; [0D 93 10, 05, 05]
+26FE; [0D 9D 08, 05, 05]
 
-26CD; [0D 93 18, 05, 05]
+26FF; [0D 9D 10, 05, 05]
 
-26CE; [0D 93 20, 05, 05]
+1F1E6; [0D 9D 18, 05, 05]
 
-26CF; [0D 93 28, 05, 05]
+1F1E7; [0D 9D 20, 05, 05]
 
-26D0; [0D 93 30, 05, 05]
+1F1E8; [0D 9D 28, 05, 05]
 
-26D1; [0D 93 38, 05, 05]
+1F1E9; [0D 9D 30, 05, 05]
 
-26D2; [0D 93 40, 05, 05]
+1F1EA; [0D 9D 38, 05, 05]
 
-26D3; [0D 93 48, 05, 05]
+1F1EB; [0D 9D 40, 05, 05]
 
-26D4; [0D 93 50, 05, 05]
+1F1EC; [0D 9D 48, 05, 05]
 
-26D5; [0D 93 58, 05, 05]
+1F1ED; [0D 9D 50, 05, 05]
 
-26D6; [0D 93 60, 05, 05]
+1F1EE; [0D 9D 58, 05, 05]
 
-26D7; [0D 93 68, 05, 05]
+1F1EF; [0D 9D 60, 05, 05]
 
-26D8; [0D 93 70, 05, 05]
+1F1F0; [0D 9D 68, 05, 05]
 
-26D9; [0D 93 78, 05, 05]
+1F1F1; [0D 9D 70, 05, 05]
 
-26DA; [0D 93 80, 05, 05]
+1F1F2; [0D 9D 78, 05, 05]
 
-26DB; [0D 93 88, 05, 05]
+1F1F3; [0D 9D 80, 05, 05]
 
-26DC; [0D 93 90, 05, 05]
+1F1F4; [0D 9D 88, 05, 05]
 
-26DD; [0D 93 98, 05, 05]
+1F1F5; [0D 9D 90, 05, 05]
 
-26DE; [0D 93 A0, 05, 05]
+1F1F6; [0D 9D 98, 05, 05]
 
-26DF; [0D 93 A8, 05, 05]
+1F1F7; [0D 9D A0, 05, 05]
 
-26E0; [0D 93 B0, 05, 05]
+1F1F8; [0D 9D A8, 05, 05]
 
-26E1; [0D 93 B8, 05, 05]
+1F1F9; [0D 9D B0, 05, 05]
 
-26E2; [0D 93 C0, 05, 05]
+1F1FA; [0D 9D B8, 05, 05]
 
-26E3; [0D 93 C8, 05, 05]
+1F1FB; [0D 9D C0, 05, 05]
 
-26E4; [0D 93 D0, 05, 05]
+1F1FC; [0D 9D C8, 05, 05]
 
-26E5; [0D 93 D8, 05, 05]
+1F1FD; [0D 9D D0, 05, 05]
 
-26E6; [0D 93 E0, 05, 05]
+1F1FE; [0D 9D D8, 05, 05]
 
-26E7; [0D 93 E8, 05, 05]
+1F1FF; [0D 9D E0, 05, 05]
 
-26E8; [0D 93 F0, 05, 05]
+2701; [0D 9D E8, 05, 05]
 
-26E9; [0D 93 F8, 05, 05]
+2702; [0D 9D F0, 05, 05]
 
-26EA; [0D 94 06, 05, 05]
+2703; [0D 9D F8, 05, 05]
 
-26EB; [0D 94 0E, 05, 05]
+2704; [0D 9E 02, 05, 05]
 
-26EC; [0D 94 16, 05, 05]
+2705; [0D 9E 0A, 05, 05]
 
-26ED; [0D 94 1E, 05, 05]
+2706; [0D 9E 12, 05, 05]
 
-26EE; [0D 94 26, 05, 05]
+2707; [0D 9E 1A, 05, 05]
 
-26EF; [0D 94 2E, 05, 05]
+2708; [0D 9E 22, 05, 05]
 
-26F0; [0D 94 36, 05, 05]
+2709; [0D 9E 2A, 05, 05]
 
-26F1; [0D 94 3E, 05, 05]
+270A; [0D 9E 32, 05, 05]
 
-26F2; [0D 94 46, 05, 05]
+270B; [0D 9E 3A, 05, 05]
 
-26F3; [0D 94 4E, 05, 05]
+270C; [0D 9E 42, 05, 05]
 
-26F4; [0D 94 56, 05, 05]
+270D; [0D 9E 4A, 05, 05]
 
-26F5; [0D 94 5E, 05, 05]
+270E; [0D 9E 52, 05, 05]
 
-26F6; [0D 94 66, 05, 05]
+270F; [0D 9E 5A, 05, 05]
 
-26F7; [0D 94 6E, 05, 05]
+2710; [0D 9E 62, 05, 05]
 
-26F8; [0D 94 76, 05, 05]
+2711; [0D 9E 6A, 05, 05]
 
-26F9; [0D 94 7E, 05, 05]
+2712; [0D 9E 72, 05, 05]
 
-26FA; [0D 94 86, 05, 05]
+2713; [0D 9E 7A, 05, 05]
 
-26FB; [0D 94 8E, 05, 05]
+2714; [0D 9E 82, 05, 05]
 
-26FC; [0D 94 96, 05, 05]
+2715; [0D 9E 8A, 05, 05]
 
-26FD; [0D 94 9E, 05, 05]
+2716; [0D 9E 92, 05, 05]
 
-26FE; [0D 94 A6, 05, 05]
+2717; [0D 9E 9A, 05, 05]
 
-26FF; [0D 94 AE, 05, 05]
+2718; [0D 9E A2, 05, 05]
 
-1F1E6; [0D 94 B6, 05, 05]
+2719; [0D 9E AA, 05, 05]
 
-1F1E7; [0D 94 BE, 05, 05]
+271A; [0D 9E B2, 05, 05]
 
-1F1E8; [0D 94 C6, 05, 05]
+271B; [0D 9E BA, 05, 05]
 
-1F1E9; [0D 94 CE, 05, 05]
+271C; [0D 9E C2, 05, 05]
 
-1F1EA; [0D 94 D6, 05, 05]
+271D; [0D 9E CA, 05, 05]
 
-1F1EB; [0D 94 DE, 05, 05]
+271E; [0D 9E D2, 05, 05]
 
-1F1EC; [0D 94 E6, 05, 05]
+271F; [0D 9E DA, 05, 05]
 
-1F1ED; [0D 94 EE, 05, 05]
+2720; [0D 9E E2, 05, 05]
 
-1F1EE; [0D 94 F6, 05, 05]
+2721; [0D 9E EA, 05, 05]
 
-1F1EF; [0D 95 04, 05, 05]
+2722; [0D 9E F2, 05, 05]
 
-1F1F0; [0D 95 0C, 05, 05]
+2723; [0D 9E FA, 05, 05]
 
-1F1F1; [0D 95 14, 05, 05]
+2724; [0D 9F 04, 05, 05]
 
-1F1F2; [0D 95 1C, 05, 05]
+2725; [0D 9F 0C, 05, 05]
 
-1F1F3; [0D 95 24, 05, 05]
+2726; [0D 9F 14, 05, 05]
 
-1F1F4; [0D 95 2C, 05, 05]
+2727; [0D 9F 1C, 05, 05]
 
-1F1F5; [0D 95 34, 05, 05]
+2728; [0D 9F 24, 05, 05]
 
-1F1F6; [0D 95 3C, 05, 05]
+2729; [0D 9F 2C, 05, 05]
 
-1F1F7; [0D 95 44, 05, 05]
+272A; [0D 9F 34, 05, 05]
 
-1F1F8; [0D 95 4C, 05, 05]
+272B; [0D 9F 3C, 05, 05]
 
-1F1F9; [0D 95 54, 05, 05]
+272C; [0D 9F 44, 05, 05]
 
-1F1FA; [0D 95 5C, 05, 05]
+272D; [0D 9F 4C, 05, 05]
 
-1F1FB; [0D 95 64, 05, 05]
+272E; [0D 9F 54, 05, 05]
 
-1F1FC; [0D 95 6C, 05, 05]
+272F; [0D 9F 5C, 05, 05]
 
-1F1FD; [0D 95 74, 05, 05]
+2730; [0D 9F 64, 05, 05]
 
-1F1FE; [0D 95 7C, 05, 05]
+2731; [0D 9F 6C, 05, 05]
 
-1F1FF; [0D 95 84, 05, 05]
+2732; [0D 9F 74, 05, 05]
 
-2701; [0D 95 8C, 05, 05]
+2733; [0D 9F 7C, 05, 05]
 
-2702; [0D 95 94, 05, 05]
+2734; [0D 9F 84, 05, 05]
 
-2703; [0D 95 9C, 05, 05]
+2735; [0D 9F 8C, 05, 05]
 
-2704; [0D 95 A4, 05, 05]
+2736; [0D 9F 94, 05, 05]
 
-2705; [0D 95 AC, 05, 05]
+2737; [0D 9F 9C, 05, 05]
 
-2706; [0D 95 B4, 05, 05]
+2738; [0D 9F A4, 05, 05]
 
-2707; [0D 95 BC, 05, 05]
+2739; [0D 9F AC, 05, 05]
 
-2708; [0D 95 C4, 05, 05]
+273A; [0D 9F B4, 05, 05]
 
-2709; [0D 95 CC, 05, 05]
+273B; [0D 9F BC, 05, 05]
 
-270A; [0D 95 D4, 05, 05]
+273C; [0D 9F C4, 05, 05]
 
-270B; [0D 95 DC, 05, 05]
+273D; [0D 9F CC, 05, 05]
 
-270C; [0D 95 E4, 05, 05]
+273E; [0D 9F D4, 05, 05]
 
-270D; [0D 95 EC, 05, 05]
+273F; [0D 9F DC, 05, 05]
 
-270E; [0D 95 F4, 05, 05]
+2740; [0D 9F E4, 05, 05]
 
-270F; [0D 95 FC, 05, 05]
+2741; [0D 9F EC, 05, 05]
 
-2710; [0D 96 0A, 05, 05]
+2742; [0D 9F F4, 05, 05]
 
-2711; [0D 96 12, 05, 05]
+2743; [0D 9F FC, 05, 05]
 
-2712; [0D 96 1A, 05, 05]
+2744; [0D A0 06, 05, 05]
 
-2713; [0D 96 22, 05, 05]
+2745; [0D A0 0E, 05, 05]
 
-2714; [0D 96 2A, 05, 05]
+2746; [0D A0 16, 05, 05]
 
-2715; [0D 96 32, 05, 05]
+2747; [0D A0 1E, 05, 05]
 
-2716; [0D 96 3A, 05, 05]
+2748; [0D A0 26, 05, 05]
 
-2717; [0D 96 42, 05, 05]
+2749; [0D A0 2E, 05, 05]
 
-2718; [0D 96 4A, 05, 05]
+274A; [0D A0 36, 05, 05]
 
-2719; [0D 96 52, 05, 05]
+274B; [0D A0 3E, 05, 05]
 
-271A; [0D 96 5A, 05, 05]
+274C; [0D A0 46, 05, 05]
 
-271B; [0D 96 62, 05, 05]
+274D; [0D A0 4E, 05, 05]
 
-271C; [0D 96 6A, 05, 05]
+274E; [0D A0 56, 05, 05]
 
-271D; [0D 96 72, 05, 05]
+274F; [0D A0 5E, 05, 05]
 
-271E; [0D 96 7A, 05, 05]
+2750; [0D A0 66, 05, 05]
 
-271F; [0D 96 82, 05, 05]
+2751; [0D A0 6E, 05, 05]
 
-2720; [0D 96 8A, 05, 05]
+2752; [0D A0 76, 05, 05]
 
-2721; [0D 96 92, 05, 05]
+2753; [0D A0 7E, 05, 05]
 
-2722; [0D 96 9A, 05, 05]
+2754; [0D A0 86, 05, 05]
 
-2723; [0D 96 A2, 05, 05]
+2755; [0D A0 8E, 05, 05]
 
-2724; [0D 96 AA, 05, 05]
+2756; [0D A0 96, 05, 05]
 
-2725; [0D 96 B2, 05, 05]
+2757; [0D A0 9E, 05, 05]
 
-2726; [0D 96 BA, 05, 05]
+2758; [0D A0 A6, 05, 05]
 
-2727; [0D 96 C2, 05, 05]
+2759; [0D A0 AE, 05, 05]
 
-2728; [0D 96 CA, 05, 05]
+275A; [0D A0 B6, 05, 05]
 
-2729; [0D 96 D2, 05, 05]
+275B; [0D A0 BE, 05, 05]
 
-272A; [0D 96 DA, 05, 05]
+275C; [0D A0 C6, 05, 05]
 
-272B; [0D 96 E2, 05, 05]
+275D; [0D A0 CE, 05, 05]
 
-272C; [0D 96 EA, 05, 05]
+275E; [0D A0 D6, 05, 05]
 
-272D; [0D 96 F2, 05, 05]
+275F; [0D A0 DE, 05, 05]
 
-272E; [0D 96 FA, 05, 05]
+2760; [0D A0 E6, 05, 05]
 
-272F; [0D 97 08, 05, 05]
+2761; [0D A0 EE, 05, 05]
 
-2730; [0D 97 10, 05, 05]
+2762; [0D A0 F6, 05, 05]
 
-2731; [0D 97 18, 05, 05]
+2763; [0D A0 FE, 05, 05]
 
-2732; [0D 97 20, 05, 05]
+2764; [0D A1 08, 05, 05]
 
-2733; [0D 97 28, 05, 05]
+2765; [0D A1 10, 05, 05]
 
-2734; [0D 97 30, 05, 05]
+2766; [0D A1 18, 05, 05]
 
-2735; [0D 97 38, 05, 05]
+2767; [0D A1 20, 05, 05]
 
-2736; [0D 97 40, 05, 05]
+2794; [0D A1 28, 05, 05]
 
-2737; [0D 97 48, 05, 05]
+2795; [0D A1 30, 05, 05]
 
-2738; [0D 97 50, 05, 05]
+2796; [0D A1 38, 05, 05]
 
-2739; [0D 97 58, 05, 05]
+2797; [0D A1 40, 05, 05]
 
-273A; [0D 97 60, 05, 05]
+2798; [0D A1 48, 05, 05]
 
-273B; [0D 97 68, 05, 05]
+2799; [0D A1 50, 05, 05]
 
-273C; [0D 97 70, 05, 05]
+279A; [0D A1 58, 05, 05]
 
-273D; [0D 97 78, 05, 05]
+279B; [0D A1 60, 05, 05]
 
-273E; [0D 97 80, 05, 05]
+279C; [0D A1 68, 05, 05]
 
-273F; [0D 97 88, 05, 05]
+279D; [0D A1 70, 05, 05]
 
-2740; [0D 97 90, 05, 05]
+279E; [0D A1 78, 05, 05]
 
-2741; [0D 97 98, 05, 05]
+279F; [0D A1 80, 05, 05]
 
-2742; [0D 97 A0, 05, 05]
+27A0; [0D A1 88, 05, 05]
 
-2743; [0D 97 A8, 05, 05]
+27A1; [0D A1 90, 05, 05]
 
-2744; [0D 97 B0, 05, 05]
+27A2; [0D A1 98, 05, 05]
 
-2745; [0D 97 B8, 05, 05]
+27A3; [0D A1 A0, 05, 05]
 
-2746; [0D 97 C0, 05, 05]
+27A4; [0D A1 A8, 05, 05]
 
-2747; [0D 97 C8, 05, 05]
+27A5; [0D A1 B0, 05, 05]
 
-2748; [0D 97 D0, 05, 05]
+27A6; [0D A1 B8, 05, 05]
 
-2749; [0D 97 D8, 05, 05]
+27A7; [0D A1 C0, 05, 05]
 
-274A; [0D 97 E0, 05, 05]
+27A8; [0D A1 C8, 05, 05]
 
-274B; [0D 97 E8, 05, 05]
+27A9; [0D A1 D0, 05, 05]
 
-274C; [0D 97 F0, 05, 05]
+27AA; [0D A1 D8, 05, 05]
 
-274D; [0D 97 F8, 05, 05]
+27AB; [0D A1 E0, 05, 05]
 
-274E; [0D 98 06, 05, 05]
+27AC; [0D A1 E8, 05, 05]
 
-274F; [0D 98 0E, 05, 05]
+27AD; [0D A1 F0, 05, 05]
 
-2750; [0D 98 16, 05, 05]
+27AE; [0D A1 F8, 05, 05]
 
-2751; [0D 98 1E, 05, 05]
+27AF; [0D A2 02, 05, 05]
 
-2752; [0D 98 26, 05, 05]
+27B0; [0D A2 0A, 05, 05]
 
-2753; [0D 98 2E, 05, 05]
+27B1; [0D A2 12, 05, 05]
 
-2754; [0D 98 36, 05, 05]
+27B2; [0D A2 1A, 05, 05]
 
-2755; [0D 98 3E, 05, 05]
+27B3; [0D A2 22, 05, 05]
 
-2756; [0D 98 46, 05, 05]
+27B4; [0D A2 2A, 05, 05]
 
-2757; [0D 98 4E, 05, 05]
+27B5; [0D A2 32, 05, 05]
 
-2758; [0D 98 56, 05, 05]
+27B6; [0D A2 3A, 05, 05]
 
-2759; [0D 98 5E, 05, 05]
+27B7; [0D A2 42, 05, 05]
 
-275A; [0D 98 66, 05, 05]
+27B8; [0D A2 4A, 05, 05]
 
-275B; [0D 98 6E, 05, 05]
+27B9; [0D A2 52, 05, 05]
 
-275C; [0D 98 76, 05, 05]
+27BA; [0D A2 5A, 05, 05]
 
-275D; [0D 98 7E, 05, 05]
+27BB; [0D A2 62, 05, 05]
 
-275E; [0D 98 86, 05, 05]
+27BC; [0D A2 6A, 05, 05]
 
-275F; [0D 98 8E, 05, 05]
+27BD; [0D A2 72, 05, 05]
 
-2760; [0D 98 96, 05, 05]
+27BE; [0D A2 7A, 05, 05]
 
-2761; [0D 98 9E, 05, 05]
+27BF; [0D A2 82, 05, 05]
 
-2762; [0D 98 A6, 05, 05]
+27C0; [0D A2 8A, 05, 05]
 
-2763; [0D 98 AE, 05, 05]
+27C1; [0D A2 92, 05, 05]
 
-2764; [0D 98 B6, 05, 05]
+27C2; [0D A2 9A, 05, 05]
 
-2765; [0D 98 BE, 05, 05]
+27C3; [0D A2 A2, 05, 05]
 
-2766; [0D 98 C6, 05, 05]
+27C4; [0D A2 AA, 05, 05]
 
-2767; [0D 98 CE, 05, 05]
+27C7; [0D A2 B2, 05, 05]
 
-2794; [0D 98 D6, 05, 05]
+27C8; [0D A2 BA, 05, 05]
 
-2795; [0D 98 DE, 05, 05]
+27C9; [0D A2 C2, 05, 05]
 
-2796; [0D 98 E6, 05, 05]
+27CA; [0D A2 CA, 05, 05]
 
-2797; [0D 98 EE, 05, 05]
+27CB; [0D A2 D2, 05, 05]
 
-2798; [0D 98 F6, 05, 05]
+27CC; [0D A2 DA, 05, 05]
 
-2799; [0D 99 04, 05, 05]
+27CD; [0D A2 E2, 05, 05]
 
-279A; [0D 99 0C, 05, 05]
+27CE; [0D A2 EA, 05, 05]
 
-279B; [0D 99 14, 05, 05]
+27CF; [0D A2 F2, 05, 05]
 
-279C; [0D 99 1C, 05, 05]
+27D0; [0D A2 FA, 05, 05]
 
-279D; [0D 99 24, 05, 05]
+27D1; [0D A3 04, 05, 05]
 
-279E; [0D 99 2C, 05, 05]
+27D2; [0D A3 0C, 05, 05]
 
-279F; [0D 99 34, 05, 05]
+27D3; [0D A3 14, 05, 05]
 
-27A0; [0D 99 3C, 05, 05]
+27D4; [0D A3 1C, 05, 05]
 
-27A1; [0D 99 44, 05, 05]
+27D5; [0D A3 24, 05, 05]
 
-27A2; [0D 99 4C, 05, 05]
+27D6; [0D A3 2C, 05, 05]
 
-27A3; [0D 99 54, 05, 05]
+27D7; [0D A3 34, 05, 05]
 
-27A4; [0D 99 5C, 05, 05]
+27D8; [0D A3 3C, 05, 05]
 
-27A5; [0D 99 64, 05, 05]
+27D9; [0D A3 44, 05, 05]
 
-27A6; [0D 99 6C, 05, 05]
+27DA; [0D A3 4C, 05, 05]
 
-27A7; [0D 99 74, 05, 05]
+27DB; [0D A3 54, 05, 05]
 
-27A8; [0D 99 7C, 05, 05]
+27DC; [0D A3 5C, 05, 05]
 
-27A9; [0D 99 84, 05, 05]
+27DD; [0D A3 64, 05, 05]
 
-27AA; [0D 99 8C, 05, 05]
+27DE; [0D A3 6C, 05, 05]
 
-27AB; [0D 99 94, 05, 05]
+27DF; [0D A3 74, 05, 05]
 
-27AC; [0D 99 9C, 05, 05]
+27E0; [0D A3 7C, 05, 05]
 
-27AD; [0D 99 A4, 05, 05]
+27E1; [0D A3 84, 05, 05]
 
-27AE; [0D 99 AC, 05, 05]
+27E2; [0D A3 8C, 05, 05]
 
-27AF; [0D 99 B4, 05, 05]
+27E3; [0D A3 94, 05, 05]
 
-27B0; [0D 99 BC, 05, 05]
+27E4; [0D A3 9C, 05, 05]
 
-27B1; [0D 99 C4, 05, 05]
+27E5; [0D A3 A4, 05, 05]
 
-27B2; [0D 99 CC, 05, 05]
+27F0; [0D A3 AC, 05, 05]
 
-27B3; [0D 99 D4, 05, 05]
+27F1; [0D A3 B4, 05, 05]
 
-27B4; [0D 99 DC, 05, 05]
+27F2; [0D A3 BC, 05, 05]
 
-27B5; [0D 99 E4, 05, 05]
+27F3; [0D A3 C4, 05, 05]
 
-27B6; [0D 99 EC, 05, 05]
+27F4; [0D A3 CC, 05, 05]
 
-27B7; [0D 99 F4, 05, 05]
+27F5; [0D A3 D4, 05, 05]
 
-27B8; [0D 99 FC, 05, 05]
+27F6; [0D A3 DC, 05, 05]
 
-27B9; [0D 9A 0A, 05, 05]
+27F7; [0D A3 E4, 05, 05]
 
-27BA; [0D 9A 12, 05, 05]
+27F8; [0D A3 EC, 05, 05]
 
-27BB; [0D 9A 1A, 05, 05]
+27F9; [0D A3 F4, 05, 05]
 
-27BC; [0D 9A 22, 05, 05]
+27FA; [0D A3 FC, 05, 05]
 
-27BD; [0D 9A 2A, 05, 05]
+27FB; [0D A4 06, 05, 05]
 
-27BE; [0D 9A 32, 05, 05]
+27FC; [0D A4 0E, 05, 05]
 
-27BF; [0D 9A 3A, 05, 05]
+27FD; [0D A4 16, 05, 05]
 
-27C0; [0D 9A 42, 05, 05]
+27FE; [0D A4 1E, 05, 05]
 
-27C1; [0D 9A 4A, 05, 05]
+27FF; [0D A4 26, 05, 05]
 
-27C2; [0D 9A 52, 05, 05]
+2900; [0D A4 2E, 05, 05]
 
-27C3; [0D 9A 5A, 05, 05]
+2901; [0D A4 36, 05, 05]
 
-27C4; [0D 9A 62, 05, 05]
+2902; [0D A4 3E, 05, 05]
 
-27C7; [0D 9A 6A, 05, 05]
+2903; [0D A4 46, 05, 05]
 
-27C8; [0D 9A 72, 05, 05]
+2904; [0D A4 4E, 05, 05]
 
-27C9; [0D 9A 7A, 05, 05]
+2905; [0D A4 56, 05, 05]
 
-27CA; [0D 9A 82, 05, 05]
+2906; [0D A4 5E, 05, 05]
 
-27CB; [0D 9A 8A, 05, 05]
+2907; [0D A4 66, 05, 05]
 
-27CC; [0D 9A 92, 05, 05]
+2908; [0D A4 6E, 05, 05]
 
-27CD; [0D 9A 9A, 05, 05]
+2909; [0D A4 76, 05, 05]
 
-27CE; [0D 9A A2, 05, 05]
+290A; [0D A4 7E, 05, 05]
 
-27CF; [0D 9A AA, 05, 05]
+290B; [0D A4 86, 05, 05]
 
-27D0; [0D 9A B2, 05, 05]
+290C; [0D A4 8E, 05, 05]
 
-27D1; [0D 9A BA, 05, 05]
+290D; [0D A4 96, 05, 05]
 
-27D2; [0D 9A C2, 05, 05]
+290E; [0D A4 9E, 05, 05]
 
-27D3; [0D 9A CA, 05, 05]
+290F; [0D A4 A6, 05, 05]
 
-27D4; [0D 9A D2, 05, 05]
+2910; [0D A4 AE, 05, 05]
 
-27D5; [0D 9A DA, 05, 05]
+2911; [0D A4 B6, 05, 05]
 
-27D6; [0D 9A E2, 05, 05]
+2912; [0D A4 BE, 05, 05]
 
-27D7; [0D 9A EA, 05, 05]
+2913; [0D A4 C6, 05, 05]
 
-27D8; [0D 9A F2, 05, 05]
+2914; [0D A4 CE, 05, 05]
 
-27D9; [0D 9A FA, 05, 05]
+2915; [0D A4 D6, 05, 05]
 
-27DA; [0D 9B 08, 05, 05]
+2916; [0D A4 DE, 05, 05]
 
-27DB; [0D 9B 10, 05, 05]
+2917; [0D A4 E6, 05, 05]
 
-27DC; [0D 9B 18, 05, 05]
+2918; [0D A4 EE, 05, 05]
 
-27DD; [0D 9B 20, 05, 05]
+2919; [0D A4 F6, 05, 05]
 
-27DE; [0D 9B 28, 05, 05]
+291A; [0D A4 FE, 05, 05]
 
-27DF; [0D 9B 30, 05, 05]
+291B; [0D A5 08, 05, 05]
 
-27E0; [0D 9B 38, 05, 05]
+291C; [0D A5 10, 05, 05]
 
-27E1; [0D 9B 40, 05, 05]
+291D; [0D A5 18, 05, 05]
 
-27E2; [0D 9B 48, 05, 05]
+291E; [0D A5 20, 05, 05]
 
-27E3; [0D 9B 50, 05, 05]
+291F; [0D A5 28, 05, 05]
 
-27E4; [0D 9B 58, 05, 05]
+2920; [0D A5 30, 05, 05]
 
-27E5; [0D 9B 60, 05, 05]
+2921; [0D A5 38, 05, 05]
 
-27F0; [0D 9B 68, 05, 05]
+2922; [0D A5 40, 05, 05]
 
-27F1; [0D 9B 70, 05, 05]
+2923; [0D A5 48, 05, 05]
 
-27F2; [0D 9B 78, 05, 05]
+2924; [0D A5 50, 05, 05]
 
-27F3; [0D 9B 80, 05, 05]
+2925; [0D A5 58, 05, 05]
 
-27F4; [0D 9B 88, 05, 05]
+2926; [0D A5 60, 05, 05]
 
-27F5; [0D 9B 90, 05, 05]
+2927; [0D A5 68, 05, 05]
 
-27F6; [0D 9B 98, 05, 05]
+2928; [0D A5 70, 05, 05]
 
-27F7; [0D 9B A0, 05, 05]
+2929; [0D A5 78, 05, 05]
 
-27F8; [0D 9B A8, 05, 05]
+292A; [0D A5 80, 05, 05]
 
-27F9; [0D 9B B0, 05, 05]
+292B; [0D A5 88, 05, 05]
 
-27FA; [0D 9B B8, 05, 05]
+292C; [0D A5 90, 05, 05]
 
-27FB; [0D 9B C0, 05, 05]
+292D; [0D A5 98, 05, 05]
 
-27FC; [0D 9B C8, 05, 05]
+292E; [0D A5 A0, 05, 05]
 
-27FD; [0D 9B D0, 05, 05]
+292F; [0D A5 A8, 05, 05]
 
-27FE; [0D 9B D8, 05, 05]
+2930; [0D A5 B0, 05, 05]
 
-27FF; [0D 9B E0, 05, 05]
+2931; [0D A5 B8, 05, 05]
 
-2900; [0D 9B E8, 05, 05]
+2932; [0D A5 C0, 05, 05]
 
-2901; [0D 9B F0, 05, 05]
+2933; [0D A5 C8, 05, 05]
 
-2902; [0D 9B F8, 05, 05]
+2934; [0D A5 D0, 05, 05]
 
-2903; [0D 9C 06, 05, 05]
+2935; [0D A5 D8, 05, 05]
 
-2904; [0D 9C 0E, 05, 05]
+2936; [0D A5 E0, 05, 05]
 
-2905; [0D 9C 16, 05, 05]
+2937; [0D A5 E8, 05, 05]
 
-2906; [0D 9C 1E, 05, 05]
+2938; [0D A5 F0, 05, 05]
 
-2907; [0D 9C 26, 05, 05]
+2939; [0D A5 F8, 05, 05]
 
-2908; [0D 9C 2E, 05, 05]
+293A; [0D A6 02, 05, 05]
 
-2909; [0D 9C 36, 05, 05]
+293B; [0D A6 0A, 05, 05]
 
-290A; [0D 9C 3E, 05, 05]
+293C; [0D A6 12, 05, 05]
 
-290B; [0D 9C 46, 05, 05]
+293D; [0D A6 1A, 05, 05]
 
-290C; [0D 9C 4E, 05, 05]
+293E; [0D A6 22, 05, 05]
 
-290D; [0D 9C 56, 05, 05]
+293F; [0D A6 2A, 05, 05]
 
-290E; [0D 9C 5E, 05, 05]
+2940; [0D A6 32, 05, 05]
 
-290F; [0D 9C 66, 05, 05]
+2941; [0D A6 3A, 05, 05]
 
-2910; [0D 9C 6E, 05, 05]
+2942; [0D A6 42, 05, 05]
 
-2911; [0D 9C 76, 05, 05]
+2943; [0D A6 4A, 05, 05]
 
-2912; [0D 9C 7E, 05, 05]
+2944; [0D A6 52, 05, 05]
 
-2913; [0D 9C 86, 05, 05]
+2945; [0D A6 5A, 05, 05]
 
-2914; [0D 9C 8E, 05, 05]
+2946; [0D A6 62, 05, 05]
 
-2915; [0D 9C 96, 05, 05]
+2947; [0D A6 6A, 05, 05]
 
-2916; [0D 9C 9E, 05, 05]
+2948; [0D A6 72, 05, 05]
 
-2917; [0D 9C A6, 05, 05]
+2949; [0D A6 7A, 05, 05]
 
-2918; [0D 9C AE, 05, 05]
+294A; [0D A6 82, 05, 05]
 
-2919; [0D 9C B6, 05, 05]
+294B; [0D A6 8A, 05, 05]
 
-291A; [0D 9C BE, 05, 05]
+294C; [0D A6 92, 05, 05]
 
-291B; [0D 9C C6, 05, 05]
+294D; [0D A6 9A, 05, 05]
 
-291C; [0D 9C CE, 05, 05]
+294E; [0D A6 A2, 05, 05]
 
-291D; [0D 9C D6, 05, 05]
+294F; [0D A6 AA, 05, 05]
 
-291E; [0D 9C DE, 05, 05]
+2950; [0D A6 B2, 05, 05]
 
-291F; [0D 9C E6, 05, 05]
+2951; [0D A6 BA, 05, 05]
 
-2920; [0D 9C EE, 05, 05]
+2952; [0D A6 C2, 05, 05]
 
-2921; [0D 9C F6, 05, 05]
+2953; [0D A6 CA, 05, 05]
 
-2922; [0D 9D 04, 05, 05]
+2954; [0D A6 D2, 05, 05]
 
-2923; [0D 9D 0C, 05, 05]
+2955; [0D A6 DA, 05, 05]
 
-2924; [0D 9D 14, 05, 05]
+2956; [0D A6 E2, 05, 05]
 
-2925; [0D 9D 1C, 05, 05]
+2957; [0D A6 EA, 05, 05]
 
-2926; [0D 9D 24, 05, 05]
+2958; [0D A6 F2, 05, 05]
 
-2927; [0D 9D 2C, 05, 05]
+2959; [0D A6 FA, 05, 05]
 
-2928; [0D 9D 34, 05, 05]
+295A; [0D A7 04, 05, 05]
 
-2929; [0D 9D 3C, 05, 05]
+295B; [0D A7 0C, 05, 05]
 
-292A; [0D 9D 44, 05, 05]
+295C; [0D A7 14, 05, 05]
 
-292B; [0D 9D 4C, 05, 05]
+295D; [0D A7 1C, 05, 05]
 
-292C; [0D 9D 54, 05, 05]
+295E; [0D A7 24, 05, 05]
 
-292D; [0D 9D 5C, 05, 05]
+295F; [0D A7 2C, 05, 05]
 
-292E; [0D 9D 64, 05, 05]
+2960; [0D A7 34, 05, 05]
 
-292F; [0D 9D 6C, 05, 05]
+2961; [0D A7 3C, 05, 05]
 
-2930; [0D 9D 74, 05, 05]
+2962; [0D A7 44, 05, 05]
 
-2931; [0D 9D 7C, 05, 05]
+2963; [0D A7 4C, 05, 05]
 
-2932; [0D 9D 84, 05, 05]
+2964; [0D A7 54, 05, 05]
 
-2933; [0D 9D 8C, 05, 05]
+2965; [0D A7 5C, 05, 05]
 
-2934; [0D 9D 94, 05, 05]
+2966; [0D A7 64, 05, 05]
 
-2935; [0D 9D 9C, 05, 05]
+2967; [0D A7 6C, 05, 05]
 
-2936; [0D 9D A4, 05, 05]
+2968; [0D A7 74, 05, 05]
 
-2937; [0D 9D AC, 05, 05]
+2969; [0D A7 7C, 05, 05]
 
-2938; [0D 9D B4, 05, 05]
+296A; [0D A7 84, 05, 05]
 
-2939; [0D 9D BC, 05, 05]
+296B; [0D A7 8C, 05, 05]
 
-293A; [0D 9D C4, 05, 05]
+296C; [0D A7 94, 05, 05]
 
-293B; [0D 9D CC, 05, 05]
+296D; [0D A7 9C, 05, 05]
 
-293C; [0D 9D D4, 05, 05]
+296E; [0D A7 A4, 05, 05]
 
-293D; [0D 9D DC, 05, 05]
+296F; [0D A7 AC, 05, 05]
 
-293E; [0D 9D E4, 05, 05]
+2970; [0D A7 B4, 05, 05]
 
-293F; [0D 9D EC, 05, 05]
+2971; [0D A7 BC, 05, 05]
 
-2940; [0D 9D F4, 05, 05]
+2972; [0D A7 C4, 05, 05]
 
-2941; [0D 9D FC, 05, 05]
+2973; [0D A7 CC, 05, 05]
 
-2942; [0D 9E 0A, 05, 05]
+2974; [0D A7 D4, 05, 05]
 
-2943; [0D 9E 12, 05, 05]
+2975; [0D A7 DC, 05, 05]
 
-2944; [0D 9E 1A, 05, 05]
+2976; [0D A7 E4, 05, 05]
 
-2945; [0D 9E 22, 05, 05]
+2977; [0D A7 EC, 05, 05]
 
-2946; [0D 9E 2A, 05, 05]
+2978; [0D A7 F4, 05, 05]
 
-2947; [0D 9E 32, 05, 05]
+2979; [0D A7 FC, 05, 05]
 
-2948; [0D 9E 3A, 05, 05]
+297A; [0D A8 06, 05, 05]
 
-2949; [0D 9E 42, 05, 05]
+297B; [0D A8 0E, 05, 05]
 
-294A; [0D 9E 4A, 05, 05]
+297C; [0D A8 16, 05, 05]
 
-294B; [0D 9E 52, 05, 05]
+297D; [0D A8 1E, 05, 05]
 
-294C; [0D 9E 5A, 05, 05]
+297E; [0D A8 26, 05, 05]
 
-294D; [0D 9E 62, 05, 05]
+297F; [0D A8 2E, 05, 05]
 
-294E; [0D 9E 6A, 05, 05]
+2980; [0D A8 36, 05, 05]
 
-294F; [0D 9E 72, 05, 05]
+2981; [0D A8 3E, 05, 05]
 
-2950; [0D 9E 7A, 05, 05]
+2982; [0D A8 46, 05, 05]
 
-2951; [0D 9E 82, 05, 05]
+2999; [0D A8 4E, 05, 05]
 
-2952; [0D 9E 8A, 05, 05]
+299A; [0D A8 56, 05, 05]
 
-2953; [0D 9E 92, 05, 05]
+299B; [0D A8 5E, 05, 05]
 
-2954; [0D 9E 9A, 05, 05]
+299C; [0D A8 66, 05, 05]
 
-2955; [0D 9E A2, 05, 05]
+299D; [0D A8 6E, 05, 05]
 
-2956; [0D 9E AA, 05, 05]
+299E; [0D A8 76, 05, 05]
 
-2957; [0D 9E B2, 05, 05]
+299F; [0D A8 7E, 05, 05]
 
-2958; [0D 9E BA, 05, 05]
+29A0; [0D A8 86, 05, 05]
 
-2959; [0D 9E C2, 05, 05]
+29A1; [0D A8 8E, 05, 05]
 
-295A; [0D 9E CA, 05, 05]
+29A2; [0D A8 96, 05, 05]
 
-295B; [0D 9E D2, 05, 05]
+29A3; [0D A8 9E, 05, 05]
 
-295C; [0D 9E DA, 05, 05]
+29A4; [0D A8 A6, 05, 05]
 
-295D; [0D 9E E2, 05, 05]
+29A5; [0D A8 AE, 05, 05]
 
-295E; [0D 9E EA, 05, 05]
+29A6; [0D A8 B6, 05, 05]
 
-295F; [0D 9E F2, 05, 05]
+29A7; [0D A8 BE, 05, 05]
 
-2960; [0D 9E FA, 05, 05]
+29A8; [0D A8 C6, 05, 05]
 
-2961; [0D 9F 08, 05, 05]
+29A9; [0D A8 CE, 05, 05]
 
-2962; [0D 9F 10, 05, 05]
+29AA; [0D A8 D6, 05, 05]
 
-2963; [0D 9F 18, 05, 05]
+29AB; [0D A8 DE, 05, 05]
 
-2964; [0D 9F 20, 05, 05]
+29AC; [0D A8 E6, 05, 05]
 
-2965; [0D 9F 28, 05, 05]
+29AD; [0D A8 EE, 05, 05]
 
-2966; [0D 9F 30, 05, 05]
+29AE; [0D A8 F6, 05, 05]
 
-2967; [0D 9F 38, 05, 05]
+29AF; [0D A8 FE, 05, 05]
 
-2968; [0D 9F 40, 05, 05]
+29B0; [0D A9 08, 05, 05]
 
-2969; [0D 9F 48, 05, 05]
+29B1; [0D A9 10, 05, 05]
 
-296A; [0D 9F 50, 05, 05]
+29B2; [0D A9 18, 05, 05]
 
-296B; [0D 9F 58, 05, 05]
+29B3; [0D A9 20, 05, 05]
 
-296C; [0D 9F 60, 05, 05]
+29B4; [0D A9 28, 05, 05]
 
-296D; [0D 9F 68, 05, 05]
+29B5; [0D A9 30, 05, 05]
 
-296E; [0D 9F 70, 05, 05]
+29B6; [0D A9 38, 05, 05]
 
-296F; [0D 9F 78, 05, 05]
+29B7; [0D A9 40, 05, 05]
 
-2970; [0D 9F 80, 05, 05]
+29B8; [0D A9 48, 05, 05]
 
-2971; [0D 9F 88, 05, 05]
+29B9; [0D A9 50, 05, 05]
 
-2972; [0D 9F 90, 05, 05]
+29BA; [0D A9 58, 05, 05]
 
-2973; [0D 9F 98, 05, 05]
+29BB; [0D A9 60, 05, 05]
 
-2974; [0D 9F A0, 05, 05]
+29BC; [0D A9 68, 05, 05]
 
-2975; [0D 9F A8, 05, 05]
+29BD; [0D A9 70, 05, 05]
 
-2976; [0D 9F B0, 05, 05]
+29BE; [0D A9 78, 05, 05]
 
-2977; [0D 9F B8, 05, 05]
+29BF; [0D A9 80, 05, 05]
 
-2978; [0D 9F C0, 05, 05]
+29C0; [0D A9 88, 05, 05]
 
-2979; [0D 9F C8, 05, 05]
+29C1; [0D A9 90, 05, 05]
 
-297A; [0D 9F D0, 05, 05]
+29C2; [0D A9 98, 05, 05]
 
-297B; [0D 9F D8, 05, 05]
+29C3; [0D A9 A0, 05, 05]
 
-297C; [0D 9F E0, 05, 05]
+29C4; [0D A9 A8, 05, 05]
 
-297D; [0D 9F E8, 05, 05]
+29C5; [0D A9 B0, 05, 05]
 
-297E; [0D 9F F0, 05, 05]
+29C6; [0D A9 B8, 05, 05]
 
-297F; [0D 9F F8, 05, 05]
+29C7; [0D A9 C0, 05, 05]
 
-2980; [0D A0 06, 05, 05]
+29C8; [0D A9 C8, 05, 05]
 
-2981; [0D A0 0E, 05, 05]
+29C9; [0D A9 D0, 05, 05]
 
-2982; [0D A0 16, 05, 05]
+29CA; [0D A9 D8, 05, 05]
 
-2999; [0D A0 1E, 05, 05]
+29CB; [0D A9 E0, 05, 05]
 
-299A; [0D A0 26, 05, 05]
+29CC; [0D A9 E8, 05, 05]
 
-299B; [0D A0 2E, 05, 05]
+29CD; [0D A9 F0, 05, 05]
 
-299C; [0D A0 36, 05, 05]
+29CE; [0D A9 F8, 05, 05]
 
-299D; [0D A0 3E, 05, 05]
+29CF; [0D AA 02, 05, 05]
 
-299E; [0D A0 46, 05, 05]
+29D0; [0D AA 0A, 05, 05]
 
-299F; [0D A0 4E, 05, 05]
+29D1; [0D AA 12, 05, 05]
 
-29A0; [0D A0 56, 05, 05]
+29D2; [0D AA 1A, 05, 05]
 
-29A1; [0D A0 5E, 05, 05]
+29D3; [0D AA 22, 05, 05]
 
-29A2; [0D A0 66, 05, 05]
+29D4; [0D AA 2A, 05, 05]
 
-29A3; [0D A0 6E, 05, 05]
+29D5; [0D AA 32, 05, 05]
 
-29A4; [0D A0 76, 05, 05]
+29D6; [0D AA 3A, 05, 05]
 
-29A5; [0D A0 7E, 05, 05]
+29D7; [0D AA 42, 05, 05]
 
-29A6; [0D A0 86, 05, 05]
+29DC; [0D AA 4A, 05, 05]
 
-29A7; [0D A0 8E, 05, 05]
+29DD; [0D AA 52, 05, 05]
 
-29A8; [0D A0 96, 05, 05]
+29DE; [0D AA 5A, 05, 05]
 
-29A9; [0D A0 9E, 05, 05]
+29DF; [0D AA 62, 05, 05]
 
-29AA; [0D A0 A6, 05, 05]
+29E0; [0D AA 6A, 05, 05]
 
-29AB; [0D A0 AE, 05, 05]
+29E1; [0D AA 72, 05, 05]
 
-29AC; [0D A0 B6, 05, 05]
+29E2; [0D AA 7A, 05, 05]
 
-29AD; [0D A0 BE, 05, 05]
+29E3; [0D AA 82, 05, 05]
 
-29AE; [0D A0 C6, 05, 05]
+29E4; [0D AA 8A, 05, 05]
 
-29AF; [0D A0 CE, 05, 05]
+29E5; [0D AA 92, 05, 05]
 
-29B0; [0D A0 D6, 05, 05]
+29E6; [0D AA 9A, 05, 05]
 
-29B1; [0D A0 DE, 05, 05]
+29E7; [0D AA A2, 05, 05]
 
-29B2; [0D A0 E6, 05, 05]
+29E8; [0D AA AA, 05, 05]
 
-29B3; [0D A0 EE, 05, 05]
+29E9; [0D AA B2, 05, 05]
 
-29B4; [0D A0 F6, 05, 05]
+29EA; [0D AA BA, 05, 05]
 
-29B5; [0D A1 04, 05, 05]
+29EB; [0D AA C2, 05, 05]
 
-29B6; [0D A1 0C, 05, 05]
+29EC; [0D AA CA, 05, 05]
 
-29B7; [0D A1 14, 05, 05]
+29ED; [0D AA D2, 05, 05]
 
-29B8; [0D A1 1C, 05, 05]
+29EE; [0D AA DA, 05, 05]
 
-29B9; [0D A1 24, 05, 05]
+29EF; [0D AA E2, 05, 05]
 
-29BA; [0D A1 2C, 05, 05]
+29F0; [0D AA EA, 05, 05]
 
-29BB; [0D A1 34, 05, 05]
+29F1; [0D AA F2, 05, 05]
 
-29BC; [0D A1 3C, 05, 05]
+29F2; [0D AA FA, 05, 05]
 
-29BD; [0D A1 44, 05, 05]
+29F3; [0D AB 04, 05, 05]
 
-29BE; [0D A1 4C, 05, 05]
+29F4; [0D AB 0C, 05, 05]
 
-29BF; [0D A1 54, 05, 05]
+29F5; [0D AB 14, 05, 05]
 
-29C0; [0D A1 5C, 05, 05]
+29F6; [0D AB 1C, 05, 05]
 
-29C1; [0D A1 64, 05, 05]
+29F7; [0D AB 24, 05, 05]
 
-29C2; [0D A1 6C, 05, 05]
+29F8; [0D AB 2C, 05, 05]
 
-29C3; [0D A1 74, 05, 05]
+29F9; [0D AB 34, 05, 05]
 
-29C4; [0D A1 7C, 05, 05]
+29FA; [0D AB 3C, 05, 05]
 
-29C5; [0D A1 84, 05, 05]
+29FB; [0D AB 44, 05, 05]
 
-29C6; [0D A1 8C, 05, 05]
+29FE; [0D AB 4C, 05, 05]
 
-29C7; [0D A1 94, 05, 05]
+29FF; [0D AB 54, 05, 05]
 
-29C8; [0D A1 9C, 05, 05]
+2A00; [0D AB 5C, 05, 05]
 
-29C9; [0D A1 A4, 05, 05]
+2A01; [0D AB 64, 05, 05]
 
-29CA; [0D A1 AC, 05, 05]
+2A02; [0D AB 6C, 05, 05]
 
-29CB; [0D A1 B4, 05, 05]
+2A03; [0D AB 74, 05, 05]
 
-29CC; [0D A1 BC, 05, 05]
+2A04; [0D AB 7C, 05, 05]
 
-29CD; [0D A1 C4, 05, 05]
+2A05; [0D AB 84, 05, 05]
 
-29CE; [0D A1 CC, 05, 05]
+2A06; [0D AB 8C, 05, 05]
 
-29CF; [0D A1 D4, 05, 05]
+2A07; [0D AB 94, 05, 05]
 
-29D0; [0D A1 DC, 05, 05]
+2A08; [0D AB 9C, 05, 05]
 
-29D1; [0D A1 E4, 05, 05]
+2A09; [0D AB A4, 05, 05]
 
-29D2; [0D A1 EC, 05, 05]
+2A0A; [0D AB AC, 05, 05]
 
-29D3; [0D A1 F4, 05, 05]
+2A0B; [0D AB B4, 05, 05]
 
-29D4; [0D A1 FC, 05, 05]
+2A0D; [0D AB BC, 05, 05]
 
-29D5; [0D A2 0A, 05, 05]
+2A0E; [0D AB C4, 05, 05]
 
-29D6; [0D A2 12, 05, 05]
+2A0F; [0D AB CC, 05, 05]
 
-29D7; [0D A2 1A, 05, 05]
+2A10; [0D AB D4, 05, 05]
 
-29DC; [0D A2 22, 05, 05]
+2A11; [0D AB DC, 05, 05]
 
-29DD; [0D A2 2A, 05, 05]
+2A12; [0D AB E4, 05, 05]
 
-29DE; [0D A2 32, 05, 05]
+2A13; [0D AB EC, 05, 05]
 
-29DF; [0D A2 3A, 05, 05]
+2A14; [0D AB F4, 05, 05]
 
-29E0; [0D A2 42, 05, 05]
+2A15; [0D AB FC, 05, 05]
 
-29E1; [0D A2 4A, 05, 05]
+2A16; [0D AC 06, 05, 05]
 
-29E2; [0D A2 52, 05, 05]
+2A17; [0D AC 0E, 05, 05]
 
-29E3; [0D A2 5A, 05, 05]
+2A18; [0D AC 16, 05, 05]
 
-29E4; [0D A2 62, 05, 05]
+2A19; [0D AC 1E, 05, 05]
 
-29E5; [0D A2 6A, 05, 05]
+2A1A; [0D AC 26, 05, 05]
 
-29E6; [0D A2 72, 05, 05]
+2A1B; [0D AC 2E, 05, 05]
 
-29E7; [0D A2 7A, 05, 05]
+2A1C; [0D AC 36, 05, 05]
 
-29E8; [0D A2 82, 05, 05]
+2A1D; [0D AC 3E, 05, 05]
 
-29E9; [0D A2 8A, 05, 05]
+2A1E; [0D AC 46, 05, 05]
 
-29EA; [0D A2 92, 05, 05]
+2A1F; [0D AC 4E, 05, 05]
 
-29EB; [0D A2 9A, 05, 05]
+2A20; [0D AC 56, 05, 05]
 
-29EC; [0D A2 A2, 05, 05]
+2A21; [0D AC 5E, 05, 05]
 
-29ED; [0D A2 AA, 05, 05]
+2A22; [0D AC 66, 05, 05]
 
-29EE; [0D A2 B2, 05, 05]
+2A23; [0D AC 6E, 05, 05]
 
-29EF; [0D A2 BA, 05, 05]
+2A24; [0D AC 76, 05, 05]
 
-29F0; [0D A2 C2, 05, 05]
+2A25; [0D AC 7E, 05, 05]
 
-29F1; [0D A2 CA, 05, 05]
+2A26; [0D AC 86, 05, 05]
 
-29F2; [0D A2 D2, 05, 05]
+2A27; [0D AC 8E, 05, 05]
 
-29F3; [0D A2 DA, 05, 05]
+2A28; [0D AC 96, 05, 05]
 
-29F4; [0D A2 E2, 05, 05]
+2A29; [0D AC 9E, 05, 05]
 
-29F5; [0D A2 EA, 05, 05]
+2A2A; [0D AC A6, 05, 05]
 
-29F6; [0D A2 F2, 05, 05]
+2A2B; [0D AC AE, 05, 05]
 
-29F7; [0D A2 FA, 05, 05]
+2A2C; [0D AC B6, 05, 05]
 
-29F8; [0D A3 08, 05, 05]
+2A2D; [0D AC BE, 05, 05]
 
-29F9; [0D A3 10, 05, 05]
+2A2E; [0D AC C6, 05, 05]
 
-29FA; [0D A3 18, 05, 05]
+2A2F; [0D AC CE, 05, 05]
 
-29FB; [0D A3 20, 05, 05]
+2A30; [0D AC D6, 05, 05]
 
-29FE; [0D A3 28, 05, 05]
+2A31; [0D AC DE, 05, 05]
 
-29FF; [0D A3 30, 05, 05]
+2A32; [0D AC E6, 05, 05]
 
-2A00; [0D A3 38, 05, 05]
+2A33; [0D AC EE, 05, 05]
 
-2A01; [0D A3 40, 05, 05]
+2A34; [0D AC F6, 05, 05]
 
-2A02; [0D A3 48, 05, 05]
+2A35; [0D AC FE, 05, 05]
 
-2A03; [0D A3 50, 05, 05]
+2A36; [0D AD 08, 05, 05]
 
-2A04; [0D A3 58, 05, 05]
+2A37; [0D AD 10, 05, 05]
 
-2A05; [0D A3 60, 05, 05]
+2A38; [0D AD 18, 05, 05]
 
-2A06; [0D A3 68, 05, 05]
+2A39; [0D AD 20, 05, 05]
 
-2A07; [0D A3 70, 05, 05]
+2A3A; [0D AD 28, 05, 05]
 
-2A08; [0D A3 78, 05, 05]
+2A3B; [0D AD 30, 05, 05]
 
-2A09; [0D A3 80, 05, 05]
+2A3C; [0D AD 38, 05, 05]
 
-2A0A; [0D A3 88, 05, 05]
+2A3D; [0D AD 40, 05, 05]
 
-2A0B; [0D A3 90, 05, 05]
+2A3E; [0D AD 48, 05, 05]
 
-2A0D; [0D A3 98, 05, 05]
+2A3F; [0D AD 50, 05, 05]
 
-2A0E; [0D A3 A0, 05, 05]
+2A40; [0D AD 58, 05, 05]
 
-2A0F; [0D A3 A8, 05, 05]
+2A41; [0D AD 60, 05, 05]
 
-2A10; [0D A3 B0, 05, 05]
+2A42; [0D AD 68, 05, 05]
 
-2A11; [0D A3 B8, 05, 05]
+2A43; [0D AD 70, 05, 05]
 
-2A12; [0D A3 C0, 05, 05]
+2A44; [0D AD 78, 05, 05]
 
-2A13; [0D A3 C8, 05, 05]
+2A45; [0D AD 80, 05, 05]
 
-2A14; [0D A3 D0, 05, 05]
+2A46; [0D AD 88, 05, 05]
 
-2A15; [0D A3 D8, 05, 05]
+2A47; [0D AD 90, 05, 05]
 
-2A16; [0D A3 E0, 05, 05]
+2A48; [0D AD 98, 05, 05]
 
-2A17; [0D A3 E8, 05, 05]
+2A49; [0D AD A0, 05, 05]
 
-2A18; [0D A3 F0, 05, 05]
+2A4A; [0D AD A8, 05, 05]
 
-2A19; [0D A3 F8, 05, 05]
+2A4B; [0D AD B0, 05, 05]
 
-2A1A; [0D A4 06, 05, 05]
+2A4C; [0D AD B8, 05, 05]
 
-2A1B; [0D A4 0E, 05, 05]
+2A4D; [0D AD C0, 05, 05]
 
-2A1C; [0D A4 16, 05, 05]
+2A4E; [0D AD C8, 05, 05]
 
-2A1D; [0D A4 1E, 05, 05]
+2A4F; [0D AD D0, 05, 05]
 
-2A1E; [0D A4 26, 05, 05]
+2A50; [0D AD D8, 05, 05]
 
-2A1F; [0D A4 2E, 05, 05]
+2A51; [0D AD E0, 05, 05]
 
-2A20; [0D A4 36, 05, 05]
+2A52; [0D AD E8, 05, 05]
 
-2A21; [0D A4 3E, 05, 05]
+2A53; [0D AD F0, 05, 05]
 
-2A22; [0D A4 46, 05, 05]
+2A54; [0D AD F8, 05, 05]
 
-2A23; [0D A4 4E, 05, 05]
+2A55; [0D AE 02, 05, 05]
 
-2A24; [0D A4 56, 05, 05]
+2A56; [0D AE 0A, 05, 05]
 
-2A25; [0D A4 5E, 05, 05]
+2A57; [0D AE 12, 05, 05]
 
-2A26; [0D A4 66, 05, 05]
+2A58; [0D AE 1A, 05, 05]
 
-2A27; [0D A4 6E, 05, 05]
+2A59; [0D AE 22, 05, 05]
 
-2A28; [0D A4 76, 05, 05]
+2A5A; [0D AE 2A, 05, 05]
 
-2A29; [0D A4 7E, 05, 05]
+2A5B; [0D AE 32, 05, 05]
 
-2A2A; [0D A4 86, 05, 05]
+2A5C; [0D AE 3A, 05, 05]
 
-2A2B; [0D A4 8E, 05, 05]
+2A5D; [0D AE 42, 05, 05]
 
-2A2C; [0D A4 96, 05, 05]
+2A5E; [0D AE 4A, 05, 05]
 
-2A2D; [0D A4 9E, 05, 05]
+2A5F; [0D AE 52, 05, 05]
 
-2A2E; [0D A4 A6, 05, 05]
+2A60; [0D AE 5A, 05, 05]
 
-2A2F; [0D A4 AE, 05, 05]
+2A61; [0D AE 62, 05, 05]
 
-2A30; [0D A4 B6, 05, 05]
+2A62; [0D AE 6A, 05, 05]
 
-2A31; [0D A4 BE, 05, 05]
+2A63; [0D AE 72, 05, 05]
 
-2A32; [0D A4 C6, 05, 05]
+2A64; [0D AE 7A, 05, 05]
 
-2A33; [0D A4 CE, 05, 05]
+2A65; [0D AE 82, 05, 05]
 
-2A34; [0D A4 D6, 05, 05]
+2A66; [0D AE 8A, 05, 05]
 
-2A35; [0D A4 DE, 05, 05]
+2A67; [0D AE 92, 05, 05]
 
-2A36; [0D A4 E6, 05, 05]
+2A68; [0D AE 9A, 05, 05]
 
-2A37; [0D A4 EE, 05, 05]
+2A69; [0D AE A2, 05, 05]
 
-2A38; [0D A4 F6, 05, 05]
+2A6A; [0D AE AA, 05, 05]
 
-2A39; [0D A5 04, 05, 05]
+2A6B; [0D AE B2, 05, 05]
 
-2A3A; [0D A5 0C, 05, 05]
+2A6C; [0D AE BA, 05, 05]
 
-2A3B; [0D A5 14, 05, 05]
+2A6D; [0D AE C2, 05, 05]
 
-2A3C; [0D A5 1C, 05, 05]
+2A6E; [0D AE CA, 05, 05]
 
-2A3D; [0D A5 24, 05, 05]
+2A6F; [0D AE D2, 05, 05]
 
-2A3E; [0D A5 2C, 05, 05]
+2A70; [0D AE DA, 05, 05]
 
-2A3F; [0D A5 34, 05, 05]
+2A71; [0D AE E2, 05, 05]
 
-2A40; [0D A5 3C, 05, 05]
+2A72; [0D AE EA, 05, 05]
 
-2A41; [0D A5 44, 05, 05]
+2A73; [0D AE F2, 05, 05]
 
-2A42; [0D A5 4C, 05, 05]
+2A77; [0D AE FA, 05, 05]
 
-2A43; [0D A5 54, 05, 05]
+2A78; [0D AF 04, 05, 05]
 
-2A44; [0D A5 5C, 05, 05]
+2A79; [0D AF 0C, 05, 05]
 
-2A45; [0D A5 64, 05, 05]
+2A7A; [0D AF 14, 05, 05]
 
-2A46; [0D A5 6C, 05, 05]
+2A7B; [0D AF 1C, 05, 05]
 
-2A47; [0D A5 74, 05, 05]
+2A7C; [0D AF 24, 05, 05]
 
-2A48; [0D A5 7C, 05, 05]
+2A7D; [0D AF 2C, 05, 05]
 
-2A49; [0D A5 84, 05, 05]
+2A7E; [0D AF 34, 05, 05]
 
-2A4A; [0D A5 8C, 05, 05]
+2A7F; [0D AF 3C, 05, 05]
 
-2A4B; [0D A5 94, 05, 05]
+2A80; [0D AF 44, 05, 05]
 
-2A4C; [0D A5 9C, 05, 05]
+2A81; [0D AF 4C, 05, 05]
 
-2A4D; [0D A5 A4, 05, 05]
+2A82; [0D AF 54, 05, 05]
 
-2A4E; [0D A5 AC, 05, 05]
+2A83; [0D AF 5C, 05, 05]
 
-2A4F; [0D A5 B4, 05, 05]
+2A84; [0D AF 64, 05, 05]
 
-2A50; [0D A5 BC, 05, 05]
+2A85; [0D AF 6C, 05, 05]
 
-2A51; [0D A5 C4, 05, 05]
+2A86; [0D AF 74, 05, 05]
 
-2A52; [0D A5 CC, 05, 05]
+2A87; [0D AF 7C, 05, 05]
 
-2A53; [0D A5 D4, 05, 05]
+2A88; [0D AF 84, 05, 05]
 
-2A54; [0D A5 DC, 05, 05]
+2A89; [0D AF 8C, 05, 05]
 
-2A55; [0D A5 E4, 05, 05]
+2A8A; [0D AF 94, 05, 05]
 
-2A56; [0D A5 EC, 05, 05]
+2A8B; [0D AF 9C, 05, 05]
 
-2A57; [0D A5 F4, 05, 05]
+2A8C; [0D AF A4, 05, 05]
 
-2A58; [0D A5 FC, 05, 05]
+2A8D; [0D AF AC, 05, 05]
 
-2A59; [0D A6 0A, 05, 05]
+2A8E; [0D AF B4, 05, 05]
 
-2A5A; [0D A6 12, 05, 05]
+2A8F; [0D AF BC, 05, 05]
 
-2A5B; [0D A6 1A, 05, 05]
+2A90; [0D AF C4, 05, 05]
 
-2A5C; [0D A6 22, 05, 05]
+2A91; [0D AF CC, 05, 05]
 
-2A5D; [0D A6 2A, 05, 05]
+2A92; [0D AF D4, 05, 05]
 
-2A5E; [0D A6 32, 05, 05]
+2A93; [0D AF DC, 05, 05]
 
-2A5F; [0D A6 3A, 05, 05]
+2A94; [0D AF E4, 05, 05]
 
-2A60; [0D A6 42, 05, 05]
+2A95; [0D AF EC, 05, 05]
 
-2A61; [0D A6 4A, 05, 05]
+2A96; [0D AF F4, 05, 05]
 
-2A62; [0D A6 52, 05, 05]
+2A97; [0D AF FC, 05, 05]
 
-2A63; [0D A6 5A, 05, 05]
+2A98; [0D B0 06, 05, 05]
 
-2A64; [0D A6 62, 05, 05]
+2A99; [0D B0 0E, 05, 05]
 
-2A65; [0D A6 6A, 05, 05]
+2A9A; [0D B0 16, 05, 05]
 
-2A66; [0D A6 72, 05, 05]
+2A9B; [0D B0 1E, 05, 05]
 
-2A67; [0D A6 7A, 05, 05]
+2A9C; [0D B0 26, 05, 05]
 
-2A68; [0D A6 82, 05, 05]
+2A9D; [0D B0 2E, 05, 05]
 
-2A69; [0D A6 8A, 05, 05]
+2A9E; [0D B0 36, 05, 05]
 
-2A6A; [0D A6 92, 05, 05]
+2A9F; [0D B0 3E, 05, 05]
 
-2A6B; [0D A6 9A, 05, 05]
+2AA0; [0D B0 46, 05, 05]
 
-2A6C; [0D A6 A2, 05, 05]
+2AA1; [0D B0 4E, 05, 05]
 
-2A6D; [0D A6 AA, 05, 05]
+2AA2; [0D B0 56, 05, 05]
 
-2A6E; [0D A6 B2, 05, 05]
+2AA3; [0D B0 5E, 05, 05]
 
-2A6F; [0D A6 BA, 05, 05]
+2AA4; [0D B0 66, 05, 05]
 
-2A70; [0D A6 C2, 05, 05]
+2AA5; [0D B0 6E, 05, 05]
 
-2A71; [0D A6 CA, 05, 05]
+2AA6; [0D B0 76, 05, 05]
 
-2A72; [0D A6 D2, 05, 05]
+2AA7; [0D B0 7E, 05, 05]
 
-2A73; [0D A6 DA, 05, 05]
+2AA8; [0D B0 86, 05, 05]
 
-2A77; [0D A6 E2, 05, 05]
+2AA9; [0D B0 8E, 05, 05]
 
-2A78; [0D A6 EA, 05, 05]
+2AAA; [0D B0 96, 05, 05]
 
-2A79; [0D A6 F2, 05, 05]
+2AAB; [0D B0 9E, 05, 05]
 
-2A7A; [0D A6 FA, 05, 05]
+2AAC; [0D B0 A6, 05, 05]
 
-2A7B; [0D A7 08, 05, 05]
+2AAD; [0D B0 AE, 05, 05]
 
-2A7C; [0D A7 10, 05, 05]
+2AAE; [0D B0 B6, 05, 05]
 
-2A7D; [0D A7 18, 05, 05]
+2AAF; [0D B0 BE, 05, 05]
 
-2A7E; [0D A7 20, 05, 05]
+2AB0; [0D B0 C6, 05, 05]
 
-2A7F; [0D A7 28, 05, 05]
+2AB1; [0D B0 CE, 05, 05]
 
-2A80; [0D A7 30, 05, 05]
+2AB2; [0D B0 D6, 05, 05]
 
-2A81; [0D A7 38, 05, 05]
+2AB3; [0D B0 DE, 05, 05]
 
-2A82; [0D A7 40, 05, 05]
+2AB4; [0D B0 E6, 05, 05]
 
-2A83; [0D A7 48, 05, 05]
+2AB5; [0D B0 EE, 05, 05]
 
-2A84; [0D A7 50, 05, 05]
+2AB6; [0D B0 F6, 05, 05]
 
-2A85; [0D A7 58, 05, 05]
+2AB7; [0D B0 FE, 05, 05]
 
-2A86; [0D A7 60, 05, 05]
+2AB8; [0D B1 08, 05, 05]
 
-2A87; [0D A7 68, 05, 05]
+2AB9; [0D B1 10, 05, 05]
 
-2A88; [0D A7 70, 05, 05]
+2ABA; [0D B1 18, 05, 05]
 
-2A89; [0D A7 78, 05, 05]
+2ABB; [0D B1 20, 05, 05]
 
-2A8A; [0D A7 80, 05, 05]
+2ABC; [0D B1 28, 05, 05]
 
-2A8B; [0D A7 88, 05, 05]
+2ABD; [0D B1 30, 05, 05]
 
-2A8C; [0D A7 90, 05, 05]
+2ABE; [0D B1 38, 05, 05]
 
-2A8D; [0D A7 98, 05, 05]
+2ABF; [0D B1 40, 05, 05]
 
-2A8E; [0D A7 A0, 05, 05]
+2AC0; [0D B1 48, 05, 05]
 
-2A8F; [0D A7 A8, 05, 05]
+2AC1; [0D B1 50, 05, 05]
 
-2A90; [0D A7 B0, 05, 05]
+2AC2; [0D B1 58, 05, 05]
 
-2A91; [0D A7 B8, 05, 05]
+2AC3; [0D B1 60, 05, 05]
 
-2A92; [0D A7 C0, 05, 05]
+2AC4; [0D B1 68, 05, 05]
 
-2A93; [0D A7 C8, 05, 05]
+2AC5; [0D B1 70, 05, 05]
 
-2A94; [0D A7 D0, 05, 05]
+2AC6; [0D B1 78, 05, 05]
 
-2A95; [0D A7 D8, 05, 05]
+2AC7; [0D B1 80, 05, 05]
 
-2A96; [0D A7 E0, 05, 05]
+2AC8; [0D B1 88, 05, 05]
 
-2A97; [0D A7 E8, 05, 05]
+2AC9; [0D B1 90, 05, 05]
 
-2A98; [0D A7 F0, 05, 05]
+2ACA; [0D B1 98, 05, 05]
 
-2A99; [0D A7 F8, 05, 05]
+2ACB; [0D B1 A0, 05, 05]
 
-2A9A; [0D A8 06, 05, 05]
+2ACC; [0D B1 A8, 05, 05]
 
-2A9B; [0D A8 0E, 05, 05]
+2ACD; [0D B1 B0, 05, 05]
 
-2A9C; [0D A8 16, 05, 05]
+2ACE; [0D B1 B8, 05, 05]
 
-2A9D; [0D A8 1E, 05, 05]
+2ACF; [0D B1 C0, 05, 05]
 
-2A9E; [0D A8 26, 05, 05]
+2AD0; [0D B1 C8, 05, 05]
 
-2A9F; [0D A8 2E, 05, 05]
+2AD1; [0D B1 D0, 05, 05]
 
-2AA0; [0D A8 36, 05, 05]
+2AD2; [0D B1 D8, 05, 05]
 
-2AA1; [0D A8 3E, 05, 05]
+2AD3; [0D B1 E0, 05, 05]
 
-2AA2; [0D A8 46, 05, 05]
+2AD4; [0D B1 E8, 05, 05]
 
-2AA3; [0D A8 4E, 05, 05]
+2AD5; [0D B1 F0, 05, 05]
 
-2AA4; [0D A8 56, 05, 05]
+2AD6; [0D B1 F8, 05, 05]
 
-2AA5; [0D A8 5E, 05, 05]
+2AD7; [0D B2 02, 05, 05]
 
-2AA6; [0D A8 66, 05, 05]
+2AD8; [0D B2 0A, 05, 05]
 
-2AA7; [0D A8 6E, 05, 05]
+2AD9; [0D B2 12, 05, 05]
 
-2AA8; [0D A8 76, 05, 05]
+2ADA; [0D B2 1A, 05, 05]
 
-2AA9; [0D A8 7E, 05, 05]
+2ADB; [0D B2 22, 05, 05]
 
-2AAA; [0D A8 86, 05, 05]
+2ADD; [0D B2 2A, 05, 05]
+2ADC; [0D B2 2A, 05, 05][, 9E, 05]
 
-2AAB; [0D A8 8E, 05, 05]
+2ADE; [0D B2 32, 05, 05]
 
-2AAC; [0D A8 96, 05, 05]
+2ADF; [0D B2 3A, 05, 05]
 
-2AAD; [0D A8 9E, 05, 05]
+2AE0; [0D B2 42, 05, 05]
 
-2AAE; [0D A8 A6, 05, 05]
+2AE1; [0D B2 4A, 05, 05]
 
-2AAF; [0D A8 AE, 05, 05]
+2AE2; [0D B2 52, 05, 05]
 
-2AB0; [0D A8 B6, 05, 05]
+2AE3; [0D B2 5A, 05, 05]
 
-2AB1; [0D A8 BE, 05, 05]
+2AE4; [0D B2 62, 05, 05]
 
-2AB2; [0D A8 C6, 05, 05]
+2AE5; [0D B2 6A, 05, 05]
 
-2AB3; [0D A8 CE, 05, 05]
+2AE6; [0D B2 72, 05, 05]
 
-2AB4; [0D A8 D6, 05, 05]
+2AE7; [0D B2 7A, 05, 05]
 
-2AB5; [0D A8 DE, 05, 05]
+2AE8; [0D B2 82, 05, 05]
 
-2AB6; [0D A8 E6, 05, 05]
+2AE9; [0D B2 8A, 05, 05]
 
-2AB7; [0D A8 EE, 05, 05]
+2AEA; [0D B2 92, 05, 05]
 
-2AB8; [0D A8 F6, 05, 05]
+2AEB; [0D B2 9A, 05, 05]
 
-2AB9; [0D A9 04, 05, 05]
+2AEC; [0D B2 A2, 05, 05]
 
-2ABA; [0D A9 0C, 05, 05]
+2AED; [0D B2 AA, 05, 05]
 
-2ABB; [0D A9 14, 05, 05]
+2AEE; [0D B2 B2, 05, 05]
 
-2ABC; [0D A9 1C, 05, 05]
+2AEF; [0D B2 BA, 05, 05]
 
-2ABD; [0D A9 24, 05, 05]
+2AF0; [0D B2 C2, 05, 05]
 
-2ABE; [0D A9 2C, 05, 05]
+2AF1; [0D B2 CA, 05, 05]
 
-2ABF; [0D A9 34, 05, 05]
+2AF2; [0D B2 D2, 05, 05]
 
-2AC0; [0D A9 3C, 05, 05]
+2AF3; [0D B2 DA, 05, 05]
 
-2AC1; [0D A9 44, 05, 05]
+2AF4; [0D B2 E2, 05, 05]
 
-2AC2; [0D A9 4C, 05, 05]
+2AF5; [0D B2 EA, 05, 05]
 
-2AC3; [0D A9 54, 05, 05]
+2AF6; [0D B2 F2, 05, 05]
 
-2AC4; [0D A9 5C, 05, 05]
+2AF7; [0D B2 FA, 05, 05]
 
-2AC5; [0D A9 64, 05, 05]
+2AF8; [0D B3 04, 05, 05]
 
-2AC6; [0D A9 6C, 05, 05]
+2AF9; [0D B3 0C, 05, 05]
 
-2AC7; [0D A9 74, 05, 05]
+2AFA; [0D B3 14, 05, 05]
 
-2AC8; [0D A9 7C, 05, 05]
+2AFB; [0D B3 1C, 05, 05]
 
-2AC9; [0D A9 84, 05, 05]
+2AFC; [0D B3 24, 05, 05]
 
-2ACA; [0D A9 8C, 05, 05]
+2AFD; [0D B3 2C, 05, 05]
 
-2ACB; [0D A9 94, 05, 05]
+2AFE; [0D B3 34, 05, 05]
 
-2ACC; [0D A9 9C, 05, 05]
+2AFF; [0D B3 3C, 05, 05]
 
-2ACD; [0D A9 A4, 05, 05]
+2B00; [0D B3 44, 05, 05]
 
-2ACE; [0D A9 AC, 05, 05]
+2B01; [0D B3 4C, 05, 05]
 
-2ACF; [0D A9 B4, 05, 05]
+2B02; [0D B3 54, 05, 05]
 
-2AD0; [0D A9 BC, 05, 05]
+2B03; [0D B3 5C, 05, 05]
 
-2AD1; [0D A9 C4, 05, 05]
+2B04; [0D B3 64, 05, 05]
 
-2AD2; [0D A9 CC, 05, 05]
+2B05; [0D B3 6C, 05, 05]
 
-2AD3; [0D A9 D4, 05, 05]
+2B06; [0D B3 74, 05, 05]
 
-2AD4; [0D A9 DC, 05, 05]
+2B07; [0D B3 7C, 05, 05]
 
-2AD5; [0D A9 E4, 05, 05]
+2B08; [0D B3 84, 05, 05]
 
-2AD6; [0D A9 EC, 05, 05]
+2B09; [0D B3 8C, 05, 05]
 
-2AD7; [0D A9 F4, 05, 05]
+2B0A; [0D B3 94, 05, 05]
 
-2AD8; [0D A9 FC, 05, 05]
+2B0B; [0D B3 9C, 05, 05]
 
-2AD9; [0D AA 0A, 05, 05]
+2B0C; [0D B3 A4, 05, 05]
 
-2ADA; [0D AA 12, 05, 05]
+2B0D; [0D B3 AC, 05, 05]
 
-2ADB; [0D AA 1A, 05, 05]
+2B0E; [0D B3 B4, 05, 05]
 
-2ADD; [0D AA 22, 05, 05]
-2ADC; [0D AA 22, 05, 05][, A5, 05]
+2B0F; [0D B3 BC, 05, 05]
 
-2ADE; [0D AA 2A, 05, 05]
+2B10; [0D B3 C4, 05, 05]
 
-2ADF; [0D AA 32, 05, 05]
+2B11; [0D B3 CC, 05, 05]
 
-2AE0; [0D AA 3A, 05, 05]
+2B12; [0D B3 D4, 05, 05]
 
-2AE1; [0D AA 42, 05, 05]
+2B13; [0D B3 DC, 05, 05]
 
-2AE2; [0D AA 4A, 05, 05]
+2B14; [0D B3 E4, 05, 05]
 
-2AE3; [0D AA 52, 05, 05]
+2B15; [0D B3 EC, 05, 05]
 
-2AE4; [0D AA 5A, 05, 05]
+2B16; [0D B3 F4, 05, 05]
 
-2AE5; [0D AA 62, 05, 05]
+2B17; [0D B3 FC, 05, 05]
 
-2AE6; [0D AA 6A, 05, 05]
+2B18; [0D B4 06, 05, 05]
 
-2AE7; [0D AA 72, 05, 05]
+2B19; [0D B4 0E, 05, 05]
 
-2AE8; [0D AA 7A, 05, 05]
+2B1A; [0D B4 16, 05, 05]
 
-2AE9; [0D AA 82, 05, 05]
+2B1B; [0D B4 1E, 05, 05]
 
-2AEA; [0D AA 8A, 05, 05]
+2B1C; [0D B4 26, 05, 05]
 
-2AEB; [0D AA 92, 05, 05]
+2B1D; [0D B4 2E, 05, 05]
 
-2AEC; [0D AA 9A, 05, 05]
+2B1E; [0D B4 36, 05, 05]
 
-2AED; [0D AA A2, 05, 05]
+2B1F; [0D B4 3E, 05, 05]
 
-2AEE; [0D AA AA, 05, 05]
+2B20; [0D B4 46, 05, 05]
 
-2AEF; [0D AA B2, 05, 05]
+2B21; [0D B4 4E, 05, 05]
 
-2AF0; [0D AA BA, 05, 05]
+2B22; [0D B4 56, 05, 05]
 
-2AF1; [0D AA C2, 05, 05]
+2B23; [0D B4 5E, 05, 05]
 
-2AF2; [0D AA CA, 05, 05]
+2B24; [0D B4 66, 05, 05]
 
-2AF3; [0D AA D2, 05, 05]
+2B25; [0D B4 6E, 05, 05]
 
-2AF4; [0D AA DA, 05, 05]
+2B26; [0D B4 76, 05, 05]
 
-2AF5; [0D AA E2, 05, 05]
+2B27; [0D B4 7E, 05, 05]
 
-2AF6; [0D AA EA, 05, 05]
+2B28; [0D B4 86, 05, 05]
 
-2AF7; [0D AA F2, 05, 05]
+2B29; [0D B4 8E, 05, 05]
 
-2AF8; [0D AA FA, 05, 05]
+2B2A; [0D B4 96, 05, 05]
 
-2AF9; [0D AB 08, 05, 05]
+2B2B; [0D B4 9E, 05, 05]
 
-2AFA; [0D AB 10, 05, 05]
+2B2C; [0D B4 A6, 05, 05]
 
-2AFB; [0D AB 18, 05, 05]
+2B2D; [0D B4 AE, 05, 05]
 
-2AFC; [0D AB 20, 05, 05]
+2B2E; [0D B4 B6, 05, 05]
 
-2AFD; [0D AB 28, 05, 05]
+2B2F; [0D B4 BE, 05, 05]
 
-2AFE; [0D AB 30, 05, 05]
+2B30; [0D B4 C6, 05, 05]
 
-2AFF; [0D AB 38, 05, 05]
+2B31; [0D B4 CE, 05, 05]
 
-2B00; [0D AB 40, 05, 05]
+2B32; [0D B4 D6, 05, 05]
 
-2B01; [0D AB 48, 05, 05]
+2B33; [0D B4 DE, 05, 05]
 
-2B02; [0D AB 50, 05, 05]
+2B34; [0D B4 E6, 05, 05]
 
-2B03; [0D AB 58, 05, 05]
+2B35; [0D B4 EE, 05, 05]
 
-2B04; [0D AB 60, 05, 05]
+2B36; [0D B4 F6, 05, 05]
 
-2B05; [0D AB 68, 05, 05]
+2B37; [0D B4 FE, 05, 05]
 
-2B06; [0D AB 70, 05, 05]
+2B38; [0D B5 08, 05, 05]
 
-2B07; [0D AB 78, 05, 05]
+2B39; [0D B5 10, 05, 05]
 
-2B08; [0D AB 80, 05, 05]
+2B3A; [0D B5 18, 05, 05]
 
-2B09; [0D AB 88, 05, 05]
+2B3B; [0D B5 20, 05, 05]
 
-2B0A; [0D AB 90, 05, 05]
+2B3C; [0D B5 28, 05, 05]
 
-2B0B; [0D AB 98, 05, 05]
+2B3D; [0D B5 30, 05, 05]
 
-2B0C; [0D AB A0, 05, 05]
+2B3E; [0D B5 38, 05, 05]
 
-2B0D; [0D AB A8, 05, 05]
+2B3F; [0D B5 40, 05, 05]
 
-2B0E; [0D AB B0, 05, 05]
+2B40; [0D B5 48, 05, 05]
 
-2B0F; [0D AB B8, 05, 05]
+2B41; [0D B5 50, 05, 05]
 
-2B10; [0D AB C0, 05, 05]
+2B42; [0D B5 58, 05, 05]
 
-2B11; [0D AB C8, 05, 05]
+2B43; [0D B5 60, 05, 05]
 
-2B12; [0D AB D0, 05, 05]
+2B44; [0D B5 68, 05, 05]
 
-2B13; [0D AB D8, 05, 05]
+2B45; [0D B5 70, 05, 05]
 
-2B14; [0D AB E0, 05, 05]
+2B46; [0D B5 78, 05, 05]
 
-2B15; [0D AB E8, 05, 05]
+2B47; [0D B5 80, 05, 05]
 
-2B16; [0D AB F0, 05, 05]
+2B48; [0D B5 88, 05, 05]
 
-2B17; [0D AB F8, 05, 05]
+2B49; [0D B5 90, 05, 05]
 
-2B18; [0D AC 06, 05, 05]
+2B4A; [0D B5 98, 05, 05]
 
-2B19; [0D AC 0E, 05, 05]
+2B4B; [0D B5 A0, 05, 05]
 
-2B1A; [0D AC 16, 05, 05]
+2B4C; [0D B5 A8, 05, 05]
 
-2B1B; [0D AC 1E, 05, 05]
+2B50; [0D B5 B0, 05, 05]
 
-2B1C; [0D AC 26, 05, 05]
+2B51; [0D B5 B8, 05, 05]
 
-2B1D; [0D AC 2E, 05, 05]
+2B52; [0D B5 C0, 05, 05]
 
-2B1E; [0D AC 36, 05, 05]
+2B53; [0D B5 C8, 05, 05]
 
-2B1F; [0D AC 3E, 05, 05]
+2B54; [0D B5 D0, 05, 05]
 
-2B20; [0D AC 46, 05, 05]
+2B55; [0D B5 D8, 05, 05]
 
-2B21; [0D AC 4E, 05, 05]
+2B56; [0D B5 E0, 05, 05]
 
-2B22; [0D AC 56, 05, 05]
+2B57; [0D B5 E8, 05, 05]
 
-2B23; [0D AC 5E, 05, 05]
+2B58; [0D B5 F0, 05, 05]
 
-2B24; [0D AC 66, 05, 05]
+2B59; [0D B5 F8, 05, 05]
 
-2B25; [0D AC 6E, 05, 05]
+2CE5; [0D B6 02, 05, 05]
 
-2B26; [0D AC 76, 05, 05]
+2CE6; [0D B6 0A, 05, 05]
 
-2B27; [0D AC 7E, 05, 05]
+2CE7; [0D B6 12, 05, 05]
 
-2B28; [0D AC 86, 05, 05]
+2CE8; [0D B6 1A, 05, 05]
 
-2B29; [0D AC 8E, 05, 05]
+2CE9; [0D B6 22, 05, 05]
 
-2B2A; [0D AC 96, 05, 05]
+2CEA; [0D B6 2A, 05, 05]
 
-2B2B; [0D AC 9E, 05, 05]
+2800; [0D B6 32, 05, 05]
 
-2B2C; [0D AC A6, 05, 05]
+2801; [0D B6 3A, 05, 05]
 
-2B2D; [0D AC AE, 05, 05]
+2802; [0D B6 42, 05, 05]
 
-2B2E; [0D AC B6, 05, 05]
+2803; [0D B6 4A, 05, 05]
 
-2B2F; [0D AC BE, 05, 05]
+2804; [0D B6 52, 05, 05]
 
-2B30; [0D AC C6, 05, 05]
+2805; [0D B6 5A, 05, 05]
 
-2B31; [0D AC CE, 05, 05]
+2806; [0D B6 62, 05, 05]
 
-2B32; [0D AC D6, 05, 05]
+2807; [0D B6 6A, 05, 05]
 
-2B33; [0D AC DE, 05, 05]
+2808; [0D B6 72, 05, 05]
 
-2B34; [0D AC E6, 05, 05]
+2809; [0D B6 7A, 05, 05]
 
-2B35; [0D AC EE, 05, 05]
+280A; [0D B6 82, 05, 05]
 
-2B36; [0D AC F6, 05, 05]
+280B; [0D B6 8A, 05, 05]
 
-2B37; [0D AD 04, 05, 05]
+280C; [0D B6 92, 05, 05]
 
-2B38; [0D AD 0C, 05, 05]
+280D; [0D B6 9A, 05, 05]
 
-2B39; [0D AD 14, 05, 05]
+280E; [0D B6 A2, 05, 05]
 
-2B3A; [0D AD 1C, 05, 05]
+280F; [0D B6 AA, 05, 05]
 
-2B3B; [0D AD 24, 05, 05]
+2810; [0D B6 B2, 05, 05]
 
-2B3C; [0D AD 2C, 05, 05]
+2811; [0D B6 BA, 05, 05]
 
-2B3D; [0D AD 34, 05, 05]
+2812; [0D B6 C2, 05, 05]
 
-2B3E; [0D AD 3C, 05, 05]
+2813; [0D B6 CA, 05, 05]
 
-2B3F; [0D AD 44, 05, 05]
+2814; [0D B6 D2, 05, 05]
 
-2B40; [0D AD 4C, 05, 05]
+2815; [0D B6 DA, 05, 05]
 
-2B41; [0D AD 54, 05, 05]
+2816; [0D B6 E2, 05, 05]
 
-2B42; [0D AD 5C, 05, 05]
+2817; [0D B6 EA, 05, 05]
 
-2B43; [0D AD 64, 05, 05]
+2818; [0D B6 F2, 05, 05]
 
-2B44; [0D AD 6C, 05, 05]
+2819; [0D B6 FA, 05, 05]
 
-2B45; [0D AD 74, 05, 05]
+281A; [0D B7 04, 05, 05]
 
-2B46; [0D AD 7C, 05, 05]
+281B; [0D B7 0C, 05, 05]
 
-2B47; [0D AD 84, 05, 05]
+281C; [0D B7 14, 05, 05]
 
-2B48; [0D AD 8C, 05, 05]
+281D; [0D B7 1C, 05, 05]
 
-2B49; [0D AD 94, 05, 05]
+281E; [0D B7 24, 05, 05]
 
-2B4A; [0D AD 9C, 05, 05]
+281F; [0D B7 2C, 05, 05]
 
-2B4B; [0D AD A4, 05, 05]
+2820; [0D B7 34, 05, 05]
 
-2B4C; [0D AD AC, 05, 05]
+2821; [0D B7 3C, 05, 05]
 
-2B50; [0D AD B4, 05, 05]
+2822; [0D B7 44, 05, 05]
 
-2B51; [0D AD BC, 05, 05]
+2823; [0D B7 4C, 05, 05]
 
-2B52; [0D AD C4, 05, 05]
+2824; [0D B7 54, 05, 05]
 
-2B53; [0D AD CC, 05, 05]
+2825; [0D B7 5C, 05, 05]
 
-2B54; [0D AD D4, 05, 05]
+2826; [0D B7 64, 05, 05]
 
-2B55; [0D AD DC, 05, 05]
+2827; [0D B7 6C, 05, 05]
 
-2B56; [0D AD E4, 05, 05]
+2828; [0D B7 74, 05, 05]
 
-2B57; [0D AD EC, 05, 05]
+2829; [0D B7 7C, 05, 05]
 
-2B58; [0D AD F4, 05, 05]
+282A; [0D B7 84, 05, 05]
 
-2B59; [0D AD FC, 05, 05]
+282B; [0D B7 8C, 05, 05]
 
-2CE5; [0D AE 0A, 05, 05]
+282C; [0D B7 94, 05, 05]
 
-2CE6; [0D AE 12, 05, 05]
+282D; [0D B7 9C, 05, 05]
 
-2CE7; [0D AE 1A, 05, 05]
+282E; [0D B7 A4, 05, 05]
 
-2CE8; [0D AE 22, 05, 05]
+282F; [0D B7 AC, 05, 05]
 
-2CE9; [0D AE 2A, 05, 05]
+2830; [0D B7 B4, 05, 05]
 
-2CEA; [0D AE 32, 05, 05]
+2831; [0D B7 BC, 05, 05]
 
-2800; [0D AE 3A, 05, 05]
+2832; [0D B7 C4, 05, 05]
 
-2801; [0D AE 42, 05, 05]
+2833; [0D B7 CC, 05, 05]
 
-2802; [0D AE 4A, 05, 05]
+2834; [0D B7 D4, 05, 05]
 
-2803; [0D AE 52, 05, 05]
+2835; [0D B7 DC, 05, 05]
 
-2804; [0D AE 5A, 05, 05]
+2836; [0D B7 E4, 05, 05]
 
-2805; [0D AE 62, 05, 05]
+2837; [0D B7 EC, 05, 05]
 
-2806; [0D AE 6A, 05, 05]
+2838; [0D B7 F4, 05, 05]
 
-2807; [0D AE 72, 05, 05]
+2839; [0D B7 FC, 05, 05]
 
-2808; [0D AE 7A, 05, 05]
+283A; [0D B8 06, 05, 05]
 
-2809; [0D AE 82, 05, 05]
+283B; [0D B8 0E, 05, 05]
 
-280A; [0D AE 8A, 05, 05]
+283C; [0D B8 16, 05, 05]
 
-280B; [0D AE 92, 05, 05]
+283D; [0D B8 1E, 05, 05]
 
-280C; [0D AE 9A, 05, 05]
+283E; [0D B8 26, 05, 05]
 
-280D; [0D AE A2, 05, 05]
+283F; [0D B8 2E, 05, 05]
 
-280E; [0D AE AA, 05, 05]
+2840; [0D B8 36, 05, 05]
 
-280F; [0D AE B2, 05, 05]
+2841; [0D B8 3E, 05, 05]
 
-2810; [0D AE BA, 05, 05]
+2842; [0D B8 46, 05, 05]
 
-2811; [0D AE C2, 05, 05]
+2843; [0D B8 4E, 05, 05]
 
-2812; [0D AE CA, 05, 05]
+2844; [0D B8 56, 05, 05]
 
-2813; [0D AE D2, 05, 05]
+2845; [0D B8 5E, 05, 05]
 
-2814; [0D AE DA, 05, 05]
+2846; [0D B8 66, 05, 05]
 
-2815; [0D AE E2, 05, 05]
+2847; [0D B8 6E, 05, 05]
 
-2816; [0D AE EA, 05, 05]
+2848; [0D B8 76, 05, 05]
 
-2817; [0D AE F2, 05, 05]
+2849; [0D B8 7E, 05, 05]
 
-2818; [0D AE FA, 05, 05]
+284A; [0D B8 86, 05, 05]
 
-2819; [0D AF 08, 05, 05]
+284B; [0D B8 8E, 05, 05]
 
-281A; [0D AF 10, 05, 05]
+284C; [0D B8 96, 05, 05]
 
-281B; [0D AF 18, 05, 05]
+284D; [0D B8 9E, 05, 05]
 
-281C; [0D AF 20, 05, 05]
+284E; [0D B8 A6, 05, 05]
 
-281D; [0D AF 28, 05, 05]
+284F; [0D B8 AE, 05, 05]
 
-281E; [0D AF 30, 05, 05]
+2850; [0D B8 B6, 05, 05]
 
-281F; [0D AF 38, 05, 05]
+2851; [0D B8 BE, 05, 05]
 
-2820; [0D AF 40, 05, 05]
+2852; [0D B8 C6, 05, 05]
 
-2821; [0D AF 48, 05, 05]
+2853; [0D B8 CE, 05, 05]
 
-2822; [0D AF 50, 05, 05]
+2854; [0D B8 D6, 05, 05]
 
-2823; [0D AF 58, 05, 05]
+2855; [0D B8 DE, 05, 05]
 
-2824; [0D AF 60, 05, 05]
+2856; [0D B8 E6, 05, 05]
 
-2825; [0D AF 68, 05, 05]
+2857; [0D B8 EE, 05, 05]
 
-2826; [0D AF 70, 05, 05]
+2858; [0D B8 F6, 05, 05]
 
-2827; [0D AF 78, 05, 05]
+2859; [0D B8 FE, 05, 05]
 
-2828; [0D AF 80, 05, 05]
+285A; [0D B9 08, 05, 05]
 
-2829; [0D AF 88, 05, 05]
+285B; [0D B9 10, 05, 05]
 
-282A; [0D AF 90, 05, 05]
+285C; [0D B9 18, 05, 05]
 
-282B; [0D AF 98, 05, 05]
+285D; [0D B9 20, 05, 05]
 
-282C; [0D AF A0, 05, 05]
+285E; [0D B9 28, 05, 05]
 
-282D; [0D AF A8, 05, 05]
+285F; [0D B9 30, 05, 05]
 
-282E; [0D AF B0, 05, 05]
+2860; [0D B9 38, 05, 05]
 
-282F; [0D AF B8, 05, 05]
+2861; [0D B9 40, 05, 05]
 
-2830; [0D AF C0, 05, 05]
+2862; [0D B9 48, 05, 05]
 
-2831; [0D AF C8, 05, 05]
+2863; [0D B9 50, 05, 05]
 
-2832; [0D AF D0, 05, 05]
+2864; [0D B9 58, 05, 05]
 
-2833; [0D AF D8, 05, 05]
+2865; [0D B9 60, 05, 05]
 
-2834; [0D AF E0, 05, 05]
+2866; [0D B9 68, 05, 05]
 
-2835; [0D AF E8, 05, 05]
+2867; [0D B9 70, 05, 05]
 
-2836; [0D AF F0, 05, 05]
+2868; [0D B9 78, 05, 05]
 
-2837; [0D AF F8, 05, 05]
+2869; [0D B9 80, 05, 05]
 
-2838; [0D B0 06, 05, 05]
+286A; [0D B9 88, 05, 05]
 
-2839; [0D B0 0E, 05, 05]
+286B; [0D B9 90, 05, 05]
 
-283A; [0D B0 16, 05, 05]
+286C; [0D B9 98, 05, 05]
 
-283B; [0D B0 1E, 05, 05]
+286D; [0D B9 A0, 05, 05]
 
-283C; [0D B0 26, 05, 05]
+286E; [0D B9 A8, 05, 05]
 
-283D; [0D B0 2E, 05, 05]
+286F; [0D B9 B0, 05, 05]
 
-283E; [0D B0 36, 05, 05]
+2870; [0D B9 B8, 05, 05]
 
-283F; [0D B0 3E, 05, 05]
+2871; [0D B9 C0, 05, 05]
 
-2840; [0D B0 46, 05, 05]
+2872; [0D B9 C8, 05, 05]
 
-2841; [0D B0 4E, 05, 05]
+2873; [0D B9 D0, 05, 05]
 
-2842; [0D B0 56, 05, 05]
+2874; [0D B9 D8, 05, 05]
 
-2843; [0D B0 5E, 05, 05]
+2875; [0D B9 E0, 05, 05]
 
-2844; [0D B0 66, 05, 05]
+2876; [0D B9 E8, 05, 05]
 
-2845; [0D B0 6E, 05, 05]
+2877; [0D B9 F0, 05, 05]
 
-2846; [0D B0 76, 05, 05]
+2878; [0D B9 F8, 05, 05]
 
-2847; [0D B0 7E, 05, 05]
+2879; [0D BA 02, 05, 05]
 
-2848; [0D B0 86, 05, 05]
+287A; [0D BA 0A, 05, 05]
 
-2849; [0D B0 8E, 05, 05]
+287B; [0D BA 12, 05, 05]
 
-284A; [0D B0 96, 05, 05]
+287C; [0D BA 1A, 05, 05]
 
-284B; [0D B0 9E, 05, 05]
+287D; [0D BA 22, 05, 05]
 
-284C; [0D B0 A6, 05, 05]
+287E; [0D BA 2A, 05, 05]
 
-284D; [0D B0 AE, 05, 05]
+287F; [0D BA 32, 05, 05]
 
-284E; [0D B0 B6, 05, 05]
+2880; [0D BA 3A, 05, 05]
 
-284F; [0D B0 BE, 05, 05]
+2881; [0D BA 42, 05, 05]
 
-2850; [0D B0 C6, 05, 05]
+2882; [0D BA 4A, 05, 05]
 
-2851; [0D B0 CE, 05, 05]
+2883; [0D BA 52, 05, 05]
 
-2852; [0D B0 D6, 05, 05]
+2884; [0D BA 5A, 05, 05]
 
-2853; [0D B0 DE, 05, 05]
+2885; [0D BA 62, 05, 05]
 
-2854; [0D B0 E6, 05, 05]
+2886; [0D BA 6A, 05, 05]
 
-2855; [0D B0 EE, 05, 05]
+2887; [0D BA 72, 05, 05]
 
-2856; [0D B0 F6, 05, 05]
+2888; [0D BA 7A, 05, 05]
 
-2857; [0D B1 04, 05, 05]
+2889; [0D BA 82, 05, 05]
 
-2858; [0D B1 0C, 05, 05]
+288A; [0D BA 8A, 05, 05]
 
-2859; [0D B1 14, 05, 05]
+288B; [0D BA 92, 05, 05]
 
-285A; [0D B1 1C, 05, 05]
+288C; [0D BA 9A, 05, 05]
 
-285B; [0D B1 24, 05, 05]
+288D; [0D BA A2, 05, 05]
 
-285C; [0D B1 2C, 05, 05]
+288E; [0D BA AA, 05, 05]
 
-285D; [0D B1 34, 05, 05]
+288F; [0D BA B2, 05, 05]
 
-285E; [0D B1 3C, 05, 05]
+2890; [0D BA BA, 05, 05]
 
-285F; [0D B1 44, 05, 05]
+2891; [0D BA C2, 05, 05]
 
-2860; [0D B1 4C, 05, 05]
+2892; [0D BA CA, 05, 05]
 
-2861; [0D B1 54, 05, 05]
+2893; [0D BA D2, 05, 05]
 
-2862; [0D B1 5C, 05, 05]
+2894; [0D BA DA, 05, 05]
 
-2863; [0D B1 64, 05, 05]
+2895; [0D BA E2, 05, 05]
 
-2864; [0D B1 6C, 05, 05]
+2896; [0D BA EA, 05, 05]
 
-2865; [0D B1 74, 05, 05]
+2897; [0D BA F2, 05, 05]
 
-2866; [0D B1 7C, 05, 05]
+2898; [0D BA FA, 05, 05]
 
-2867; [0D B1 84, 05, 05]
+2899; [0D BB 04, 05, 05]
 
-2868; [0D B1 8C, 05, 05]
+289A; [0D BB 0C, 05, 05]
 
-2869; [0D B1 94, 05, 05]
+289B; [0D BB 14, 05, 05]
 
-286A; [0D B1 9C, 05, 05]
+289C; [0D BB 1C, 05, 05]
 
-286B; [0D B1 A4, 05, 05]
+289D; [0D BB 24, 05, 05]
 
-286C; [0D B1 AC, 05, 05]
+289E; [0D BB 2C, 05, 05]
 
-286D; [0D B1 B4, 05, 05]
+289F; [0D BB 34, 05, 05]
 
-286E; [0D B1 BC, 05, 05]
+28A0; [0D BB 3C, 05, 05]
 
-286F; [0D B1 C4, 05, 05]
+28A1; [0D BB 44, 05, 05]
 
-2870; [0D B1 CC, 05, 05]
+28A2; [0D BB 4C, 05, 05]
 
-2871; [0D B1 D4, 05, 05]
+28A3; [0D BB 54, 05, 05]
 
-2872; [0D B1 DC, 05, 05]
+28A4; [0D BB 5C, 05, 05]
 
-2873; [0D B1 E4, 05, 05]
+28A5; [0D BB 64, 05, 05]
 
-2874; [0D B1 EC, 05, 05]
+28A6; [0D BB 6C, 05, 05]
 
-2875; [0D B1 F4, 05, 05]
+28A7; [0D BB 74, 05, 05]
 
-2876; [0D B1 FC, 05, 05]
+28A8; [0D BB 7C, 05, 05]
 
-2877; [0D B2 0A, 05, 05]
+28A9; [0D BB 84, 05, 05]
 
-2878; [0D B2 12, 05, 05]
+28AA; [0D BB 8C, 05, 05]
 
-2879; [0D B2 1A, 05, 05]
+28AB; [0D BB 94, 05, 05]
 
-287A; [0D B2 22, 05, 05]
+28AC; [0D BB 9C, 05, 05]
 
-287B; [0D B2 2A, 05, 05]
+28AD; [0D BB A4, 05, 05]
 
-287C; [0D B2 32, 05, 05]
+28AE; [0D BB AC, 05, 05]
 
-287D; [0D B2 3A, 05, 05]
+28AF; [0D BB B4, 05, 05]
 
-287E; [0D B2 42, 05, 05]
+28B0; [0D BB BC, 05, 05]
 
-287F; [0D B2 4A, 05, 05]
+28B1; [0D BB C4, 05, 05]
 
-2880; [0D B2 52, 05, 05]
+28B2; [0D BB CC, 05, 05]
 
-2881; [0D B2 5A, 05, 05]
+28B3; [0D BB D4, 05, 05]
 
-2882; [0D B2 62, 05, 05]
+28B4; [0D BB DC, 05, 05]
 
-2883; [0D B2 6A, 05, 05]
+28B5; [0D BB E4, 05, 05]
 
-2884; [0D B2 72, 05, 05]
+28B6; [0D BB EC, 05, 05]
 
-2885; [0D B2 7A, 05, 05]
+28B7; [0D BB F4, 05, 05]
 
-2886; [0D B2 82, 05, 05]
+28B8; [0D BB FC, 05, 05]
 
-2887; [0D B2 8A, 05, 05]
+28B9; [0D BC 06, 05, 05]
 
-2888; [0D B2 92, 05, 05]
+28BA; [0D BC 0E, 05, 05]
 
-2889; [0D B2 9A, 05, 05]
+28BB; [0D BC 16, 05, 05]
 
-288A; [0D B2 A2, 05, 05]
+28BC; [0D BC 1E, 05, 05]
 
-288B; [0D B2 AA, 05, 05]
+28BD; [0D BC 26, 05, 05]
 
-288C; [0D B2 B2, 05, 05]
+28BE; [0D BC 2E, 05, 05]
 
-288D; [0D B2 BA, 05, 05]
+28BF; [0D BC 36, 05, 05]
 
-288E; [0D B2 C2, 05, 05]
+28C0; [0D BC 3E, 05, 05]
 
-288F; [0D B2 CA, 05, 05]
+28C1; [0D BC 46, 05, 05]
 
-2890; [0D B2 D2, 05, 05]
+28C2; [0D BC 4E, 05, 05]
 
-2891; [0D B2 DA, 05, 05]
+28C3; [0D BC 56, 05, 05]
 
-2892; [0D B2 E2, 05, 05]
+28C4; [0D BC 5E, 05, 05]
 
-2893; [0D B2 EA, 05, 05]
+28C5; [0D BC 66, 05, 05]
 
-2894; [0D B2 F2, 05, 05]
+28C6; [0D BC 6E, 05, 05]
 
-2895; [0D B2 FA, 05, 05]
+28C7; [0D BC 76, 05, 05]
 
-2896; [0D B3 08, 05, 05]
+28C8; [0D BC 7E, 05, 05]
 
-2897; [0D B3 10, 05, 05]
+28C9; [0D BC 86, 05, 05]
 
-2898; [0D B3 18, 05, 05]
+28CA; [0D BC 8E, 05, 05]
 
-2899; [0D B3 20, 05, 05]
+28CB; [0D BC 96, 05, 05]
 
-289A; [0D B3 28, 05, 05]
+28CC; [0D BC 9E, 05, 05]
 
-289B; [0D B3 30, 05, 05]
+28CD; [0D BC A6, 05, 05]
 
-289C; [0D B3 38, 05, 05]
+28CE; [0D BC AE, 05, 05]
 
-289D; [0D B3 40, 05, 05]
+28CF; [0D BC B6, 05, 05]
 
-289E; [0D B3 48, 05, 05]
+28D0; [0D BC BE, 05, 05]
 
-289F; [0D B3 50, 05, 05]
+28D1; [0D BC C6, 05, 05]
 
-28A0; [0D B3 58, 05, 05]
+28D2; [0D BC CE, 05, 05]
 
-28A1; [0D B3 60, 05, 05]
+28D3; [0D BC D6, 05, 05]
 
-28A2; [0D B3 68, 05, 05]
+28D4; [0D BC DE, 05, 05]
 
-28A3; [0D B3 70, 05, 05]
+28D5; [0D BC E6, 05, 05]
 
-28A4; [0D B3 78, 05, 05]
+28D6; [0D BC EE, 05, 05]
 
-28A5; [0D B3 80, 05, 05]
+28D7; [0D BC F6, 05, 05]
 
-28A6; [0D B3 88, 05, 05]
+28D8; [0D BC FE, 05, 05]
 
-28A7; [0D B3 90, 05, 05]
+28D9; [0D BD 08, 05, 05]
 
-28A8; [0D B3 98, 05, 05]
+28DA; [0D BD 10, 05, 05]
 
-28A9; [0D B3 A0, 05, 05]
+28DB; [0D BD 18, 05, 05]
 
-28AA; [0D B3 A8, 05, 05]
+28DC; [0D BD 20, 05, 05]
 
-28AB; [0D B3 B0, 05, 05]
+28DD; [0D BD 28, 05, 05]
 
-28AC; [0D B3 B8, 05, 05]
+28DE; [0D BD 30, 05, 05]
 
-28AD; [0D B3 C0, 05, 05]
+28DF; [0D BD 38, 05, 05]
 
-28AE; [0D B3 C8, 05, 05]
+28E0; [0D BD 40, 05, 05]
 
-28AF; [0D B3 D0, 05, 05]
+28E1; [0D BD 48, 05, 05]
 
-28B0; [0D B3 D8, 05, 05]
+28E2; [0D BD 50, 05, 05]
 
-28B1; [0D B3 E0, 05, 05]
+28E3; [0D BD 58, 05, 05]
 
-28B2; [0D B3 E8, 05, 05]
+28E4; [0D BD 60, 05, 05]
 
-28B3; [0D B3 F0, 05, 05]
+28E5; [0D BD 68, 05, 05]
 
-28B4; [0D B3 F8, 05, 05]
+28E6; [0D BD 70, 05, 05]
 
-28B5; [0D B4 06, 05, 05]
+28E7; [0D BD 78, 05, 05]
 
-28B6; [0D B4 0E, 05, 05]
+28E8; [0D BD 80, 05, 05]
 
-28B7; [0D B4 16, 05, 05]
+28E9; [0D BD 88, 05, 05]
 
-28B8; [0D B4 1E, 05, 05]
+28EA; [0D BD 90, 05, 05]
 
-28B9; [0D B4 26, 05, 05]
+28EB; [0D BD 98, 05, 05]
 
-28BA; [0D B4 2E, 05, 05]
+28EC; [0D BD A0, 05, 05]
 
-28BB; [0D B4 36, 05, 05]
+28ED; [0D BD A8, 05, 05]
 
-28BC; [0D B4 3E, 05, 05]
+28EE; [0D BD B0, 05, 05]
 
-28BD; [0D B4 46, 05, 05]
+28EF; [0D BD B8, 05, 05]
 
-28BE; [0D B4 4E, 05, 05]
+28F0; [0D BD C0, 05, 05]
 
-28BF; [0D B4 56, 05, 05]
+28F1; [0D BD C8, 05, 05]
 
-28C0; [0D B4 5E, 05, 05]
+28F2; [0D BD D0, 05, 05]
 
-28C1; [0D B4 66, 05, 05]
+28F3; [0D BD D8, 05, 05]
 
-28C2; [0D B4 6E, 05, 05]
+28F4; [0D BD E0, 05, 05]
 
-28C3; [0D B4 76, 05, 05]
+28F5; [0D BD E8, 05, 05]
 
-28C4; [0D B4 7E, 05, 05]
+28F6; [0D BD F0, 05, 05]
 
-28C5; [0D B4 86, 05, 05]
+28F7; [0D BD F8, 05, 05]
 
-28C6; [0D B4 8E, 05, 05]
+28F8; [0D BE 02, 05, 05]
 
-28C7; [0D B4 96, 05, 05]
+28F9; [0D BE 0A, 05, 05]
 
-28C8; [0D B4 9E, 05, 05]
+28FA; [0D BE 12, 05, 05]
 
-28C9; [0D B4 A6, 05, 05]
+28FB; [0D BE 1A, 05, 05]
 
-28CA; [0D B4 AE, 05, 05]
+28FC; [0D BE 22, 05, 05]
 
-28CB; [0D B4 B6, 05, 05]
+28FD; [0D BE 2A, 05, 05]
 
-28CC; [0D B4 BE, 05, 05]
+28FE; [0D BE 32, 05, 05]
 
-28CD; [0D B4 C6, 05, 05]
+28FF; [0D BE 3A, 05, 05]
 
-28CE; [0D B4 CE, 05, 05]
+268A; [0D BE 42, 05, 05]
 
-28CF; [0D B4 D6, 05, 05]
+268B; [0D BE 4A, 05, 05]
 
-28D0; [0D B4 DE, 05, 05]
+268C; [0D BE 52, 05, 05]
 
-28D1; [0D B4 E6, 05, 05]
+268D; [0D BE 5A, 05, 05]
 
-28D2; [0D B4 EE, 05, 05]
+268E; [0D BE 62, 05, 05]
 
-28D3; [0D B4 F6, 05, 05]
+268F; [0D BE 6A, 05, 05]
 
-28D4; [0D B5 04, 05, 05]
+2630; [0D BE 72, 05, 05]
 
-28D5; [0D B5 0C, 05, 05]
+2631; [0D BE 7A, 05, 05]
 
-28D6; [0D B5 14, 05, 05]
+2632; [0D BE 82, 05, 05]
 
-28D7; [0D B5 1C, 05, 05]
+2633; [0D BE 8A, 05, 05]
 
-28D8; [0D B5 24, 05, 05]
+2634; [0D BE 92, 05, 05]
 
-28D9; [0D B5 2C, 05, 05]
+2635; [0D BE 9A, 05, 05]
 
-28DA; [0D B5 34, 05, 05]
+2636; [0D BE A2, 05, 05]
 
-28DB; [0D B5 3C, 05, 05]
+2637; [0D BE AA, 05, 05]
 
-28DC; [0D B5 44, 05, 05]
+4DC0; [0D BE B2, 05, 05]
 
-28DD; [0D B5 4C, 05, 05]
+4DC1; [0D BE BA, 05, 05]
 
-28DE; [0D B5 54, 05, 05]
+4DC2; [0D BE C2, 05, 05]
 
-28DF; [0D B5 5C, 05, 05]
+4DC3; [0D BE CA, 05, 05]
 
-28E0; [0D B5 64, 05, 05]
+4DC4; [0D BE D2, 05, 05]
 
-28E1; [0D B5 6C, 05, 05]
+4DC5; [0D BE DA, 05, 05]
 
-28E2; [0D B5 74, 05, 05]
+4DC6; [0D BE E2, 05, 05]
 
-28E3; [0D B5 7C, 05, 05]
+4DC7; [0D BE EA, 05, 05]
 
-28E4; [0D B5 84, 05, 05]
+4DC8; [0D BE F2, 05, 05]
 
-28E5; [0D B5 8C, 05, 05]
+4DC9; [0D BE FA, 05, 05]
 
-28E6; [0D B5 94, 05, 05]
+4DCA; [0D BF 04, 05, 05]
 
-28E7; [0D B5 9C, 05, 05]
+4DCB; [0D BF 0C, 05, 05]
 
-28E8; [0D B5 A4, 05, 05]
+4DCC; [0D BF 14, 05, 05]
 
-28E9; [0D B5 AC, 05, 05]
+4DCD; [0D BF 1C, 05, 05]
 
-28EA; [0D B5 B4, 05, 05]
+4DCE; [0D BF 24, 05, 05]
 
-28EB; [0D B5 BC, 05, 05]
+4DCF; [0D BF 2C, 05, 05]
 
-28EC; [0D B5 C4, 05, 05]
+4DD0; [0D BF 34, 05, 05]
 
-28ED; [0D B5 CC, 05, 05]
+4DD1; [0D BF 3C, 05, 05]
 
-28EE; [0D B5 D4, 05, 05]
+4DD2; [0D BF 44, 05, 05]
 
-28EF; [0D B5 DC, 05, 05]
+4DD3; [0D BF 4C, 05, 05]
 
-28F0; [0D B5 E4, 05, 05]
+4DD4; [0D BF 54, 05, 05]
 
-28F1; [0D B5 EC, 05, 05]
+4DD5; [0D BF 5C, 05, 05]
 
-28F2; [0D B5 F4, 05, 05]
+4DD6; [0D BF 64, 05, 05]
 
-28F3; [0D B5 FC, 05, 05]
+4DD7; [0D BF 6C, 05, 05]
 
-28F4; [0D B6 0A, 05, 05]
+4DD8; [0D BF 74, 05, 05]
 
-28F5; [0D B6 12, 05, 05]
+4DD9; [0D BF 7C, 05, 05]
 
-28F6; [0D B6 1A, 05, 05]
+4DDA; [0D BF 84, 05, 05]
 
-28F7; [0D B6 22, 05, 05]
+4DDB; [0D BF 8C, 05, 05]
 
-28F8; [0D B6 2A, 05, 05]
+4DDC; [0D BF 94, 05, 05]
 
-28F9; [0D B6 32, 05, 05]
+4DDD; [0D BF 9C, 05, 05]
 
-28FA; [0D B6 3A, 05, 05]
+4DDE; [0D BF A4, 05, 05]
 
-28FB; [0D B6 42, 05, 05]
+4DDF; [0D BF AC, 05, 05]
 
-28FC; [0D B6 4A, 05, 05]
+4DE0; [0D BF B4, 05, 05]
 
-28FD; [0D B6 52, 05, 05]
+4DE1; [0D BF BC, 05, 05]
 
-28FE; [0D B6 5A, 05, 05]
+4DE2; [0D BF C4, 05, 05]
 
-28FF; [0D B6 62, 05, 05]
+4DE3; [0D BF CC, 05, 05]
 
-268A; [0D B6 6A, 05, 05]
+4DE4; [0D BF D4, 05, 05]
 
-268B; [0D B6 72, 05, 05]
+4DE5; [0D BF DC, 05, 05]
 
-268C; [0D B6 7A, 05, 05]
+4DE6; [0D BF E4, 05, 05]
 
-268D; [0D B6 82, 05, 05]
+4DE7; [0D BF EC, 05, 05]
 
-268E; [0D B6 8A, 05, 05]
+4DE8; [0D BF F4, 05, 05]
 
-268F; [0D B6 92, 05, 05]
+4DE9; [0D BF FC, 05, 05]
 
-2630; [0D B6 9A, 05, 05]
+4DEA; [0D C0 06, 05, 05]
 
-2631; [0D B6 A2, 05, 05]
+4DEB; [0D C0 0E, 05, 05]
 
-2632; [0D B6 AA, 05, 05]
+4DEC; [0D C0 16, 05, 05]
 
-2633; [0D B6 B2, 05, 05]
+4DED; [0D C0 1E, 05, 05]
 
-2634; [0D B6 BA, 05, 05]
+4DEE; [0D C0 26, 05, 05]
 
-2635; [0D B6 C2, 05, 05]
+4DEF; [0D C0 2E, 05, 05]
 
-2636; [0D B6 CA, 05, 05]
+4DF0; [0D C0 36, 05, 05]
 
-2637; [0D B6 D2, 05, 05]
+4DF1; [0D C0 3E, 05, 05]
 
-4DC0; [0D B6 DA, 05, 05]
+4DF2; [0D C0 46, 05, 05]
 
-4DC1; [0D B6 E2, 05, 05]
+4DF3; [0D C0 4E, 05, 05]
 
-4DC2; [0D B6 EA, 05, 05]
+4DF4; [0D C0 56, 05, 05]
 
-4DC3; [0D B6 F2, 05, 05]
+4DF5; [0D C0 5E, 05, 05]
 
-4DC4; [0D B6 FA, 05, 05]
+4DF6; [0D C0 66, 05, 05]
 
-4DC5; [0D B7 08, 05, 05]
+4DF7; [0D C0 6E, 05, 05]
 
-4DC6; [0D B7 10, 05, 05]
+4DF8; [0D C0 76, 05, 05]
 
-4DC7; [0D B7 18, 05, 05]
+4DF9; [0D C0 7E, 05, 05]
 
-4DC8; [0D B7 20, 05, 05]
+4DFA; [0D C0 86, 05, 05]
 
-4DC9; [0D B7 28, 05, 05]
+4DFB; [0D C0 8E, 05, 05]
 
-4DCA; [0D B7 30, 05, 05]
+4DFC; [0D C0 96, 05, 05]
 
-4DCB; [0D B7 38, 05, 05]
+4DFD; [0D C0 9E, 05, 05]
 
-4DCC; [0D B7 40, 05, 05]
+4DFE; [0D C0 A6, 05, 05]
 
-4DCD; [0D B7 48, 05, 05]
+4DFF; [0D C0 AE, 05, 05]
 
-4DCE; [0D B7 50, 05, 05]
+1D300; [0D C0 B6, 05, 05]
 
-4DCF; [0D B7 58, 05, 05]
+1D301; [0D C0 BE, 05, 05]
 
-4DD0; [0D B7 60, 05, 05]
+1D302; [0D C0 C6, 05, 05]
 
-4DD1; [0D B7 68, 05, 05]
+1D303; [0D C0 CE, 05, 05]
 
-4DD2; [0D B7 70, 05, 05]
+1D304; [0D C0 D6, 05, 05]
 
-4DD3; [0D B7 78, 05, 05]
+1D305; [0D C0 DE, 05, 05]
 
-4DD4; [0D B7 80, 05, 05]
+1D306; [0D C0 E6, 05, 05]
 
-4DD5; [0D B7 88, 05, 05]
+1D307; [0D C0 EE, 05, 05]
 
-4DD6; [0D B7 90, 05, 05]
+1D308; [0D C0 F6, 05, 05]
 
-4DD7; [0D B7 98, 05, 05]
+1D309; [0D C0 FE, 05, 05]
 
-4DD8; [0D B7 A0, 05, 05]
+1D30A; [0D C1 08, 05, 05]
 
-4DD9; [0D B7 A8, 05, 05]
+1D30B; [0D C1 10, 05, 05]
 
-4DDA; [0D B7 B0, 05, 05]
+1D30C; [0D C1 18, 05, 05]
 
-4DDB; [0D B7 B8, 05, 05]
+1D30D; [0D C1 20, 05, 05]
 
-4DDC; [0D B7 C0, 05, 05]
+1D30E; [0D C1 28, 05, 05]
 
-4DDD; [0D B7 C8, 05, 05]
+1D30F; [0D C1 30, 05, 05]
 
-4DDE; [0D B7 D0, 05, 05]
+1D310; [0D C1 38, 05, 05]
 
-4DDF; [0D B7 D8, 05, 05]
+1D311; [0D C1 40, 05, 05]
 
-4DE0; [0D B7 E0, 05, 05]
+1D312; [0D C1 48, 05, 05]
 
-4DE1; [0D B7 E8, 05, 05]
+1D313; [0D C1 50, 05, 05]
 
-4DE2; [0D B7 F0, 05, 05]
+1D314; [0D C1 58, 05, 05]
 
-4DE3; [0D B7 F8, 05, 05]
+1D315; [0D C1 60, 05, 05]
 
-4DE4; [0D B8 06, 05, 05]
+1D316; [0D C1 68, 05, 05]
 
-4DE5; [0D B8 0E, 05, 05]
+1D317; [0D C1 70, 05, 05]
 
-4DE6; [0D B8 16, 05, 05]
+1D318; [0D C1 78, 05, 05]
 
-4DE7; [0D B8 1E, 05, 05]
+1D319; [0D C1 80, 05, 05]
 
-4DE8; [0D B8 26, 05, 05]
+1D31A; [0D C1 88, 05, 05]
 
-4DE9; [0D B8 2E, 05, 05]
+1D31B; [0D C1 90, 05, 05]
 
-4DEA; [0D B8 36, 05, 05]
+1D31C; [0D C1 98, 05, 05]
 
-4DEB; [0D B8 3E, 05, 05]
+1D31D; [0D C1 A0, 05, 05]
 
-4DEC; [0D B8 46, 05, 05]
+1D31E; [0D C1 A8, 05, 05]
 
-4DED; [0D B8 4E, 05, 05]
+1D31F; [0D C1 B0, 05, 05]
 
-4DEE; [0D B8 56, 05, 05]
+1D320; [0D C1 B8, 05, 05]
 
-4DEF; [0D B8 5E, 05, 05]
+1D321; [0D C1 C0, 05, 05]
 
-4DF0; [0D B8 66, 05, 05]
+1D322; [0D C1 C8, 05, 05]
 
-4DF1; [0D B8 6E, 05, 05]
+1D323; [0D C1 D0, 05, 05]
 
-4DF2; [0D B8 76, 05, 05]
+1D324; [0D C1 D8, 05, 05]
 
-4DF3; [0D B8 7E, 05, 05]
+1D325; [0D C1 E0, 05, 05]
 
-4DF4; [0D B8 86, 05, 05]
+1D326; [0D C1 E8, 05, 05]
 
-4DF5; [0D B8 8E, 05, 05]
+1D327; [0D C1 F0, 05, 05]
 
-4DF6; [0D B8 96, 05, 05]
+1D328; [0D C1 F8, 05, 05]
 
-4DF7; [0D B8 9E, 05, 05]
+1D329; [0D C2 02, 05, 05]
 
-4DF8; [0D B8 A6, 05, 05]
+1D32A; [0D C2 0A, 05, 05]
 
-4DF9; [0D B8 AE, 05, 05]
+1D32B; [0D C2 12, 05, 05]
 
-4DFA; [0D B8 B6, 05, 05]
+1D32C; [0D C2 1A, 05, 05]
 
-4DFB; [0D B8 BE, 05, 05]
+1D32D; [0D C2 22, 05, 05]
 
-4DFC; [0D B8 C6, 05, 05]
+1D32E; [0D C2 2A, 05, 05]
 
-4DFD; [0D B8 CE, 05, 05]
+1D32F; [0D C2 32, 05, 05]
 
-4DFE; [0D B8 D6, 05, 05]
+1D330; [0D C2 3A, 05, 05]
 
-4DFF; [0D B8 DE, 05, 05]
+1D331; [0D C2 42, 05, 05]
 
-1D300; [0D B8 E6, 05, 05]
+1D332; [0D C2 4A, 05, 05]
 
-1D301; [0D B8 EE, 05, 05]
+1D333; [0D C2 52, 05, 05]
 
-1D302; [0D B8 F6, 05, 05]
+1D334; [0D C2 5A, 05, 05]
 
-1D303; [0D B9 04, 05, 05]
+1D335; [0D C2 62, 05, 05]
 
-1D304; [0D B9 0C, 05, 05]
+1D336; [0D C2 6A, 05, 05]
 
-1D305; [0D B9 14, 05, 05]
+1D337; [0D C2 72, 05, 05]
 
-1D306; [0D B9 1C, 05, 05]
+1D338; [0D C2 7A, 05, 05]
 
-1D307; [0D B9 24, 05, 05]
+1D339; [0D C2 82, 05, 05]
 
-1D308; [0D B9 2C, 05, 05]
+1D33A; [0D C2 8A, 05, 05]
 
-1D309; [0D B9 34, 05, 05]
+1D33B; [0D C2 92, 05, 05]
 
-1D30A; [0D B9 3C, 05, 05]
+1D33C; [0D C2 9A, 05, 05]
 
-1D30B; [0D B9 44, 05, 05]
+1D33D; [0D C2 A2, 05, 05]
 
-1D30C; [0D B9 4C, 05, 05]
+1D33E; [0D C2 AA, 05, 05]
 
-1D30D; [0D B9 54, 05, 05]
+1D33F; [0D C2 B2, 05, 05]
 
-1D30E; [0D B9 5C, 05, 05]
+1D340; [0D C2 BA, 05, 05]
 
-1D30F; [0D B9 64, 05, 05]
+1D341; [0D C2 C2, 05, 05]
 
-1D310; [0D B9 6C, 05, 05]
+1D342; [0D C2 CA, 05, 05]
 
-1D311; [0D B9 74, 05, 05]
+1D343; [0D C2 D2, 05, 05]
 
-1D312; [0D B9 7C, 05, 05]
+1D344; [0D C2 DA, 05, 05]
 
-1D313; [0D B9 84, 05, 05]
+1D345; [0D C2 E2, 05, 05]
 
-1D314; [0D B9 8C, 05, 05]
+1D346; [0D C2 EA, 05, 05]
 
-1D315; [0D B9 94, 05, 05]
+1D347; [0D C2 F2, 05, 05]
 
-1D316; [0D B9 9C, 05, 05]
+1D348; [0D C2 FA, 05, 05]
 
-1D317; [0D B9 A4, 05, 05]
+1D349; [0D C3 04, 05, 05]
 
-1D318; [0D B9 AC, 05, 05]
+1D34A; [0D C3 0C, 05, 05]
 
-1D319; [0D B9 B4, 05, 05]
+1D34B; [0D C3 14, 05, 05]
 
-1D31A; [0D B9 BC, 05, 05]
+1D34C; [0D C3 1C, 05, 05]
 
-1D31B; [0D B9 C4, 05, 05]
+1D34D; [0D C3 24, 05, 05]
 
-1D31C; [0D B9 CC, 05, 05]
+1D34E; [0D C3 2C, 05, 05]
 
-1D31D; [0D B9 D4, 05, 05]
+1D34F; [0D C3 34, 05, 05]
 
-1D31E; [0D B9 DC, 05, 05]
+1D350; [0D C3 3C, 05, 05]
 
-1D31F; [0D B9 E4, 05, 05]
+1D351; [0D C3 44, 05, 05]
 
-1D320; [0D B9 EC, 05, 05]
+1D352; [0D C3 4C, 05, 05]
 
-1D321; [0D B9 F4, 05, 05]
+1D353; [0D C3 54, 05, 05]
 
-1D322; [0D B9 FC, 05, 05]
+1D354; [0D C3 5C, 05, 05]
 
-1D323; [0D BA 0A, 05, 05]
+1D355; [0D C3 64, 05, 05]
 
-1D324; [0D BA 12, 05, 05]
+1D356; [0D C3 6C, 05, 05]
 
-1D325; [0D BA 1A, 05, 05]
+A490; [0D C3 74, 05, 05]
 
-1D326; [0D BA 22, 05, 05]
+A491; [0D C3 7C, 05, 05]
 
-1D327; [0D BA 2A, 05, 05]
+A492; [0D C3 84, 05, 05]
 
-1D328; [0D BA 32, 05, 05]
+A493; [0D C3 8C, 05, 05]
 
-1D329; [0D BA 3A, 05, 05]
+A494; [0D C3 94, 05, 05]
 
-1D32A; [0D BA 42, 05, 05]
+A495; [0D C3 9C, 05, 05]
 
-1D32B; [0D BA 4A, 05, 05]
+A496; [0D C3 A4, 05, 05]
 
-1D32C; [0D BA 52, 05, 05]
+A497; [0D C3 AC, 05, 05]
 
-1D32D; [0D BA 5A, 05, 05]
+A498; [0D C3 B4, 05, 05]
 
-1D32E; [0D BA 62, 05, 05]
+A499; [0D C3 BC, 05, 05]
 
-1D32F; [0D BA 6A, 05, 05]
+A49A; [0D C3 C4, 05, 05]
 
-1D330; [0D BA 72, 05, 05]
+A49B; [0D C3 CC, 05, 05]
 
-1D331; [0D BA 7A, 05, 05]
+A49C; [0D C3 D4, 05, 05]
 
-1D332; [0D BA 82, 05, 05]
+A49D; [0D C3 DC, 05, 05]
 
-1D333; [0D BA 8A, 05, 05]
+A49E; [0D C3 E4, 05, 05]
 
-1D334; [0D BA 92, 05, 05]
+A49F; [0D C3 EC, 05, 05]
 
-1D335; [0D BA 9A, 05, 05]
+A4A0; [0D C3 F4, 05, 05]
 
-1D336; [0D BA A2, 05, 05]
+A4A1; [0D C3 FC, 05, 05]
 
-1D337; [0D BA AA, 05, 05]
+A4A2; [0D C4 06, 05, 05]
 
-1D338; [0D BA B2, 05, 05]
+A4A3; [0D C4 0E, 05, 05]
 
-1D339; [0D BA BA, 05, 05]
+A4A4; [0D C4 16, 05, 05]
 
-1D33A; [0D BA C2, 05, 05]
+A4A5; [0D C4 1E, 05, 05]
 
-1D33B; [0D BA CA, 05, 05]
+A4A6; [0D C4 26, 05, 05]
 
-1D33C; [0D BA D2, 05, 05]
+A4A7; [0D C4 2E, 05, 05]
 
-1D33D; [0D BA DA, 05, 05]
+A4A8; [0D C4 36, 05, 05]
 
-1D33E; [0D BA E2, 05, 05]
+A4A9; [0D C4 3E, 05, 05]
 
-1D33F; [0D BA EA, 05, 05]
+A4AA; [0D C4 46, 05, 05]
 
-1D340; [0D BA F2, 05, 05]
+A4AB; [0D C4 4E, 05, 05]
 
-1D341; [0D BA FA, 05, 05]
+A4AC; [0D C4 56, 05, 05]
 
-1D342; [0D BB 08, 05, 05]
+A4AD; [0D C4 5E, 05, 05]
 
-1D343; [0D BB 10, 05, 05]
+A4AE; [0D C4 66, 05, 05]
 
-1D344; [0D BB 18, 05, 05]
+A4AF; [0D C4 6E, 05, 05]
 
-1D345; [0D BB 20, 05, 05]
+A4B0; [0D C4 76, 05, 05]
 
-1D346; [0D BB 28, 05, 05]
+A4B1; [0D C4 7E, 05, 05]
 
-1D347; [0D BB 30, 05, 05]
+A4B2; [0D C4 86, 05, 05]
 
-1D348; [0D BB 38, 05, 05]
+A4B3; [0D C4 8E, 05, 05]
 
-1D349; [0D BB 40, 05, 05]
+A4B4; [0D C4 96, 05, 05]
 
-1D34A; [0D BB 48, 05, 05]
+A4B5; [0D C4 9E, 05, 05]
 
-1D34B; [0D BB 50, 05, 05]
+A4B6; [0D C4 A6, 05, 05]
 
-1D34C; [0D BB 58, 05, 05]
+A4B7; [0D C4 AE, 05, 05]
 
-1D34D; [0D BB 60, 05, 05]
+A4B8; [0D C4 B6, 05, 05]
 
-1D34E; [0D BB 68, 05, 05]
+A4B9; [0D C4 BE, 05, 05]
 
-1D34F; [0D BB 70, 05, 05]
+A4BA; [0D C4 C6, 05, 05]
 
-1D350; [0D BB 78, 05, 05]
+A4BB; [0D C4 CE, 05, 05]
 
-1D351; [0D BB 80, 05, 05]
+A4BC; [0D C4 D6, 05, 05]
 
-1D352; [0D BB 88, 05, 05]
+A4BD; [0D C4 DE, 05, 05]
 
-1D353; [0D BB 90, 05, 05]
+A4BE; [0D C4 E6, 05, 05]
 
-1D354; [0D BB 98, 05, 05]
+A4BF; [0D C4 EE, 05, 05]
 
-1D355; [0D BB A0, 05, 05]
+A4C0; [0D C4 F6, 05, 05]
 
-1D356; [0D BB A8, 05, 05]
+A4C1; [0D C4 FE, 05, 05]
 
-A490; [0D BB B0, 05, 05]
+A4C2; [0D C5 08, 05, 05]
 
-A491; [0D BB B8, 05, 05]
+A4C3; [0D C5 10, 05, 05]
 
-A492; [0D BB C0, 05, 05]
+A4C4; [0D C5 18, 05, 05]
 
-A493; [0D BB C8, 05, 05]
+A4C5; [0D C5 20, 05, 05]
 
-A494; [0D BB D0, 05, 05]
+A4C6; [0D C5 28, 05, 05]
 
-A495; [0D BB D8, 05, 05]
+10137; [0D C5 30, 05, 05]
 
-A496; [0D BB E0, 05, 05]
+10138; [0D C5 38, 05, 05]
 
-A497; [0D BB E8, 05, 05]
+10139; [0D C5 40, 05, 05]
 
-A498; [0D BB F0, 05, 05]
+1013A; [0D C5 48, 05, 05]
 
-A499; [0D BB F8, 05, 05]
+1013B; [0D C5 50, 05, 05]
 
-A49A; [0D BC 06, 05, 05]
+1013C; [0D C5 58, 05, 05]
 
-A49B; [0D BC 0E, 05, 05]
+1013D; [0D C5 60, 05, 05]
 
-A49C; [0D BC 16, 05, 05]
+1013E; [0D C5 68, 05, 05]
 
-A49D; [0D BC 1E, 05, 05]
+1013F; [0D C5 70, 05, 05]
 
-A49E; [0D BC 26, 05, 05]
+10179; [0D C5 78, 05, 05]
 
-A49F; [0D BC 2E, 05, 05]
+1017A; [0D C5 80, 05, 05]
 
-A4A0; [0D BC 36, 05, 05]
+1017B; [0D C5 88, 05, 05]
 
-A4A1; [0D BC 3E, 05, 05]
+1017C; [0D C5 90, 05, 05]
 
-A4A2; [0D BC 46, 05, 05]
+1017D; [0D C5 98, 05, 05]
 
-A4A3; [0D BC 4E, 05, 05]
+1017E; [0D C5 A0, 05, 05]
 
-A4A4; [0D BC 56, 05, 05]
+1017F; [0D C5 A8, 05, 05]
 
-A4A5; [0D BC 5E, 05, 05]
+10180; [0D C5 B0, 05, 05]
 
-A4A6; [0D BC 66, 05, 05]
+10181; [0D C5 B8, 05, 05]
 
-A4A7; [0D BC 6E, 05, 05]
+10182; [0D C5 C0, 05, 05]
 
-A4A8; [0D BC 76, 05, 05]
+10183; [0D C5 C8, 05, 05]
 
-A4A9; [0D BC 7E, 05, 05]
+10184; [0D C5 D0, 05, 05]
 
-A4AA; [0D BC 86, 05, 05]
+10185; [0D C5 D8, 05, 05]
 
-A4AB; [0D BC 8E, 05, 05]
+10186; [0D C5 E0, 05, 05]
 
-A4AC; [0D BC 96, 05, 05]
+10187; [0D C5 E8, 05, 05]
 
-A4AD; [0D BC 9E, 05, 05]
+10188; [0D C5 F0, 05, 05]
 
-A4AE; [0D BC A6, 05, 05]
+10189; [0D C5 F8, 05, 05]
 
-A4AF; [0D BC AE, 05, 05]
+10190; [0D C6 02, 05, 05]
 
-A4B0; [0D BC B6, 05, 05]
+10191; [0D C6 0A, 05, 05]
 
-A4B1; [0D BC BE, 05, 05]
+10192; [0D C6 12, 05, 05]
 
-A4B2; [0D BC C6, 05, 05]
+10193; [0D C6 1A, 05, 05]
 
-A4B3; [0D BC CE, 05, 05]
+10194; [0D C6 22, 05, 05]
 
-A4B4; [0D BC D6, 05, 05]
+10195; [0D C6 2A, 05, 05]
 
-A4B5; [0D BC DE, 05, 05]
+10196; [0D C6 32, 05, 05]
 
-A4B6; [0D BC E6, 05, 05]
+10197; [0D C6 3A, 05, 05]
 
-A4B7; [0D BC EE, 05, 05]
+10198; [0D C6 42, 05, 05]
 
-A4B8; [0D BC F6, 05, 05]
+10199; [0D C6 4A, 05, 05]
 
-A4B9; [0D BD 04, 05, 05]
+1019A; [0D C6 52, 05, 05]
 
-A4BA; [0D BD 0C, 05, 05]
+1019B; [0D C6 5A, 05, 05]
 
-A4BB; [0D BD 14, 05, 05]
+101D0; [0D C6 62, 05, 05]
 
-A4BC; [0D BD 1C, 05, 05]
+101D1; [0D C6 6A, 05, 05]
 
-A4BD; [0D BD 24, 05, 05]
+101D2; [0D C6 72, 05, 05]
 
-A4BE; [0D BD 2C, 05, 05]
+101D3; [0D C6 7A, 05, 05]
 
-A4BF; [0D BD 34, 05, 05]
+101D4; [0D C6 82, 05, 05]
 
-A4C0; [0D BD 3C, 05, 05]
+101D5; [0D C6 8A, 05, 05]
 
-A4C1; [0D BD 44, 05, 05]
+101D6; [0D C6 92, 05, 05]
 
-A4C2; [0D BD 4C, 05, 05]
+101D7; [0D C6 9A, 05, 05]
 
-A4C3; [0D BD 54, 05, 05]
+101D8; [0D C6 A2, 05, 05]
 
-A4C4; [0D BD 5C, 05, 05]
+101D9; [0D C6 AA, 05, 05]
 
-A4C5; [0D BD 64, 05, 05]
+101DA; [0D C6 B2, 05, 05]
 
-A4C6; [0D BD 6C, 05, 05]
+101DB; [0D C6 BA, 05, 05]
 
-10137; [0D BD 74, 05, 05]
+101DC; [0D C6 C2, 05, 05]
 
-10138; [0D BD 7C, 05, 05]
+101DD; [0D C6 CA, 05, 05]
 
-10139; [0D BD 84, 05, 05]
+101DE; [0D C6 D2, 05, 05]
 
-1013A; [0D BD 8C, 05, 05]
+101DF; [0D C6 DA, 05, 05]
 
-1013B; [0D BD 94, 05, 05]
+101E0; [0D C6 E2, 05, 05]
 
-1013C; [0D BD 9C, 05, 05]
+101E1; [0D C6 EA, 05, 05]
 
-1013D; [0D BD A4, 05, 05]
+101E2; [0D C6 F2, 05, 05]
 
-1013E; [0D BD AC, 05, 05]
+101E3; [0D C6 FA, 05, 05]
 
-1013F; [0D BD B4, 05, 05]
+101E4; [0D C7 04, 05, 05]
 
-10179; [0D BD BC, 05, 05]
+101E5; [0D C7 0C, 05, 05]
 
-1017A; [0D BD C4, 05, 05]
+101E6; [0D C7 14, 05, 05]
 
-1017B; [0D BD CC, 05, 05]
+101E7; [0D C7 1C, 05, 05]
 
-1017C; [0D BD D4, 05, 05]
+101E8; [0D C7 24, 05, 05]
 
-1017D; [0D BD DC, 05, 05]
+101E9; [0D C7 2C, 05, 05]
 
-1017E; [0D BD E4, 05, 05]
+101EA; [0D C7 34, 05, 05]
 
-1017F; [0D BD EC, 05, 05]
+101EB; [0D C7 3C, 05, 05]
 
-10180; [0D BD F4, 05, 05]
+101EC; [0D C7 44, 05, 05]
 
-10181; [0D BD FC, 05, 05]
+101ED; [0D C7 4C, 05, 05]
 
-10182; [0D BE 0A, 05, 05]
+101EE; [0D C7 54, 05, 05]
 
-10183; [0D BE 12, 05, 05]
+101EF; [0D C7 5C, 05, 05]
 
-10184; [0D BE 1A, 05, 05]
+101F0; [0D C7 64, 05, 05]
 
-10185; [0D BE 22, 05, 05]
+101F1; [0D C7 6C, 05, 05]
 
-10186; [0D BE 2A, 05, 05]
+101F2; [0D C7 74, 05, 05]
 
-10187; [0D BE 32, 05, 05]
+101F3; [0D C7 7C, 05, 05]
 
-10188; [0D BE 3A, 05, 05]
+101F4; [0D C7 84, 05, 05]
 
-10189; [0D BE 42, 05, 05]
+101F5; [0D C7 8C, 05, 05]
 
-10190; [0D BE 4A, 05, 05]
+101F6; [0D C7 94, 05, 05]
 
-10191; [0D BE 52, 05, 05]
+101F7; [0D C7 9C, 05, 05]
 
-10192; [0D BE 5A, 05, 05]
+101F8; [0D C7 A4, 05, 05]
 
-10193; [0D BE 62, 05, 05]
+101F9; [0D C7 AC, 05, 05]
 
-10194; [0D BE 6A, 05, 05]
+101FA; [0D C7 B4, 05, 05]
 
-10195; [0D BE 72, 05, 05]
+101FB; [0D C7 BC, 05, 05]
 
-10196; [0D BE 7A, 05, 05]
+101FC; [0D C7 C4, 05, 05]
 
-10197; [0D BE 82, 05, 05]
+1D000; [0D C7 CC, 05, 05]
 
-10198; [0D BE 8A, 05, 05]
+1D001; [0D C7 D4, 05, 05]
 
-10199; [0D BE 92, 05, 05]
+1D002; [0D C7 DC, 05, 05]
 
-1019A; [0D BE 9A, 05, 05]
+1D003; [0D C7 E4, 05, 05]
 
-1019B; [0D BE A2, 05, 05]
+1D004; [0D C7 EC, 05, 05]
 
-101D0; [0D BE AA, 05, 05]
+1D005; [0D C7 F4, 05, 05]
 
-101D1; [0D BE B2, 05, 05]
+1D006; [0D C7 FC, 05, 05]
 
-101D2; [0D BE BA, 05, 05]
+1D007; [0D C8 06, 05, 05]
 
-101D3; [0D BE C2, 05, 05]
+1D008; [0D C8 0E, 05, 05]
 
-101D4; [0D BE CA, 05, 05]
+1D009; [0D C8 16, 05, 05]
 
-101D5; [0D BE D2, 05, 05]
+1D00A; [0D C8 1E, 05, 05]
 
-101D6; [0D BE DA, 05, 05]
+1D00B; [0D C8 26, 05, 05]
 
-101D7; [0D BE E2, 05, 05]
+1D00C; [0D C8 2E, 05, 05]
 
-101D8; [0D BE EA, 05, 05]
+1D00D; [0D C8 36, 05, 05]
 
-101D9; [0D BE F2, 05, 05]
+1D00E; [0D C8 3E, 05, 05]
 
-101DA; [0D BE FA, 05, 05]
+1D00F; [0D C8 46, 05, 05]
 
-101DB; [0D BF 08, 05, 05]
+1D010; [0D C8 4E, 05, 05]
 
-101DC; [0D BF 10, 05, 05]
+1D011; [0D C8 56, 05, 05]
 
-101DD; [0D BF 18, 05, 05]
+1D012; [0D C8 5E, 05, 05]
 
-101DE; [0D BF 20, 05, 05]
+1D013; [0D C8 66, 05, 05]
 
-101DF; [0D BF 28, 05, 05]
+1D014; [0D C8 6E, 05, 05]
 
-101E0; [0D BF 30, 05, 05]
+1D015; [0D C8 76, 05, 05]
 
-101E1; [0D BF 38, 05, 05]
+1D016; [0D C8 7E, 05, 05]
 
-101E2; [0D BF 40, 05, 05]
+1D017; [0D C8 86, 05, 05]
 
-101E3; [0D BF 48, 05, 05]
+1D018; [0D C8 8E, 05, 05]
 
-101E4; [0D BF 50, 05, 05]
+1D019; [0D C8 96, 05, 05]
 
-101E5; [0D BF 58, 05, 05]
+1D01A; [0D C8 9E, 05, 05]
 
-101E6; [0D BF 60, 05, 05]
+1D01B; [0D C8 A6, 05, 05]
 
-101E7; [0D BF 68, 05, 05]
+1D01C; [0D C8 AE, 05, 05]
 
-101E8; [0D BF 70, 05, 05]
+1D01D; [0D C8 B6, 05, 05]
 
-101E9; [0D BF 78, 05, 05]
+1D01E; [0D C8 BE, 05, 05]
 
-101EA; [0D BF 80, 05, 05]
+1D01F; [0D C8 C6, 05, 05]
 
-101EB; [0D BF 88, 05, 05]
+1D020; [0D C8 CE, 05, 05]
 
-101EC; [0D BF 90, 05, 05]
+1D021; [0D C8 D6, 05, 05]
 
-101ED; [0D BF 98, 05, 05]
+1D022; [0D C8 DE, 05, 05]
 
-101EE; [0D BF A0, 05, 05]
+1D023; [0D C8 E6, 05, 05]
 
-101EF; [0D BF A8, 05, 05]
+1D024; [0D C8 EE, 05, 05]
 
-101F0; [0D BF B0, 05, 05]
+1D025; [0D C8 F6, 05, 05]
 
-101F1; [0D BF B8, 05, 05]
+1D026; [0D C8 FE, 05, 05]
 
-101F2; [0D BF C0, 05, 05]
+1D027; [0D C9 08, 05, 05]
 
-101F3; [0D BF C8, 05, 05]
+1D028; [0D C9 10, 05, 05]
 
-101F4; [0D BF D0, 05, 05]
+1D029; [0D C9 18, 05, 05]
 
-101F5; [0D BF D8, 05, 05]
+1D02A; [0D C9 20, 05, 05]
 
-101F6; [0D BF E0, 05, 05]
+1D02B; [0D C9 28, 05, 05]
 
-101F7; [0D BF E8, 05, 05]
+1D02C; [0D C9 30, 05, 05]
 
-101F8; [0D BF F0, 05, 05]
+1D02D; [0D C9 38, 05, 05]
 
-101F9; [0D BF F8, 05, 05]
+1D02E; [0D C9 40, 05, 05]
 
-101FA; [0D C0 06, 05, 05]
+1D02F; [0D C9 48, 05, 05]
 
-101FB; [0D C0 0E, 05, 05]
+1D030; [0D C9 50, 05, 05]
 
-101FC; [0D C0 16, 05, 05]
+1D031; [0D C9 58, 05, 05]
 
-1D000; [0D C0 1E, 05, 05]
+1D032; [0D C9 60, 05, 05]
 
-1D001; [0D C0 26, 05, 05]
+1D033; [0D C9 68, 05, 05]
 
-1D002; [0D C0 2E, 05, 05]
+1D034; [0D C9 70, 05, 05]
 
-1D003; [0D C0 36, 05, 05]
+1D035; [0D C9 78, 05, 05]
 
-1D004; [0D C0 3E, 05, 05]
+1D036; [0D C9 80, 05, 05]
 
-1D005; [0D C0 46, 05, 05]
+1D037; [0D C9 88, 05, 05]
 
-1D006; [0D C0 4E, 05, 05]
+1D038; [0D C9 90, 05, 05]
 
-1D007; [0D C0 56, 05, 05]
+1D039; [0D C9 98, 05, 05]
 
-1D008; [0D C0 5E, 05, 05]
+1D03A; [0D C9 A0, 05, 05]
 
-1D009; [0D C0 66, 05, 05]
+1D03B; [0D C9 A8, 05, 05]
 
-1D00A; [0D C0 6E, 05, 05]
+1D03C; [0D C9 B0, 05, 05]
 
-1D00B; [0D C0 76, 05, 05]
+1D03D; [0D C9 B8, 05, 05]
 
-1D00C; [0D C0 7E, 05, 05]
+1D03E; [0D C9 C0, 05, 05]
 
-1D00D; [0D C0 86, 05, 05]
+1D03F; [0D C9 C8, 05, 05]
 
-1D00E; [0D C0 8E, 05, 05]
+1D040; [0D C9 D0, 05, 05]
 
-1D00F; [0D C0 96, 05, 05]
+1D041; [0D C9 D8, 05, 05]
 
-1D010; [0D C0 9E, 05, 05]
+1D042; [0D C9 E0, 05, 05]
 
-1D011; [0D C0 A6, 05, 05]
+1D043; [0D C9 E8, 05, 05]
 
-1D012; [0D C0 AE, 05, 05]
+1D044; [0D C9 F0, 05, 05]
 
-1D013; [0D C0 B6, 05, 05]
+1D045; [0D C9 F8, 05, 05]
 
-1D014; [0D C0 BE, 05, 05]
+1D046; [0D CA 02, 05, 05]
 
-1D015; [0D C0 C6, 05, 05]
+1D047; [0D CA 0A, 05, 05]
 
-1D016; [0D C0 CE, 05, 05]
+1D048; [0D CA 12, 05, 05]
 
-1D017; [0D C0 D6, 05, 05]
+1D049; [0D CA 1A, 05, 05]
 
-1D018; [0D C0 DE, 05, 05]
+1D04A; [0D CA 22, 05, 05]
 
-1D019; [0D C0 E6, 05, 05]
+1D04B; [0D CA 2A, 05, 05]
 
-1D01A; [0D C0 EE, 05, 05]
+1D04C; [0D CA 32, 05, 05]
 
-1D01B; [0D C0 F6, 05, 05]
+1D04D; [0D CA 3A, 05, 05]
 
-1D01C; [0D C1 04, 05, 05]
+1D04E; [0D CA 42, 05, 05]
 
-1D01D; [0D C1 0C, 05, 05]
+1D04F; [0D CA 4A, 05, 05]
 
-1D01E; [0D C1 14, 05, 05]
+1D050; [0D CA 52, 05, 05]
 
-1D01F; [0D C1 1C, 05, 05]
+1D051; [0D CA 5A, 05, 05]
 
-1D020; [0D C1 24, 05, 05]
+1D052; [0D CA 62, 05, 05]
 
-1D021; [0D C1 2C, 05, 05]
+1D053; [0D CA 6A, 05, 05]
 
-1D022; [0D C1 34, 05, 05]
+1D054; [0D CA 72, 05, 05]
 
-1D023; [0D C1 3C, 05, 05]
+1D055; [0D CA 7A, 05, 05]
 
-1D024; [0D C1 44, 05, 05]
+1D056; [0D CA 82, 05, 05]
 
-1D025; [0D C1 4C, 05, 05]
+1D057; [0D CA 8A, 05, 05]
 
-1D026; [0D C1 54, 05, 05]
+1D058; [0D CA 92, 05, 05]
 
-1D027; [0D C1 5C, 05, 05]
+1D059; [0D CA 9A, 05, 05]
 
-1D028; [0D C1 64, 05, 05]
+1D05A; [0D CA A2, 05, 05]
 
-1D029; [0D C1 6C, 05, 05]
+1D05B; [0D CA AA, 05, 05]
 
-1D02A; [0D C1 74, 05, 05]
+1D05C; [0D CA B2, 05, 05]
 
-1D02B; [0D C1 7C, 05, 05]
+1D05D; [0D CA BA, 05, 05]
 
-1D02C; [0D C1 84, 05, 05]
+1D05E; [0D CA C2, 05, 05]
 
-1D02D; [0D C1 8C, 05, 05]
+1D05F; [0D CA CA, 05, 05]
 
-1D02E; [0D C1 94, 05, 05]
+1D060; [0D CA D2, 05, 05]
 
-1D02F; [0D C1 9C, 05, 05]
+1D061; [0D CA DA, 05, 05]
 
-1D030; [0D C1 A4, 05, 05]
+1D062; [0D CA E2, 05, 05]
 
-1D031; [0D C1 AC, 05, 05]
+1D063; [0D CA EA, 05, 05]
 
-1D032; [0D C1 B4, 05, 05]
+1D064; [0D CA F2, 05, 05]
 
-1D033; [0D C1 BC, 05, 05]
+1D065; [0D CA FA, 05, 05]
 
-1D034; [0D C1 C4, 05, 05]
+1D066; [0D CB 04, 05, 05]
 
-1D035; [0D C1 CC, 05, 05]
+1D067; [0D CB 0C, 05, 05]
 
-1D036; [0D C1 D4, 05, 05]
+1D068; [0D CB 14, 05, 05]
 
-1D037; [0D C1 DC, 05, 05]
+1D069; [0D CB 1C, 05, 05]
 
-1D038; [0D C1 E4, 05, 05]
+1D06A; [0D CB 24, 05, 05]
 
-1D039; [0D C1 EC, 05, 05]
+1D06B; [0D CB 2C, 05, 05]
 
-1D03A; [0D C1 F4, 05, 05]
+1D06C; [0D CB 34, 05, 05]
 
-1D03B; [0D C1 FC, 05, 05]
+1D06D; [0D CB 3C, 05, 05]
 
-1D03C; [0D C2 0A, 05, 05]
+1D06E; [0D CB 44, 05, 05]
 
-1D03D; [0D C2 12, 05, 05]
+1D06F; [0D CB 4C, 05, 05]
 
-1D03E; [0D C2 1A, 05, 05]
+1D070; [0D CB 54, 05, 05]
 
-1D03F; [0D C2 22, 05, 05]
+1D071; [0D CB 5C, 05, 05]
 
-1D040; [0D C2 2A, 05, 05]
+1D072; [0D CB 64, 05, 05]
 
-1D041; [0D C2 32, 05, 05]
+1D073; [0D CB 6C, 05, 05]
 
-1D042; [0D C2 3A, 05, 05]
+1D074; [0D CB 74, 05, 05]
 
-1D043; [0D C2 42, 05, 05]
+1D075; [0D CB 7C, 05, 05]
 
-1D044; [0D C2 4A, 05, 05]
+1D076; [0D CB 84, 05, 05]
 
-1D045; [0D C2 52, 05, 05]
+1D077; [0D CB 8C, 05, 05]
 
-1D046; [0D C2 5A, 05, 05]
+1D078; [0D CB 94, 05, 05]
 
-1D047; [0D C2 62, 05, 05]
+1D079; [0D CB 9C, 05, 05]
 
-1D048; [0D C2 6A, 05, 05]
+1D07A; [0D CB A4, 05, 05]
 
-1D049; [0D C2 72, 05, 05]
+1D07B; [0D CB AC, 05, 05]
 
-1D04A; [0D C2 7A, 05, 05]
+1D07C; [0D CB B4, 05, 05]
 
-1D04B; [0D C2 82, 05, 05]
+1D07D; [0D CB BC, 05, 05]
 
-1D04C; [0D C2 8A, 05, 05]
+1D07E; [0D CB C4, 05, 05]
 
-1D04D; [0D C2 92, 05, 05]
+1D07F; [0D CB CC, 05, 05]
 
-1D04E; [0D C2 9A, 05, 05]
+1D080; [0D CB D4, 05, 05]
 
-1D04F; [0D C2 A2, 05, 05]
+1D081; [0D CB DC, 05, 05]
 
-1D050; [0D C2 AA, 05, 05]
+1D082; [0D CB E4, 05, 05]
 
-1D051; [0D C2 B2, 05, 05]
+1D083; [0D CB EC, 05, 05]
 
-1D052; [0D C2 BA, 05, 05]
+1D084; [0D CB F4, 05, 05]
 
-1D053; [0D C2 C2, 05, 05]
+1D085; [0D CB FC, 05, 05]
 
-1D054; [0D C2 CA, 05, 05]
+1D086; [0D CC 06, 05, 05]
 
-1D055; [0D C2 D2, 05, 05]
+1D087; [0D CC 0E, 05, 05]
 
-1D056; [0D C2 DA, 05, 05]
+1D088; [0D CC 16, 05, 05]
 
-1D057; [0D C2 E2, 05, 05]
+1D089; [0D CC 1E, 05, 05]
 
-1D058; [0D C2 EA, 05, 05]
+1D08A; [0D CC 26, 05, 05]
 
-1D059; [0D C2 F2, 05, 05]
+1D08B; [0D CC 2E, 05, 05]
 
-1D05A; [0D C2 FA, 05, 05]
+1D08C; [0D CC 36, 05, 05]
 
-1D05B; [0D C3 08, 05, 05]
+1D08D; [0D CC 3E, 05, 05]
 
-1D05C; [0D C3 10, 05, 05]
+1D08E; [0D CC 46, 05, 05]
 
-1D05D; [0D C3 18, 05, 05]
+1D08F; [0D CC 4E, 05, 05]
 
-1D05E; [0D C3 20, 05, 05]
+1D090; [0D CC 56, 05, 05]
 
-1D05F; [0D C3 28, 05, 05]
+1D091; [0D CC 5E, 05, 05]
 
-1D060; [0D C3 30, 05, 05]
+1D092; [0D CC 66, 05, 05]
 
-1D061; [0D C3 38, 05, 05]
+1D093; [0D CC 6E, 05, 05]
 
-1D062; [0D C3 40, 05, 05]
+1D094; [0D CC 76, 05, 05]
 
-1D063; [0D C3 48, 05, 05]
+1D095; [0D CC 7E, 05, 05]
 
-1D064; [0D C3 50, 05, 05]
+1D096; [0D CC 86, 05, 05]
 
-1D065; [0D C3 58, 05, 05]
+1D097; [0D CC 8E, 05, 05]
 
-1D066; [0D C3 60, 05, 05]
+1D098; [0D CC 96, 05, 05]
 
-1D067; [0D C3 68, 05, 05]
+1D099; [0D CC 9E, 05, 05]
 
-1D068; [0D C3 70, 05, 05]
+1D09A; [0D CC A6, 05, 05]
 
-1D069; [0D C3 78, 05, 05]
+1D09B; [0D CC AE, 05, 05]
 
-1D06A; [0D C3 80, 05, 05]
+1D09C; [0D CC B6, 05, 05]
 
-1D06B; [0D C3 88, 05, 05]
+1D09D; [0D CC BE, 05, 05]
 
-1D06C; [0D C3 90, 05, 05]
+1D09E; [0D CC C6, 05, 05]
 
-1D06D; [0D C3 98, 05, 05]
+1D09F; [0D CC CE, 05, 05]
 
-1D06E; [0D C3 A0, 05, 05]
+1D0A0; [0D CC D6, 05, 05]
 
-1D06F; [0D C3 A8, 05, 05]
+1D0A1; [0D CC DE, 05, 05]
 
-1D070; [0D C3 B0, 05, 05]
+1D0A2; [0D CC E6, 05, 05]
 
-1D071; [0D C3 B8, 05, 05]
+1D0A3; [0D CC EE, 05, 05]
 
-1D072; [0D C3 C0, 05, 05]
+1D0A4; [0D CC F6, 05, 05]
 
-1D073; [0D C3 C8, 05, 05]
+1D0A5; [0D CC FE, 05, 05]
 
-1D074; [0D C3 D0, 05, 05]
+1D0A6; [0D CD 08, 05, 05]
 
-1D075; [0D C3 D8, 05, 05]
+1D0A7; [0D CD 10, 05, 05]
 
-1D076; [0D C3 E0, 05, 05]
+1D0A8; [0D CD 18, 05, 05]
 
-1D077; [0D C3 E8, 05, 05]
+1D0A9; [0D CD 20, 05, 05]
 
-1D078; [0D C3 F0, 05, 05]
+1D0AA; [0D CD 28, 05, 05]
 
-1D079; [0D C3 F8, 05, 05]
+1D0AB; [0D CD 30, 05, 05]
 
-1D07A; [0D C4 06, 05, 05]
+1D0AC; [0D CD 38, 05, 05]
 
-1D07B; [0D C4 0E, 05, 05]
+1D0AD; [0D CD 40, 05, 05]
 
-1D07C; [0D C4 16, 05, 05]
+1D0AE; [0D CD 48, 05, 05]
 
-1D07D; [0D C4 1E, 05, 05]
+1D0AF; [0D CD 50, 05, 05]
 
-1D07E; [0D C4 26, 05, 05]
+1D0B0; [0D CD 58, 05, 05]
 
-1D07F; [0D C4 2E, 05, 05]
+1D0B1; [0D CD 60, 05, 05]
 
-1D080; [0D C4 36, 05, 05]
+1D0B2; [0D CD 68, 05, 05]
 
-1D081; [0D C4 3E, 05, 05]
+1D0B3; [0D CD 70, 05, 05]
 
-1D082; [0D C4 46, 05, 05]
+1D0B4; [0D CD 78, 05, 05]
 
-1D083; [0D C4 4E, 05, 05]
+1D0B5; [0D CD 80, 05, 05]
 
-1D084; [0D C4 56, 05, 05]
+1D0B6; [0D CD 88, 05, 05]
 
-1D085; [0D C4 5E, 05, 05]
+1D0B7; [0D CD 90, 05, 05]
 
-1D086; [0D C4 66, 05, 05]
+1D0B8; [0D CD 98, 05, 05]
 
-1D087; [0D C4 6E, 05, 05]
+1D0B9; [0D CD A0, 05, 05]
 
-1D088; [0D C4 76, 05, 05]
+1D0BA; [0D CD A8, 05, 05]
 
-1D089; [0D C4 7E, 05, 05]
+1D0BB; [0D CD B0, 05, 05]
 
-1D08A; [0D C4 86, 05, 05]
+1D0BC; [0D CD B8, 05, 05]
 
-1D08B; [0D C4 8E, 05, 05]
+1D0BD; [0D CD C0, 05, 05]
 
-1D08C; [0D C4 96, 05, 05]
+1D0BE; [0D CD C8, 05, 05]
 
-1D08D; [0D C4 9E, 05, 05]
+1D0BF; [0D CD D0, 05, 05]
 
-1D08E; [0D C4 A6, 05, 05]
+1D0C0; [0D CD D8, 05, 05]
 
-1D08F; [0D C4 AE, 05, 05]
+1D0C1; [0D CD E0, 05, 05]
 
-1D090; [0D C4 B6, 05, 05]
+1D0C2; [0D CD E8, 05, 05]
 
-1D091; [0D C4 BE, 05, 05]
+1D0C3; [0D CD F0, 05, 05]
 
-1D092; [0D C4 C6, 05, 05]
+1D0C4; [0D CD F8, 05, 05]
 
-1D093; [0D C4 CE, 05, 05]
+1D0C5; [0D CE 02, 05, 05]
 
-1D094; [0D C4 D6, 05, 05]
+1D0C6; [0D CE 0A, 05, 05]
 
-1D095; [0D C4 DE, 05, 05]
+1D0C7; [0D CE 12, 05, 05]
 
-1D096; [0D C4 E6, 05, 05]
+1D0C8; [0D CE 1A, 05, 05]
 
-1D097; [0D C4 EE, 05, 05]
+1D0C9; [0D CE 22, 05, 05]
 
-1D098; [0D C4 F6, 05, 05]
+1D0CA; [0D CE 2A, 05, 05]
 
-1D099; [0D C5 04, 05, 05]
+1D0CB; [0D CE 32, 05, 05]
 
-1D09A; [0D C5 0C, 05, 05]
+1D0CC; [0D CE 3A, 05, 05]
 
-1D09B; [0D C5 14, 05, 05]
+1D0CD; [0D CE 42, 05, 05]
 
-1D09C; [0D C5 1C, 05, 05]
+1D0CE; [0D CE 4A, 05, 05]
 
-1D09D; [0D C5 24, 05, 05]
+1D0CF; [0D CE 52, 05, 05]
 
-1D09E; [0D C5 2C, 05, 05]
+1D0D0; [0D CE 5A, 05, 05]
 
-1D09F; [0D C5 34, 05, 05]
+1D0D1; [0D CE 62, 05, 05]
 
-1D0A0; [0D C5 3C, 05, 05]
+1D0D2; [0D CE 6A, 05, 05]
 
-1D0A1; [0D C5 44, 05, 05]
+1D0D3; [0D CE 72, 05, 05]
 
-1D0A2; [0D C5 4C, 05, 05]
+1D0D4; [0D CE 7A, 05, 05]
 
-1D0A3; [0D C5 54, 05, 05]
+1D0D5; [0D CE 82, 05, 05]
 
-1D0A4; [0D C5 5C, 05, 05]
+1D0D6; [0D CE 8A, 05, 05]
 
-1D0A5; [0D C5 64, 05, 05]
+1D0D7; [0D CE 92, 05, 05]
 
-1D0A6; [0D C5 6C, 05, 05]
+1D0D8; [0D CE 9A, 05, 05]
 
-1D0A7; [0D C5 74, 05, 05]
+1D0D9; [0D CE A2, 05, 05]
 
-1D0A8; [0D C5 7C, 05, 05]
+1D0DA; [0D CE AA, 05, 05]
 
-1D0A9; [0D C5 84, 05, 05]
+1D0DB; [0D CE B2, 05, 05]
 
-1D0AA; [0D C5 8C, 05, 05]
+1D0DC; [0D CE BA, 05, 05]
 
-1D0AB; [0D C5 94, 05, 05]
+1D0DD; [0D CE C2, 05, 05]
 
-1D0AC; [0D C5 9C, 05, 05]
+1D0DE; [0D CE CA, 05, 05]
 
-1D0AD; [0D C5 A4, 05, 05]
+1D0DF; [0D CE D2, 05, 05]
 
-1D0AE; [0D C5 AC, 05, 05]
+1D0E0; [0D CE DA, 05, 05]
 
-1D0AF; [0D C5 B4, 05, 05]
+1D0E1; [0D CE E2, 05, 05]
 
-1D0B0; [0D C5 BC, 05, 05]
+1D0E2; [0D CE EA, 05, 05]
 
-1D0B1; [0D C5 C4, 05, 05]
+1D0E3; [0D CE F2, 05, 05]
 
-1D0B2; [0D C5 CC, 05, 05]
+1D0E4; [0D CE FA, 05, 05]
 
-1D0B3; [0D C5 D4, 05, 05]
+1D0E5; [0D CF 04, 05, 05]
 
-1D0B4; [0D C5 DC, 05, 05]
+1D0E6; [0D CF 0C, 05, 05]
 
-1D0B5; [0D C5 E4, 05, 05]
+1D0E7; [0D CF 14, 05, 05]
 
-1D0B6; [0D C5 EC, 05, 05]
+1D0E8; [0D CF 1C, 05, 05]
 
-1D0B7; [0D C5 F4, 05, 05]
+1D0E9; [0D CF 24, 05, 05]
 
-1D0B8; [0D C5 FC, 05, 05]
+1D0EA; [0D CF 2C, 05, 05]
 
-1D0B9; [0D C6 0A, 05, 05]
+1D0EB; [0D CF 34, 05, 05]
 
-1D0BA; [0D C6 12, 05, 05]
+1D0EC; [0D CF 3C, 05, 05]
 
-1D0BB; [0D C6 1A, 05, 05]
+1D0ED; [0D CF 44, 05, 05]
 
-1D0BC; [0D C6 22, 05, 05]
+1D0EE; [0D CF 4C, 05, 05]
 
-1D0BD; [0D C6 2A, 05, 05]
+1D0EF; [0D CF 54, 05, 05]
 
-1D0BE; [0D C6 32, 05, 05]
+1D0F0; [0D CF 5C, 05, 05]
 
-1D0BF; [0D C6 3A, 05, 05]
+1D0F1; [0D CF 64, 05, 05]
 
-1D0C0; [0D C6 42, 05, 05]
+1D0F2; [0D CF 6C, 05, 05]
 
-1D0C1; [0D C6 4A, 05, 05]
+1D0F3; [0D CF 74, 05, 05]
 
-1D0C2; [0D C6 52, 05, 05]
+1D0F4; [0D CF 7C, 05, 05]
 
-1D0C3; [0D C6 5A, 05, 05]
+1D0F5; [0D CF 84, 05, 05]
 
-1D0C4; [0D C6 62, 05, 05]
+1D100; [0D CF 8C, 05, 05]
 
-1D0C5; [0D C6 6A, 05, 05]
+1D101; [0D CF 94, 05, 05]
 
-1D0C6; [0D C6 72, 05, 05]
+1D102; [0D CF 9C, 05, 05]
 
-1D0C7; [0D C6 7A, 05, 05]
+1D103; [0D CF A4, 05, 05]
 
-1D0C8; [0D C6 82, 05, 05]
+1D104; [0D CF AC, 05, 05]
 
-1D0C9; [0D C6 8A, 05, 05]
+1D105; [0D CF B4, 05, 05]
 
-1D0CA; [0D C6 92, 05, 05]
+1D106; [0D CF BC, 05, 05]
 
-1D0CB; [0D C6 9A, 05, 05]
+1D107; [0D CF C4, 05, 05]
 
-1D0CC; [0D C6 A2, 05, 05]
+1D108; [0D CF CC, 05, 05]
 
-1D0CD; [0D C6 AA, 05, 05]
+1D109; [0D CF D4, 05, 05]
 
-1D0CE; [0D C6 B2, 05, 05]
+1D10A; [0D CF DC, 05, 05]
 
-1D0CF; [0D C6 BA, 05, 05]
+1D10B; [0D CF E4, 05, 05]
 
-1D0D0; [0D C6 C2, 05, 05]
+1D10C; [0D CF EC, 05, 05]
 
-1D0D1; [0D C6 CA, 05, 05]
+1D10D; [0D CF F4, 05, 05]
 
-1D0D2; [0D C6 D2, 05, 05]
+1D10E; [0D CF FC, 05, 05]
 
-1D0D3; [0D C6 DA, 05, 05]
+1D10F; [0D D0 06, 05, 05]
 
-1D0D4; [0D C6 E2, 05, 05]
+1D110; [0D D0 0E, 05, 05]
 
-1D0D5; [0D C6 EA, 05, 05]
+1D111; [0D D0 16, 05, 05]
 
-1D0D6; [0D C6 F2, 05, 05]
+1D112; [0D D0 1E, 05, 05]
 
-1D0D7; [0D C6 FA, 05, 05]
+1D113; [0D D0 26, 05, 05]
 
-1D0D8; [0D C7 08, 05, 05]
+1D114; [0D D0 2E, 05, 05]
 
-1D0D9; [0D C7 10, 05, 05]
+1D115; [0D D0 36, 05, 05]
 
-1D0DA; [0D C7 18, 05, 05]
+1D116; [0D D0 3E, 05, 05]
 
-1D0DB; [0D C7 20, 05, 05]
+1D117; [0D D0 46, 05, 05]
 
-1D0DC; [0D C7 28, 05, 05]
+1D118; [0D D0 4E, 05, 05]
 
-1D0DD; [0D C7 30, 05, 05]
+1D119; [0D D0 56, 05, 05]
 
-1D0DE; [0D C7 38, 05, 05]
+1D11A; [0D D0 5E, 05, 05]
 
-1D0DF; [0D C7 40, 05, 05]
+1D11B; [0D D0 66, 05, 05]
 
-1D0E0; [0D C7 48, 05, 05]
+1D11C; [0D D0 6E, 05, 05]
 
-1D0E1; [0D C7 50, 05, 05]
+1D11D; [0D D0 76, 05, 05]
 
-1D0E2; [0D C7 58, 05, 05]
+1D11E; [0D D0 7E, 05, 05]
 
-1D0E3; [0D C7 60, 05, 05]
+1D11F; [0D D0 86, 05, 05]
 
-1D0E4; [0D C7 68, 05, 05]
+1D120; [0D D0 8E, 05, 05]
 
-1D0E5; [0D C7 70, 05, 05]
+1D121; [0D D0 96, 05, 05]
 
-1D0E6; [0D C7 78, 05, 05]
+1D122; [0D D0 9E, 05, 05]
 
-1D0E7; [0D C7 80, 05, 05]
+1D123; [0D D0 A6, 05, 05]
 
-1D0E8; [0D C7 88, 05, 05]
+1D124; [0D D0 AE, 05, 05]
 
-1D0E9; [0D C7 90, 05, 05]
+1D125; [0D D0 B6, 05, 05]
 
-1D0EA; [0D C7 98, 05, 05]
+1D126; [0D D0 BE, 05, 05]
 
-1D0EB; [0D C7 A0, 05, 05]
+266D; [0D D0 C6, 05, 05]
 
-1D0EC; [0D C7 A8, 05, 05]
+266E; [0D D0 CE, 05, 05]
 
-1D0ED; [0D C7 B0, 05, 05]
+266F; [0D D0 D6, 05, 05]
 
-1D0EE; [0D C7 B8, 05, 05]
+1D12A; [0D D0 DE, 05, 05]
 
-1D0EF; [0D C7 C0, 05, 05]
+1D12B; [0D D0 E6, 05, 05]
 
-1D0F0; [0D C7 C8, 05, 05]
+1D12C; [0D D0 EE, 05, 05]
 
-1D0F1; [0D C7 D0, 05, 05]
+1D12D; [0D D0 F6, 05, 05]
 
-1D0F2; [0D C7 D8, 05, 05]
+1D12E; [0D D0 FE, 05, 05]
 
-1D0F3; [0D C7 E0, 05, 05]
+1D12F; [0D D1 08, 05, 05]
 
-1D0F4; [0D C7 E8, 05, 05]
+1D130; [0D D1 10, 05, 05]
 
-1D0F5; [0D C7 F0, 05, 05]
+1D131; [0D D1 18, 05, 05]
 
-1D100; [0D C7 F8, 05, 05]
+1D132; [0D D1 20, 05, 05]
 
-1D101; [0D C8 06, 05, 05]
+1D133; [0D D1 28, 05, 05]
 
-1D102; [0D C8 0E, 05, 05]
+1D134; [0D D1 30, 05, 05]
 
-1D103; [0D C8 16, 05, 05]
+1D135; [0D D1 38, 05, 05]
 
-1D104; [0D C8 1E, 05, 05]
+1D136; [0D D1 40, 05, 05]
 
-1D105; [0D C8 26, 05, 05]
+1D137; [0D D1 48, 05, 05]
 
-1D106; [0D C8 2E, 05, 05]
+1D138; [0D D1 50, 05, 05]
 
-1D107; [0D C8 36, 05, 05]
+1D139; [0D D1 58, 05, 05]
 
-1D108; [0D C8 3E, 05, 05]
+1D129; [0D D1 60, 05, 05]
 
-1D109; [0D C8 46, 05, 05]
+1D13A; [0D D1 68, 05, 05]
 
-1D10A; [0D C8 4E, 05, 05]
+1D13B; [0D D1 70, 05, 05]
 
-1D10B; [0D C8 56, 05, 05]
+1D13C; [0D D1 78, 05, 05]
 
-1D10C; [0D C8 5E, 05, 05]
+1D13D; [0D D1 80, 05, 05]
 
-1D10D; [0D C8 66, 05, 05]
+1D13E; [0D D1 88, 05, 05]
 
-1D10E; [0D C8 6E, 05, 05]
+1D13F; [0D D1 90, 05, 05]
 
-1D10F; [0D C8 76, 05, 05]
+1D140; [0D D1 98, 05, 05]
 
-1D110; [0D C8 7E, 05, 05]
+1D141; [0D D1 A0, 05, 05]
 
-1D111; [0D C8 86, 05, 05]
+1D142; [0D D1 A8, 05, 05]
 
-1D112; [0D C8 8E, 05, 05]
+1D143; [0D D1 B0, 05, 05]
 
-1D113; [0D C8 96, 05, 05]
+1D144; [0D D1 B8, 05, 05]
 
-1D114; [0D C8 9E, 05, 05]
+1D145; [0D D1 C0, 05, 05]
 
-1D115; [0D C8 A6, 05, 05]
+1D146; [0D D1 C8, 05, 05]
 
-1D116; [0D C8 AE, 05, 05]
+1D147; [0D D1 D0, 05, 05]
 
-1D117; [0D C8 B6, 05, 05]
+1D148; [0D D1 D8, 05, 05]
 
-1D118; [0D C8 BE, 05, 05]
+1D149; [0D D1 E0, 05, 05]
 
-1D119; [0D C8 C6, 05, 05]
+1D14A; [0D D1 E8, 05, 05]
 
-1D11A; [0D C8 CE, 05, 05]
+1D14B; [0D D1 F0, 05, 05]
 
-1D11B; [0D C8 D6, 05, 05]
+1D14C; [0D D1 F8, 05, 05]
 
-1D11C; [0D C8 DE, 05, 05]
+1D14D; [0D D2 02, 05, 05]
 
-1D11D; [0D C8 E6, 05, 05]
+1D14E; [0D D2 0A, 05, 05]
 
-1D11E; [0D C8 EE, 05, 05]
+1D14F; [0D D2 12, 05, 05]
 
-1D11F; [0D C8 F6, 05, 05]
+1D150; [0D D2 1A, 05, 05]
 
-1D120; [0D C9 04, 05, 05]
+1D151; [0D D2 22, 05, 05]
 
-1D121; [0D C9 0C, 05, 05]
+1D152; [0D D2 2A, 05, 05]
 
-1D122; [0D C9 14, 05, 05]
+1D153; [0D D2 32, 05, 05]
 
-1D123; [0D C9 1C, 05, 05]
+1D154; [0D D2 3A, 05, 05]
 
-1D124; [0D C9 24, 05, 05]
+1D155; [0D D2 42, 05, 05]
 
-1D125; [0D C9 2C, 05, 05]
+1D156; [0D D2 4A, 05, 05]
 
-1D126; [0D C9 34, 05, 05]
+1D157; [0D D2 52, 05, 05]
+1D15E; [0D D2 52, 05, 05]
 
-266D; [0D C9 3C, 05, 05]
+1D158; [0D D2 5A, 05, 05]
+1D15F; [0D D2 5A, 05, 05]
+1D160; [0D D2 5A, 05, 05]
+1D161; [0D D2 5A, 05, 05]
+1D162; [0D D2 5A, 05, 05]
+1D163; [0D D2 5A, 05, 05]
+1D164; [0D D2 5A, 05, 05]
 
-266E; [0D C9 44, 05, 05]
+1D159; [0D D2 62, 05, 05]
 
-266F; [0D C9 4C, 05, 05]
+1D15A; [0D D2 6A, 05, 05]
 
-1D12A; [0D C9 54, 05, 05]
+1D15B; [0D D2 72, 05, 05]
 
-1D12B; [0D C9 5C, 05, 05]
+1D15C; [0D D2 7A, 05, 05]
 
-1D12C; [0D C9 64, 05, 05]
+1D15D; [0D D2 82, 05, 05]
 
-1D12D; [0D C9 6C, 05, 05]
+1D16A; [0D D2 8A, 05, 05]
 
-1D12E; [0D C9 74, 05, 05]
+1D16B; [0D D2 92, 05, 05]
 
-1D12F; [0D C9 7C, 05, 05]
+1D16C; [0D D2 9A, 05, 05]
 
-1D130; [0D C9 84, 05, 05]
+1D183; [0D D2 A2, 05, 05]
 
-1D131; [0D C9 8C, 05, 05]
+1D184; [0D D2 AA, 05, 05]
 
-1D132; [0D C9 94, 05, 05]
+1D18C; [0D D2 B2, 05, 05]
 
-1D133; [0D C9 9C, 05, 05]
+1D18D; [0D D2 BA, 05, 05]
 
-1D134; [0D C9 A4, 05, 05]
+1D18E; [0D D2 C2, 05, 05]
 
-1D135; [0D C9 AC, 05, 05]
+1D18F; [0D D2 CA, 05, 05]
 
-1D136; [0D C9 B4, 05, 05]
+1D190; [0D D2 D2, 05, 05]
 
-1D137; [0D C9 BC, 05, 05]
+1D191; [0D D2 DA, 05, 05]
 
-1D138; [0D C9 C4, 05, 05]
+1D192; [0D D2 E2, 05, 05]
 
-1D139; [0D C9 CC, 05, 05]
+1D193; [0D D2 EA, 05, 05]
 
-1D129; [0D C9 D4, 05, 05]
+1D194; [0D D2 F2, 05, 05]
 
-1D13A; [0D C9 DC, 05, 05]
+1D195; [0D D2 FA, 05, 05]
 
-1D13B; [0D C9 E4, 05, 05]
+1D196; [0D D3 04, 05, 05]
 
-1D13C; [0D C9 EC, 05, 05]
+1D197; [0D D3 0C, 05, 05]
 
-1D13D; [0D C9 F4, 05, 05]
+1D198; [0D D3 14, 05, 05]
 
-1D13E; [0D C9 FC, 05, 05]
+1D199; [0D D3 1C, 05, 05]
 
-1D13F; [0D CA 0A, 05, 05]
+1D19A; [0D D3 24, 05, 05]
 
-1D140; [0D CA 12, 05, 05]
+1D19B; [0D D3 2C, 05, 05]
 
-1D141; [0D CA 1A, 05, 05]
+1D19C; [0D D3 34, 05, 05]
 
-1D142; [0D CA 22, 05, 05]
+1D19D; [0D D3 3C, 05, 05]
 
-1D143; [0D CA 2A, 05, 05]
+1D19E; [0D D3 44, 05, 05]
 
-1D144; [0D CA 32, 05, 05]
+1D19F; [0D D3 4C, 05, 05]
 
-1D145; [0D CA 3A, 05, 05]
+1D1A0; [0D D3 54, 05, 05]
 
-1D146; [0D CA 42, 05, 05]
+1D1A1; [0D D3 5C, 05, 05]
 
-1D147; [0D CA 4A, 05, 05]
+1D1A2; [0D D3 64, 05, 05]
 
-1D148; [0D CA 52, 05, 05]
+1D1A3; [0D D3 6C, 05, 05]
 
-1D149; [0D CA 5A, 05, 05]
+1D1A4; [0D D3 74, 05, 05]
 
-1D14A; [0D CA 62, 05, 05]
+1D1A5; [0D D3 7C, 05, 05]
 
-1D14B; [0D CA 6A, 05, 05]
+1D1A6; [0D D3 84, 05, 05]
 
-1D14C; [0D CA 72, 05, 05]
+1D1A7; [0D D3 8C, 05, 05]
 
-1D14D; [0D CA 7A, 05, 05]
+1D1A8; [0D D3 94, 05, 05]
 
-1D14E; [0D CA 82, 05, 05]
+1D1A9; [0D D3 9C, 05, 05]
 
-1D14F; [0D CA 8A, 05, 05]
+1D1AE; [0D D3 A4, 05, 05]
 
-1D150; [0D CA 92, 05, 05]
+1D1AF; [0D D3 AC, 05, 05]
 
-1D151; [0D CA 9A, 05, 05]
+1D1B0; [0D D3 B4, 05, 05]
 
-1D152; [0D CA A2, 05, 05]
+1D1B1; [0D D3 BC, 05, 05]
 
-1D153; [0D CA AA, 05, 05]
+1D1B2; [0D D3 C4, 05, 05]
 
-1D154; [0D CA B2, 05, 05]
+1D1B3; [0D D3 CC, 05, 05]
 
-1D155; [0D CA BA, 05, 05]
+1D1B4; [0D D3 D4, 05, 05]
 
-1D156; [0D CA C2, 05, 05]
+1D1B5; [0D D3 DC, 05, 05]
 
-1D157; [0D CA CA, 05, 05]
-1D15E; [0D CA CA, 05, 05]
+1D1B6; [0D D3 E4, 05, 05]
 
-1D158; [0D CA D2, 05, 05]
-1D15F; [0D CA D2, 05, 05]
-1D160; [0D CA D2, 05, 05]
-1D161; [0D CA D2, 05, 05]
-1D162; [0D CA D2, 05, 05]
-1D163; [0D CA D2, 05, 05]
-1D164; [0D CA D2, 05, 05]
+1D1B7; [0D D3 EC, 05, 05]
 
-1D159; [0D CA DA, 05, 05]
+1D1B8; [0D D3 F4, 05, 05]
 
-1D15A; [0D CA E2, 05, 05]
+1D1B9; [0D D3 FC, 05, 05]
+1D1BB; [0D D3 FC, 05, 05]
+1D1BD; [0D D3 FC, 05, 05]
+1D1BF; [0D D3 FC, 05, 05]
 
-1D15B; [0D CA EA, 05, 05]
+1D1BA; [0D D4 06, 05, 05]
+1D1BC; [0D D4 06, 05, 05]
+1D1BE; [0D D4 06, 05, 05]
+1D1C0; [0D D4 06, 05, 05]
 
-1D15C; [0D CA F2, 05, 05]
+1D1C1; [0D D4 0E, 05, 05]
 
-1D15D; [0D CA FA, 05, 05]
+1D1C2; [0D D4 16, 05, 05]
 
-1D16A; [0D CB 08, 05, 05]
+1D1C3; [0D D4 1E, 05, 05]
 
-1D16B; [0D CB 10, 05, 05]
+1D1C4; [0D D4 26, 05, 05]
 
-1D16C; [0D CB 18, 05, 05]
+1D1C5; [0D D4 2E, 05, 05]
 
-1D183; [0D CB 20, 05, 05]
+1D1C6; [0D D4 36, 05, 05]
 
-1D184; [0D CB 28, 05, 05]
+1D1C7; [0D D4 3E, 05, 05]
 
-1D18C; [0D CB 30, 05, 05]
+1D1C8; [0D D4 46, 05, 05]
 
-1D18D; [0D CB 38, 05, 05]
+1D1C9; [0D D4 4E, 05, 05]
 
-1D18E; [0D CB 40, 05, 05]
+1D1CA; [0D D4 56, 05, 05]
 
-1D18F; [0D CB 48, 05, 05]
+1D1CB; [0D D4 5E, 05, 05]
 
-1D190; [0D CB 50, 05, 05]
+1D1CC; [0D D4 66, 05, 05]
 
-1D191; [0D CB 58, 05, 05]
+1D1CD; [0D D4 6E, 05, 05]
 
-1D192; [0D CB 60, 05, 05]
+1D1CE; [0D D4 76, 05, 05]
 
-1D193; [0D CB 68, 05, 05]
+1D1CF; [0D D4 7E, 05, 05]
 
-1D194; [0D CB 70, 05, 05]
+1D1D0; [0D D4 86, 05, 05]
 
-1D195; [0D CB 78, 05, 05]
+1D1D1; [0D D4 8E, 05, 05]
 
-1D196; [0D CB 80, 05, 05]
+1D1D2; [0D D4 96, 05, 05]
 
-1D197; [0D CB 88, 05, 05]
+1D1D3; [0D D4 9E, 05, 05]
 
-1D198; [0D CB 90, 05, 05]
+1D1D4; [0D D4 A6, 05, 05]
 
-1D199; [0D CB 98, 05, 05]
+1D1D5; [0D D4 AE, 05, 05]
 
-1D19A; [0D CB A0, 05, 05]
+1D1D6; [0D D4 B6, 05, 05]
 
-1D19B; [0D CB A8, 05, 05]
+1D1D7; [0D D4 BE, 05, 05]
 
-1D19C; [0D CB B0, 05, 05]
+1D1D8; [0D D4 C6, 05, 05]
 
-1D19D; [0D CB B8, 05, 05]
+1D1D9; [0D D4 CE, 05, 05]
 
-1D19E; [0D CB C0, 05, 05]
+1D1DA; [0D D4 D6, 05, 05]
 
-1D19F; [0D CB C8, 05, 05]
+1D1DB; [0D D4 DE, 05, 05]
 
-1D1A0; [0D CB D0, 05, 05]
+1D1DC; [0D D4 E6, 05, 05]
 
-1D1A1; [0D CB D8, 05, 05]
+1D1DD; [0D D4 EE, 05, 05]
 
-1D1A2; [0D CB E0, 05, 05]
+1D200; [0D D4 F6, 05, 05]
 
-1D1A3; [0D CB E8, 05, 05]
+1D201; [0D D4 FE, 05, 05]
 
-1D1A4; [0D CB F0, 05, 05]
+1D202; [0D D5 08, 05, 05]
 
-1D1A5; [0D CB F8, 05, 05]
+1D203; [0D D5 10, 05, 05]
 
-1D1A6; [0D CC 06, 05, 05]
+1D204; [0D D5 18, 05, 05]
 
-1D1A7; [0D CC 0E, 05, 05]
+1D205; [0D D5 20, 05, 05]
 
-1D1A8; [0D CC 16, 05, 05]
+1D206; [0D D5 28, 05, 05]
 
-1D1A9; [0D CC 1E, 05, 05]
+1D207; [0D D5 30, 05, 05]
 
-1D1AE; [0D CC 26, 05, 05]
+1D208; [0D D5 38, 05, 05]
 
-1D1AF; [0D CC 2E, 05, 05]
+1D209; [0D D5 40, 05, 05]
 
-1D1B0; [0D CC 36, 05, 05]
+1D20A; [0D D5 48, 05, 05]
 
-1D1B1; [0D CC 3E, 05, 05]
+1D20B; [0D D5 50, 05, 05]
 
-1D1B2; [0D CC 46, 05, 05]
+1D20C; [0D D5 58, 05, 05]
 
-1D1B3; [0D CC 4E, 05, 05]
+1D20D; [0D D5 60, 05, 05]
 
-1D1B4; [0D CC 56, 05, 05]
+1D20E; [0D D5 68, 05, 05]
 
-1D1B5; [0D CC 5E, 05, 05]
+1D20F; [0D D5 70, 05, 05]
 
-1D1B6; [0D CC 66, 05, 05]
+1D210; [0D D5 78, 05, 05]
 
-1D1B7; [0D CC 6E, 05, 05]
+1D211; [0D D5 80, 05, 05]
 
-1D1B8; [0D CC 76, 05, 05]
+1D212; [0D D5 88, 05, 05]
 
-1D1B9; [0D CC 7E, 05, 05]
-1D1BB; [0D CC 7E, 05, 05]
-1D1BD; [0D CC 7E, 05, 05]
-1D1BF; [0D CC 7E, 05, 05]
+1D213; [0D D5 90, 05, 05]
 
-1D1BA; [0D CC 86, 05, 05]
-1D1BC; [0D CC 86, 05, 05]
-1D1BE; [0D CC 86, 05, 05]
-1D1C0; [0D CC 86, 05, 05]
+1D214; [0D D5 98, 05, 05]
 
-1D1C1; [0D CC 8E, 05, 05]
+1D215; [0D D5 A0, 05, 05]
 
-1D1C2; [0D CC 96, 05, 05]
+1D216; [0D D5 A8, 05, 05]
 
-1D1C3; [0D CC 9E, 05, 05]
+1D217; [0D D5 B0, 05, 05]
 
-1D1C4; [0D CC A6, 05, 05]
+1D218; [0D D5 B8, 05, 05]
 
-1D1C5; [0D CC AE, 05, 05]
+1D219; [0D D5 C0, 05, 05]
 
-1D1C6; [0D CC B6, 05, 05]
+1D21A; [0D D5 C8, 05, 05]
 
-1D1C7; [0D CC BE, 05, 05]
+1D21B; [0D D5 D0, 05, 05]
 
-1D1C8; [0D CC C6, 05, 05]
+1D21C; [0D D5 D8, 05, 05]
 
-1D1C9; [0D CC CE, 05, 05]
+1D21D; [0D D5 E0, 05, 05]
 
-1D1CA; [0D CC D6, 05, 05]
+1D21E; [0D D5 E8, 05, 05]
 
-1D1CB; [0D CC DE, 05, 05]
+1D21F; [0D D5 F0, 05, 05]
 
-1D1CC; [0D CC E6, 05, 05]
+1D220; [0D D5 F8, 05, 05]
 
-1D1CD; [0D CC EE, 05, 05]
+1D221; [0D D6 02, 05, 05]
 
-1D1CE; [0D CC F6, 05, 05]
+1D222; [0D D6 0A, 05, 05]
 
-1D1CF; [0D CD 04, 05, 05]
+1D223; [0D D6 12, 05, 05]
 
-1D1D0; [0D CD 0C, 05, 05]
+1D224; [0D D6 1A, 05, 05]
 
-1D1D1; [0D CD 14, 05, 05]
+1D225; [0D D6 22, 05, 05]
 
-1D1D2; [0D CD 1C, 05, 05]
+1D226; [0D D6 2A, 05, 05]
 
-1D1D3; [0D CD 24, 05, 05]
+1D227; [0D D6 32, 05, 05]
 
-1D1D4; [0D CD 2C, 05, 05]
+1D228; [0D D6 3A, 05, 05]
 
-1D1D5; [0D CD 34, 05, 05]
+1D229; [0D D6 42, 05, 05]
 
-1D1D6; [0D CD 3C, 05, 05]
+1D22A; [0D D6 4A, 05, 05]
 
-1D1D7; [0D CD 44, 05, 05]
+1D22B; [0D D6 52, 05, 05]
 
-1D1D8; [0D CD 4C, 05, 05]
+1D22C; [0D D6 5A, 05, 05]
 
-1D1D9; [0D CD 54, 05, 05]
+1D22D; [0D D6 62, 05, 05]
 
-1D1DA; [0D CD 5C, 05, 05]
+1D22E; [0D D6 6A, 05, 05]
 
-1D1DB; [0D CD 64, 05, 05]
+1D22F; [0D D6 72, 05, 05]
 
-1D1DC; [0D CD 6C, 05, 05]
+1D230; [0D D6 7A, 05, 05]
 
-1D1DD; [0D CD 74, 05, 05]
+1D231; [0D D6 82, 05, 05]
 
-1D200; [0D CD 7C, 05, 05]
+1D232; [0D D6 8A, 05, 05]
 
-1D201; [0D CD 84, 05, 05]
+1D233; [0D D6 92, 05, 05]
 
-1D202; [0D CD 8C, 05, 05]
+1D234; [0D D6 9A, 05, 05]
 
-1D203; [0D CD 94, 05, 05]
+1D235; [0D D6 A2, 05, 05]
 
-1D204; [0D CD 9C, 05, 05]
+1D236; [0D D6 AA, 05, 05]
 
-1D205; [0D CD A4, 05, 05]
+1D237; [0D D6 B2, 05, 05]
 
-1D206; [0D CD AC, 05, 05]
+1D238; [0D D6 BA, 05, 05]
 
-1D207; [0D CD B4, 05, 05]
+1D239; [0D D6 C2, 05, 05]
 
-1D208; [0D CD BC, 05, 05]
+1D23A; [0D D6 CA, 05, 05]
 
-1D209; [0D CD C4, 05, 05]
+1D23B; [0D D6 D2, 05, 05]
 
-1D20A; [0D CD CC, 05, 05]
+1D23C; [0D D6 DA, 05, 05]
 
-1D20B; [0D CD D4, 05, 05]
+1D23D; [0D D6 E2, 05, 05]
 
-1D20C; [0D CD DC, 05, 05]
+1D23E; [0D D6 EA, 05, 05]
 
-1D20D; [0D CD E4, 05, 05]
+1D23F; [0D D6 F2, 05, 05]
 
-1D20E; [0D CD EC, 05, 05]
+1D240; [0D D6 FA, 05, 05]
 
-1D20F; [0D CD F4, 05, 05]
+1D241; [0D D7 04, 05, 05]
 
-1D210; [0D CD FC, 05, 05]
+1D245; [0D D7 0C, 05, 05]
 
-1D211; [0D CE 0A, 05, 05]
+1F000; [0D D7 14, 05, 05]
 
-1D212; [0D CE 12, 05, 05]
+1F001; [0D D7 1C, 05, 05]
 
-1D213; [0D CE 1A, 05, 05]
+1F002; [0D D7 24, 05, 05]
 
-1D214; [0D CE 22, 05, 05]
+1F003; [0D D7 2C, 05, 05]
 
-1D215; [0D CE 2A, 05, 05]
+1F004; [0D D7 34, 05, 05]
 
-1D216; [0D CE 32, 05, 05]
+1F005; [0D D7 3C, 05, 05]
 
-1D217; [0D CE 3A, 05, 05]
+1F006; [0D D7 44, 05, 05]
 
-1D218; [0D CE 42, 05, 05]
+1F007; [0D D7 4C, 05, 05]
 
-1D219; [0D CE 4A, 05, 05]
+1F008; [0D D7 54, 05, 05]
 
-1D21A; [0D CE 52, 05, 05]
+1F009; [0D D7 5C, 05, 05]
 
-1D21B; [0D CE 5A, 05, 05]
+1F00A; [0D D7 64, 05, 05]
 
-1D21C; [0D CE 62, 05, 05]
+1F00B; [0D D7 6C, 05, 05]
 
-1D21D; [0D CE 6A, 05, 05]
+1F00C; [0D D7 74, 05, 05]
 
-1D21E; [0D CE 72, 05, 05]
+1F00D; [0D D7 7C, 05, 05]
 
-1D21F; [0D CE 7A, 05, 05]
+1F00E; [0D D7 84, 05, 05]
 
-1D220; [0D CE 82, 05, 05]
+1F00F; [0D D7 8C, 05, 05]
 
-1D221; [0D CE 8A, 05, 05]
+1F010; [0D D7 94, 05, 05]
 
-1D222; [0D CE 92, 05, 05]
+1F011; [0D D7 9C, 05, 05]
 
-1D223; [0D CE 9A, 05, 05]
+1F012; [0D D7 A4, 05, 05]
 
-1D224; [0D CE A2, 05, 05]
+1F013; [0D D7 AC, 05, 05]
 
-1D225; [0D CE AA, 05, 05]
+1F014; [0D D7 B4, 05, 05]
 
-1D226; [0D CE B2, 05, 05]
+1F015; [0D D7 BC, 05, 05]
 
-1D227; [0D CE BA, 05, 05]
+1F016; [0D D7 C4, 05, 05]
 
-1D228; [0D CE C2, 05, 05]
+1F017; [0D D7 CC, 05, 05]
 
-1D229; [0D CE CA, 05, 05]
+1F018; [0D D7 D4, 05, 05]
 
-1D22A; [0D CE D2, 05, 05]
+1F019; [0D D7 DC, 05, 05]
 
-1D22B; [0D CE DA, 05, 05]
+1F01A; [0D D7 E4, 05, 05]
 
-1D22C; [0D CE E2, 05, 05]
+1F01B; [0D D7 EC, 05, 05]
 
-1D22D; [0D CE EA, 05, 05]
+1F01C; [0D D7 F4, 05, 05]
 
-1D22E; [0D CE F2, 05, 05]
+1F01D; [0D D7 FC, 05, 05]
 
-1D22F; [0D CE FA, 05, 05]
+1F01E; [0D D8 06, 05, 05]
 
-1D230; [0D CF 08, 05, 05]
+1F01F; [0D D8 0E, 05, 05]
 
-1D231; [0D CF 10, 05, 05]
+1F020; [0D D8 16, 05, 05]
 
-1D232; [0D CF 18, 05, 05]
+1F021; [0D D8 1E, 05, 05]
 
-1D233; [0D CF 20, 05, 05]
+1F022; [0D D8 26, 05, 05]
 
-1D234; [0D CF 28, 05, 05]
+1F023; [0D D8 2E, 05, 05]
 
-1D235; [0D CF 30, 05, 05]
+1F024; [0D D8 36, 05, 05]
 
-1D236; [0D CF 38, 05, 05]
+1F025; [0D D8 3E, 05, 05]
 
-1D237; [0D CF 40, 05, 05]
+1F026; [0D D8 46, 05, 05]
 
-1D238; [0D CF 48, 05, 05]
+1F027; [0D D8 4E, 05, 05]
 
-1D239; [0D CF 50, 05, 05]
+1F028; [0D D8 56, 05, 05]
 
-1D23A; [0D CF 58, 05, 05]
+1F029; [0D D8 5E, 05, 05]
 
-1D23B; [0D CF 60, 05, 05]
+1F02A; [0D D8 66, 05, 05]
 
-1D23C; [0D CF 68, 05, 05]
+1F02B; [0D D8 6E, 05, 05]
 
-1D23D; [0D CF 70, 05, 05]
+1F030; [0D D8 76, 05, 05]
 
-1D23E; [0D CF 78, 05, 05]
+1F031; [0D D8 7E, 05, 05]
 
-1D23F; [0D CF 80, 05, 05]
+1F032; [0D D8 86, 05, 05]
 
-1D240; [0D CF 88, 05, 05]
+1F033; [0D D8 8E, 05, 05]
 
-1D241; [0D CF 90, 05, 05]
+1F034; [0D D8 96, 05, 05]
 
-1D245; [0D CF 98, 05, 05]
+1F035; [0D D8 9E, 05, 05]
 
-1F000; [0D CF A0, 05, 05]
+1F036; [0D D8 A6, 05, 05]
 
-1F001; [0D CF A8, 05, 05]
+1F037; [0D D8 AE, 05, 05]
 
-1F002; [0D CF B0, 05, 05]
+1F038; [0D D8 B6, 05, 05]
 
-1F003; [0D CF B8, 05, 05]
+1F039; [0D D8 BE, 05, 05]
 
-1F004; [0D CF C0, 05, 05]
+1F03A; [0D D8 C6, 05, 05]
 
-1F005; [0D CF C8, 05, 05]
+1F03B; [0D D8 CE, 05, 05]
 
-1F006; [0D CF D0, 05, 05]
+1F03C; [0D D8 D6, 05, 05]
 
-1F007; [0D CF D8, 05, 05]
+1F03D; [0D D8 DE, 05, 05]
 
-1F008; [0D CF E0, 05, 05]
+1F03E; [0D D8 E6, 05, 05]
 
-1F009; [0D CF E8, 05, 05]
+1F03F; [0D D8 EE, 05, 05]
 
-1F00A; [0D CF F0, 05, 05]
+1F040; [0D D8 F6, 05, 05]
 
-1F00B; [0D CF F8, 05, 05]
+1F041; [0D D8 FE, 05, 05]
 
-1F00C; [0D D0 06, 05, 05]
+1F042; [0D D9 08, 05, 05]
 
-1F00D; [0D D0 0E, 05, 05]
+1F043; [0D D9 10, 05, 05]
 
-1F00E; [0D D0 16, 05, 05]
+1F044; [0D D9 18, 05, 05]
 
-1F00F; [0D D0 1E, 05, 05]
+1F045; [0D D9 20, 05, 05]
 
-1F010; [0D D0 26, 05, 05]
+1F046; [0D D9 28, 05, 05]
 
-1F011; [0D D0 2E, 05, 05]
+1F047; [0D D9 30, 05, 05]
 
-1F012; [0D D0 36, 05, 05]
+1F048; [0D D9 38, 05, 05]
 
-1F013; [0D D0 3E, 05, 05]
+1F049; [0D D9 40, 05, 05]
 
-1F014; [0D D0 46, 05, 05]
+1F04A; [0D D9 48, 05, 05]
 
-1F015; [0D D0 4E, 05, 05]
+1F04B; [0D D9 50, 05, 05]
 
-1F016; [0D D0 56, 05, 05]
+1F04C; [0D D9 58, 05, 05]
 
-1F017; [0D D0 5E, 05, 05]
+1F04D; [0D D9 60, 05, 05]
 
-1F018; [0D D0 66, 05, 05]
+1F04E; [0D D9 68, 05, 05]
 
-1F019; [0D D0 6E, 05, 05]
+1F04F; [0D D9 70, 05, 05]
 
-1F01A; [0D D0 76, 05, 05]
+1F050; [0D D9 78, 05, 05]
 
-1F01B; [0D D0 7E, 05, 05]
+1F051; [0D D9 80, 05, 05]
 
-1F01C; [0D D0 86, 05, 05]
+1F052; [0D D9 88, 05, 05]
 
-1F01D; [0D D0 8E, 05, 05]
+1F053; [0D D9 90, 05, 05]
 
-1F01E; [0D D0 96, 05, 05]
+1F054; [0D D9 98, 05, 05]
 
-1F01F; [0D D0 9E, 05, 05]
+1F055; [0D D9 A0, 05, 05]
 
-1F020; [0D D0 A6, 05, 05]
+1F056; [0D D9 A8, 05, 05]
 
-1F021; [0D D0 AE, 05, 05]
+1F057; [0D D9 B0, 05, 05]
 
-1F022; [0D D0 B6, 05, 05]
+1F058; [0D D9 B8, 05, 05]
 
-1F023; [0D D0 BE, 05, 05]
+1F059; [0D D9 C0, 05, 05]
 
-1F024; [0D D0 C6, 05, 05]
+1F05A; [0D D9 C8, 05, 05]
 
-1F025; [0D D0 CE, 05, 05]
+1F05B; [0D D9 D0, 05, 05]
 
-1F026; [0D D0 D6, 05, 05]
+1F05C; [0D D9 D8, 05, 05]
 
-1F027; [0D D0 DE, 05, 05]
+1F05D; [0D D9 E0, 05, 05]
 
-1F028; [0D D0 E6, 05, 05]
+1F05E; [0D D9 E8, 05, 05]
 
-1F029; [0D D0 EE, 05, 05]
+1F05F; [0D D9 F0, 05, 05]
 
-1F02A; [0D D0 F6, 05, 05]
+1F060; [0D D9 F8, 05, 05]
 
-1F02B; [0D D1 04, 05, 05]
+1F061; [0D DA 02, 05, 05]
 
-1F030; [0D D1 0C, 05, 05]
+1F062; [0D DA 0A, 05, 05]
 
-1F031; [0D D1 14, 05, 05]
+1F063; [0D DA 12, 05, 05]
 
-1F032; [0D D1 1C, 05, 05]
+1F064; [0D DA 1A, 05, 05]
 
-1F033; [0D D1 24, 05, 05]
+1F065; [0D DA 22, 05, 05]
 
-1F034; [0D D1 2C, 05, 05]
+1F066; [0D DA 2A, 05, 05]
 
-1F035; [0D D1 34, 05, 05]
+1F067; [0D DA 32, 05, 05]
 
-1F036; [0D D1 3C, 05, 05]
+1F068; [0D DA 3A, 05, 05]
 
-1F037; [0D D1 44, 05, 05]
+1F069; [0D DA 42, 05, 05]
 
-1F038; [0D D1 4C, 05, 05]
+1F06A; [0D DA 4A, 05, 05]
 
-1F039; [0D D1 54, 05, 05]
+1F06B; [0D DA 52, 05, 05]
 
-1F03A; [0D D1 5C, 05, 05]
+1F06C; [0D DA 5A, 05, 05]
 
-1F03B; [0D D1 64, 05, 05]
+1F06D; [0D DA 62, 05, 05]
 
-1F03C; [0D D1 6C, 05, 05]
+1F06E; [0D DA 6A, 05, 05]
 
-1F03D; [0D D1 74, 05, 05]
+1F06F; [0D DA 72, 05, 05]
 
-1F03E; [0D D1 7C, 05, 05]
+1F070; [0D DA 7A, 05, 05]
 
-1F03F; [0D D1 84, 05, 05]
+1F071; [0D DA 82, 05, 05]
 
-1F040; [0D D1 8C, 05, 05]
+1F072; [0D DA 8A, 05, 05]
 
-1F041; [0D D1 94, 05, 05]
+1F073; [0D DA 92, 05, 05]
 
-1F042; [0D D1 9C, 05, 05]
+1F074; [0D DA 9A, 05, 05]
 
-1F043; [0D D1 A4, 05, 05]
+1F075; [0D DA A2, 05, 05]
 
-1F044; [0D D1 AC, 05, 05]
+1F076; [0D DA AA, 05, 05]
 
-1F045; [0D D1 B4, 05, 05]
+1F077; [0D DA B2, 05, 05]
 
-1F046; [0D D1 BC, 05, 05]
+1F078; [0D DA BA, 05, 05]
 
-1F047; [0D D1 C4, 05, 05]
+1F079; [0D DA C2, 05, 05]
 
-1F048; [0D D1 CC, 05, 05]
+1F07A; [0D DA CA, 05, 05]
 
-1F049; [0D D1 D4, 05, 05]
+1F07B; [0D DA D2, 05, 05]
 
-1F04A; [0D D1 DC, 05, 05]
+1F07C; [0D DA DA, 05, 05]
 
-1F04B; [0D D1 E4, 05, 05]
+1F07D; [0D DA E2, 05, 05]
 
-1F04C; [0D D1 EC, 05, 05]
+1F07E; [0D DA EA, 05, 05]
 
-1F04D; [0D D1 F4, 05, 05]
+1F07F; [0D DA F2, 05, 05]
 
-1F04E; [0D D1 FC, 05, 05]
+1F080; [0D DA FA, 05, 05]
 
-1F04F; [0D D2 0A, 05, 05]
+1F081; [0D DB 04, 05, 05]
 
-1F050; [0D D2 12, 05, 05]
+1F082; [0D DB 0C, 05, 05]
 
-1F051; [0D D2 1A, 05, 05]
+1F083; [0D DB 14, 05, 05]
 
-1F052; [0D D2 22, 05, 05]
+1F084; [0D DB 1C, 05, 05]
 
-1F053; [0D D2 2A, 05, 05]
+1F085; [0D DB 24, 05, 05]
 
-1F054; [0D D2 32, 05, 05]
+1F086; [0D DB 2C, 05, 05]
 
-1F055; [0D D2 3A, 05, 05]
+1F087; [0D DB 34, 05, 05]
 
-1F056; [0D D2 42, 05, 05]
+1F088; [0D DB 3C, 05, 05]
 
-1F057; [0D D2 4A, 05, 05]
+1F089; [0D DB 44, 05, 05]
 
-1F058; [0D D2 52, 05, 05]
+1F08A; [0D DB 4C, 05, 05]
 
-1F059; [0D D2 5A, 05, 05]
+1F08B; [0D DB 54, 05, 05]
 
-1F05A; [0D D2 62, 05, 05]
+1F08C; [0D DB 5C, 05, 05]
 
-1F05B; [0D D2 6A, 05, 05]
+1F08D; [0D DB 64, 05, 05]
 
-1F05C; [0D D2 72, 05, 05]
+1F08E; [0D DB 6C, 05, 05]
 
-1F05D; [0D D2 7A, 05, 05]
+1F08F; [0D DB 74, 05, 05]
 
-1F05E; [0D D2 82, 05, 05]
+1F090; [0D DB 7C, 05, 05]
 
-1F05F; [0D D2 8A, 05, 05]
+1F091; [0D DB 84, 05, 05]
 
-1F060; [0D D2 92, 05, 05]
+1F092; [0D DB 8C, 05, 05]
 
-1F061; [0D D2 9A, 05, 05]
+1F093; [0D DB 94, 05, 05]
 
-1F062; [0D D2 A2, 05, 05]
+1F0A0; [0D DB 9C, 05, 05]
 
-1F063; [0D D2 AA, 05, 05]
+1F0A1; [0D DB A4, 05, 05]
 
-1F064; [0D D2 B2, 05, 05]
+1F0A2; [0D DB AC, 05, 05]
 
-1F065; [0D D2 BA, 05, 05]
+1F0A3; [0D DB B4, 05, 05]
 
-1F066; [0D D2 C2, 05, 05]
+1F0A4; [0D DB BC, 05, 05]
 
-1F067; [0D D2 CA, 05, 05]
+1F0A5; [0D DB C4, 05, 05]
 
-1F068; [0D D2 D2, 05, 05]
+1F0A6; [0D DB CC, 05, 05]
 
-1F069; [0D D2 DA, 05, 05]
+1F0A7; [0D DB D4, 05, 05]
 
-1F06A; [0D D2 E2, 05, 05]
+1F0A8; [0D DB DC, 05, 05]
 
-1F06B; [0D D2 EA, 05, 05]
+1F0A9; [0D DB E4, 05, 05]
 
-1F06C; [0D D2 F2, 05, 05]
+1F0AA; [0D DB EC, 05, 05]
 
-1F06D; [0D D2 FA, 05, 05]
+1F0AB; [0D DB F4, 05, 05]
 
-1F06E; [0D D3 08, 05, 05]
+1F0AC; [0D DB FC, 05, 05]
 
-1F06F; [0D D3 10, 05, 05]
+1F0AD; [0D DC 06, 05, 05]
 
-1F070; [0D D3 18, 05, 05]
+1F0AE; [0D DC 0E, 05, 05]
 
-1F071; [0D D3 20, 05, 05]
+1F0B1; [0D DC 16, 05, 05]
 
-1F072; [0D D3 28, 05, 05]
+1F0B2; [0D DC 1E, 05, 05]
 
-1F073; [0D D3 30, 05, 05]
+1F0B3; [0D DC 26, 05, 05]
 
-1F074; [0D D3 38, 05, 05]
+1F0B4; [0D DC 2E, 05, 05]
 
-1F075; [0D D3 40, 05, 05]
+1F0B5; [0D DC 36, 05, 05]
 
-1F076; [0D D3 48, 05, 05]
+1F0B6; [0D DC 3E, 05, 05]
 
-1F077; [0D D3 50, 05, 05]
+1F0B7; [0D DC 46, 05, 05]
 
-1F078; [0D D3 58, 05, 05]
+1F0B8; [0D DC 4E, 05, 05]
 
-1F079; [0D D3 60, 05, 05]
+1F0B9; [0D DC 56, 05, 05]
 
-1F07A; [0D D3 68, 05, 05]
+1F0BA; [0D DC 5E, 05, 05]
 
-1F07B; [0D D3 70, 05, 05]
+1F0BB; [0D DC 66, 05, 05]
 
-1F07C; [0D D3 78, 05, 05]
+1F0BC; [0D DC 6E, 05, 05]
 
-1F07D; [0D D3 80, 05, 05]
+1F0BD; [0D DC 76, 05, 05]
 
-1F07E; [0D D3 88, 05, 05]
+1F0BE; [0D DC 7E, 05, 05]
 
-1F07F; [0D D3 90, 05, 05]
+1F0C1; [0D DC 86, 05, 05]
 
-1F080; [0D D3 98, 05, 05]
+1F0C2; [0D DC 8E, 05, 05]
 
-1F081; [0D D3 A0, 05, 05]
+1F0C3; [0D DC 96, 05, 05]
 
-1F082; [0D D3 A8, 05, 05]
+1F0C4; [0D DC 9E, 05, 05]
 
-1F083; [0D D3 B0, 05, 05]
+1F0C5; [0D DC A6, 05, 05]
 
-1F084; [0D D3 B8, 05, 05]
+1F0C6; [0D DC AE, 05, 05]
 
-1F085; [0D D3 C0, 05, 05]
+1F0C7; [0D DC B6, 05, 05]
 
-1F086; [0D D3 C8, 05, 05]
+1F0C8; [0D DC BE, 05, 05]
 
-1F087; [0D D3 D0, 05, 05]
+1F0C9; [0D DC C6, 05, 05]
 
-1F088; [0D D3 D8, 05, 05]
+1F0CA; [0D DC CE, 05, 05]
 
-1F089; [0D D3 E0, 05, 05]
+1F0CB; [0D DC D6, 05, 05]
 
-1F08A; [0D D3 E8, 05, 05]
+1F0CC; [0D DC DE, 05, 05]
 
-1F08B; [0D D3 F0, 05, 05]
+1F0CD; [0D DC E6, 05, 05]
 
-1F08C; [0D D3 F8, 05, 05]
+1F0CE; [0D DC EE, 05, 05]
 
-1F08D; [0D D4 06, 05, 05]
+1F0CF; [0D DC F6, 05, 05]
 
-1F08E; [0D D4 0E, 05, 05]
+1F0D1; [0D DC FE, 05, 05]
 
-1F08F; [0D D4 16, 05, 05]
+1F0D2; [0D DD 08, 05, 05]
 
-1F090; [0D D4 1E, 05, 05]
+1F0D3; [0D DD 10, 05, 05]
 
-1F091; [0D D4 26, 05, 05]
+1F0D4; [0D DD 18, 05, 05]
 
-1F092; [0D D4 2E, 05, 05]
+1F0D5; [0D DD 20, 05, 05]
 
-1F093; [0D D4 36, 05, 05]
+1F0D6; [0D DD 28, 05, 05]
 
-1F0A0; [0D D4 3E, 05, 05]
+1F0D7; [0D DD 30, 05, 05]
 
-1F0A1; [0D D4 46, 05, 05]
+1F0D8; [0D DD 38, 05, 05]
 
-1F0A2; [0D D4 4E, 05, 05]
+1F0D9; [0D DD 40, 05, 05]
 
-1F0A3; [0D D4 56, 05, 05]
+1F0DA; [0D DD 48, 05, 05]
 
-1F0A4; [0D D4 5E, 05, 05]
+1F0DB; [0D DD 50, 05, 05]
 
-1F0A5; [0D D4 66, 05, 05]
+1F0DC; [0D DD 58, 05, 05]
 
-1F0A6; [0D D4 6E, 05, 05]
+1F0DD; [0D DD 60, 05, 05]
 
-1F0A7; [0D D4 76, 05, 05]
+1F0DE; [0D DD 68, 05, 05]
 
-1F0A8; [0D D4 7E, 05, 05]
+1F0DF; [0D DD 70, 05, 05]
 
-1F0A9; [0D D4 86, 05, 05]
+1F300; [0D DD 78, 05, 05]
 
-1F0AA; [0D D4 8E, 05, 05]
+1F301; [0D DD 80, 05, 05]
 
-1F0AB; [0D D4 96, 05, 05]
+1F302; [0D DD 88, 05, 05]
 
-1F0AC; [0D D4 9E, 05, 05]
+1F303; [0D DD 90, 05, 05]
 
-1F0AD; [0D D4 A6, 05, 05]
+1F304; [0D DD 98, 05, 05]
 
-1F0AE; [0D D4 AE, 05, 05]
+1F305; [0D DD A0, 05, 05]
 
-1F0B1; [0D D4 B6, 05, 05]
+1F306; [0D DD A8, 05, 05]
 
-1F0B2; [0D D4 BE, 05, 05]
+1F307; [0D DD B0, 05, 05]
 
-1F0B3; [0D D4 C6, 05, 05]
+1F308; [0D DD B8, 05, 05]
 
-1F0B4; [0D D4 CE, 05, 05]
+1F309; [0D DD C0, 05, 05]
 
-1F0B5; [0D D4 D6, 05, 05]
+1F30A; [0D DD C8, 05, 05]
 
-1F0B6; [0D D4 DE, 05, 05]
+1F30B; [0D DD D0, 05, 05]
 
-1F0B7; [0D D4 E6, 05, 05]
+1F30C; [0D DD D8, 05, 05]
 
-1F0B8; [0D D4 EE, 05, 05]
+1F30D; [0D DD E0, 05, 05]
 
-1F0B9; [0D D4 F6, 05, 05]
+1F30E; [0D DD E8, 05, 05]
 
-1F0BA; [0D D5 04, 05, 05]
+1F30F; [0D DD F0, 05, 05]
 
-1F0BB; [0D D5 0C, 05, 05]
+1F310; [0D DD F8, 05, 05]
 
-1F0BC; [0D D5 14, 05, 05]
+1F311; [0D DE 02, 05, 05]
 
-1F0BD; [0D D5 1C, 05, 05]
+1F312; [0D DE 0A, 05, 05]
 
-1F0BE; [0D D5 24, 05, 05]
+1F313; [0D DE 12, 05, 05]
 
-1F0C1; [0D D5 2C, 05, 05]
+1F314; [0D DE 1A, 05, 05]
 
-1F0C2; [0D D5 34, 05, 05]
+1F315; [0D DE 22, 05, 05]
 
-1F0C3; [0D D5 3C, 05, 05]
+1F316; [0D DE 2A, 05, 05]
 
-1F0C4; [0D D5 44, 05, 05]
+1F317; [0D DE 32, 05, 05]
 
-1F0C5; [0D D5 4C, 05, 05]
+1F318; [0D DE 3A, 05, 05]
 
-1F0C6; [0D D5 54, 05, 05]
+1F319; [0D DE 42, 05, 05]
 
-1F0C7; [0D D5 5C, 05, 05]
+1F31A; [0D DE 4A, 05, 05]
 
-1F0C8; [0D D5 64, 05, 05]
+1F31B; [0D DE 52, 05, 05]
 
-1F0C9; [0D D5 6C, 05, 05]
+1F31C; [0D DE 5A, 05, 05]
 
-1F0CA; [0D D5 74, 05, 05]
+1F31D; [0D DE 62, 05, 05]
 
-1F0CB; [0D D5 7C, 05, 05]
+1F31E; [0D DE 6A, 05, 05]
 
-1F0CC; [0D D5 84, 05, 05]
+1F31F; [0D DE 72, 05, 05]
 
-1F0CD; [0D D5 8C, 05, 05]
+1F320; [0D DE 7A, 05, 05]
 
-1F0CE; [0D D5 94, 05, 05]
+1F330; [0D DE 82, 05, 05]
 
-1F0CF; [0D D5 9C, 05, 05]
+1F331; [0D DE 8A, 05, 05]
 
-1F0D1; [0D D5 A4, 05, 05]
+1F332; [0D DE 92, 05, 05]
 
-1F0D2; [0D D5 AC, 05, 05]
+1F333; [0D DE 9A, 05, 05]
 
-1F0D3; [0D D5 B4, 05, 05]
+1F334; [0D DE A2, 05, 05]
 
-1F0D4; [0D D5 BC, 05, 05]
+1F335; [0D DE AA, 05, 05]
 
-1F0D5; [0D D5 C4, 05, 05]
+1F337; [0D DE B2, 05, 05]
 
-1F0D6; [0D D5 CC, 05, 05]
+1F338; [0D DE BA, 05, 05]
 
-1F0D7; [0D D5 D4, 05, 05]
+1F339; [0D DE C2, 05, 05]
 
-1F0D8; [0D D5 DC, 05, 05]
+1F33A; [0D DE CA, 05, 05]
 
-1F0D9; [0D D5 E4, 05, 05]
+1F33B; [0D DE D2, 05, 05]
 
-1F0DA; [0D D5 EC, 05, 05]
+1F33C; [0D DE DA, 05, 05]
 
-1F0DB; [0D D5 F4, 05, 05]
+1F33D; [0D DE E2, 05, 05]
 
-1F0DC; [0D D5 FC, 05, 05]
+1F33E; [0D DE EA, 05, 05]
 
-1F0DD; [0D D6 0A, 05, 05]
+1F33F; [0D DE F2, 05, 05]
 
-1F0DE; [0D D6 12, 05, 05]
+1F340; [0D DE FA, 05, 05]
 
-1F0DF; [0D D6 1A, 05, 05]
+1F341; [0D DF 04, 05, 05]
 
-1F300; [0D D6 22, 05, 05]
+1F342; [0D DF 0C, 05, 05]
 
-1F301; [0D D6 2A, 05, 05]
+1F343; [0D DF 14, 05, 05]
 
-1F302; [0D D6 32, 05, 05]
+1F344; [0D DF 1C, 05, 05]
 
-1F303; [0D D6 3A, 05, 05]
+1F345; [0D DF 24, 05, 05]
 
-1F304; [0D D6 42, 05, 05]
+1F346; [0D DF 2C, 05, 05]
 
-1F305; [0D D6 4A, 05, 05]
+1F347; [0D DF 34, 05, 05]
 
-1F306; [0D D6 52, 05, 05]
+1F348; [0D DF 3C, 05, 05]
 
-1F307; [0D D6 5A, 05, 05]
+1F349; [0D DF 44, 05, 05]
 
-1F308; [0D D6 62, 05, 05]
+1F34A; [0D DF 4C, 05, 05]
 
-1F309; [0D D6 6A, 05, 05]
+1F34B; [0D DF 54, 05, 05]
 
-1F30A; [0D D6 72, 05, 05]
+1F34C; [0D DF 5C, 05, 05]
 
-1F30B; [0D D6 7A, 05, 05]
+1F34D; [0D DF 64, 05, 05]
 
-1F30C; [0D D6 82, 05, 05]
+1F34E; [0D DF 6C, 05, 05]
 
-1F30D; [0D D6 8A, 05, 05]
+1F34F; [0D DF 74, 05, 05]
 
-1F30E; [0D D6 92, 05, 05]
+1F350; [0D DF 7C, 05, 05]
 
-1F30F; [0D D6 9A, 05, 05]
+1F351; [0D DF 84, 05, 05]
 
-1F310; [0D D6 A2, 05, 05]
+1F352; [0D DF 8C, 05, 05]
 
-1F311; [0D D6 AA, 05, 05]
+1F353; [0D DF 94, 05, 05]
 
-1F312; [0D D6 B2, 05, 05]
+1F354; [0D DF 9C, 05, 05]
 
-1F313; [0D D6 BA, 05, 05]
+1F355; [0D DF A4, 05, 05]
 
-1F314; [0D D6 C2, 05, 05]
+1F356; [0D DF AC, 05, 05]
 
-1F315; [0D D6 CA, 05, 05]
+1F357; [0D DF B4, 05, 05]
 
-1F316; [0D D6 D2, 05, 05]
+1F358; [0D DF BC, 05, 05]
 
-1F317; [0D D6 DA, 05, 05]
+1F359; [0D DF C4, 05, 05]
 
-1F318; [0D D6 E2, 05, 05]
+1F35A; [0D DF CC, 05, 05]
 
-1F319; [0D D6 EA, 05, 05]
+1F35B; [0D DF D4, 05, 05]
 
-1F31A; [0D D6 F2, 05, 05]
+1F35C; [0D DF DC, 05, 05]
 
-1F31B; [0D D6 FA, 05, 05]
+1F35D; [0D DF E4, 05, 05]
 
-1F31C; [0D D7 08, 05, 05]
+1F35E; [0D DF EC, 05, 05]
 
-1F31D; [0D D7 10, 05, 05]
+1F35F; [0D DF F4, 05, 05]
 
-1F31E; [0D D7 18, 05, 05]
+1F360; [0D DF FC, 05, 05]
 
-1F31F; [0D D7 20, 05, 05]
+1F361; [0D E0 06, 05, 05]
 
-1F320; [0D D7 28, 05, 05]
+1F362; [0D E0 0E, 05, 05]
 
-1F330; [0D D7 30, 05, 05]
+1F363; [0D E0 16, 05, 05]
 
-1F331; [0D D7 38, 05, 05]
+1F364; [0D E0 1E, 05, 05]
 
-1F332; [0D D7 40, 05, 05]
+1F365; [0D E0 26, 05, 05]
 
-1F333; [0D D7 48, 05, 05]
+1F366; [0D E0 2E, 05, 05]
 
-1F334; [0D D7 50, 05, 05]
+1F367; [0D E0 36, 05, 05]
 
-1F335; [0D D7 58, 05, 05]
+1F368; [0D E0 3E, 05, 05]
 
-1F337; [0D D7 60, 05, 05]
+1F369; [0D E0 46, 05, 05]
 
-1F338; [0D D7 68, 05, 05]
+1F36A; [0D E0 4E, 05, 05]
 
-1F339; [0D D7 70, 05, 05]
+1F36B; [0D E0 56, 05, 05]
 
-1F33A; [0D D7 78, 05, 05]
+1F36C; [0D E0 5E, 05, 05]
 
-1F33B; [0D D7 80, 05, 05]
+1F36D; [0D E0 66, 05, 05]
 
-1F33C; [0D D7 88, 05, 05]
+1F36E; [0D E0 6E, 05, 05]
 
-1F33D; [0D D7 90, 05, 05]
+1F36F; [0D E0 76, 05, 05]
 
-1F33E; [0D D7 98, 05, 05]
+1F370; [0D E0 7E, 05, 05]
 
-1F33F; [0D D7 A0, 05, 05]
+1F371; [0D E0 86, 05, 05]
 
-1F340; [0D D7 A8, 05, 05]
+1F372; [0D E0 8E, 05, 05]
 
-1F341; [0D D7 B0, 05, 05]
+1F373; [0D E0 96, 05, 05]
 
-1F342; [0D D7 B8, 05, 05]
+1F374; [0D E0 9E, 05, 05]
 
-1F343; [0D D7 C0, 05, 05]
+1F375; [0D E0 A6, 05, 05]
 
-1F344; [0D D7 C8, 05, 05]
+1F376; [0D E0 AE, 05, 05]
 
-1F345; [0D D7 D0, 05, 05]
+1F377; [0D E0 B6, 05, 05]
 
-1F346; [0D D7 D8, 05, 05]
+1F378; [0D E0 BE, 05, 05]
 
-1F347; [0D D7 E0, 05, 05]
+1F379; [0D E0 C6, 05, 05]
 
-1F348; [0D D7 E8, 05, 05]
+1F37A; [0D E0 CE, 05, 05]
 
-1F349; [0D D7 F0, 05, 05]
+1F37B; [0D E0 D6, 05, 05]
 
-1F34A; [0D D7 F8, 05, 05]
+1F37C; [0D E0 DE, 05, 05]
 
-1F34B; [0D D8 06, 05, 05]
+1F380; [0D E0 E6, 05, 05]
 
-1F34C; [0D D8 0E, 05, 05]
+1F381; [0D E0 EE, 05, 05]
 
-1F34D; [0D D8 16, 05, 05]
+1F382; [0D E0 F6, 05, 05]
 
-1F34E; [0D D8 1E, 05, 05]
+1F383; [0D E0 FE, 05, 05]
 
-1F34F; [0D D8 26, 05, 05]
+1F384; [0D E1 08, 05, 05]
 
-1F350; [0D D8 2E, 05, 05]
+1F385; [0D E1 10, 05, 05]
 
-1F351; [0D D8 36, 05, 05]
+1F386; [0D E1 18, 05, 05]
 
-1F352; [0D D8 3E, 05, 05]
+1F387; [0D E1 20, 05, 05]
 
-1F353; [0D D8 46, 05, 05]
+1F388; [0D E1 28, 05, 05]
 
-1F354; [0D D8 4E, 05, 05]
+1F389; [0D E1 30, 05, 05]
 
-1F355; [0D D8 56, 05, 05]
+1F38A; [0D E1 38, 05, 05]
 
-1F356; [0D D8 5E, 05, 05]
+1F38B; [0D E1 40, 05, 05]
 
-1F357; [0D D8 66, 05, 05]
+1F38C; [0D E1 48, 05, 05]
 
-1F358; [0D D8 6E, 05, 05]
+1F38D; [0D E1 50, 05, 05]
 
-1F359; [0D D8 76, 05, 05]
+1F38E; [0D E1 58, 05, 05]
 
-1F35A; [0D D8 7E, 05, 05]
+1F38F; [0D E1 60, 05, 05]
 
-1F35B; [0D D8 86, 05, 05]
+1F390; [0D E1 68, 05, 05]
 
-1F35C; [0D D8 8E, 05, 05]
+1F391; [0D E1 70, 05, 05]
 
-1F35D; [0D D8 96, 05, 05]
+1F392; [0D E1 78, 05, 05]
 
-1F35E; [0D D8 9E, 05, 05]
+1F393; [0D E1 80, 05, 05]
 
-1F35F; [0D D8 A6, 05, 05]
+1F3A0; [0D E1 88, 05, 05]
 
-1F360; [0D D8 AE, 05, 05]
+1F3A1; [0D E1 90, 05, 05]
 
-1F361; [0D D8 B6, 05, 05]
+1F3A2; [0D E1 98, 05, 05]
 
-1F362; [0D D8 BE, 05, 05]
+1F3A3; [0D E1 A0, 05, 05]
 
-1F363; [0D D8 C6, 05, 05]
+1F3A4; [0D E1 A8, 05, 05]
 
-1F364; [0D D8 CE, 05, 05]
+1F3A5; [0D E1 B0, 05, 05]
 
-1F365; [0D D8 D6, 05, 05]
+1F3A6; [0D E1 B8, 05, 05]
 
-1F366; [0D D8 DE, 05, 05]
+1F3A7; [0D E1 C0, 05, 05]
 
-1F367; [0D D8 E6, 05, 05]
+1F3A8; [0D E1 C8, 05, 05]
 
-1F368; [0D D8 EE, 05, 05]
+1F3A9; [0D E1 D0, 05, 05]
 
-1F369; [0D D8 F6, 05, 05]
+1F3AA; [0D E1 D8, 05, 05]
 
-1F36A; [0D D9 04, 05, 05]
+1F3AB; [0D E1 E0, 05, 05]
 
-1F36B; [0D D9 0C, 05, 05]
+1F3AC; [0D E1 E8, 05, 05]
 
-1F36C; [0D D9 14, 05, 05]
+1F3AD; [0D E1 F0, 05, 05]
 
-1F36D; [0D D9 1C, 05, 05]
+1F3AE; [0D E1 F8, 05, 05]
 
-1F36E; [0D D9 24, 05, 05]
+1F3AF; [0D E2 02, 05, 05]
 
-1F36F; [0D D9 2C, 05, 05]
+1F3B0; [0D E2 0A, 05, 05]
 
-1F370; [0D D9 34, 05, 05]
+1F3B1; [0D E2 12, 05, 05]
 
-1F371; [0D D9 3C, 05, 05]
+1F3B2; [0D E2 1A, 05, 05]
 
-1F372; [0D D9 44, 05, 05]
+1F3B3; [0D E2 22, 05, 05]
 
-1F373; [0D D9 4C, 05, 05]
+1F3B4; [0D E2 2A, 05, 05]
 
-1F374; [0D D9 54, 05, 05]
+1F3B5; [0D E2 32, 05, 05]
 
-1F375; [0D D9 5C, 05, 05]
+1F3B6; [0D E2 3A, 05, 05]
 
-1F376; [0D D9 64, 05, 05]
+1F3B7; [0D E2 42, 05, 05]
 
-1F377; [0D D9 6C, 05, 05]
+1F3B8; [0D E2 4A, 05, 05]
 
-1F378; [0D D9 74, 05, 05]
+1F3B9; [0D E2 52, 05, 05]
 
-1F379; [0D D9 7C, 05, 05]
+1F3BA; [0D E2 5A, 05, 05]
 
-1F37A; [0D D9 84, 05, 05]
+1F3BB; [0D E2 62, 05, 05]
 
-1F37B; [0D D9 8C, 05, 05]
+1F3BC; [0D E2 6A, 05, 05]
 
-1F37C; [0D D9 94, 05, 05]
+1F3BD; [0D E2 72, 05, 05]
 
-1F380; [0D D9 9C, 05, 05]
+1F3BE; [0D E2 7A, 05, 05]
 
-1F381; [0D D9 A4, 05, 05]
+1F3BF; [0D E2 82, 05, 05]
 
-1F382; [0D D9 AC, 05, 05]
+1F3C0; [0D E2 8A, 05, 05]
 
-1F383; [0D D9 B4, 05, 05]
+1F3C1; [0D E2 92, 05, 05]
 
-1F384; [0D D9 BC, 05, 05]
+1F3C2; [0D E2 9A, 05, 05]
 
-1F385; [0D D9 C4, 05, 05]
+1F3C3; [0D E2 A2, 05, 05]
 
-1F386; [0D D9 CC, 05, 05]
+1F3C4; [0D E2 AA, 05, 05]
 
-1F387; [0D D9 D4, 05, 05]
+1F3C6; [0D E2 B2, 05, 05]
 
-1F388; [0D D9 DC, 05, 05]
+1F3C7; [0D E2 BA, 05, 05]
 
-1F389; [0D D9 E4, 05, 05]
+1F3C8; [0D E2 C2, 05, 05]
 
-1F38A; [0D D9 EC, 05, 05]
+1F3C9; [0D E2 CA, 05, 05]
 
-1F38B; [0D D9 F4, 05, 05]
+1F3CA; [0D E2 D2, 05, 05]
 
-1F38C; [0D D9 FC, 05, 05]
+1F3E0; [0D E2 DA, 05, 05]
 
-1F38D; [0D DA 0A, 05, 05]
+1F3E1; [0D E2 E2, 05, 05]
 
-1F38E; [0D DA 12, 05, 05]
+1F3E2; [0D E2 EA, 05, 05]
 
-1F38F; [0D DA 1A, 05, 05]
+1F3E3; [0D E2 F2, 05, 05]
 
-1F390; [0D DA 22, 05, 05]
+1F3E4; [0D E2 FA, 05, 05]
 
-1F391; [0D DA 2A, 05, 05]
+1F3E5; [0D E3 04, 05, 05]
 
-1F392; [0D DA 32, 05, 05]
+1F3E6; [0D E3 0C, 05, 05]
 
-1F393; [0D DA 3A, 05, 05]
+1F3E7; [0D E3 14, 05, 05]
 
-1F3A0; [0D DA 42, 05, 05]
+1F3E8; [0D E3 1C, 05, 05]
 
-1F3A1; [0D DA 4A, 05, 05]
+1F3E9; [0D E3 24, 05, 05]
 
-1F3A2; [0D DA 52, 05, 05]
+1F3EA; [0D E3 2C, 05, 05]
 
-1F3A3; [0D DA 5A, 05, 05]
+1F3EB; [0D E3 34, 05, 05]
 
-1F3A4; [0D DA 62, 05, 05]
+1F3EC; [0D E3 3C, 05, 05]
 
-1F3A5; [0D DA 6A, 05, 05]
+1F3ED; [0D E3 44, 05, 05]
 
-1F3A6; [0D DA 72, 05, 05]
+1F3EE; [0D E3 4C, 05, 05]
 
-1F3A7; [0D DA 7A, 05, 05]
+1F3EF; [0D E3 54, 05, 05]
 
-1F3A8; [0D DA 82, 05, 05]
+1F3F0; [0D E3 5C, 05, 05]
 
-1F3A9; [0D DA 8A, 05, 05]
+1F400; [0D E3 64, 05, 05]
 
-1F3AA; [0D DA 92, 05, 05]
+1F401; [0D E3 6C, 05, 05]
 
-1F3AB; [0D DA 9A, 05, 05]
+1F402; [0D E3 74, 05, 05]
 
-1F3AC; [0D DA A2, 05, 05]
+1F403; [0D E3 7C, 05, 05]
 
-1F3AD; [0D DA AA, 05, 05]
+1F404; [0D E3 84, 05, 05]
 
-1F3AE; [0D DA B2, 05, 05]
+1F405; [0D E3 8C, 05, 05]
 
-1F3AF; [0D DA BA, 05, 05]
+1F406; [0D E3 94, 05, 05]
 
-1F3B0; [0D DA C2, 05, 05]
+1F407; [0D E3 9C, 05, 05]
 
-1F3B1; [0D DA CA, 05, 05]
+1F408; [0D E3 A4, 05, 05]
 
-1F3B2; [0D DA D2, 05, 05]
+1F409; [0D E3 AC, 05, 05]
 
-1F3B3; [0D DA DA, 05, 05]
+1F40A; [0D E3 B4, 05, 05]
 
-1F3B4; [0D DA E2, 05, 05]
+1F40B; [0D E3 BC, 05, 05]
 
-1F3B5; [0D DA EA, 05, 05]
+1F40C; [0D E3 C4, 05, 05]
 
-1F3B6; [0D DA F2, 05, 05]
+1F40D; [0D E3 CC, 05, 05]
 
-1F3B7; [0D DA FA, 05, 05]
+1F40E; [0D E3 D4, 05, 05]
 
-1F3B8; [0D DB 08, 05, 05]
+1F40F; [0D E3 DC, 05, 05]
 
-1F3B9; [0D DB 10, 05, 05]
+1F410; [0D E3 E4, 05, 05]
 
-1F3BA; [0D DB 18, 05, 05]
+1F411; [0D E3 EC, 05, 05]
 
-1F3BB; [0D DB 20, 05, 05]
+1F412; [0D E3 F4, 05, 05]
 
-1F3BC; [0D DB 28, 05, 05]
+1F413; [0D E3 FC, 05, 05]
 
-1F3BD; [0D DB 30, 05, 05]
+1F414; [0D E4 06, 05, 05]
 
-1F3BE; [0D DB 38, 05, 05]
+1F415; [0D E4 0E, 05, 05]
 
-1F3BF; [0D DB 40, 05, 05]
+1F416; [0D E4 16, 05, 05]
 
-1F3C0; [0D DB 48, 05, 05]
+1F417; [0D E4 1E, 05, 05]
 
-1F3C1; [0D DB 50, 05, 05]
+1F418; [0D E4 26, 05, 05]
 
-1F3C2; [0D DB 58, 05, 05]
+1F419; [0D E4 2E, 05, 05]
 
-1F3C3; [0D DB 60, 05, 05]
+1F41A; [0D E4 36, 05, 05]
 
-1F3C4; [0D DB 68, 05, 05]
+1F41B; [0D E4 3E, 05, 05]
 
-1F3C6; [0D DB 70, 05, 05]
+1F41C; [0D E4 46, 05, 05]
 
-1F3C7; [0D DB 78, 05, 05]
+1F41D; [0D E4 4E, 05, 05]
 
-1F3C8; [0D DB 80, 05, 05]
+1F41E; [0D E4 56, 05, 05]
 
-1F3C9; [0D DB 88, 05, 05]
+1F41F; [0D E4 5E, 05, 05]
 
-1F3CA; [0D DB 90, 05, 05]
+1F420; [0D E4 66, 05, 05]
 
-1F3E0; [0D DB 98, 05, 05]
+1F421; [0D E4 6E, 05, 05]
 
-1F3E1; [0D DB A0, 05, 05]
+1F422; [0D E4 76, 05, 05]
 
-1F3E2; [0D DB A8, 05, 05]
+1F423; [0D E4 7E, 05, 05]
 
-1F3E3; [0D DB B0, 05, 05]
+1F424; [0D E4 86, 05, 05]
 
-1F3E4; [0D DB B8, 05, 05]
+1F425; [0D E4 8E, 05, 05]
 
-1F3E5; [0D DB C0, 05, 05]
+1F426; [0D E4 96, 05, 05]
 
-1F3E6; [0D DB C8, 05, 05]
+1F427; [0D E4 9E, 05, 05]
 
-1F3E7; [0D DB D0, 05, 05]
+1F428; [0D E4 A6, 05, 05]
 
-1F3E8; [0D DB D8, 05, 05]
+1F429; [0D E4 AE, 05, 05]
 
-1F3E9; [0D DB E0, 05, 05]
+1F42A; [0D E4 B6, 05, 05]
 
-1F3EA; [0D DB E8, 05, 05]
+1F42B; [0D E4 BE, 05, 05]
 
-1F3EB; [0D DB F0, 05, 05]
+1F42C; [0D E4 C6, 05, 05]
 
-1F3EC; [0D DB F8, 05, 05]
+1F42D; [0D E4 CE, 05, 05]
 
-1F3ED; [0D DC 06, 05, 05]
+1F42E; [0D E4 D6, 05, 05]
 
-1F3EE; [0D DC 0E, 05, 05]
+1F42F; [0D E4 DE, 05, 05]
 
-1F3EF; [0D DC 16, 05, 05]
+1F430; [0D E4 E6, 05, 05]
 
-1F3F0; [0D DC 1E, 05, 05]
+1F431; [0D E4 EE, 05, 05]
 
-1F400; [0D DC 26, 05, 05]
+1F432; [0D E4 F6, 05, 05]
 
-1F401; [0D DC 2E, 05, 05]
+1F433; [0D E4 FE, 05, 05]
 
-1F402; [0D DC 36, 05, 05]
+1F434; [0D E5 08, 05, 05]
 
-1F403; [0D DC 3E, 05, 05]
+1F435; [0D E5 10, 05, 05]
 
-1F404; [0D DC 46, 05, 05]
+1F436; [0D E5 18, 05, 05]
 
-1F405; [0D DC 4E, 05, 05]
+1F437; [0D E5 20, 05, 05]
 
-1F406; [0D DC 56, 05, 05]
+1F438; [0D E5 28, 05, 05]
 
-1F407; [0D DC 5E, 05, 05]
+1F439; [0D E5 30, 05, 05]
 
-1F408; [0D DC 66, 05, 05]
+1F43A; [0D E5 38, 05, 05]
 
-1F409; [0D DC 6E, 05, 05]
+1F43B; [0D E5 40, 05, 05]
 
-1F40A; [0D DC 76, 05, 05]
+1F43C; [0D E5 48, 05, 05]
 
-1F40B; [0D DC 7E, 05, 05]
+1F43D; [0D E5 50, 05, 05]
 
-1F40C; [0D DC 86, 05, 05]
+1F43E; [0D E5 58, 05, 05]
 
-1F40D; [0D DC 8E, 05, 05]
+1F440; [0D E5 60, 05, 05]
 
-1F40E; [0D DC 96, 05, 05]
+1F442; [0D E5 68, 05, 05]
 
-1F40F; [0D DC 9E, 05, 05]
+1F443; [0D E5 70, 05, 05]
 
-1F410; [0D DC A6, 05, 05]
+1F444; [0D E5 78, 05, 05]
 
-1F411; [0D DC AE, 05, 05]
+1F445; [0D E5 80, 05, 05]
 
-1F412; [0D DC B6, 05, 05]
+1F446; [0D E5 88, 05, 05]
 
-1F413; [0D DC BE, 05, 05]
+1F447; [0D E5 90, 05, 05]
 
-1F414; [0D DC C6, 05, 05]
+1F448; [0D E5 98, 05, 05]
 
-1F415; [0D DC CE, 05, 05]
+1F449; [0D E5 A0, 05, 05]
 
-1F416; [0D DC D6, 05, 05]
+1F44A; [0D E5 A8, 05, 05]
 
-1F417; [0D DC DE, 05, 05]
+1F44B; [0D E5 B0, 05, 05]
 
-1F418; [0D DC E6, 05, 05]
+1F44C; [0D E5 B8, 05, 05]
 
-1F419; [0D DC EE, 05, 05]
+1F44D; [0D E5 C0, 05, 05]
 
-1F41A; [0D DC F6, 05, 05]
+1F44E; [0D E5 C8, 05, 05]
 
-1F41B; [0D DD 04, 05, 05]
+1F44F; [0D E5 D0, 05, 05]
 
-1F41C; [0D DD 0C, 05, 05]
+1F450; [0D E5 D8, 05, 05]
 
-1F41D; [0D DD 14, 05, 05]
+1F451; [0D E5 E0, 05, 05]
 
-1F41E; [0D DD 1C, 05, 05]
+1F452; [0D E5 E8, 05, 05]
 
-1F41F; [0D DD 24, 05, 05]
+1F453; [0D E5 F0, 05, 05]
 
-1F420; [0D DD 2C, 05, 05]
+1F454; [0D E5 F8, 05, 05]
 
-1F421; [0D DD 34, 05, 05]
+1F455; [0D E6 02, 05, 05]
 
-1F422; [0D DD 3C, 05, 05]
+1F456; [0D E6 0A, 05, 05]
 
-1F423; [0D DD 44, 05, 05]
+1F457; [0D E6 12, 05, 05]
 
-1F424; [0D DD 4C, 05, 05]
+1F458; [0D E6 1A, 05, 05]
 
-1F425; [0D DD 54, 05, 05]
+1F459; [0D E6 22, 05, 05]
 
-1F426; [0D DD 5C, 05, 05]
+1F45A; [0D E6 2A, 05, 05]
 
-1F427; [0D DD 64, 05, 05]
+1F45B; [0D E6 32, 05, 05]
 
-1F428; [0D DD 6C, 05, 05]
+1F45C; [0D E6 3A, 05, 05]
 
-1F429; [0D DD 74, 05, 05]
+1F45D; [0D E6 42, 05, 05]
 
-1F42A; [0D DD 7C, 05, 05]
+1F45E; [0D E6 4A, 05, 05]
 
-1F42B; [0D DD 84, 05, 05]
+1F45F; [0D E6 52, 05, 05]
 
-1F42C; [0D DD 8C, 05, 05]
+1F460; [0D E6 5A, 05, 05]
 
-1F42D; [0D DD 94, 05, 05]
+1F461; [0D E6 62, 05, 05]
 
-1F42E; [0D DD 9C, 05, 05]
+1F462; [0D E6 6A, 05, 05]
 
-1F42F; [0D DD A4, 05, 05]
+1F463; [0D E6 72, 05, 05]
 
-1F430; [0D DD AC, 05, 05]
+1F464; [0D E6 7A, 05, 05]
 
-1F431; [0D DD B4, 05, 05]
+1F465; [0D E6 82, 05, 05]
 
-1F432; [0D DD BC, 05, 05]
+1F466; [0D E6 8A, 05, 05]
 
-1F433; [0D DD C4, 05, 05]
+1F467; [0D E6 92, 05, 05]
 
-1F434; [0D DD CC, 05, 05]
+1F468; [0D E6 9A, 05, 05]
 
-1F435; [0D DD D4, 05, 05]
+1F469; [0D E6 A2, 05, 05]
 
-1F436; [0D DD DC, 05, 05]
+1F46A; [0D E6 AA, 05, 05]
 
-1F437; [0D DD E4, 05, 05]
+1F46B; [0D E6 B2, 05, 05]
 
-1F438; [0D DD EC, 05, 05]
+1F46C; [0D E6 BA, 05, 05]
 
-1F439; [0D DD F4, 05, 05]
+1F46D; [0D E6 C2, 05, 05]
 
-1F43A; [0D DD FC, 05, 05]
+1F46E; [0D E6 CA, 05, 05]
 
-1F43B; [0D DE 0A, 05, 05]
+1F46F; [0D E6 D2, 05, 05]
 
-1F43C; [0D DE 12, 05, 05]
+1F470; [0D E6 DA, 05, 05]
 
-1F43D; [0D DE 1A, 05, 05]
+1F471; [0D E6 E2, 05, 05]
 
-1F43E; [0D DE 22, 05, 05]
+1F472; [0D E6 EA, 05, 05]
 
-1F440; [0D DE 2A, 05, 05]
+1F473; [0D E6 F2, 05, 05]
 
-1F442; [0D DE 32, 05, 05]
+1F474; [0D E6 FA, 05, 05]
 
-1F443; [0D DE 3A, 05, 05]
+1F475; [0D E7 04, 05, 05]
 
-1F444; [0D DE 42, 05, 05]
+1F476; [0D E7 0C, 05, 05]
 
-1F445; [0D DE 4A, 05, 05]
+1F477; [0D E7 14, 05, 05]
 
-1F446; [0D DE 52, 05, 05]
+1F478; [0D E7 1C, 05, 05]
 
-1F447; [0D DE 5A, 05, 05]
+1F479; [0D E7 24, 05, 05]
 
-1F448; [0D DE 62, 05, 05]
+1F47A; [0D E7 2C, 05, 05]
 
-1F449; [0D DE 6A, 05, 05]
+1F47B; [0D E7 34, 05, 05]
 
-1F44A; [0D DE 72, 05, 05]
+1F47C; [0D E7 3C, 05, 05]
 
-1F44B; [0D DE 7A, 05, 05]
+1F47D; [0D E7 44, 05, 05]
 
-1F44C; [0D DE 82, 05, 05]
+1F47E; [0D E7 4C, 05, 05]
 
-1F44D; [0D DE 8A, 05, 05]
+1F47F; [0D E7 54, 05, 05]
 
-1F44E; [0D DE 92, 05, 05]
+1F480; [0D E7 5C, 05, 05]
 
-1F44F; [0D DE 9A, 05, 05]
+1F481; [0D E7 64, 05, 05]
 
-1F450; [0D DE A2, 05, 05]
+1F482; [0D E7 6C, 05, 05]
 
-1F451; [0D DE AA, 05, 05]
+1F483; [0D E7 74, 05, 05]
 
-1F452; [0D DE B2, 05, 05]
+1F484; [0D E7 7C, 05, 05]
 
-1F453; [0D DE BA, 05, 05]
+1F485; [0D E7 84, 05, 05]
 
-1F454; [0D DE C2, 05, 05]
+1F486; [0D E7 8C, 05, 05]
 
-1F455; [0D DE CA, 05, 05]
+1F487; [0D E7 94, 05, 05]
 
-1F456; [0D DE D2, 05, 05]
+1F488; [0D E7 9C, 05, 05]
 
-1F457; [0D DE DA, 05, 05]
+1F489; [0D E7 A4, 05, 05]
 
-1F458; [0D DE E2, 05, 05]
+1F48A; [0D E7 AC, 05, 05]
 
-1F459; [0D DE EA, 05, 05]
+1F48B; [0D E7 B4, 05, 05]
 
-1F45A; [0D DE F2, 05, 05]
+1F48C; [0D E7 BC, 05, 05]
 
-1F45B; [0D DE FA, 05, 05]
+1F48D; [0D E7 C4, 05, 05]
 
-1F45C; [0D DF 08, 05, 05]
+1F48E; [0D E7 CC, 05, 05]
 
-1F45D; [0D DF 10, 05, 05]
+1F48F; [0D E7 D4, 05, 05]
 
-1F45E; [0D DF 18, 05, 05]
+1F490; [0D E7 DC, 05, 05]
 
-1F45F; [0D DF 20, 05, 05]
+1F491; [0D E7 E4, 05, 05]
 
-1F460; [0D DF 28, 05, 05]
+1F492; [0D E7 EC, 05, 05]
 
-1F461; [0D DF 30, 05, 05]
+1F493; [0D E7 F4, 05, 05]
 
-1F462; [0D DF 38, 05, 05]
+1F494; [0D E7 FC, 05, 05]
 
-1F463; [0D DF 40, 05, 05]
+1F495; [0D E8 06, 05, 05]
 
-1F464; [0D DF 48, 05, 05]
+1F496; [0D E8 0E, 05, 05]
 
-1F465; [0D DF 50, 05, 05]
+1F497; [0D E8 16, 05, 05]
 
-1F466; [0D DF 58, 05, 05]
+1F498; [0D E8 1E, 05, 05]
 
-1F467; [0D DF 60, 05, 05]
+1F499; [0D E8 26, 05, 05]
 
-1F468; [0D DF 68, 05, 05]
+1F49A; [0D E8 2E, 05, 05]
 
-1F469; [0D DF 70, 05, 05]
+1F49B; [0D E8 36, 05, 05]
 
-1F46A; [0D DF 78, 05, 05]
+1F49C; [0D E8 3E, 05, 05]
 
-1F46B; [0D DF 80, 05, 05]
+1F49D; [0D E8 46, 05, 05]
 
-1F46C; [0D DF 88, 05, 05]
+1F49E; [0D E8 4E, 05, 05]
 
-1F46D; [0D DF 90, 05, 05]
+1F49F; [0D E8 56, 05, 05]
 
-1F46E; [0D DF 98, 05, 05]
+1F4A0; [0D E8 5E, 05, 05]
 
-1F46F; [0D DF A0, 05, 05]
+1F4A1; [0D E8 66, 05, 05]
 
-1F470; [0D DF A8, 05, 05]
+1F4A2; [0D E8 6E, 05, 05]
 
-1F471; [0D DF B0, 05, 05]
+1F4A3; [0D E8 76, 05, 05]
 
-1F472; [0D DF B8, 05, 05]
+1F4A4; [0D E8 7E, 05, 05]
 
-1F473; [0D DF C0, 05, 05]
+1F4A5; [0D E8 86, 05, 05]
 
-1F474; [0D DF C8, 05, 05]
+1F4A6; [0D E8 8E, 05, 05]
 
-1F475; [0D DF D0, 05, 05]
+1F4A7; [0D E8 96, 05, 05]
 
-1F476; [0D DF D8, 05, 05]
+1F4A8; [0D E8 9E, 05, 05]
 
-1F477; [0D DF E0, 05, 05]
+1F4A9; [0D E8 A6, 05, 05]
 
-1F478; [0D DF E8, 05, 05]
+1F4AA; [0D E8 AE, 05, 05]
 
-1F479; [0D DF F0, 05, 05]
+1F4AB; [0D E8 B6, 05, 05]
 
-1F47A; [0D DF F8, 05, 05]
+1F4AC; [0D E8 BE, 05, 05]
 
-1F47B; [0D E0 06, 05, 05]
+1F4AD; [0D E8 C6, 05, 05]
 
-1F47C; [0D E0 0E, 05, 05]
+1F4AE; [0D E8 CE, 05, 05]
 
-1F47D; [0D E0 16, 05, 05]
+1F4AF; [0D E8 D6, 05, 05]
 
-1F47E; [0D E0 1E, 05, 05]
+1F4B0; [0D E8 DE, 05, 05]
 
-1F47F; [0D E0 26, 05, 05]
+1F4B1; [0D E8 E6, 05, 05]
 
-1F480; [0D E0 2E, 05, 05]
+1F4B2; [0D E8 EE, 05, 05]
 
-1F481; [0D E0 36, 05, 05]
+1F4B3; [0D E8 F6, 05, 05]
 
-1F482; [0D E0 3E, 05, 05]
+1F4B4; [0D E8 FE, 05, 05]
 
-1F483; [0D E0 46, 05, 05]
+1F4B5; [0D E9 08, 05, 05]
 
-1F484; [0D E0 4E, 05, 05]
+1F4B6; [0D E9 10, 05, 05]
 
-1F485; [0D E0 56, 05, 05]
+1F4B7; [0D E9 18, 05, 05]
 
-1F486; [0D E0 5E, 05, 05]
+1F4B8; [0D E9 20, 05, 05]
 
-1F487; [0D E0 66, 05, 05]
+1F4B9; [0D E9 28, 05, 05]
 
-1F488; [0D E0 6E, 05, 05]
+1F4BA; [0D E9 30, 05, 05]
 
-1F489; [0D E0 76, 05, 05]
+1F4BB; [0D E9 38, 05, 05]
 
-1F48A; [0D E0 7E, 05, 05]
+1F4BC; [0D E9 40, 05, 05]
 
-1F48B; [0D E0 86, 05, 05]
+1F4BD; [0D E9 48, 05, 05]
 
-1F48C; [0D E0 8E, 05, 05]
+1F4BE; [0D E9 50, 05, 05]
 
-1F48D; [0D E0 96, 05, 05]
+1F4BF; [0D E9 58, 05, 05]
 
-1F48E; [0D E0 9E, 05, 05]
+1F4C0; [0D E9 60, 05, 05]
 
-1F48F; [0D E0 A6, 05, 05]
+1F4C1; [0D E9 68, 05, 05]
 
-1F490; [0D E0 AE, 05, 05]
+1F4C2; [0D E9 70, 05, 05]
 
-1F491; [0D E0 B6, 05, 05]
+1F4C3; [0D E9 78, 05, 05]
 
-1F492; [0D E0 BE, 05, 05]
+1F4C4; [0D E9 80, 05, 05]
 
-1F493; [0D E0 C6, 05, 05]
+1F4C5; [0D E9 88, 05, 05]
 
-1F494; [0D E0 CE, 05, 05]
+1F4C6; [0D E9 90, 05, 05]
 
-1F495; [0D E0 D6, 05, 05]
+1F4C7; [0D E9 98, 05, 05]
 
-1F496; [0D E0 DE, 05, 05]
+1F4C8; [0D E9 A0, 05, 05]
 
-1F497; [0D E0 E6, 05, 05]
+1F4C9; [0D E9 A8, 05, 05]
 
-1F498; [0D E0 EE, 05, 05]
+1F4CA; [0D E9 B0, 05, 05]
 
-1F499; [0D E0 F6, 05, 05]
+1F4CB; [0D E9 B8, 05, 05]
 
-1F49A; [0D E1 04, 05, 05]
+1F4CC; [0D E9 C0, 05, 05]
 
-1F49B; [0D E1 0C, 05, 05]
+1F4CD; [0D E9 C8, 05, 05]
 
-1F49C; [0D E1 14, 05, 05]
+1F4CE; [0D E9 D0, 05, 05]
 
-1F49D; [0D E1 1C, 05, 05]
+1F4CF; [0D E9 D8, 05, 05]
 
-1F49E; [0D E1 24, 05, 05]
+1F4D0; [0D E9 E0, 05, 05]
 
-1F49F; [0D E1 2C, 05, 05]
+1F4D1; [0D E9 E8, 05, 05]
 
-1F4A0; [0D E1 34, 05, 05]
+1F4D2; [0D E9 F0, 05, 05]
 
-1F4A1; [0D E1 3C, 05, 05]
+1F4D3; [0D E9 F8, 05, 05]
 
-1F4A2; [0D E1 44, 05, 05]
+1F4D4; [0D EA 02, 05, 05]
 
-1F4A3; [0D E1 4C, 05, 05]
+1F4D5; [0D EA 0A, 05, 05]
 
-1F4A4; [0D E1 54, 05, 05]
+1F4D6; [0D EA 12, 05, 05]
 
-1F4A5; [0D E1 5C, 05, 05]
+1F4D7; [0D EA 1A, 05, 05]
 
-1F4A6; [0D E1 64, 05, 05]
+1F4D8; [0D EA 22, 05, 05]
 
-1F4A7; [0D E1 6C, 05, 05]
+1F4D9; [0D EA 2A, 05, 05]
 
-1F4A8; [0D E1 74, 05, 05]
+1F4DA; [0D EA 32, 05, 05]
 
-1F4A9; [0D E1 7C, 05, 05]
+1F4DB; [0D EA 3A, 05, 05]
 
-1F4AA; [0D E1 84, 05, 05]
+1F4DC; [0D EA 42, 05, 05]
 
-1F4AB; [0D E1 8C, 05, 05]
+1F4DD; [0D EA 4A, 05, 05]
 
-1F4AC; [0D E1 94, 05, 05]
+1F4DE; [0D EA 52, 05, 05]
 
-1F4AD; [0D E1 9C, 05, 05]
+1F4DF; [0D EA 5A, 05, 05]
 
-1F4AE; [0D E1 A4, 05, 05]
+1F4E0; [0D EA 62, 05, 05]
 
-1F4AF; [0D E1 AC, 05, 05]
+1F4E1; [0D EA 6A, 05, 05]
 
-1F4B0; [0D E1 B4, 05, 05]
+1F4E2; [0D EA 72, 05, 05]
 
-1F4B1; [0D E1 BC, 05, 05]
+1F4E3; [0D EA 7A, 05, 05]
 
-1F4B2; [0D E1 C4, 05, 05]
+1F4E4; [0D EA 82, 05, 05]
 
-1F4B3; [0D E1 CC, 05, 05]
+1F4E5; [0D EA 8A, 05, 05]
 
-1F4B4; [0D E1 D4, 05, 05]
+1F4E6; [0D EA 92, 05, 05]
 
-1F4B5; [0D E1 DC, 05, 05]
+1F4E7; [0D EA 9A, 05, 05]
 
-1F4B6; [0D E1 E4, 05, 05]
+1F4E8; [0D EA A2, 05, 05]
 
-1F4B7; [0D E1 EC, 05, 05]
+1F4E9; [0D EA AA, 05, 05]
 
-1F4B8; [0D E1 F4, 05, 05]
+1F4EA; [0D EA B2, 05, 05]
 
-1F4B9; [0D E1 FC, 05, 05]
+1F4EB; [0D EA BA, 05, 05]
 
-1F4BA; [0D E2 0A, 05, 05]
+1F4EC; [0D EA C2, 05, 05]
 
-1F4BB; [0D E2 12, 05, 05]
+1F4ED; [0D EA CA, 05, 05]
 
-1F4BC; [0D E2 1A, 05, 05]
+1F4EE; [0D EA D2, 05, 05]
 
-1F4BD; [0D E2 22, 05, 05]
+1F4EF; [0D EA DA, 05, 05]
 
-1F4BE; [0D E2 2A, 05, 05]
+1F4F0; [0D EA E2, 05, 05]
 
-1F4BF; [0D E2 32, 05, 05]
+1F4F1; [0D EA EA, 05, 05]
 
-1F4C0; [0D E2 3A, 05, 05]
+1F4F2; [0D EA F2, 05, 05]
 
-1F4C1; [0D E2 42, 05, 05]
+1F4F3; [0D EA FA, 05, 05]
 
-1F4C2; [0D E2 4A, 05, 05]
+1F4F4; [0D EB 04, 05, 05]
 
-1F4C3; [0D E2 52, 05, 05]
+1F4F5; [0D EB 0C, 05, 05]
 
-1F4C4; [0D E2 5A, 05, 05]
+1F4F6; [0D EB 14, 05, 05]
 
-1F4C5; [0D E2 62, 05, 05]
+1F4F7; [0D EB 1C, 05, 05]
 
-1F4C6; [0D E2 6A, 05, 05]
+1F4F9; [0D EB 24, 05, 05]
 
-1F4C7; [0D E2 72, 05, 05]
+1F4FA; [0D EB 2C, 05, 05]
 
-1F4C8; [0D E2 7A, 05, 05]
+1F4FB; [0D EB 34, 05, 05]
 
-1F4C9; [0D E2 82, 05, 05]
+1F4FC; [0D EB 3C, 05, 05]
 
-1F4CA; [0D E2 8A, 05, 05]
+1F500; [0D EB 44, 05, 05]
 
-1F4CB; [0D E2 92, 05, 05]
+1F501; [0D EB 4C, 05, 05]
 
-1F4CC; [0D E2 9A, 05, 05]
+1F502; [0D EB 54, 05, 05]
 
-1F4CD; [0D E2 A2, 05, 05]
+1F503; [0D EB 5C, 05, 05]
 
-1F4CE; [0D E2 AA, 05, 05]
+1F504; [0D EB 64, 05, 05]
 
-1F4CF; [0D E2 B2, 05, 05]
+1F505; [0D EB 6C, 05, 05]
 
-1F4D0; [0D E2 BA, 05, 05]
+1F506; [0D EB 74, 05, 05]
 
-1F4D1; [0D E2 C2, 05, 05]
+1F507; [0D EB 7C, 05, 05]
 
-1F4D2; [0D E2 CA, 05, 05]
+1F508; [0D EB 84, 05, 05]
 
-1F4D3; [0D E2 D2, 05, 05]
+1F509; [0D EB 8C, 05, 05]
 
-1F4D4; [0D E2 DA, 05, 05]
+1F50A; [0D EB 94, 05, 05]
 
-1F4D5; [0D E2 E2, 05, 05]
+1F50B; [0D EB 9C, 05, 05]
 
-1F4D6; [0D E2 EA, 05, 05]
+1F50C; [0D EB A4, 05, 05]
 
-1F4D7; [0D E2 F2, 05, 05]
+1F50D; [0D EB AC, 05, 05]
 
-1F4D8; [0D E2 FA, 05, 05]
+1F50E; [0D EB B4, 05, 05]
 
-1F4D9; [0D E3 08, 05, 05]
+1F50F; [0D EB BC, 05, 05]
 
-1F4DA; [0D E3 10, 05, 05]
+1F510; [0D EB C4, 05, 05]
 
-1F4DB; [0D E3 18, 05, 05]
+1F511; [0D EB CC, 05, 05]
 
-1F4DC; [0D E3 20, 05, 05]
+1F512; [0D EB D4, 05, 05]
 
-1F4DD; [0D E3 28, 05, 05]
+1F513; [0D EB DC, 05, 05]
 
-1F4DE; [0D E3 30, 05, 05]
+1F514; [0D EB E4, 05, 05]
 
-1F4DF; [0D E3 38, 05, 05]
+1F515; [0D EB EC, 05, 05]
 
-1F4E0; [0D E3 40, 05, 05]
+1F516; [0D EB F4, 05, 05]
 
-1F4E1; [0D E3 48, 05, 05]
+1F517; [0D EB FC, 05, 05]
 
-1F4E2; [0D E3 50, 05, 05]
+1F518; [0D EC 06, 05, 05]
 
-1F4E3; [0D E3 58, 05, 05]
+1F519; [0D EC 0E, 05, 05]
 
-1F4E4; [0D E3 60, 05, 05]
+1F51A; [0D EC 16, 05, 05]
 
-1F4E5; [0D E3 68, 05, 05]
+1F51B; [0D EC 1E, 05, 05]
 
-1F4E6; [0D E3 70, 05, 05]
+1F51C; [0D EC 26, 05, 05]
 
-1F4E7; [0D E3 78, 05, 05]
+1F51D; [0D EC 2E, 05, 05]
 
-1F4E8; [0D E3 80, 05, 05]
+1F51E; [0D EC 36, 05, 05]
 
-1F4E9; [0D E3 88, 05, 05]
+1F51F; [0D EC 3E, 05, 05]
 
-1F4EA; [0D E3 90, 05, 05]
+1F520; [0D EC 46, 05, 05]
 
-1F4EB; [0D E3 98, 05, 05]
+1F521; [0D EC 4E, 05, 05]
 
-1F4EC; [0D E3 A0, 05, 05]
+1F522; [0D EC 56, 05, 05]
 
-1F4ED; [0D E3 A8, 05, 05]
+1F523; [0D EC 5E, 05, 05]
 
-1F4EE; [0D E3 B0, 05, 05]
+1F524; [0D EC 66, 05, 05]
 
-1F4EF; [0D E3 B8, 05, 05]
+1F525; [0D EC 6E, 05, 05]
 
-1F4F0; [0D E3 C0, 05, 05]
+1F526; [0D EC 76, 05, 05]
 
-1F4F1; [0D E3 C8, 05, 05]
+1F527; [0D EC 7E, 05, 05]
 
-1F4F2; [0D E3 D0, 05, 05]
+1F528; [0D EC 86, 05, 05]
 
-1F4F3; [0D E3 D8, 05, 05]
+1F529; [0D EC 8E, 05, 05]
 
-1F4F4; [0D E3 E0, 05, 05]
+1F52A; [0D EC 96, 05, 05]
 
-1F4F5; [0D E3 E8, 05, 05]
+1F52B; [0D EC 9E, 05, 05]
 
-1F4F6; [0D E3 F0, 05, 05]
+1F52C; [0D EC A6, 05, 05]
 
-1F4F7; [0D E3 F8, 05, 05]
+1F52D; [0D EC AE, 05, 05]
 
-1F4F9; [0D E4 06, 05, 05]
+1F52E; [0D EC B6, 05, 05]
 
-1F4FA; [0D E4 0E, 05, 05]
+1F52F; [0D EC BE, 05, 05]
 
-1F4FB; [0D E4 16, 05, 05]
+1F530; [0D EC C6, 05, 05]
 
-1F4FC; [0D E4 1E, 05, 05]
+1F531; [0D EC CE, 05, 05]
 
-1F500; [0D E4 26, 05, 05]
+1F532; [0D EC D6, 05, 05]
 
-1F501; [0D E4 2E, 05, 05]
+1F533; [0D EC DE, 05, 05]
 
-1F502; [0D E4 36, 05, 05]
+1F534; [0D EC E6, 05, 05]
 
-1F503; [0D E4 3E, 05, 05]
+1F535; [0D EC EE, 05, 05]
 
-1F504; [0D E4 46, 05, 05]
+1F536; [0D EC F6, 05, 05]
 
-1F505; [0D E4 4E, 05, 05]
+1F537; [0D EC FE, 05, 05]
 
-1F506; [0D E4 56, 05, 05]
+1F538; [0D ED 08, 05, 05]
 
-1F507; [0D E4 5E, 05, 05]
+1F539; [0D ED 10, 05, 05]
 
-1F508; [0D E4 66, 05, 05]
+1F53A; [0D ED 18, 05, 05]
 
-1F509; [0D E4 6E, 05, 05]
+1F53B; [0D ED 20, 05, 05]
 
-1F50A; [0D E4 76, 05, 05]
+1F53C; [0D ED 28, 05, 05]
 
-1F50B; [0D E4 7E, 05, 05]
+1F53D; [0D ED 30, 05, 05]
 
-1F50C; [0D E4 86, 05, 05]
+1F540; [0D ED 38, 05, 05]
 
-1F50D; [0D E4 8E, 05, 05]
+1F541; [0D ED 40, 05, 05]
 
-1F50E; [0D E4 96, 05, 05]
+1F542; [0D ED 48, 05, 05]
 
-1F50F; [0D E4 9E, 05, 05]
+1F543; [0D ED 50, 05, 05]
 
-1F510; [0D E4 A6, 05, 05]
+1F550; [0D ED 58, 05, 05]
 
-1F511; [0D E4 AE, 05, 05]
+1F551; [0D ED 60, 05, 05]
 
-1F512; [0D E4 B6, 05, 05]
+1F552; [0D ED 68, 05, 05]
 
-1F513; [0D E4 BE, 05, 05]
+1F553; [0D ED 70, 05, 05]
 
-1F514; [0D E4 C6, 05, 05]
+1F554; [0D ED 78, 05, 05]
 
-1F515; [0D E4 CE, 05, 05]
+1F555; [0D ED 80, 05, 05]
 
-1F516; [0D E4 D6, 05, 05]
+1F556; [0D ED 88, 05, 05]
 
-1F517; [0D E4 DE, 05, 05]
+1F557; [0D ED 90, 05, 05]
 
-1F518; [0D E4 E6, 05, 05]
+1F558; [0D ED 98, 05, 05]
 
-1F519; [0D E4 EE, 05, 05]
+1F559; [0D ED A0, 05, 05]
 
-1F51A; [0D E4 F6, 05, 05]
+1F55A; [0D ED A8, 05, 05]
 
-1F51B; [0D E5 04, 05, 05]
+1F55B; [0D ED B0, 05, 05]
 
-1F51C; [0D E5 0C, 05, 05]
+1F55C; [0D ED B8, 05, 05]
 
-1F51D; [0D E5 14, 05, 05]
+1F55D; [0D ED C0, 05, 05]
 
-1F51E; [0D E5 1C, 05, 05]
+1F55E; [0D ED C8, 05, 05]
 
-1F51F; [0D E5 24, 05, 05]
+1F55F; [0D ED D0, 05, 05]
 
-1F520; [0D E5 2C, 05, 05]
+1F560; [0D ED D8, 05, 05]
 
-1F521; [0D E5 34, 05, 05]
+1F561; [0D ED E0, 05, 05]
 
-1F522; [0D E5 3C, 05, 05]
+1F562; [0D ED E8, 05, 05]
 
-1F523; [0D E5 44, 05, 05]
+1F563; [0D ED F0, 05, 05]
 
-1F524; [0D E5 4C, 05, 05]
+1F564; [0D ED F8, 05, 05]
 
-1F525; [0D E5 54, 05, 05]
+1F565; [0D EE 02, 05, 05]
 
-1F526; [0D E5 5C, 05, 05]
+1F566; [0D EE 0A, 05, 05]
 
-1F527; [0D E5 64, 05, 05]
+1F567; [0D EE 12, 05, 05]
 
-1F528; [0D E5 6C, 05, 05]
+1F5FB; [0D EE 1A, 05, 05]
 
-1F529; [0D E5 74, 05, 05]
+1F5FC; [0D EE 22, 05, 05]
 
-1F52A; [0D E5 7C, 05, 05]
+1F5FD; [0D EE 2A, 05, 05]
 
-1F52B; [0D E5 84, 05, 05]
+1F5FE; [0D EE 32, 05, 05]
 
-1F52C; [0D E5 8C, 05, 05]
+1F5FF; [0D EE 3A, 05, 05]
 
-1F52D; [0D E5 94, 05, 05]
+1F600; [0D EE 42, 05, 05]
 
-1F52E; [0D E5 9C, 05, 05]
+1F601; [0D EE 4A, 05, 05]
 
-1F52F; [0D E5 A4, 05, 05]
+1F602; [0D EE 52, 05, 05]
 
-1F530; [0D E5 AC, 05, 05]
+1F603; [0D EE 5A, 05, 05]
 
-1F531; [0D E5 B4, 05, 05]
+1F604; [0D EE 62, 05, 05]
 
-1F532; [0D E5 BC, 05, 05]
+1F605; [0D EE 6A, 05, 05]
 
-1F533; [0D E5 C4, 05, 05]
+1F606; [0D EE 72, 05, 05]
 
-1F534; [0D E5 CC, 05, 05]
+1F607; [0D EE 7A, 05, 05]
 
-1F535; [0D E5 D4, 05, 05]
+1F608; [0D EE 82, 05, 05]
 
-1F536; [0D E5 DC, 05, 05]
+1F609; [0D EE 8A, 05, 05]
 
-1F537; [0D E5 E4, 05, 05]
+1F60A; [0D EE 92, 05, 05]
 
-1F538; [0D E5 EC, 05, 05]
+1F60B; [0D EE 9A, 05, 05]
 
-1F539; [0D E5 F4, 05, 05]
+1F60C; [0D EE A2, 05, 05]
 
-1F53A; [0D E5 FC, 05, 05]
+1F60D; [0D EE AA, 05, 05]
 
-1F53B; [0D E6 0A, 05, 05]
+1F60E; [0D EE B2, 05, 05]
 
-1F53C; [0D E6 12, 05, 05]
+1F60F; [0D EE BA, 05, 05]
 
-1F53D; [0D E6 1A, 05, 05]
+1F610; [0D EE C2, 05, 05]
 
-1F540; [0D E6 22, 05, 05]
+1F611; [0D EE CA, 05, 05]
 
-1F541; [0D E6 2A, 05, 05]
+1F612; [0D EE D2, 05, 05]
 
-1F542; [0D E6 32, 05, 05]
+1F613; [0D EE DA, 05, 05]
 
-1F543; [0D E6 3A, 05, 05]
+1F614; [0D EE E2, 05, 05]
 
-1F550; [0D E6 42, 05, 05]
+1F615; [0D EE EA, 05, 05]
 
-1F551; [0D E6 4A, 05, 05]
+1F616; [0D EE F2, 05, 05]
 
-1F552; [0D E6 52, 05, 05]
+1F617; [0D EE FA, 05, 05]
 
-1F553; [0D E6 5A, 05, 05]
+1F618; [0D EF 04, 05, 05]
 
-1F554; [0D E6 62, 05, 05]
+1F619; [0D EF 0C, 05, 05]
 
-1F555; [0D E6 6A, 05, 05]
+1F61A; [0D EF 14, 05, 05]
 
-1F556; [0D E6 72, 05, 05]
+1F61B; [0D EF 1C, 05, 05]
 
-1F557; [0D E6 7A, 05, 05]
+1F61C; [0D EF 24, 05, 05]
 
-1F558; [0D E6 82, 05, 05]
+1F61D; [0D EF 2C, 05, 05]
 
-1F559; [0D E6 8A, 05, 05]
+1F61E; [0D EF 34, 05, 05]
 
-1F55A; [0D E6 92, 05, 05]
+1F61F; [0D EF 3C, 05, 05]
 
-1F55B; [0D E6 9A, 05, 05]
+1F620; [0D EF 44, 05, 05]
 
-1F55C; [0D E6 A2, 05, 05]
+1F621; [0D EF 4C, 05, 05]
 
-1F55D; [0D E6 AA, 05, 05]
+1F622; [0D EF 54, 05, 05]
 
-1F55E; [0D E6 B2, 05, 05]
+1F623; [0D EF 5C, 05, 05]
 
-1F55F; [0D E6 BA, 05, 05]
+1F624; [0D EF 64, 05, 05]
 
-1F560; [0D E6 C2, 05, 05]
+1F625; [0D EF 6C, 05, 05]
 
-1F561; [0D E6 CA, 05, 05]
+1F626; [0D EF 74, 05, 05]
 
-1F562; [0D E6 D2, 05, 05]
+1F627; [0D EF 7C, 05, 05]
 
-1F563; [0D E6 DA, 05, 05]
+1F628; [0D EF 84, 05, 05]
 
-1F564; [0D E6 E2, 05, 05]
+1F629; [0D EF 8C, 05, 05]
 
-1F565; [0D E6 EA, 05, 05]
+1F62A; [0D EF 94, 05, 05]
 
-1F566; [0D E6 F2, 05, 05]
+1F62B; [0D EF 9C, 05, 05]
 
-1F567; [0D E6 FA, 05, 05]
+1F62C; [0D EF A4, 05, 05]
 
-1F5FB; [0D E7 08, 05, 05]
+1F62D; [0D EF AC, 05, 05]
 
-1F5FC; [0D E7 10, 05, 05]
+1F62E; [0D EF B4, 05, 05]
 
-1F5FD; [0D E7 18, 05, 05]
+1F62F; [0D EF BC, 05, 05]
 
-1F5FE; [0D E7 20, 05, 05]
+1F630; [0D EF C4, 05, 05]
 
-1F5FF; [0D E7 28, 05, 05]
+1F631; [0D EF CC, 05, 05]
 
-1F600; [0D E7 30, 05, 05]
+1F632; [0D EF D4, 05, 05]
 
-1F601; [0D E7 38, 05, 05]
+1F633; [0D EF DC, 05, 05]
 
-1F602; [0D E7 40, 05, 05]
+1F634; [0D EF E4, 05, 05]
 
-1F603; [0D E7 48, 05, 05]
+1F635; [0D EF EC, 05, 05]
 
-1F604; [0D E7 50, 05, 05]
+1F636; [0D EF F4, 05, 05]
 
-1F605; [0D E7 58, 05, 05]
+1F637; [0D EF FC, 05, 05]
 
-1F606; [0D E7 60, 05, 05]
+1F638; [0D F0 06, 05, 05]
 
-1F607; [0D E7 68, 05, 05]
+1F639; [0D F0 0E, 05, 05]
 
-1F608; [0D E7 70, 05, 05]
+1F63A; [0D F0 16, 05, 05]
 
-1F609; [0D E7 78, 05, 05]
+1F63B; [0D F0 1E, 05, 05]
 
-1F60A; [0D E7 80, 05, 05]
+1F63C; [0D F0 26, 05, 05]
 
-1F60B; [0D E7 88, 05, 05]
+1F63D; [0D F0 2E, 05, 05]
 
-1F60C; [0D E7 90, 05, 05]
+1F63E; [0D F0 36, 05, 05]
 
-1F60D; [0D E7 98, 05, 05]
+1F63F; [0D F0 3E, 05, 05]
 
-1F60E; [0D E7 A0, 05, 05]
+1F640; [0D F0 46, 05, 05]
 
-1F60F; [0D E7 A8, 05, 05]
+1F645; [0D F0 4E, 05, 05]
 
-1F610; [0D E7 B0, 05, 05]
+1F646; [0D F0 56, 05, 05]
 
-1F611; [0D E7 B8, 05, 05]
+1F647; [0D F0 5E, 05, 05]
 
-1F612; [0D E7 C0, 05, 05]
+1F648; [0D F0 66, 05, 05]
 
-1F613; [0D E7 C8, 05, 05]
+1F649; [0D F0 6E, 05, 05]
 
-1F614; [0D E7 D0, 05, 05]
+1F64A; [0D F0 76, 05, 05]
 
-1F615; [0D E7 D8, 05, 05]
+1F64B; [0D F0 7E, 05, 05]
 
-1F616; [0D E7 E0, 05, 05]
+1F64C; [0D F0 86, 05, 05]
 
-1F617; [0D E7 E8, 05, 05]
+1F64D; [0D F0 8E, 05, 05]
 
-1F618; [0D E7 F0, 05, 05]
+1F64E; [0D F0 96, 05, 05]
 
-1F619; [0D E7 F8, 05, 05]
+1F64F; [0D F0 9E, 05, 05]
 
-1F61A; [0D E8 06, 05, 05]
+1F680; [0D F0 A6, 05, 05]
 
-1F61B; [0D E8 0E, 05, 05]
+1F681; [0D F0 AE, 05, 05]
 
-1F61C; [0D E8 16, 05, 05]
+1F682; [0D F0 B6, 05, 05]
 
-1F61D; [0D E8 1E, 05, 05]
+1F683; [0D F0 BE, 05, 05]
 
-1F61E; [0D E8 26, 05, 05]
+1F684; [0D F0 C6, 05, 05]
 
-1F61F; [0D E8 2E, 05, 05]
+1F685; [0D F0 CE, 05, 05]
 
-1F620; [0D E8 36, 05, 05]
+1F686; [0D F0 D6, 05, 05]
 
-1F621; [0D E8 3E, 05, 05]
+1F687; [0D F0 DE, 05, 05]
 
-1F622; [0D E8 46, 05, 05]
+1F688; [0D F0 E6, 05, 05]
 
-1F623; [0D E8 4E, 05, 05]
+1F689; [0D F0 EE, 05, 05]
 
-1F624; [0D E8 56, 05, 05]
+1F68A; [0D F0 F6, 05, 05]
 
-1F625; [0D E8 5E, 05, 05]
+1F68B; [0D F0 FE, 05, 05]
 
-1F626; [0D E8 66, 05, 05]
+1F68C; [0D F1 08, 05, 05]
 
-1F627; [0D E8 6E, 05, 05]
+1F68D; [0D F1 10, 05, 05]
 
-1F628; [0D E8 76, 05, 05]
+1F68E; [0D F1 18, 05, 05]
 
-1F629; [0D E8 7E, 05, 05]
+1F68F; [0D F1 20, 05, 05]
 
-1F62A; [0D E8 86, 05, 05]
+1F690; [0D F1 28, 05, 05]
 
-1F62B; [0D E8 8E, 05, 05]
+1F691; [0D F1 30, 05, 05]
 
-1F62C; [0D E8 96, 05, 05]
+1F692; [0D F1 38, 05, 05]
 
-1F62D; [0D E8 9E, 05, 05]
+1F693; [0D F1 40, 05, 05]
 
-1F62E; [0D E8 A6, 05, 05]
+1F694; [0D F1 48, 05, 05]
 
-1F62F; [0D E8 AE, 05, 05]
+1F695; [0D F1 50, 05, 05]
 
-1F630; [0D E8 B6, 05, 05]
+1F696; [0D F1 58, 05, 05]
 
-1F631; [0D E8 BE, 05, 05]
+1F697; [0D F1 60, 05, 05]
 
-1F632; [0D E8 C6, 05, 05]
+1F698; [0D F1 68, 05, 05]
 
-1F633; [0D E8 CE, 05, 05]
+1F699; [0D F1 70, 05, 05]
 
-1F634; [0D E8 D6, 05, 05]
+1F69A; [0D F1 78, 05, 05]
 
-1F635; [0D E8 DE, 05, 05]
+1F69B; [0D F1 80, 05, 05]
 
-1F636; [0D E8 E6, 05, 05]
+1F69C; [0D F1 88, 05, 05]
 
-1F637; [0D E8 EE, 05, 05]
+1F69D; [0D F1 90, 05, 05]
 
-1F638; [0D E8 F6, 05, 05]
+1F69E; [0D F1 98, 05, 05]
 
-1F639; [0D E9 04, 05, 05]
+1F69F; [0D F1 A0, 05, 05]
 
-1F63A; [0D E9 0C, 05, 05]
+1F6A0; [0D F1 A8, 05, 05]
 
-1F63B; [0D E9 14, 05, 05]
+1F6A1; [0D F1 B0, 05, 05]
 
-1F63C; [0D E9 1C, 05, 05]
+1F6A2; [0D F1 B8, 05, 05]
 
-1F63D; [0D E9 24, 05, 05]
+1F6A3; [0D F1 C0, 05, 05]
 
-1F63E; [0D E9 2C, 05, 05]
+1F6A4; [0D F1 C8, 05, 05]
 
-1F63F; [0D E9 34, 05, 05]
+1F6A5; [0D F1 D0, 05, 05]
 
-1F640; [0D E9 3C, 05, 05]
+1F6A6; [0D F1 D8, 05, 05]
 
-1F645; [0D E9 44, 05, 05]
+1F6A7; [0D F1 E0, 05, 05]
 
-1F646; [0D E9 4C, 05, 05]
+1F6A8; [0D F1 E8, 05, 05]
 
-1F647; [0D E9 54, 05, 05]
+1F6A9; [0D F1 F0, 05, 05]
 
-1F648; [0D E9 5C, 05, 05]
+1F6AA; [0D F1 F8, 05, 05]
 
-1F649; [0D E9 64, 05, 05]
+1F6AB; [0D F2 02, 05, 05]
 
-1F64A; [0D E9 6C, 05, 05]
+1F6AC; [0D F2 0A, 05, 05]
 
-1F64B; [0D E9 74, 05, 05]
+1F6AD; [0D F2 12, 05, 05]
 
-1F64C; [0D E9 7C, 05, 05]
+1F6AE; [0D F2 1A, 05, 05]
 
-1F64D; [0D E9 84, 05, 05]
+1F6AF; [0D F2 22, 05, 05]
 
-1F64E; [0D E9 8C, 05, 05]
+1F6B0; [0D F2 2A, 05, 05]
 
-1F64F; [0D E9 94, 05, 05]
+1F6B1; [0D F2 32, 05, 05]
 
-1F680; [0D E9 9C, 05, 05]
+1F6B2; [0D F2 3A, 05, 05]
 
-1F681; [0D E9 A4, 05, 05]
+1F6B3; [0D F2 42, 05, 05]
 
-1F682; [0D E9 AC, 05, 05]
+1F6B4; [0D F2 4A, 05, 05]
 
-1F683; [0D E9 B4, 05, 05]
+1F6B5; [0D F2 52, 05, 05]
 
-1F684; [0D E9 BC, 05, 05]
+1F6B6; [0D F2 5A, 05, 05]
 
-1F685; [0D E9 C4, 05, 05]
+1F6B7; [0D F2 62, 05, 05]
 
-1F686; [0D E9 CC, 05, 05]
+1F6B8; [0D F2 6A, 05, 05]
 
-1F687; [0D E9 D4, 05, 05]
+1F6B9; [0D F2 72, 05, 05]
 
-1F688; [0D E9 DC, 05, 05]
+1F6BA; [0D F2 7A, 05, 05]
 
-1F689; [0D E9 E4, 05, 05]
+1F6BB; [0D F2 82, 05, 05]
 
-1F68A; [0D E9 EC, 05, 05]
+1F6BC; [0D F2 8A, 05, 05]
 
-1F68B; [0D E9 F4, 05, 05]
+1F6BD; [0D F2 92, 05, 05]
 
-1F68C; [0D E9 FC, 05, 05]
+1F6BE; [0D F2 9A, 05, 05]
 
-1F68D; [0D EA 0A, 05, 05]
+1F6BF; [0D F2 A2, 05, 05]
 
-1F68E; [0D EA 12, 05, 05]
+1F6C0; [0D F2 AA, 05, 05]
 
-1F68F; [0D EA 1A, 05, 05]
+1F6C1; [0D F2 B2, 05, 05]
 
-1F690; [0D EA 22, 05, 05]
+1F6C2; [0D F2 BA, 05, 05]
 
-1F691; [0D EA 2A, 05, 05]
+1F6C3; [0D F2 C2, 05, 05]
 
-1F692; [0D EA 32, 05, 05]
+1F6C4; [0D F2 CA, 05, 05]
 
-1F693; [0D EA 3A, 05, 05]
+1F6C5; [0D F2 D2, 05, 05]
 
-1F694; [0D EA 42, 05, 05]
+1F700; [0D F2 DA, 05, 05]
 
-1F695; [0D EA 4A, 05, 05]
+1F701; [0D F2 E2, 05, 05]
 
-1F696; [0D EA 52, 05, 05]
+1F702; [0D F2 EA, 05, 05]
 
-1F697; [0D EA 5A, 05, 05]
+1F703; [0D F2 F2, 05, 05]
 
-1F698; [0D EA 62, 05, 05]
+1F704; [0D F2 FA, 05, 05]
 
-1F699; [0D EA 6A, 05, 05]
+1F705; [0D F3 04, 05, 05]
 
-1F69A; [0D EA 72, 05, 05]
+1F706; [0D F3 0C, 05, 05]
 
-1F69B; [0D EA 7A, 05, 05]
+1F707; [0D F3 14, 05, 05]
 
-1F69C; [0D EA 82, 05, 05]
+1F708; [0D F3 1C, 05, 05]
 
-1F69D; [0D EA 8A, 05, 05]
+1F709; [0D F3 24, 05, 05]
 
-1F69E; [0D EA 92, 05, 05]
+1F70A; [0D F3 2C, 05, 05]
 
-1F69F; [0D EA 9A, 05, 05]
+1F70B; [0D F3 34, 05, 05]
 
-1F6A0; [0D EA A2, 05, 05]
+1F70C; [0D F3 3C, 05, 05]
 
-1F6A1; [0D EA AA, 05, 05]
+1F70D; [0D F3 44, 05, 05]
 
-1F6A2; [0D EA B2, 05, 05]
+1F70E; [0D F3 4C, 05, 05]
 
-1F6A3; [0D EA BA, 05, 05]
+1F70F; [0D F3 54, 05, 05]
 
-1F6A4; [0D EA C2, 05, 05]
+1F710; [0D F3 5C, 05, 05]
 
-1F6A5; [0D EA CA, 05, 05]
+1F711; [0D F3 64, 05, 05]
 
-1F6A6; [0D EA D2, 05, 05]
+1F712; [0D F3 6C, 05, 05]
 
-1F6A7; [0D EA DA, 05, 05]
+1F713; [0D F3 74, 05, 05]
 
-1F6A8; [0D EA E2, 05, 05]
+1F714; [0D F3 7C, 05, 05]
 
-1F6A9; [0D EA EA, 05, 05]
+1F715; [0D F3 84, 05, 05]
 
-1F6AA; [0D EA F2, 05, 05]
+1F716; [0D F3 8C, 05, 05]
 
-1F6AB; [0D EA FA, 05, 05]
+1F717; [0D F3 94, 05, 05]
 
-1F6AC; [0D EB 08, 05, 05]
+1F718; [0D F3 9C, 05, 05]
 
-1F6AD; [0D EB 10, 05, 05]
+1F719; [0D F3 A4, 05, 05]
 
-1F6AE; [0D EB 18, 05, 05]
+1F71A; [0D F3 AC, 05, 05]
 
-1F6AF; [0D EB 20, 05, 05]
+1F71B; [0D F3 B4, 05, 05]
 
-1F6B0; [0D EB 28, 05, 05]
+1F71C; [0D F3 BC, 05, 05]
 
-1F6B1; [0D EB 30, 05, 05]
+1F71D; [0D F3 C4, 05, 05]
 
-1F6B2; [0D EB 38, 05, 05]
+1F71E; [0D F3 CC, 05, 05]
 
-1F6B3; [0D EB 40, 05, 05]
+1F71F; [0D F3 D4, 05, 05]
 
-1F6B4; [0D EB 48, 05, 05]
+1F720; [0D F3 DC, 05, 05]
 
-1F6B5; [0D EB 50, 05, 05]
+1F721; [0D F3 E4, 05, 05]
 
-1F6B6; [0D EB 58, 05, 05]
+1F722; [0D F3 EC, 05, 05]
 
-1F6B7; [0D EB 60, 05, 05]
+1F723; [0D F3 F4, 05, 05]
 
-1F6B8; [0D EB 68, 05, 05]
+1F724; [0D F3 FC, 05, 05]
 
-1F6B9; [0D EB 70, 05, 05]
+1F725; [0D F4 06, 05, 05]
 
-1F6BA; [0D EB 78, 05, 05]
+1F726; [0D F4 0E, 05, 05]
 
-1F6BB; [0D EB 80, 05, 05]
+1F727; [0D F4 16, 05, 05]
 
-1F6BC; [0D EB 88, 05, 05]
+1F728; [0D F4 1E, 05, 05]
 
-1F6BD; [0D EB 90, 05, 05]
+1F729; [0D F4 26, 05, 05]
 
-1F6BE; [0D EB 98, 05, 05]
+1F72A; [0D F4 2E, 05, 05]
 
-1F6BF; [0D EB A0, 05, 05]
+1F72B; [0D F4 36, 05, 05]
 
-1F6C0; [0D EB A8, 05, 05]
+1F72C; [0D F4 3E, 05, 05]
 
-1F6C1; [0D EB B0, 05, 05]
+1F72D; [0D F4 46, 05, 05]
 
-1F6C2; [0D EB B8, 05, 05]
+1F72E; [0D F4 4E, 05, 05]
 
-1F6C3; [0D EB C0, 05, 05]
+1F72F; [0D F4 56, 05, 05]
 
-1F6C4; [0D EB C8, 05, 05]
+1F730; [0D F4 5E, 05, 05]
 
-1F6C5; [0D EB D0, 05, 05]
+1F731; [0D F4 66, 05, 05]
 
-1F700; [0D EB D8, 05, 05]
+1F732; [0D F4 6E, 05, 05]
 
-1F701; [0D EB E0, 05, 05]
+1F733; [0D F4 76, 05, 05]
 
-1F702; [0D EB E8, 05, 05]
+1F734; [0D F4 7E, 05, 05]
 
-1F703; [0D EB F0, 05, 05]
+1F735; [0D F4 86, 05, 05]
 
-1F704; [0D EB F8, 05, 05]
+1F736; [0D F4 8E, 05, 05]
 
-1F705; [0D EC 06, 05, 05]
+1F737; [0D F4 96, 05, 05]
 
-1F706; [0D EC 0E, 05, 05]
+1F738; [0D F4 9E, 05, 05]
 
-1F707; [0D EC 16, 05, 05]
+1F739; [0D F4 A6, 05, 05]
 
-1F708; [0D EC 1E, 05, 05]
+1F73A; [0D F4 AE, 05, 05]
 
-1F709; [0D EC 26, 05, 05]
+1F73B; [0D F4 B6, 05, 05]
 
-1F70A; [0D EC 2E, 05, 05]
+1F73C; [0D F4 BE, 05, 05]
 
-1F70B; [0D EC 36, 05, 05]
+1F73D; [0D F4 C6, 05, 05]
 
-1F70C; [0D EC 3E, 05, 05]
+1F73E; [0D F4 CE, 05, 05]
 
-1F70D; [0D EC 46, 05, 05]
+1F73F; [0D F4 D6, 05, 05]
 
-1F70E; [0D EC 4E, 05, 05]
+1F740; [0D F4 DE, 05, 05]
 
-1F70F; [0D EC 56, 05, 05]
+1F741; [0D F4 E6, 05, 05]
 
-1F710; [0D EC 5E, 05, 05]
+1F742; [0D F4 EE, 05, 05]
 
-1F711; [0D EC 66, 05, 05]
+1F743; [0D F4 F6, 05, 05]
 
-1F712; [0D EC 6E, 05, 05]
+1F744; [0D F4 FE, 05, 05]
 
-1F713; [0D EC 76, 05, 05]
+1F745; [0D F5 08, 05, 05]
 
-1F714; [0D EC 7E, 05, 05]
+1F746; [0D F5 10, 05, 05]
 
-1F715; [0D EC 86, 05, 05]
+1F747; [0D F5 18, 05, 05]
 
-1F716; [0D EC 8E, 05, 05]
+1F748; [0D F5 20, 05, 05]
 
-1F717; [0D EC 96, 05, 05]
+1F749; [0D F5 28, 05, 05]
 
-1F718; [0D EC 9E, 05, 05]
+1F74A; [0D F5 30, 05, 05]
 
-1F719; [0D EC A6, 05, 05]
+1F74B; [0D F5 38, 05, 05]
 
-1F71A; [0D EC AE, 05, 05]
+1F74C; [0D F5 40, 05, 05]
 
-1F71B; [0D EC B6, 05, 05]
+1F74D; [0D F5 48, 05, 05]
 
-1F71C; [0D EC BE, 05, 05]
+1F74E; [0D F5 50, 05, 05]
 
-1F71D; [0D EC C6, 05, 05]
+1F74F; [0D F5 58, 05, 05]
 
-1F71E; [0D EC CE, 05, 05]
+1F750; [0D F5 60, 05, 05]
 
-1F71F; [0D EC D6, 05, 05]
+1F751; [0D F5 68, 05, 05]
 
-1F720; [0D EC DE, 05, 05]
+1F752; [0D F5 70, 05, 05]
 
-1F721; [0D EC E6, 05, 05]
+1F753; [0D F5 78, 05, 05]
 
-1F722; [0D EC EE, 05, 05]
+1F754; [0D F5 80, 05, 05]
 
-1F723; [0D EC F6, 05, 05]
+1F755; [0D F5 88, 05, 05]
 
-1F724; [0D ED 04, 05, 05]
+1F756; [0D F5 90, 05, 05]
 
-1F725; [0D ED 0C, 05, 05]
+1F757; [0D F5 98, 05, 05]
 
-1F726; [0D ED 14, 05, 05]
+1F758; [0D F5 A0, 05, 05]
 
-1F727; [0D ED 1C, 05, 05]
+1F759; [0D F5 A8, 05, 05]
 
-1F728; [0D ED 24, 05, 05]
+1F75A; [0D F5 B0, 05, 05]
 
-1F729; [0D ED 2C, 05, 05]
+1F75B; [0D F5 B8, 05, 05]
 
-1F72A; [0D ED 34, 05, 05]
+1F75C; [0D F5 C0, 05, 05]
 
-1F72B; [0D ED 3C, 05, 05]
+1F75D; [0D F5 C8, 05, 05]
 
-1F72C; [0D ED 44, 05, 05]
+1F75E; [0D F5 D0, 05, 05]
 
-1F72D; [0D ED 4C, 05, 05]
+1F75F; [0D F5 D8, 05, 05]
 
-1F72E; [0D ED 54, 05, 05]
+1F760; [0D F5 E0, 05, 05]
 
-1F72F; [0D ED 5C, 05, 05]
+1F761; [0D F5 E8, 05, 05]
 
-1F730; [0D ED 64, 05, 05]
+1F762; [0D F5 F0, 05, 05]
 
-1F731; [0D ED 6C, 05, 05]
+1F763; [0D F5 F8, 05, 05]
 
-1F732; [0D ED 74, 05, 05]
+1F764; [0D F6 02, 05, 05]
 
-1F733; [0D ED 7C, 05, 05]
+1F765; [0D F6 0A, 05, 05]
 
-1F734; [0D ED 84, 05, 05]
+1F766; [0D F6 12, 05, 05]
 
-1F735; [0D ED 8C, 05, 05]
+1F767; [0D F6 1A, 05, 05]
 
-1F736; [0D ED 94, 05, 05]
+1F768; [0D F6 22, 05, 05]
 
-1F737; [0D ED 9C, 05, 05]
+1F769; [0D F6 2A, 05, 05]
 
-1F738; [0D ED A4, 05, 05]
+1F76A; [0D F6 32, 05, 05]
 
-1F739; [0D ED AC, 05, 05]
+1F76B; [0D F6 3A, 05, 05]
 
-1F73A; [0D ED B4, 05, 05]
+1F76C; [0D F6 42, 05, 05]
 
-1F73B; [0D ED BC, 05, 05]
+1F76D; [0D F6 4A, 05, 05]
 
-1F73C; [0D ED C4, 05, 05]
+1F76E; [0D F6 52, 05, 05]
 
-1F73D; [0D ED CC, 05, 05]
+1F76F; [0D F6 5A, 05, 05]
 
-1F73E; [0D ED D4, 05, 05]
+1F770; [0D F6 62, 05, 05]
 
-1F73F; [0D ED DC, 05, 05]
+1F771; [0D F6 6A, 05, 05]
 
-1F740; [0D ED E4, 05, 05]
+1F772; [0D F6 72, 05, 05]
 
-1F741; [0D ED EC, 05, 05]
+1F773; [0D F6 7A, 05, 05]
 
-1F742; [0D ED F4, 05, 05]
+2FF0; [0D F6 82, 05, 05]
 
-1F743; [0D ED FC, 05, 05]
+2FF1; [0D F6 8A, 05, 05]
 
-1F744; [0D EE 0A, 05, 05]
+2FF2; [0D F6 92, 05, 05]
 
-1F745; [0D EE 12, 05, 05]
+2FF3; [0D F6 9A, 05, 05]
 
-1F746; [0D EE 1A, 05, 05]
+2FF4; [0D F6 A2, 05, 05]
 
-1F747; [0D EE 22, 05, 05]
+2FF5; [0D F6 AA, 05, 05]
 
-1F748; [0D EE 2A, 05, 05]
+2FF6; [0D F6 B2, 05, 05]
 
-1F749; [0D EE 32, 05, 05]
+2FF7; [0D F6 BA, 05, 05]
 
-1F74A; [0D EE 3A, 05, 05]
+2FF8; [0D F6 C2, 05, 05]
 
-1F74B; [0D EE 42, 05, 05]
+2FF9; [0D F6 CA, 05, 05]
 
-1F74C; [0D EE 4A, 05, 05]
+2FFA; [0D F6 D2, 05, 05]
 
-1F74D; [0D EE 52, 05, 05]
+2FFB; [0D F6 DA, 05, 05]
 
-1F74E; [0D EE 5A, 05, 05]
+31C0; [0D F6 E2, 05, 05]
 
-1F74F; [0D EE 62, 05, 05]
+31C1; [0D F6 EA, 05, 05]
 
-1F750; [0D EE 6A, 05, 05]
+31C2; [0D F6 F2, 05, 05]
 
-1F751; [0D EE 72, 05, 05]
+31C3; [0D F6 FA, 05, 05]
 
-1F752; [0D EE 7A, 05, 05]
+31C4; [0D F7 04, 05, 05]
 
-1F753; [0D EE 82, 05, 05]
+31C5; [0D F7 0C, 05, 05]
 
-1F754; [0D EE 8A, 05, 05]
+31C6; [0D F7 14, 05, 05]
 
-1F755; [0D EE 92, 05, 05]
+31C7; [0D F7 1C, 05, 05]
 
-1F756; [0D EE 9A, 05, 05]
+31C8; [0D F7 24, 05, 05]
 
-1F757; [0D EE A2, 05, 05]
+31C9; [0D F7 2C, 05, 05]
 
-1F758; [0D EE AA, 05, 05]
+31CA; [0D F7 34, 05, 05]
 
-1F759; [0D EE B2, 05, 05]
+31CB; [0D F7 3C, 05, 05]
 
-1F75A; [0D EE BA, 05, 05]
+31CC; [0D F7 44, 05, 05]
 
-1F75B; [0D EE C2, 05, 05]
+31CD; [0D F7 4C, 05, 05]
 
-1F75C; [0D EE CA, 05, 05]
+31CE; [0D F7 54, 05, 05]
 
-1F75D; [0D EE D2, 05, 05]
+31CF; [0D F7 5C, 05, 05]
 
-1F75E; [0D EE DA, 05, 05]
+31D0; [0D F7 64, 05, 05]
 
-1F75F; [0D EE E2, 05, 05]
+31D1; [0D F7 6C, 05, 05]
 
-1F760; [0D EE EA, 05, 05]
+31D2; [0D F7 74, 05, 05]
 
-1F761; [0D EE F2, 05, 05]
+31D3; [0D F7 7C, 05, 05]
 
-1F762; [0D EE FA, 05, 05]
+31D4; [0D F7 84, 05, 05]
 
-1F763; [0D EF 08, 05, 05]
+31D5; [0D F7 8C, 05, 05]
 
-1F764; [0D EF 10, 05, 05]
+31D6; [0D F7 94, 05, 05]
 
-1F765; [0D EF 18, 05, 05]
+31D7; [0D F7 9C, 05, 05]
 
-1F766; [0D EF 20, 05, 05]
+31D8; [0D F7 A4, 05, 05]
 
-1F767; [0D EF 28, 05, 05]
+31D9; [0D F7 AC, 05, 05]
 
-1F768; [0D EF 30, 05, 05]
+31DA; [0D F7 B4, 05, 05]
 
-1F769; [0D EF 38, 05, 05]
+31DB; [0D F7 BC, 05, 05]
 
-1F76A; [0D EF 40, 05, 05]
+31DC; [0D F7 C4, 05, 05]
 
-1F76B; [0D EF 48, 05, 05]
+31DD; [0D F7 CC, 05, 05]
 
-1F76C; [0D EF 50, 05, 05]
+31DE; [0D F7 D4, 05, 05]
 
-1F76D; [0D EF 58, 05, 05]
+31DF; [0D F7 DC, 05, 05]
 
-1F76E; [0D EF 60, 05, 05]
+31E0; [0D F7 E4, 05, 05]
 
-1F76F; [0D EF 68, 05, 05]
+31E1; [0D F7 EC, 05, 05]
 
-1F770; [0D EF 70, 05, 05]
+31E2; [0D F7 F4, 05, 05]
 
-1F771; [0D EF 78, 05, 05]
+31E3; [0D F7 FC, 05, 05]
 
-1F772; [0D EF 80, 05, 05]
+3004; [0D F8 06, 05, 05]
 
-1F773; [0D EF 88, 05, 05]
+3012; [0D F8 0E, 05, 05]
+3036; [0D F8 0E, 05, 20]
 
-2FF0; [0D EF 90, 05, 05]
+3013; [0D F8 16, 05, 05]
 
-2FF1; [0D EF 98, 05, 05]
+3020; [0D F8 1E, 05, 05]
 
-2FF2; [0D EF A0, 05, 05]
+3037; [0D F8 26, 05, 05]
 
-2FF3; [0D EF A8, 05, 05]
+303E; [0D F8 2E, 05, 05]
 
-2FF4; [0D EF B0, 05, 05]
+303F; [0D F8 36, 05, 05]
 
-2FF5; [0D EF B8, 05, 05]
+3190; [0D F8 3E, 05, 05]
 
-2FF6; [0D EF C0, 05, 05]
+3191; [0D F8 46, 05, 05]
 
-2FF7; [0D EF C8, 05, 05]
+327F; [0D F8 4E, 05, 05]
 
-2FF8; [0D EF D0, 05, 05]
+FFFC; [0D F8 56, 05, 05]
 
-2FF9; [0D EF D8, 05, 05]
+02D0; [0D FA, 05, 05]
 
-2FFA; [0D EF E0, 05, 05]
+02D1; [0D FC, 05, 05]
 
-2FFB; [0D EF E8, 05, 05]
+0971; [0D FE, 05, 05]
 
-31C0; [0D EF F0, 05, 05]
+0E46; [0E 02, 05, 05]
 
-31C1; [0D EF F8, 05, 05]
+0EC6; [0E 04, 05, 05]
 
-31C2; [0D F0 06, 05, 05]
+17D7; [0E 06, 05, 05]
 
-31C3; [0D F0 0E, 05, 05]
+1AA7; [0E 08, 05, 05]
 
-31C4; [0D F0 16, 05, 05]
+A9CF; [0E 0A, 05, 05]
 
-31C5; [0D F0 1E, 05, 05]
+AA70; [0E 0C, 05, 05]
 
-31C6; [0D F0 26, 05, 05]
+AADD; [0E 0E 02, 05, 05]
 
-31C7; [0D F0 2E, 05, 05]
+AAF3; [0E 0E 0A, 05, 05]
 
-31C8; [0D F0 36, 05, 05]
+AAF4; [0E 0E 12, 05, 05]
 
-31C9; [0D F0 3E, 05, 05]
+3005; [0E 10, 05, 05]
 
-31CA; [0D F0 46, 05, 05]
+303B; [0E 12, 05, 05]
 
-31CB; [0D F0 4E, 05, 05]
+3031; [0E 14, 05, 05]
+3032; [0E 14, 05, 05][, AE, 05]
 
-31CC; [0D F0 56, 05, 05]
+3033; [0E 16, 05, 05]
+3034; [0E 16, 05, 05][, AE, 05]
 
-31CD; [0D F0 5E, 05, 05]
+3035; [0E 18, 05, 05]
 
-31CE; [0D F0 66, 05, 05]
+309D; [0E 1A, 05, 05]
+309E; [0E 1A, 05, 05][, AE, 05]
 
-31CF; [0D F0 6E, 05, 05]
+30FC; [0E 1C, 05, 05]
+FF70; [0E 1C, 05, A0]
 
-31D0; [0D F0 76, 05, 05]
+30FD; [0E 1E, 05, 05]
+30FE; [0E 1E, 05, 05][, AE, 05]
 
-31D1; [0D F0 7E, 05, 05]
+FDD1 20AC;     [0F 02 02, 05, 05]      # CURRENCY first primary starts reordering group
 
-31D2; [0D F0 86, 05, 05]
+00A4; [0F 07, 05, 05]
 
-31D3; [0D F0 8E, 05, 05]
+00A2; [0F 09, 05, 05]
+FFE0; [0F 09, 05, 20]
 
-31D4; [0D F0 96, 05, 05]
+0024; [0F 0B, 05, 05]
+FF04; [0F 0B, 05, 20]
+FE69; [0F 0B, 05, 2E]
 
-31D5; [0D F0 9E, 05, 05]
+00A3; [0F 0D, 05, 05]
+FFE1; [0F 0D, 05, 20]
 
-31D6; [0D F0 A6, 05, 05]
+00A5; [0F 0F, 05, 05]
+FFE5; [0F 0F, 05, 20]
 
-31D7; [0D F0 AE, 05, 05]
+058F; [0F 11, 05, 05]
 
-31D8; [0D F0 B6, 05, 05]
+060B; [0F 13, 05, 05]
 
-31D9; [0D F0 BE, 05, 05]
+09F2; [0F 15, 05, 05]
 
-31DA; [0D F0 C6, 05, 05]
+09F3; [0F 17, 05, 05]
 
-31DB; [0D F0 CE, 05, 05]
+09FB; [0F 19, 05, 05]
 
-31DC; [0D F0 D6, 05, 05]
+0AF1; [0F 1B, 05, 05]
 
-31DD; [0D F0 DE, 05, 05]
+A838; [0F 1D, 05, 05]
 
-31DE; [0D F0 E6, 05, 05]
+0BF9; [0F 1F, 05, 05]
 
-31DF; [0D F0 EE, 05, 05]
+0E3F; [0F 21, 05, 05]
 
-31E0; [0D F0 F6, 05, 05]
+17DB; [0F 23, 05, 05]
 
-31E1; [0D F1 04, 05, 05]
+20A0; [0F 25, 05, 05]
 
-31E2; [0D F1 0C, 05, 05]
+20A1; [0F 27, 05, 05]
 
-31E3; [0D F1 14, 05, 05]
+20A2; [0F 29, 05, 05]
 
-3004; [0D F1 1C, 05, 05]
+20A3; [0F 2B, 05, 05]
 
-3012; [0D F1 24, 05, 05]
-3036; [0D F1 24, 05, 09]
+20A4; [0F 2D, 05, 05]
 
-3013; [0D F1 2C, 05, 05]
+20A5; [0F 2F, 05, 05]
 
-3020; [0D F1 34, 05, 05]
+20A6; [0F 31, 05, 05]
 
-3037; [0D F1 3C, 05, 05]
+20A7; [0F 33, 05, 05]
 
-303E; [0D F1 44, 05, 05]
+20A9; [0F 35, 05, 05]
+FFE6; [0F 35, 05, 20]
 
-303F; [0D F1 4C, 05, 05]
+20AA; [0F 37, 05, 05]
 
-3190; [0D F1 54, 05, 05]
+20AB; [0F 39, 05, 05]
 
-3191; [0D F1 5C, 05, 05]
+20AC; [0F 3B, 05, 05]
 
-327F; [0D F1 64, 05, 05]
+20AD; [0F 3D, 05, 05]
 
-FFFC; [0D F1 6C, 05, 05]
+20AE; [0F 3F, 05, 05]
 
-FFFD; [0E 0A 04, 05, 05]
+20AF; [0F 41, 05, 05]
 
-02D0; [0E 0B, 05, 05]
+20B0; [0F 43, 05, 05]
 
-02D1; [0E 0D, 05, 05]
+20B1; [0F 45, 05, 05]
 
-0971; [0E 0F, 05, 05]
+20B2; [0F 47, 05, 05]
 
-0E46; [0E 11, 05, 05]
+20B3; [0F 49, 05, 05]
 
-0EC6; [0E 13, 05, 05]
+20B4; [0F 4B, 05, 05]
 
-17D7; [0E 15, 05, 05]
+20B5; [0F 4D, 05, 05]
 
-1AA7; [0E 17 04, 05, 05]
+20B6; [0F 4F, 05, 05]
 
-A9CF; [0E 17 0C, 05, 05]
+20B7; [0F 51, 05, 05]
 
-AA70; [0E 18, 05, 05]
+20B8; [0F 53, 05, 05]
 
-AADD; [0E 1A 04, 05, 05]
+20B9; [0F 55, 05, 05]
 
-AAF3; [0E 1A 0C, 05, 05]
+20BA; [0F 57, 05, 05]
 
-AAF4; [0E 1A 14, 05, 05]
+20A8; [0F 59, 05, 05]
 
-3005; [0E 1B, 05, 05]
+FDFC; [0F 5B, 05, 05]
 
-303B; [0E 1D, 05, 05]
+FDD1 0034;     [10 02 02, 05, 05]      # DIGIT first primary starts reordering group
 
-3031; [0E 1F, 05, 05]
-3032; [0E 1F, 05, 05][, DA 95, 05]
+FDD0 0034;     [11, 05, 05]    # lead byte for numeric sorting
 
-3033; [0E 21, 05, 05]
-3034; [0E 21, 05, 05][, DA 95, 05]
+09F4; [12 06, 05, 05]
 
-3035; [0E 23, 05, 05]
+09F5; [12 08, 05, 05]
 
-309D; [0E 25, 05, 05]
-309E; [0E 25, 05, 05][, DA 95, 05]
+09F6; [12 0A, 05, 05]
 
-30FC; [0E 27, 05, 05]
-FF70; [0E 27, 05, A3]
+09F7; [12 0C, 05, 05]
 
-30FD; [0E 29, 05, 05]
-30FE; [0E 29, 05, 05][, DA 95, 05]
+09F8; [12 0E, 05, 05]
 
-00A4; [0F 0A, 05, 05]
+09F9; [12 10, 05, 05]
 
-00A2; [0F 0C, 05, 05]
-FFE0; [0F 0C, 05, 07]
+0B72; [12 12, 05, 05]
 
-0024; [0F 0E, 05, 05]
-FF04; [0F 0E, 05, 07]
-FE69; [0F 0E, 05, 1D]
+0B73; [12 14, 05, 05]
 
-00A3; [0F 10, 05, 05]
-FFE1; [0F 10, 05, 07]
+0B74; [12 16, 05, 05]
 
-00A5; [0F 12, 05, 05]
-FFE5; [0F 12, 05, 07]
+0B75; [12 18, 05, 05]
 
-058F; [0F 14, 05, 05]
+0B76; [12 1A, 05, 05]
 
-060B; [0F 16, 05, 05]
+0B77; [12 1C, 05, 05]
 
-09F2; [0F 18, 05, 05]
+A830; [12 1E, 05, 05]
 
-09F3; [0F 1A, 05, 05]
+A831; [12 20, 05, 05]
 
-09FB; [0F 1C, 05, 05]
+A832; [12 22, 05, 05]
 
-0AF1; [0F 1E, 05, 05]
+A833; [12 24, 05, 05]
 
-A838; [0F 20, 05, 05]
+A834; [12 26, 05, 05]
 
-0BF9; [0F 22, 05, 05]
+A835; [12 28, 05, 05]
 
-0E3F; [0F 24, 05, 05]
+0BF0; [12 2A, 05, 05]
 
-17DB; [0F 26, 05, 05]
+0BF1; [12 2C, 05, 05]
 
-20A0; [0F 28, 05, 05]
+0BF2; [12 2E, 05, 05]
 
-20A1; [0F 2A, 05, 05]
+0D70; [12 30, 05, 05]
 
-20A2; [0F 2C, 05, 05]
+0D71; [12 32, 05, 05]
 
-20A3; [0F 2E, 05, 05]
+0D72; [12 34, 05, 05]
 
-20A4; [0F 30, 05, 05]
+0D73; [12 36, 05, 05]
 
-20A5; [0F 32, 05, 05]
+0D74; [12 38, 05, 05]
 
-20A6; [0F 34, 05, 05]
+0D75; [12 3A, 05, 05]
 
-20A7; [0F 36, 05, 05]
+1372; [12 3C, 05, 05]
 
-20A9; [0F 38, 05, 05]
-FFE6; [0F 38, 05, 07]
+1373; [12 3E, 05, 05]
 
-20AA; [0F 3A, 05, 05]
+1374; [12 40, 05, 05]
 
-20AB; [0F 3C, 05, 05]
+1375; [12 42, 05, 05]
 
-20AC; [0F 3E, 05, 05]
+1376; [12 44, 05, 05]
 
-20AD; [0F 40, 05, 05]
+1377; [12 46, 05, 05]
 
-20AE; [0F 42, 05, 05]
+1378; [12 48, 05, 05]
 
-20AF; [0F 44, 05, 05]
+1379; [12 4A, 05, 05]
 
-20B0; [0F 46, 05, 05]
+137A; [12 4C, 05, 05]
 
-20B1; [0F 48, 05, 05]
+137B; [12 4E, 05, 05]
 
-20B2; [0F 4A, 05, 05]
+137C; [12 50, 05, 05]
 
-20B3; [0F 4C, 05, 05]
+2180; [12 52, 05, 05]
 
-20B4; [0F 4E, 05, 05]
+2181; [12 54, 05, 05]
 
-20B5; [0F 50, 05, 05]
+2182; [12 56, 05, 05]
 
-20B6; [0F 52, 05, 05]
+2186; [12 58, 05, 05]
 
-20B7; [0F 54, 05, 05]
+2187; [12 5A, 05, 05]
 
-20B8; [0F 56, 05, 05]
+2188; [12 5C, 05, 05]
 
-20B9; [0F 58, 05, 05]
+10E69; [12 5E, 05, 05]
 
-20BA; [0F 5A, 05, 05]
+10E6A; [12 60, 05, 05]
 
-20A8; [0F 5C, 05, 05]
+10E6B; [12 62, 05, 05]
 
-FDFC; [0F 5E, 05, 05]
+10E6C; [12 64, 05, 05]
 
-09F4; [10 0A, 05, 05]
+10E6D; [12 66, 05, 05]
 
-09F5; [10 0C, 05, 05]
+10E6E; [12 68, 05, 05]
 
-09F6; [10 0E, 05, 05]
+10E6F; [12 6A, 05, 05]
 
-09F7; [10 10, 05, 05]
+10E70; [12 6C, 05, 05]
 
-09F8; [10 12, 05, 05]
+10E71; [12 6E, 05, 05]
 
-09F9; [10 14, 05, 05]
+10E72; [12 70, 05, 05]
 
-0B72; [10 16, 05, 05]
+10E73; [12 72, 05, 05]
 
-0B73; [10 18, 05, 05]
+10E74; [12 74, 05, 05]
 
-0B74; [10 1A, 05, 05]
+10E75; [12 76, 05, 05]
 
-0B75; [10 1C, 05, 05]
+10E76; [12 78, 05, 05]
 
-0B76; [10 1E, 05, 05]
+10E77; [12 7A, 05, 05]
 
-0B77; [10 20, 05, 05]
+10E78; [12 7C, 05, 05]
 
-A830; [10 22, 05, 05]
+10E79; [12 7E, 05, 05]
 
-A831; [10 24, 05, 05]
+10E7A; [12 80, 05, 05]
 
-A832; [10 26, 05, 05]
+10E7B; [12 82, 05, 05]
 
-A833; [10 28, 05, 05]
+10E7C; [12 84, 05, 05]
 
-A834; [10 2A, 05, 05]
+10E7D; [12 86, 05, 05]
 
-A835; [10 2C, 05, 05]
+10E7E; [12 88, 05, 05]
 
-0BF0; [10 2E, 05, 05]
+2CFD; [12 8A 02, 05, 05]
 
-0BF1; [10 30, 05, 05]
+10322; [12 8A 0A, 05, 05]
 
-0BF2; [10 32, 05, 05]
+10323; [12 8A 12, 05, 05]
 
-0D70; [10 34, 05, 05]
+10110; [12 8C, 05, 05]
 
-0D71; [10 36, 05, 05]
+10111; [12 8E, 05, 05]
 
-0D72; [10 38, 05, 05]
+10112; [12 90, 05, 05]
 
-0D73; [10 3A, 05, 05]
+10113; [12 92, 05, 05]
 
-0D74; [10 3C, 05, 05]
+10114; [12 94, 05, 05]
 
-0D75; [10 3E, 05, 05]
+10115; [12 96, 05, 05]
 
-1372; [10 40, 05, 05]
+10116; [12 98, 05, 05]
 
-1373; [10 42, 05, 05]
+10117; [12 9A, 05, 05]
 
-1374; [10 44, 05, 05]
+10118; [12 9C, 05, 05]
 
-1375; [10 46, 05, 05]
+10119; [12 9E, 05, 05]
 
-1376; [10 48, 05, 05]
+1011A; [12 A0, 05, 05]
 
-1377; [10 4A, 05, 05]
+1011B; [12 A2, 05, 05]
 
-1378; [10 4C, 05, 05]
+1011C; [12 A4, 05, 05]
 
-1379; [10 4E, 05, 05]
+1011D; [12 A6, 05, 05]
 
-137A; [10 50, 05, 05]
+1011E; [12 A8, 05, 05]
 
-137B; [10 52, 05, 05]
+1011F; [12 AA, 05, 05]
 
-137C; [10 54, 05, 05]
+10120; [12 AC, 05, 05]
 
-2180; [10 56, 05, 05]
+10121; [12 AE, 05, 05]
 
-2181; [10 58, 05, 05]
+10122; [12 B0, 05, 05]
 
-2182; [10 5A, 05, 05]
+10123; [12 B2, 05, 05]
 
-2186; [10 5C, 05, 05]
+10124; [12 B4, 05, 05]
 
-2187; [10 5E, 05, 05]
+10125; [12 B6, 05, 05]
 
-2188; [10 60, 05, 05]
+10126; [12 B8, 05, 05]
 
-10E69; [10 62, 05, 05]
+10127; [12 BA, 05, 05]
 
-10E6A; [10 64, 05, 05]
+10128; [12 BC, 05, 05]
 
-10E6B; [10 66, 05, 05]
+10129; [12 BE, 05, 05]
 
-10E6C; [10 68, 05, 05]
+1012A; [12 C0, 05, 05]
 
-10E6D; [10 6A, 05, 05]
+1012B; [12 C2, 05, 05]
 
-10E6E; [10 6C, 05, 05]
+1012C; [12 C4, 05, 05]
 
-10E6F; [10 6E, 05, 05]
+1012D; [12 C6, 05, 05]
 
-10E70; [10 70, 05, 05]
+1012E; [12 C8, 05, 05]
 
-10E71; [10 72, 05, 05]
+1012F; [12 CA, 05, 05]
 
-10E72; [10 74, 05, 05]
+10130; [12 CC, 05, 05]
 
-10E73; [10 76, 05, 05]
+10131; [12 CE, 05, 05]
 
-10E74; [10 78, 05, 05]
+10132; [12 D0, 05, 05]
 
-10E75; [10 7A, 05, 05]
+10133; [12 D2, 05, 05]
 
-10E76; [10 7C, 05, 05]
+10140; [12 D4, 05, 05]
 
-10E77; [10 7E, 05, 05]
+10141; [12 D6, 05, 05]
 
-10E78; [10 80, 05, 05]
+10144; [12 D8, 05, 05]
 
-10E79; [10 82, 05, 05]
+10145; [12 DA, 05, 05]
 
-10E7A; [10 84, 05, 05]
+10146; [12 DC, 05, 05]
 
-10E7B; [10 86, 05, 05]
+10147; [12 DE, 05, 05]
 
-10E7C; [10 88, 05, 05]
+10149; [12 E0, 05, 05]
 
-10E7D; [10 8A, 05, 05]
+1014A; [12 E2, 05, 05]
 
-10E7E; [10 8C, 05, 05]
+1014B; [12 E4, 05, 05]
 
-2CFD; [10 8E 04, 05, 05]
+1014C; [12 E6, 05, 05]
 
-10322; [10 8E 0C, 05, 05]
+1014D; [12 E8, 05, 05]
 
-10323; [10 8E 14, 05, 05]
+1014E; [12 EA, 05, 05]
 
-10110; [10 8F, 05, 05]
+10150; [12 EC, 05, 05]
 
-10111; [10 91, 05, 05]
+10151; [12 EE, 05, 05]
 
-10112; [10 93, 05, 05]
+10152; [12 F0, 05, 05]
 
-10113; [10 95, 05, 05]
+10153; [12 F2, 05, 05]
 
-10114; [10 97, 05, 05]
+10154; [12 F4, 05, 05]
 
-10115; [10 99, 05, 05]
+10155; [12 F6, 05, 05]
 
-10116; [10 9B, 05, 05]
+10156; [12 F8, 05, 05]
 
-10117; [10 9D, 05, 05]
+10157; [12 FA, 05, 05]
 
-10118; [10 9F, 05, 05]
+10160; [12 FC, 05, 05]
 
-10119; [10 A1, 05, 05]
+10161; [12 FE, 05, 05]
 
-1011A; [10 A3, 05, 05]
+10162; [13 02, 05, 05]
 
-1011B; [10 A5, 05, 05]
+10163; [13 04, 05, 05]
 
-1011C; [10 A7, 05, 05]
+10164; [13 06, 05, 05]
 
-1011D; [10 A9, 05, 05]
+10165; [13 08, 05, 05]
 
-1011E; [10 AB, 05, 05]
+10166; [13 0A, 05, 05]
 
-1011F; [10 AD, 05, 05]
+10167; [13 0C, 05, 05]
 
-10120; [10 AF, 05, 05]
+10168; [13 0E, 05, 05]
 
-10121; [10 B1, 05, 05]
+10169; [13 10, 05, 05]
 
-10122; [10 B3, 05, 05]
+1016A; [13 12, 05, 05]
 
-10123; [10 B5, 05, 05]
+1016B; [13 14, 05, 05]
 
-10124; [10 B7, 05, 05]
+1016C; [13 16, 05, 05]
 
-10125; [10 B9, 05, 05]
+1016D; [13 18, 05, 05]
 
-10126; [10 BB, 05, 05]
+1016E; [13 1A, 05, 05]
 
-10127; [10 BD, 05, 05]
+1016F; [13 1C, 05, 05]
 
-10128; [10 BF, 05, 05]
+10170; [13 1E, 05, 05]
 
-10129; [10 C1, 05, 05]
+10171; [13 20, 05, 05]
 
-1012A; [10 C3, 05, 05]
+10172; [13 22, 05, 05]
 
-1012B; [10 C5, 05, 05]
+10174; [13 24, 05, 05]
 
-1012C; [10 C7, 05, 05]
+10175; [13 26, 05, 05]
 
-1012D; [10 C9, 05, 05]
+10176; [13 28, 05, 05]
 
-1012E; [10 CB, 05, 05]
+10177; [13 2A, 05, 05]
 
-1012F; [10 CD, 05, 05]
+10178; [13 2C, 05, 05]
 
-10130; [10 CF, 05, 05]
+103D3; [13 2E 02, 05, 05]
 
-10131; [10 D1, 05, 05]
+103D4; [13 2E 0A, 05, 05]
 
-10132; [10 D3, 05, 05]
+103D5; [13 2E 12, 05, 05]
 
-10133; [10 D5, 05, 05]
+10A7E; [13 2E 1A, 05, 05]
 
-10140; [10 D7, 05, 05]
+10917; [13 2E 22, 05, 05]
 
-10141; [10 D9, 05, 05]
+10918; [13 2E 2A, 05, 05]
 
-10144; [10 DB, 05, 05]
+10919; [13 2E 32, 05, 05]
 
-10145; [10 DD, 05, 05]
+1085B; [13 2E 3A, 05, 05]
 
-10146; [10 DF, 05, 05]
+1085C; [13 2E 42, 05, 05]
 
-10147; [10 E1, 05, 05]
+1085D; [13 2E 4A, 05, 05]
 
-10149; [10 E3, 05, 05]
+1085E; [13 2E 52, 05, 05]
 
-1014A; [10 E5, 05, 05]
+1085F; [13 2E 5A, 05, 05]
 
-1014B; [10 E7, 05, 05]
+10B5C; [13 2E 62, 05, 05]
 
-1014C; [10 E9, 05, 05]
+10B5D; [13 2E 6A, 05, 05]
 
-1014D; [10 EB, 05, 05]
+10B5E; [13 2E 72, 05, 05]
 
-1014E; [10 ED, 05, 05]
+10B5F; [13 2E 7A, 05, 05]
 
-10150; [10 EF, 05, 05]
+10B7C; [13 2E 82, 05, 05]
 
-10151; [10 F1, 05, 05]
+10B7D; [13 2E 8A, 05, 05]
 
-10152; [10 F3, 05, 05]
+10B7E; [13 2E 92, 05, 05]
 
-10153; [10 F5, 05, 05]
+10B7F; [13 2E 9A, 05, 05]
 
-10154; [10 F7, 05, 05]
+1105B; [13 2E A2, 05, 05]
 
-10155; [10 F9, 05, 05]
+1105C; [13 2E AA, 05, 05]
 
-10156; [10 FB, 05, 05]
+1105D; [13 2E B2, 05, 05]
 
-10157; [11 06, 05, 05]
+1105E; [13 2E BA, 05, 05]
 
-10160; [11 08, 05, 05]
+1105F; [13 2E C2, 05, 05]
 
-10161; [11 0A, 05, 05]
+11060; [13 2E CA, 05, 05]
 
-10162; [11 0C, 05, 05]
+11061; [13 2E D2, 05, 05]
 
-10163; [11 0E, 05, 05]
+11062; [13 2E DA, 05, 05]
 
-10164; [11 10, 05, 05]
+11063; [13 2E E2, 05, 05]
 
-10165; [11 12, 05, 05]
+11064; [13 2E EA, 05, 05]
 
-10166; [11 14, 05, 05]
+11065; [13 2E F2, 05, 05]
 
-10167; [11 16, 05, 05]
+10A44; [13 2E FA, 05, 05]
 
-10168; [11 18, 05, 05]
+10A45; [13 2F 04, 05, 05]
 
-10169; [11 1A, 05, 05]
+10A46; [13 2F 0C, 05, 05]
 
-1016A; [11 1C, 05, 05]
+10A47; [13 2F 14, 05, 05]
 
-1016B; [11 1E, 05, 05]
+12432; [13 2F 1C, 05, 05]
 
-1016C; [11 20, 05, 05]
+12433; [13 2F 24, 05, 05]
 
-1016D; [11 22, 05, 05]
+1245A; [13 2F 2C, 05, 05]
 
-1016E; [11 24, 05, 05]
+1245B; [13 2F 34, 05, 05]
 
-1016F; [11 26, 05, 05]
+1245C; [13 2F 3C, 05, 05]
 
-10170; [11 28, 05, 05]
+1245D; [13 2F 44, 05, 05]
 
-10171; [11 2A, 05, 05]
+1245E; [13 2F 4C, 05, 05]
 
-10172; [11 2C, 05, 05]
+1245F; [13 2F 54, 05, 05]
 
-10174; [11 2E, 05, 05]
+12460; [13 2F 5C, 05, 05]
 
-10175; [11 30, 05, 05]
+12461; [13 2F 64, 05, 05]
 
-10176; [11 32, 05, 05]
+12462; [13 2F 6C, 05, 05]
 
-10177; [11 34, 05, 05]
+1D369; [13 31, 05, 05]
 
-10178; [11 36, 05, 05]
+1D36A; [13 33, 05, 05]
 
-103D3; [11 38 04, 05, 05]
+1D36B; [13 35, 05, 05]
 
-103D4; [11 38 0C, 05, 05]
+1D36C; [13 37, 05, 05]
 
-103D5; [11 38 14, 05, 05]
+1D36D; [13 39, 05, 05]
 
-10A7E; [11 38 1C, 05, 05]
+1D36E; [13 3B, 05, 05]
 
-10917; [11 38 24, 05, 05]
+1D36F; [13 3D, 05, 05]
 
-10918; [11 38 2C, 05, 05]
+1D370; [13 3F, 05, 05]
 
-10919; [11 38 34, 05, 05]
+1D371; [13 41, 05, 05]
 
-1085B; [11 38 3C, 05, 05]
+0030; [14, 05, 05]
+0660; [14, 05, 05]
+06F0; [14, 05, 05]
+07C0; [14, 05, 05]
+0966; [14, 05, 05]
+09E6; [14, 05, 05]
+0A66; [14, 05, 05]
+0AE6; [14, 05, 05]
+0B66; [14, 05, 05]
+0BE6; [14, 05, 05]
+0C66; [14, 05, 05]
+0C78; [14, 05, 05]
+0CE6; [14, 05, 05]
+0D66; [14, 05, 05]
+0E50; [14, 05, 05]
+0ED0; [14, 05, 05]
+0F20; [14, 05, 05]
+1040; [14, 05, 05]
+1090; [14, 05, 05]
+17E0; [14, 05, 05]
+17F0; [14, 05, 05]
+1810; [14, 05, 05]
+1946; [14, 05, 05]
+19D0; [14, 05, 05]
+1A80; [14, 05, 05]
+1A90; [14, 05, 05]
+1B50; [14, 05, 05]
+1BB0; [14, 05, 05]
+1C40; [14, 05, 05]
+1C50; [14, 05, 05]
+3007; [14, 05, 05]
+A620; [14, 05, 05]
+A8D0; [14, 05, 05]
+A900; [14, 05, 05]
+A9D0; [14, 05, 05]
+AA50; [14, 05, 05]
+ABF0; [14, 05, 05]
+1018A; [14, 05, 05]
+104A0; [14, 05, 05]
+11066; [14, 05, 05]
+110F0; [14, 05, 05]
+11136; [14, 05, 05]
+111D0; [14, 05, 05]
+116C0; [14, 05, 05]
+FF10; [14, 05, 10]
+0F33; [14, 05, 16]
+1D7CE; [14, 05, 1C]
+1D7D8; [14, 05, 1C]
+1D7E2; [14, 05, 1C]
+1D7EC; [14, 05, 1C]
+1D7F6; [14, 05, 1C]
+24EA; [14, 05, 22]
+24FF; [14, 05, 22]
+2070; [14, 05, 28]
+2080; [14, 05, 2E]
+1F101; [14, 05, 16][07, 05, 1B]
+1F100; [14, 05, 16][09, 05, 18]
+2189; [14, 05, 34][0D 7E 2A, 05, 20][1A, 05, 33]
+3358; [14, 05, 16][U+70B9, 10]
+
+0031; [16, 05, 05]
+0661; [16, 05, 05]
+06F1; [16, 05, 05]
+07C1; [16, 05, 05]
+0967; [16, 05, 05]
+09E7; [16, 05, 05]
+0A67; [16, 05, 05]
+0AE7; [16, 05, 05]
+0B67; [16, 05, 05]
+0BE7; [16, 05, 05]
+0C67; [16, 05, 05]
+0C79; [16, 05, 05]
+0C7C; [16, 05, 05]
+0CE7; [16, 05, 05]
+0D67; [16, 05, 05]
+0E51; [16, 05, 05]
+0ED1; [16, 05, 05]
+0F21; [16, 05, 05]
+1041; [16, 05, 05]
+1091; [16, 05, 05]
+1369; [16, 05, 05]
+17E1; [16, 05, 05]
+17F1; [16, 05, 05]
+1811; [16, 05, 05]
+1947; [16, 05, 05]
+19D1; [16, 05, 05]
+19DA; [16, 05, 05]
+1A81; [16, 05, 05]
+1A91; [16, 05, 05]
+1B51; [16, 05, 05]
+1BB1; [16, 05, 05]
+1C41; [16, 05, 05]
+1C51; [16, 05, 05]
+3021; [16, 05, 05]
+A621; [16, 05, 05]
+A8D1; [16, 05, 05]
+A901; [16, 05, 05]
+A9D1; [16, 05, 05]
+AA51; [16, 05, 05]
+ABF1; [16, 05, 05]
+10107; [16, 05, 05]
+10142; [16, 05, 05]
+10158; [16, 05, 05]
+10159; [16, 05, 05]
+1015A; [16, 05, 05]
+10320; [16, 05, 05]
+103D1; [16, 05, 05]
+104A1; [16, 05, 05]
+10858; [16, 05, 05]
+10916; [16, 05, 05]
+10A40; [16, 05, 05]
+10A7D; [16, 05, 05]
+10B58; [16, 05, 05]
+10B78; [16, 05, 05]
+10E60; [16, 05, 05]
+11052; [16, 05, 05]
+11067; [16, 05, 05]
+110F1; [16, 05, 05]
+11137; [16, 05, 05]
+111D1; [16, 05, 05]
+116C1; [16, 05, 05]
+12415; [16, 05, 05]
+1241E; [16, 05, 05]
+1242C; [16, 05, 05]
+12434; [16, 05, 05]
+1244F; [16, 05, 05]
+12458; [16, 05, 05]
+1D360; [16, 05, 05]
+FF11; [16, 05, 10]
+0F2A; [16, 05, 16]
+1D7CF; [16, 05, 1C]
+1D7D9; [16, 05, 1C]
+1D7E3; [16, 05, 1C]
+1D7ED; [16, 05, 1C]
+1D7F7; [16, 05, 1C]
+2460; [16, 05, 22]
+24F5; [16, 05, 22]
+2776; [16, 05, 22]
+2780; [16, 05, 22]
+278A; [16, 05, 22]
+00B9; [16, 05, 28]
+2081; [16, 05, 2E]
+1F102; [16, 05, 16][07, 05, 1B]
+2488; [16, 05, 16][09, 05, 18]
+215F; [16, 05, 34][0D 7E 2A, 05, 20]
+2152; [16, 05, 34][0D 7E 2A, 05, 20][16, 05, 34][14, 05, 34]
+00BD; [16, 05, 34][0D 7E 2A, 05, 20][18, 05, 33]
+2153; [16, 05, 34][0D 7E 2A, 05, 20][1A, 05, 33]
+00BC; [16, 05, 34][0D 7E 2A, 05, 20][1C, 05, 34]
+2155; [16, 05, 34][0D 7E 2A, 05, 20][1E, 05, 34]
+2159; [16, 05, 34][0D 7E 2A, 05, 20][20, 05, 34]
+2150; [16, 05, 34][0D 7E 2A, 05, 20][22, 05, 34]
+215B; [16, 05, 34][0D 7E 2A, 05, 20][24, 05, 34]
+2151; [16, 05, 34][0D 7E 2A, 05, 20][26, 05, 34]
+2469; [16, 05, 22][14, 05, 22]
+24FE; [16, 05, 22][14, 05, 22]
+277F; [16, 05, 22][14, 05, 22]
+2789; [16, 05, 22][14, 05, 22]
+2793; [16, 05, 22][14, 05, 22]
+3248; [16, 05, 22][14, 05, 22]
+2491; [16, 05, 16][14, 05, 16][09, 05, 18]
+33E9; [16, 05, 16][14, 05, 16][U+65E5, 10]
+32C9; [16, 05, 16][14, 05, 16][U+6708, 10]
+3362; [16, 05, 16][14, 05, 16][U+70B9, 10]
+246A; [16, 05, 22][16, 05, 22]
+24EB; [16, 05, 22][16, 05, 22]
+2492; [16, 05, 16][16, 05, 16][09, 05, 18]
+33EA; [16, 05, 16][16, 05, 16][U+65E5, 10]
+32CA; [16, 05, 16][16, 05, 16][U+6708, 10]
+3363; [16, 05, 16][16, 05, 16][U+70B9, 10]
+246B; [16, 05, 22][18, 05, 1F]
+24EC; [16, 05, 22][18, 05, 1F]
+2493; [16, 05, 16][18, 05, 15][09, 05, 18]
+33EB; [16, 05, 16][18, 05, 15][U+65E5, 10]
+32CB; [16, 05, 16][18, 05, 15][U+6708, 10]
+3364; [16, 05, 16][18, 05, 15][U+70B9, 10]
+246C; [16, 05, 22][1A, 05, 1F]
+24ED; [16, 05, 22][1A, 05, 1F]
+2494; [16, 05, 16][1A, 05, 15][09, 05, 18]
+33EC; [16, 05, 16][1A, 05, 15][U+65E5, 10]
+3365; [16, 05, 16][1A, 05, 15][U+70B9, 10]
+246D; [16, 05, 22][1C, 05, 22]
+24EE; [16, 05, 22][1C, 05, 22]
+2495; [16, 05, 16][1C, 05, 16][09, 05, 18]
+33ED; [16, 05, 16][1C, 05, 16][U+65E5, 10]
+3366; [16, 05, 16][1C, 05, 16][U+70B9, 10]
+246E; [16, 05, 22][1E, 05, 22]
+24EF; [16, 05, 22][1E, 05, 22]
+2496; [16, 05, 16][1E, 05, 16][09, 05, 18]
+33EE; [16, 05, 16][1E, 05, 16][U+65E5, 10]
+3367; [16, 05, 16][1E, 05, 16][U+70B9, 10]
+246F; [16, 05, 22][20, 05, 22]
+24F0; [16, 05, 22][20, 05, 22]
+2497; [16, 05, 16][20, 05, 16][09, 05, 18]
+33EF; [16, 05, 16][20, 05, 16][U+65E5, 10]
+3368; [16, 05, 16][20, 05, 16][U+70B9, 10]
+2470; [16, 05, 22][22, 05, 22]
+24F1; [16, 05, 22][22, 05, 22]
+2498; [16, 05, 16][22, 05, 16][09, 05, 18]
+33F0; [16, 05, 16][22, 05, 16][U+65E5, 10]
+3369; [16, 05, 16][22, 05, 16][U+70B9, 10]
+2471; [16, 05, 22][24, 05, 22]
+24F2; [16, 05, 22][24, 05, 22]
+2499; [16, 05, 16][24, 05, 16][09, 05, 18]
+33F1; [16, 05, 16][24, 05, 16][U+65E5, 10]
+336A; [16, 05, 16][24, 05, 16][U+70B9, 10]
+2472; [16, 05, 22][26, 05, 22]
+24F3; [16, 05, 22][26, 05, 22]
+249A; [16, 05, 16][26, 05, 16][09, 05, 18]
+33F2; [16, 05, 16][26, 05, 16][U+65E5, 10]
+336B; [16, 05, 16][26, 05, 16][U+70B9, 10]
+33E0; [16, 05, 16][U+65E5, 10]
+32C0; [16, 05, 16][U+6708, 10]
+3359; [16, 05, 16][U+70B9, 10]
+
+0032; [18, 05, 05]
+0662; [18, 05, 05]
+06F2; [18, 05, 05]
+07C2; [18, 05, 05]
+0968; [18, 05, 05]
+09E8; [18, 05, 05]
+0A68; [18, 05, 05]
+0AE8; [18, 05, 05]
+0B68; [18, 05, 05]
+0BE8; [18, 05, 05]
+0C68; [18, 05, 05]
+0C7A; [18, 05, 05]
+0C7D; [18, 05, 05]
+0CE8; [18, 05, 05]
+0D68; [18, 05, 05]
+0E52; [18, 05, 05]
+0ED2; [18, 05, 05]
+0F22; [18, 05, 05]
+1042; [18, 05, 05]
+1092; [18, 05, 05]
+136A; [18, 05, 05]
+17E2; [18, 05, 05]
+17F2; [18, 05, 05]
+1812; [18, 05, 05]
+1948; [18, 05, 05]
+19D2; [18, 05, 05]
+1A82; [18, 05, 05]
+1A92; [18, 05, 05]
+1B52; [18, 05, 05]
+1BB2; [18, 05, 05]
+1C42; [18, 05, 05]
+1C52; [18, 05, 05]
+3022; [18, 05, 05]
+A622; [18, 05, 05]
+A8D2; [18, 05, 05]
+A902; [18, 05, 05]
+A9D2; [18, 05, 05]
+AA52; [18, 05, 05]
+ABF2; [18, 05, 05]
+10108; [18, 05, 05]
+1015B; [18, 05, 05]
+1015C; [18, 05, 05]
+1015D; [18, 05, 05]
+1015E; [18, 05, 05]
+103D2; [18, 05, 05]
+104A2; [18, 05, 05]
+10859; [18, 05, 05]
+1091A; [18, 05, 05]
+10A41; [18, 05, 05]
+10B59; [18, 05, 05]
+10B79; [18, 05, 05]
+10E61; [18, 05, 05]
+11053; [18, 05, 05]
+11068; [18, 05, 05]
+110F2; [18, 05, 05]
+11138; [18, 05, 05]
+111D2; [18, 05, 05]
+116C2; [18, 05, 05]
+12400; [18, 05, 05]
+12416; [18, 05, 05]
+1241F; [18, 05, 05]
+12423; [18, 05, 05]
+1242D; [18, 05, 05]
+12435; [18, 05, 05]
+1244A; [18, 05, 05]
+12450; [18, 05, 05]
+12456; [18, 05, 05]
+12459; [18, 05, 05]
+1D361; [18, 05, 05]
+FF12; [18, 05, 10]
+0F2B; [18, 05, 15]
+1D7D0; [18, 05, 1A]
+1D7DA; [18, 05, 1A]
+1D7E4; [18, 05, 1A]
+1D7EE; [18, 05, 1A]
+1D7F8; [18, 05, 1A]
+2461; [18, 05, 1F]
+24F6; [18, 05, 1F]
+2777; [18, 05, 1F]
+2781; [18, 05, 1F]
+278B; [18, 05, 1F]
+00B2; [18, 05, 24]
+2082; [18, 05, 29]
+1F103; [18, 05, 15][07, 05, 1B]
+2489; [18, 05, 15][09, 05, 18]
+2154; [18, 05, 33][0D 7E 2A, 05, 20][1A, 05, 33]
+2156; [18, 05, 33][0D 7E 2A, 05, 20][1E, 05, 34]
+2473; [18, 05, 1F][14, 05, 22]
+24F4; [18, 05, 1F][14, 05, 22]
+3249; [18, 05, 1F][14, 05, 22]
+249B; [18, 05, 15][14, 05, 16][09, 05, 18]
+33F3; [18, 05, 15][14, 05, 16][U+65E5, 10]
+336C; [18, 05, 15][14, 05, 16][U+70B9, 10]
+3251; [18, 05, 1F][16, 05, 22]
+33F4; [18, 05, 15][16, 05, 16][U+65E5, 10]
+336D; [18, 05, 15][16, 05, 16][U+70B9, 10]
+3252; [18, 05, 1F][18, 05, 1F]
+33F5; [18, 05, 15][18, 05, 15][U+65E5, 10]
+336E; [18, 05, 15][18, 05, 15][U+70B9, 10]
+3253; [18, 05, 1F][1A, 05, 1F]
+33F6; [18, 05, 15][1A, 05, 15][U+65E5, 10]
+336F; [18, 05, 15][1A, 05, 15][U+70B9, 10]
+3254; [18, 05, 1F][1C, 05, 22]
+33F7; [18, 05, 15][1C, 05, 16][U+65E5, 10]
+3370; [18, 05, 15][1C, 05, 16][U+70B9, 10]
+3255; [18, 05, 1F][1E, 05, 22]
+33F8; [18, 05, 15][1E, 05, 16][U+65E5, 10]
+3256; [18, 05, 1F][20, 05, 22]
+33F9; [18, 05, 15][20, 05, 16][U+65E5, 10]
+3257; [18, 05, 1F][22, 05, 22]
+33FA; [18, 05, 15][22, 05, 16][U+65E5, 10]
+3258; [18, 05, 1F][24, 05, 22]
+33FB; [18, 05, 15][24, 05, 16][U+65E5, 10]
+3259; [18, 05, 1F][26, 05, 22]
+33FC; [18, 05, 15][26, 05, 16][U+65E5, 10]
+33E1; [18, 05, 15][U+65E5, 10]
+32C1; [18, 05, 15][U+6708, 10]
+335A; [18, 05, 15][U+70B9, 10]
+
+0033; [1A, 05, 05]
+0663; [1A, 05, 05]
+06F3; [1A, 05, 05]
+07C3; [1A, 05, 05]
+0969; [1A, 05, 05]
+09E9; [1A, 05, 05]
+0A69; [1A, 05, 05]
+0AE9; [1A, 05, 05]
+0B69; [1A, 05, 05]
+0BE9; [1A, 05, 05]
+0C69; [1A, 05, 05]
+0C7B; [1A, 05, 05]
+0C7E; [1A, 05, 05]
+0CE9; [1A, 05, 05]
+0D69; [1A, 05, 05]
+0E53; [1A, 05, 05]
+0ED3; [1A, 05, 05]
+0F23; [1A, 05, 05]
+1043; [1A, 05, 05]
+1093; [1A, 05, 05]
+136B; [1A, 05, 05]
+17E3; [1A, 05, 05]
+17F3; [1A, 05, 05]
+1813; [1A, 05, 05]
+1949; [1A, 05, 05]
+19D3; [1A, 05, 05]
+1A83; [1A, 05, 05]
+1A93; [1A, 05, 05]
+1B53; [1A, 05, 05]
+1BB3; [1A, 05, 05]
+1C43; [1A, 05, 05]
+1C53; [1A, 05, 05]
+3023; [1A, 05, 05]
+A623; [1A, 05, 05]
+A8D3; [1A, 05, 05]
+A903; [1A, 05, 05]
+A9D3; [1A, 05, 05]
+AA53; [1A, 05, 05]
+ABF3; [1A, 05, 05]
+10109; [1A, 05, 05]
+104A3; [1A, 05, 05]
+1085A; [1A, 05, 05]
+1091B; [1A, 05, 05]
+10A42; [1A, 05, 05]
+10B5A; [1A, 05, 05]
+10B7A; [1A, 05, 05]
+10E62; [1A, 05, 05]
+11054; [1A, 05, 05]
+11069; [1A, 05, 05]
+110F3; [1A, 05, 05]
+11139; [1A, 05, 05]
+111D3; [1A, 05, 05]
+116C3; [1A, 05, 05]
+12401; [1A, 05, 05]
+12408; [1A, 05, 05]
+12417; [1A, 05, 05]
+12420; [1A, 05, 05]
+12424; [1A, 05, 05]
+12425; [1A, 05, 05]
+1242E; [1A, 05, 05]
+1242F; [1A, 05, 05]
+12436; [1A, 05, 05]
+12437; [1A, 05, 05]
+1243A; [1A, 05, 05]
+1243B; [1A, 05, 05]
+1244B; [1A, 05, 05]
+12451; [1A, 05, 05]
+12457; [1A, 05, 05]
+1D362; [1A, 05, 05]
+FF13; [1A, 05, 10]
+0F2C; [1A, 05, 15]
+1D7D1; [1A, 05, 1A]
+1D7DB; [1A, 05, 1A]
+1D7E5; [1A, 05, 1A]
+1D7EF; [1A, 05, 1A]
+1D7F9; [1A, 05, 1A]
+2462; [1A, 05, 1F]
+24F7; [1A, 05, 1F]
+2778; [1A, 05, 1F]
+2782; [1A, 05, 1F]
+278C; [1A, 05, 1F]
+00B3; [1A, 05, 24]
+2083; [1A, 05, 29]
+1F104; [1A, 05, 15][07, 05, 1B]
+248A; [1A, 05, 15][09, 05, 18]
+00BE; [1A, 05, 33][0D 7E 2A, 05, 20][1C, 05, 34]
+2157; [1A, 05, 33][0D 7E 2A, 05, 20][1E, 05, 34]
+215C; [1A, 05, 33][0D 7E 2A, 05, 20][24, 05, 34]
+324A; [1A, 05, 1F][14, 05, 22]
+325A; [1A, 05, 1F][14, 05, 22]
+33FD; [1A, 05, 15][14, 05, 16][U+65E5, 10]
+325B; [1A, 05, 1F][16, 05, 22]
+33FE; [1A, 05, 15][16, 05, 16][U+65E5, 10]
+325C; [1A, 05, 1F][18, 05, 1F]
+325D; [1A, 05, 1F][1A, 05, 1F]
+325E; [1A, 05, 1F][1C, 05, 22]
+325F; [1A, 05, 1F][1E, 05, 22]
+32B1; [1A, 05, 1F][20, 05, 22]
+32B2; [1A, 05, 1F][22, 05, 22]
+32B3; [1A, 05, 1F][24, 05, 22]
+32B4; [1A, 05, 1F][26, 05, 22]
+33E2; [1A, 05, 15][U+65E5, 10]
+32C2; [1A, 05, 15][U+6708, 10]
+335B; [1A, 05, 15][U+70B9, 10]
+
+0034; [1C, 05, 05]
+0664; [1C, 05, 05]
+06F4; [1C, 05, 05]
+07C4; [1C, 05, 05]
+096A; [1C, 05, 05]
+09EA; [1C, 05, 05]
+0A6A; [1C, 05, 05]
+0AEA; [1C, 05, 05]
+0B6A; [1C, 05, 05]
+0BEA; [1C, 05, 05]
+0C6A; [1C, 05, 05]
+0CEA; [1C, 05, 05]
+0D6A; [1C, 05, 05]
+0E54; [1C, 05, 05]
+0ED4; [1C, 05, 05]
+0F24; [1C, 05, 05]
+1044; [1C, 05, 05]
+1094; [1C, 05, 05]
+136C; [1C, 05, 05]
+17E4; [1C, 05, 05]
+17F4; [1C, 05, 05]
+1814; [1C, 05, 05]
+194A; [1C, 05, 05]
+19D4; [1C, 05, 05]
+1A84; [1C, 05, 05]
+1A94; [1C, 05, 05]
+1B54; [1C, 05, 05]
+1BB4; [1C, 05, 05]
+1C44; [1C, 05, 05]
+1C54; [1C, 05, 05]
+3024; [1C, 05, 05]
+A624; [1C, 05, 05]
+A8D4; [1C, 05, 05]
+A904; [1C, 05, 05]
+A9D4; [1C, 05, 05]
+AA54; [1C, 05, 05]
+ABF4; [1C, 05, 05]
+1010A; [1C, 05, 05]
+104A4; [1C, 05, 05]
+10A43; [1C, 05, 05]
+10B5B; [1C, 05, 05]
+10B7B; [1C, 05, 05]
+10E63; [1C, 05, 05]
+11055; [1C, 05, 05]
+1106A; [1C, 05, 05]
+110F4; [1C, 05, 05]
+1113A; [1C, 05, 05]
+111D4; [1C, 05, 05]
+116C4; [1C, 05, 05]
+12402; [1C, 05, 05]
+12409; [1C, 05, 05]
+1240F; [1C, 05, 05]
+12418; [1C, 05, 05]
+12421; [1C, 05, 05]
+12426; [1C, 05, 05]
+12430; [1C, 05, 05]
+12438; [1C, 05, 05]
+1243C; [1C, 05, 05]
+1243D; [1C, 05, 05]
+1243E; [1C, 05, 05]
+1243F; [1C, 05, 05]
+1244C; [1C, 05, 05]
+12452; [1C, 05, 05]
+12453; [1C, 05, 05]
+1D363; [1C, 05, 05]
+FF14; [1C, 05, 10]
+0F2D; [1C, 05, 16]
+1D7D2; [1C, 05, 1C]
+1D7DC; [1C, 05, 1C]
+1D7E6; [1C, 05, 1C]
+1D7F0; [1C, 05, 1C]
+1D7FA; [1C, 05, 1C]
+2463; [1C, 05, 22]
+24F8; [1C, 05, 22]
+2779; [1C, 05, 22]
+2783; [1C, 05, 22]
+278D; [1C, 05, 22]
+2074; [1C, 05, 28]
+2084; [1C, 05, 2E]
+1F105; [1C, 05, 16][07, 05, 1B]
+248B; [1C, 05, 16][09, 05, 18]
+2158; [1C, 05, 34][0D 7E 2A, 05, 20][1E, 05, 34]
+324B; [1C, 05, 22][14, 05, 22]
+32B5; [1C, 05, 22][14, 05, 22]
+32B6; [1C, 05, 22][16, 05, 22]
+32B7; [1C, 05, 22][18, 05, 1F]
+32B8; [1C, 05, 22][1A, 05, 1F]
+32B9; [1C, 05, 22][1C, 05, 22]
+32BA; [1C, 05, 22][1E, 05, 22]
+32BB; [1C, 05, 22][20, 05, 22]
+32BC; [1C, 05, 22][22, 05, 22]
+32BD; [1C, 05, 22][24, 05, 22]
+32BE; [1C, 05, 22][26, 05, 22]
+33E3; [1C, 05, 16][U+65E5, 10]
+32C3; [1C, 05, 16][U+6708, 10]
+335C; [1C, 05, 16][U+70B9, 10]
+
+0035; [1E, 05, 05]
+0665; [1E, 05, 05]
+06F5; [1E, 05, 05]
+07C5; [1E, 05, 05]
+096B; [1E, 05, 05]
+09EB; [1E, 05, 05]
+0A6B; [1E, 05, 05]
+0AEB; [1E, 05, 05]
+0B6B; [1E, 05, 05]
+0BEB; [1E, 05, 05]
+0C6B; [1E, 05, 05]
+0CEB; [1E, 05, 05]
+0D6B; [1E, 05, 05]
+0E55; [1E, 05, 05]
+0ED5; [1E, 05, 05]
+0F25; [1E, 05, 05]
+1045; [1E, 05, 05]
+1095; [1E, 05, 05]
+136D; [1E, 05, 05]
+17E5; [1E, 05, 05]
+17F5; [1E, 05, 05]
+1815; [1E, 05, 05]
+194B; [1E, 05, 05]
+19D5; [1E, 05, 05]
+1A85; [1E, 05, 05]
+1A95; [1E, 05, 05]
+1B55; [1E, 05, 05]
+1BB5; [1E, 05, 05]
+1C45; [1E, 05, 05]
+1C55; [1E, 05, 05]
+3025; [1E, 05, 05]
+A625; [1E, 05, 05]
+A8D5; [1E, 05, 05]
+A905; [1E, 05, 05]
+A9D5; [1E, 05, 05]
+AA55; [1E, 05, 05]
+ABF5; [1E, 05, 05]
+1010B; [1E, 05, 05]
+10143; [1E, 05, 05]
+10148; [1E, 05, 05]
+1014F; [1E, 05, 05]
+1015F; [1E, 05, 05]
+10173; [1E, 05, 05]
+10321; [1E, 05, 05]
+104A5; [1E, 05, 05]
+10E64; [1E, 05, 05]
+11056; [1E, 05, 05]
+1106B; [1E, 05, 05]
+110F5; [1E, 05, 05]
+1113B; [1E, 05, 05]
+111D5; [1E, 05, 05]
+116C5; [1E, 05, 05]
+12403; [1E, 05, 05]
+1240A; [1E, 05, 05]
+12410; [1E, 05, 05]
+12419; [1E, 05, 05]
+12422; [1E, 05, 05]
+12427; [1E, 05, 05]
+12431; [1E, 05, 05]
+12439; [1E, 05, 05]
+1244D; [1E, 05, 05]
+12454; [1E, 05, 05]
+12455; [1E, 05, 05]
+1D364; [1E, 05, 05]
+FF15; [1E, 05, 10]
+0F2E; [1E, 05, 16]
+1D7D3; [1E, 05, 1C]
+1D7DD; [1E, 05, 1C]
+1D7E7; [1E, 05, 1C]
+1D7F1; [1E, 05, 1C]
+1D7FB; [1E, 05, 1C]
+2464; [1E, 05, 22]
+24F9; [1E, 05, 22]
+277A; [1E, 05, 22]
+2784; [1E, 05, 22]
+278E; [1E, 05, 22]
+2075; [1E, 05, 28]
+2085; [1E, 05, 2E]
+1F106; [1E, 05, 16][07, 05, 1B]
+248C; [1E, 05, 16][09, 05, 18]
+215A; [1E, 05, 34][0D 7E 2A, 05, 20][20, 05, 34]
+215D; [1E, 05, 34][0D 7E 2A, 05, 20][24, 05, 34]
+324C; [1E, 05, 22][14, 05, 22]
+32BF; [1E, 05, 22][14, 05, 22]
+33E4; [1E, 05, 16][U+65E5, 10]
+32C4; [1E, 05, 16][U+6708, 10]
+335D; [1E, 05, 16][U+70B9, 10]
+
+0036; [20, 05, 05]
+0666; [20, 05, 05]
+06F6; [20, 05, 05]
+07C6; [20, 05, 05]
+096C; [20, 05, 05]
+09EC; [20, 05, 05]
+0A6C; [20, 05, 05]
+0AEC; [20, 05, 05]
+0B6C; [20, 05, 05]
+0BEC; [20, 05, 05]
+0C6C; [20, 05, 05]
+0CEC; [20, 05, 05]
+0D6C; [20, 05, 05]
+0E56; [20, 05, 05]
+0ED6; [20, 05, 05]
+0F26; [20, 05, 05]
+1046; [20, 05, 05]
+1096; [20, 05, 05]
+136E; [20, 05, 05]
+17E6; [20, 05, 05]
+17F6; [20, 05, 05]
+1816; [20, 05, 05]
+194C; [20, 05, 05]
+19D6; [20, 05, 05]
+1A86; [20, 05, 05]
+1A96; [20, 05, 05]
+1B56; [20, 05, 05]
+1BB6; [20, 05, 05]
+1C46; [20, 05, 05]
+1C56; [20, 05, 05]
+2185; [20, 05, 05]
+3026; [20, 05, 05]
+A626; [20, 05, 05]
+A8D6; [20, 05, 05]
+A906; [20, 05, 05]
+A9D6; [20, 05, 05]
+AA56; [20, 05, 05]
+ABF6; [20, 05, 05]
+1010C; [20, 05, 05]
+104A6; [20, 05, 05]
+10E65; [20, 05, 05]
+11057; [20, 05, 05]
+1106C; [20, 05, 05]
+110F6; [20, 05, 05]
+1113C; [20, 05, 05]
+111D6; [20, 05, 05]
+116C6; [20, 05, 05]
+12404; [20, 05, 05]
+1240B; [20, 05, 05]
+12411; [20, 05, 05]
+1241A; [20, 05, 05]
+12428; [20, 05, 05]
+12440; [20, 05, 05]
+1244E; [20, 05, 05]
+1D365; [20, 05, 05]
+FF16; [20, 05, 10]
+0F2F; [20, 05, 16]
+1D7D4; [20, 05, 1C]
+1D7DE; [20, 05, 1C]
+1D7E8; [20, 05, 1C]
+1D7F2; [20, 05, 1C]
+1D7FC; [20, 05, 1C]
+2465; [20, 05, 22]
+24FA; [20, 05, 22]
+277B; [20, 05, 22]
+2785; [20, 05, 22]
+278F; [20, 05, 22]
+2076; [20, 05, 28]
+2086; [20, 05, 2E]
+1F107; [20, 05, 16][07, 05, 1B]
+248D; [20, 05, 16][09, 05, 18]
+324D; [20, 05, 22][14, 05, 22]
+33E5; [20, 05, 16][U+65E5, 10]
+32C5; [20, 05, 16][U+6708, 10]
+335E; [20, 05, 16][U+70B9, 10]
+
+0037; [22, 05, 05]
+0667; [22, 05, 05]
+06F7; [22, 05, 05]
+07C7; [22, 05, 05]
+096D; [22, 05, 05]
+09ED; [22, 05, 05]
+0A6D; [22, 05, 05]
+0AED; [22, 05, 05]
+0B6D; [22, 05, 05]
+0BED; [22, 05, 05]
+0C6D; [22, 05, 05]
+0CED; [22, 05, 05]
+0D6D; [22, 05, 05]
+0E57; [22, 05, 05]
+0ED7; [22, 05, 05]
+0F27; [22, 05, 05]
+1047; [22, 05, 05]
+1097; [22, 05, 05]
+136F; [22, 05, 05]
+17E7; [22, 05, 05]
+17F7; [22, 05, 05]
+1817; [22, 05, 05]
+194D; [22, 05, 05]
+19D7; [22, 05, 05]
+1A87; [22, 05, 05]
+1A97; [22, 05, 05]
+1B57; [22, 05, 05]
+1BB7; [22, 05, 05]
+1C47; [22, 05, 05]
+1C57; [22, 05, 05]
+3027; [22, 05, 05]
+A627; [22, 05, 05]
+A8D7; [22, 05, 05]
+A907; [22, 05, 05]
+A9D7; [22, 05, 05]
+AA57; [22, 05, 05]
+ABF7; [22, 05, 05]
+1010D; [22, 05, 05]
+104A7; [22, 05, 05]
+10E66; [22, 05, 05]
+11058; [22, 05, 05]
+1106D; [22, 05, 05]
+110F7; [22, 05, 05]
+1113D; [22, 05, 05]
+111D7; [22, 05, 05]
+116C7; [22, 05, 05]
+12405; [22, 05, 05]
+1240C; [22, 05, 05]
+12412; [22, 05, 05]
+1241B; [22, 05, 05]
+12429; [22, 05, 05]
+12441; [22, 05, 05]
+12442; [22, 05, 05]
+12443; [22, 05, 05]
+1D366; [22, 05, 05]
+FF17; [22, 05, 10]
+0F30; [22, 05, 16]
+1D7D5; [22, 05, 1C]
+1D7DF; [22, 05, 1C]
+1D7E9; [22, 05, 1C]
+1D7F3; [22, 05, 1C]
+1D7FD; [22, 05, 1C]
+2466; [22, 05, 22]
+24FB; [22, 05, 22]
+277C; [22, 05, 22]
+2786; [22, 05, 22]
+2790; [22, 05, 22]
+2077; [22, 05, 28]
+2087; [22, 05, 2E]
+1F108; [22, 05, 16][07, 05, 1B]
+248E; [22, 05, 16][09, 05, 18]
+215E; [22, 05, 34][0D 7E 2A, 05, 20][24, 05, 34]
+324E; [22, 05, 22][14, 05, 22]
+33E6; [22, 05, 16][U+65E5, 10]
+32C6; [22, 05, 16][U+6708, 10]
+335F; [22, 05, 16][U+70B9, 10]
+
+0038; [24, 05, 05]
+0668; [24, 05, 05]
+06F8; [24, 05, 05]
+07C8; [24, 05, 05]
+096E; [24, 05, 05]
+09EE; [24, 05, 05]
+0A6E; [24, 05, 05]
+0AEE; [24, 05, 05]
+0B6E; [24, 05, 05]
+0BEE; [24, 05, 05]
+0C6E; [24, 05, 05]
+0CEE; [24, 05, 05]
+0D6E; [24, 05, 05]
+0E58; [24, 05, 05]
+0ED8; [24, 05, 05]
+0F28; [24, 05, 05]
+1048; [24, 05, 05]
+1098; [24, 05, 05]
+1370; [24, 05, 05]
+17E8; [24, 05, 05]
+17F8; [24, 05, 05]
+1818; [24, 05, 05]
+194E; [24, 05, 05]
+19D8; [24, 05, 05]
+1A88; [24, 05, 05]
+1A98; [24, 05, 05]
+1B58; [24, 05, 05]
+1BB8; [24, 05, 05]
+1C48; [24, 05, 05]
+1C58; [24, 05, 05]
+3028; [24, 05, 05]
+A628; [24, 05, 05]
+A8D8; [24, 05, 05]
+A908; [24, 05, 05]
+A9D8; [24, 05, 05]
+AA58; [24, 05, 05]
+ABF8; [24, 05, 05]
+1010E; [24, 05, 05]
+104A8; [24, 05, 05]
+10E67; [24, 05, 05]
+11059; [24, 05, 05]
+1106E; [24, 05, 05]
+110F8; [24, 05, 05]
+1113E; [24, 05, 05]
+111D8; [24, 05, 05]
+116C8; [24, 05, 05]
+12406; [24, 05, 05]
+1240D; [24, 05, 05]
+12413; [24, 05, 05]
+1241C; [24, 05, 05]
+1242A; [24, 05, 05]
+12444; [24, 05, 05]
+12445; [24, 05, 05]
+1D367; [24, 05, 05]
+FF18; [24, 05, 10]
+0F31; [24, 05, 16]
+1D7D6; [24, 05, 1C]
+1D7E0; [24, 05, 1C]
+1D7EA; [24, 05, 1C]
+1D7F4; [24, 05, 1C]
+1D7FE; [24, 05, 1C]
+2467; [24, 05, 22]
+24FC; [24, 05, 22]
+277D; [24, 05, 22]
+2787; [24, 05, 22]
+2791; [24, 05, 22]
+2078; [24, 05, 28]
+2088; [24, 05, 2E]
+1F109; [24, 05, 16][07, 05, 1B]
+248F; [24, 05, 16][09, 05, 18]
+324F; [24, 05, 22][14, 05, 22]
+33E7; [24, 05, 16][U+65E5, 10]
+32C7; [24, 05, 16][U+6708, 10]
+3360; [24, 05, 16][U+70B9, 10]
+
+0039; [26, 05, 05]
+0669; [26, 05, 05]
+06F9; [26, 05, 05]
+07C9; [26, 05, 05]
+096F; [26, 05, 05]
+09EF; [26, 05, 05]
+0A6F; [26, 05, 05]
+0AEF; [26, 05, 05]
+0B6F; [26, 05, 05]
+0BEF; [26, 05, 05]
+0C6F; [26, 05, 05]
+0CEF; [26, 05, 05]
+0D6F; [26, 05, 05]
+0E59; [26, 05, 05]
+0ED9; [26, 05, 05]
+0F29; [26, 05, 05]
+1049; [26, 05, 05]
+1099; [26, 05, 05]
+1371; [26, 05, 05]
+17E9; [26, 05, 05]
+17F9; [26, 05, 05]
+1819; [26, 05, 05]
+194F; [26, 05, 05]
+19D9; [26, 05, 05]
+1A89; [26, 05, 05]
+1A99; [26, 05, 05]
+1B59; [26, 05, 05]
+1BB9; [26, 05, 05]
+1C49; [26, 05, 05]
+1C59; [26, 05, 05]
+3029; [26, 05, 05]
+A629; [26, 05, 05]
+A8D9; [26, 05, 05]
+A909; [26, 05, 05]
+A9D9; [26, 05, 05]
+AA59; [26, 05, 05]
+ABF9; [26, 05, 05]
+1010F; [26, 05, 05]
+104A9; [26, 05, 05]
+10E68; [26, 05, 05]
+1105A; [26, 05, 05]
+1106F; [26, 05, 05]
+110F9; [26, 05, 05]
+1113F; [26, 05, 05]
+111D9; [26, 05, 05]
+116C9; [26, 05, 05]
+12407; [26, 05, 05]
+1240E; [26, 05, 05]
+12414; [26, 05, 05]
+1241D; [26, 05, 05]
+1242B; [26, 05, 05]
+12446; [26, 05, 05]
+12447; [26, 05, 05]
+12448; [26, 05, 05]
+12449; [26, 05, 05]
+1D368; [26, 05, 05]
+FF19; [26, 05, 10]
+0F32; [26, 05, 16]
+1D7D7; [26, 05, 1C]
+1D7E1; [26, 05, 1C]
+1D7EB; [26, 05, 1C]
+1D7F5; [26, 05, 1C]
+1D7FF; [26, 05, 1C]
+2468; [26, 05, 22]
+24FD; [26, 05, 22]
+277E; [26, 05, 22]
+2788; [26, 05, 22]
+2792; [26, 05, 22]
+2079; [26, 05, 28]
+2089; [26, 05, 2E]
+1F10A; [26, 05, 16][07, 05, 1B]
+2490; [26, 05, 16][09, 05, 18]
+33E8; [26, 05, 16][U+65E5, 10]
+32C8; [26, 05, 16][U+6708, 10]
+3361; [26, 05, 16][U+70B9, 10]
+
+FDD1 004C;     [28 02 02, 05, 05]      # LATIN first primary starts reordering group
+
+0061; [29, 05, 05]
+FF41; [29, 05, 10]
+0363; [29, 05, 13]
+1D41A; [29, 05, 16]
+1D44E; [29, 05, 16]
+1D482; [29, 05, 16]
+1D4B6; [29, 05, 16]
+1D4EA; [29, 05, 16]
+1D51E; [29, 05, 16]
+1D552; [29, 05, 16]
+1D586; [29, 05, 16]
+1D5BA; [29, 05, 16]
+1D5EE; [29, 05, 16]
+1D622; [29, 05, 16]
+1D656; [29, 05, 16]
+1D68A; [29, 05, 16]
+24D0; [29, 05, 19]
+0041; [29, 05, 9C]
+FF21; [29, 05, 9F]
+1D400; [29, 05, A5]
+1D434; [29, 05, A5]
+1D468; [29, 05, A5]
+1D49C; [29, 05, A5]
+1D4D0; [29, 05, A5]
+1D504; [29, 05, A5]
+1D538; [29, 05, A5]
+1D56C; [29, 05, A5]
+1D5A0; [29, 05, A5]
+1D5D4; [29, 05, A5]
+1D608; [29, 05, A5]
+1D63C; [29, 05, A5]
+1D670; [29, 05, A5]
+24B6; [29, 05, A8]
+1F150; [29, 05, A8]
+00AA; [29, 05, 2B]
+1D43; [29, 05, 2B]
+2090; [29, 05, 2E]
+1D2C; [29, 05, B4]
+1F130; [29, 05, B4]
+1F170; [29, 05, B4]
+00E1; [29, 05, 05][, 88, 05]
+00C1; [29, 05, 9C][, 88, 05]
+00E0; [29, 05, 05][, 8A, 05]
+00C0; [29, 05, 9C][, 8A, 05]
+0103; [29, 05, 05][, 8C, 05]
+0102; [29, 05, 9C][, 8C, 05]
+1EAF; [29, 05, 05][, 8C, 05][, 88, 05]
+1EAE; [29, 05, 9C][, 8C, 05][, 88, 05]
+1EB1; [29, 05, 05][, 8C, 05][, 8A, 05]
+1EB0; [29, 05, 9C][, 8C, 05][, 8A, 05]
+1EB5; [29, 05, 05][, 8C, 05][, 9A, 05]
+1EB4; [29, 05, 9C][, 8C, 05][, 9A, 05]
+1EB3; [29, 05, 05][, 8C, 05][, B6, 05]
+1EB2; [29, 05, 9C][, 8C, 05][, B6, 05]
+00E2; [29, 05, 05][, 8E, 05]
+00C2; [29, 05, 9C][, 8E, 05]
+1EA5; [29, 05, 05][, 8E, 05][, 88, 05]
+1EA4; [29, 05, 9C][, 8E, 05][, 88, 05]
+1EA7; [29, 05, 05][, 8E, 05][, 8A, 05]
+1EA6; [29, 05, 9C][, 8E, 05][, 8A, 05]
+1EAB; [29, 05, 05][, 8E, 05][, 9A, 05]
+1EAA; [29, 05, 9C][, 8E, 05][, 9A, 05]
+1EA9; [29, 05, 05][, 8E, 05][, B6, 05]
+1EA8; [29, 05, 9C][, 8E, 05][, B6, 05]
+01CE; [29, 05, 05][, 90, 05]
+01CD; [29, 05, 9C][, 90, 05]
+00E5; [29, 05, 05][, 92, 05]
+00C5; [29, 05, 9C][, 92, 05]
+212B; [29, 05, 9C][, 92, 05]
+01FB; [29, 05, 05][, 92, 05][, 88, 05]
+01FA; [29, 05, 9C][, 92, 05][, 88, 05]
+00E4; [29, 05, 05][, 96, 05]
+00C4; [29, 05, 9C][, 96, 05]
+01DF; [29, 05, 05][, 96, 05][, A4, 05]
+01DE; [29, 05, 9C][, 96, 05][, A4, 05]
+00E3; [29, 05, 05][, 9A, 05]
+00C3; [29, 05, 9C][, 9A, 05]
+0227; [29, 05, 05][, 9C, 05]
+0226; [29, 05, 9C][, 9C, 05]
+01E1; [29, 05, 05][, 9C, 05][, A4, 05]
+01E0; [29, 05, 9C][, 9C, 05][, A4, 05]
+0105; [29, 05, 05][, A2, 05]
+0104; [29, 05, 9C][, A2, 05]
+0101; [29, 05, 05][, A4, 05]
+0100; [29, 05, 9C][, A4, 05]
+1EA3; [29, 05, 05][, B6, 05]
+1EA2; [29, 05, 9C][, B6, 05]
+0201; [29, 05, 05][, B8, 05]
+0200; [29, 05, 9C][, B8, 05]
+0203; [29, 05, 05][, BC, 05]
+0202; [29, 05, 9C][, BC, 05]
+1EA1; [29, 05, 05][, C4, 05]
+1EA0; [29, 05, 9C][, C4, 05]
+1EB7; [29, 05, 05][, C4, 05][, 8C, 05]
+1EB6; [29, 05, 9C][, C4, 05][, 8C, 05]
+1EAD; [29, 05, 05][, C4, 05][, 8E, 05]
+1EAC; [29, 05, 9C][, C4, 05][, 8E, 05]
+1E01; [29, 05, 05][, C8, 05]
+1E00; [29, 05, 9C][, C8, 05]
+1DD3; [29, 70, 10]
+33C2; [29, 05, 31][09, 05, 30][41, 05, 31][09, 05, 30]
+2100; [29, 05, 13][0B 7C, 05, 2E][2D, 05, 13]
+2101; [29, 05, 13][0B 7C, 05, 2E][4D, 05, 13]
+214D; [29, 05, A2][0B 7C, 05, 2E][4D, 05, A2]
+33DF; [29, 05, B4][0D 7E 22, 05, 20][41, 05, 31]
+A733; [29, 05, 13][29, 05, 13]
+A732; [29, 05, A2][29, 05, A2]
+1F18E; [29, 05, B4][2B, 05, B1]
+00E6; [29, 70, 10][31, 05, 13]
+1DD4; [29, 70, 10][31, 05, 13]
+00C6; [29, 70, 9E][31, 05, A2]
+1D2D; [29, 70, 2C][31, 05, 2B]
+01FD; [29, 70, 10][31, 05, 13][, 88, 05]
+01FC; [29, 70, 9E][31, 05, A2][, 88, 05]
+01E3; [29, 70, 10][31, 05, 13][, A4, 05]
+01E2; [29, 70, 9E][31, 05, A2][, A4, 05]
+1DD5; [29, 05, 13][45, 05, 13]
+A735; [29, 05, 13][45, 05, 13]
+A734; [29, 05, A2][45, 05, A2]
+A737; [29, 05, 13][51, 05, 13]
+A736; [29, 05, A2][51, 05, A2]
+3373; [29, 05, B4][51, 05, B1]
+1DD6; [29, 05, 13][53, 05, 13]
+A739; [29, 05, 13][53, 05, 13]
+A738; [29, 05, A2][53, 05, A2]
+A73B; [29, 70, 10][53, 05, 13]
+A73A; [29, 70, 9E][53, 05, A2]
+A73D; [29, 05, 13][59, 05, 13]
+A73C; [29, 05, A2][59, 05, A2]
+1E9A; [29, 05, 13][5C 50, 05, 20]
+
+1D00; [2A 06, 05, 05]
+
+2C65; [2A 08, 05, 05]
+023A; [2A 08, 05, A0]
+
+1D8F; [2A 0A, 05, 05]
+
+1D01; [2A 0C, 05, 05]
+
+1D02; [2A 0E, 05, 05]
+1D46; [2A 0E, 05, 20]
+
+0250; [2A 10, 05, 05]
+2C6F; [2A 10, 05, A0]
+1D44; [2A 10, 05, 2E]
+
+0251; [2A 12, 05, 05]
+2C6D; [2A 12, 05, A0]
+1D45; [2A 12, 05, 2E]
+
+1D90; [2A 14, 05, 05]
+
+0252; [2A 16, 05, 05]
+2C70; [2A 16, 05, A0]
+1D9B; [2A 16, 05, 2E]
+
+0062; [2B, 05, 05]
+FF42; [2B, 05, 10]
+1D41B; [2B, 05, 16]
+1D44F; [2B, 05, 16]
+1D483; [2B, 05, 16]
+1D4B7; [2B, 05, 16]
+1D4EB; [2B, 05, 16]
+1D51F; [2B, 05, 16]
+1D553; [2B, 05, 16]
+1D587; [2B, 05, 16]
+1D5BB; [2B, 05, 16]
+1D5EF; [2B, 05, 16]
+1D623; [2B, 05, 16]
+1D657; [2B, 05, 16]
+1D68B; [2B, 05, 16]
+24D1; [2B, 05, 19]
+0042; [2B, 05, 9C]
+FF22; [2B, 05, 9F]
+212C; [2B, 05, A5]
+1D401; [2B, 05, A5]
+1D435; [2B, 05, A5]
+1D469; [2B, 05, A5]
+1D4D1; [2B, 05, A5]
+1D505; [2B, 05, A5]
+1D539; [2B, 05, A5]
+1D56D; [2B, 05, A5]
+1D5A1; [2B, 05, A5]
+1D5D5; [2B, 05, A5]
+1D609; [2B, 05, A5]
+1D63D; [2B, 05, A5]
+1D671; [2B, 05, A5]
+24B7; [2B, 05, A8]
+1F151; [2B, 05, A8]
+1D47; [2B, 05, 2B]
+1D2E; [2B, 05, B1]
+1F131; [2B, 05, B1]
+1F171; [2B, 05, B1]
+1E03; [2B, 05, 05][, 9C, 05]
+1E02; [2B, 05, 9C][, 9C, 05]
+1E05; [2B, 05, 05][, C4, 05]
+1E04; [2B, 05, 9C][, C4, 05]
+1E07; [2B, 05, 05][, D2, 05]
+1E06; [2B, 05, 9C][, D2, 05]
+3374; [2B, 05, 2E][29, 05, 31][4B, 05, 31]
+33C3; [2B, 05, B1][49, 05, 34]
+
+0299; [2C 06, 05, 05]
+
+0180; [2C 08, 05, 05]
+0243; [2C 08, 05, A0]
+
+1D2F; [2C 0A, 05, 05]
+
+1D03; [2C 0C, 05, 05]
+
+1D6C; [2C 0E, 05, 05]
+
+1D80; [2C 10, 05, 05]
+
+0253; [2C 12, 05, 05]
+0181; [2C 12, 05, A0]
+
+0183; [2C 14, 05, 05]
+0182; [2C 14, 05, A0]
+
+0063; [2D, 05, 05]
+FF43; [2D, 05, 10]
+0368; [2D, 05, 13]
+217D; [2D, 05, 13]
+1D41C; [2D, 05, 16]
+1D450; [2D, 05, 16]
+1D484; [2D, 05, 16]
+1D4B8; [2D, 05, 16]
+1D4EC; [2D, 05, 16]
+1D520; [2D, 05, 16]
+1D554; [2D, 05, 16]
+1D588; [2D, 05, 16]
+1D5BC; [2D, 05, 16]
+1D5F0; [2D, 05, 16]
+1D624; [2D, 05, 16]
+1D658; [2D, 05, 16]
+1D68C; [2D, 05, 16]
+24D2; [2D, 05, 19]
+0043; [2D, 05, 9C]
+FF23; [2D, 05, 9F]
+216D; [2D, 05, A2]
+2102; [2D, 05, A5]
+212D; [2D, 05, A5]
+1D402; [2D, 05, A5]
+1D436; [2D, 05, A5]
+1D46A; [2D, 05, A5]
+1D49E; [2D, 05, A5]
+1D4D2; [2D, 05, A5]
+1D56E; [2D, 05, A5]
+1D5A2; [2D, 05, A5]
+1D5D6; [2D, 05, A5]
+1D60A; [2D, 05, A5]
+1D63E; [2D, 05, A5]
+1D672; [2D, 05, A5]
+24B8; [2D, 05, A8]
+1F12B; [2D, 05, A8]
+1F152; [2D, 05, A8]
+1D9C; [2D, 05, 2B]
+1F132; [2D, 05, B1]
+1F172; [2D, 05, B1]
+0107; [2D, 05, 05][, 88, 05]
+0106; [2D, 05, 9C][, 88, 05]
+0109; [2D, 05, 05][, 8E, 05]
+0108; [2D, 05, 9C][, 8E, 05]
+010D; [2D, 05, 05][, 90, 05]
+010C; [2D, 05, 9C][, 90, 05]
+010B; [2D, 05, 05][, 9C, 05]
+010A; [2D, 05, 9C][, 9C, 05]
+00E7; [2D, 05, 05][, A0, 05]
+1DD7; [2D, 05, 13][, A0, 20]
+00C7; [2D, 05, 9C][, A0, 05]
+1E09; [2D, 05, 05][, A0, 05][, 88, 05]
+1E08; [2D, 05, 9C][, A0, 05][, 88, 05]
+2105; [2D, 05, 13][0B 7C, 05, 2E][45, 05, 13]
+2106; [2D, 05, 13][0B 7C, 05, 2E][51, 05, 13]
+33C6; [2D, 05, B1][0D 7E 22, 05, 20][3D, 05, 31][35, 05, 2E]
+3388; [2D, 05, 2E][29, 05, 31][3F, 05, 31]
+33C4; [2D, 05, 2E][2D, 05, 2E]
+1F12D; [2D, 05, A8][2F, 05, A8]
+33C5; [2D, 05, 2E][2F, 05, 2E]
+1F191; [2D, 05, B1][3F, 05, B4]
+339D; [2D, 05, 2E][41, 05, 31]
+33A0; [2D, 05, 2E][41, 05, 31][18, 05, 2E]
+33A4; [2D, 05, 2E][41, 05, 31][1A, 05, 2E]
+33C7; [2D, 05, B1][45, 05, 31][09, 05, 30]
+1F192; [2D, 05, B1][45, 05, B4][45, 05, B4][3F, 05, B4]
+
+1D04; [2E 06, 05, 05]
+
+023C; [2E 08, 05, 05]
+023B; [2E 08, 05, A0]
+
+A793; [2E 0A, 05, 05]
+A792; [2E 0A, 05, A0]
+
+0188; [2E 0C, 05, 05]
+0187; [2E 0C, 05, A0]
+
+0255; [2E 0E, 05, 05]
+1D9D; [2E 0E, 05, 2E]
+
+2184; [2E 10, 05, 05]
+2183; [2E 10, 05, A0]
+
+A73F; [2E 12, 05, 05]
+A73E; [2E 12, 05, A0]
+
+0064; [2F, 05, 05]
+FF44; [2F, 05, 10]
+0369; [2F, 05, 13]
+217E; [2F, 05, 13]
+2146; [2F, 05, 16]
+1D41D; [2F, 05, 16]
+1D451; [2F, 05, 16]
+1D485; [2F, 05, 16]
+1D4B9; [2F, 05, 16]
+1D4ED; [2F, 05, 16]
+1D521; [2F, 05, 16]
+1D555; [2F, 05, 16]
+1D589; [2F, 05, 16]
+1D5BD; [2F, 05, 16]
+1D5F1; [2F, 05, 16]
+1D625; [2F, 05, 16]
+1D659; [2F, 05, 16]
+1D68D; [2F, 05, 16]
+24D3; [2F, 05, 19]
+0044; [2F, 05, 9C]
+FF24; [2F, 05, 9F]
+216E; [2F, 05, A2]
+2145; [2F, 05, A5]
+1D403; [2F, 05, A5]
+1D437; [2F, 05, A5]
+1D46B; [2F, 05, A5]
+1D49F; [2F, 05, A5]
+1D4D3; [2F, 05, A5]
+1D507; [2F, 05, A5]
+1D53B; [2F, 05, A5]
+1D56F; [2F, 05, A5]
+1D5A3; [2F, 05, A5]
+1D5D7; [2F, 05, A5]
+1D60B; [2F, 05, A5]
+1D63F; [2F, 05, A5]
+1D673; [2F, 05, A5]
+24B9; [2F, 05, A8]
+1F153; [2F, 05, A8]
+1D48; [2F, 05, 2B]
+1D30; [2F, 05, B1]
+1F133; [2F, 05, B1]
+1F173; [2F, 05, B1]
+010F; [2F, 05, 05][, 90, 05]
+010E; [2F, 05, 9C][, 90, 05]
+1E0B; [2F, 05, 05][, 9C, 05]
+1E0A; [2F, 05, 9C][, 9C, 05]
+1E11; [2F, 05, 05][, A0, 05]
+1E10; [2F, 05, 9C][, A0, 05]
+0111; [2F, 05, 05][, B2, 05]
+0110; [2F, 05, 9C][, B2, 05]
+1E0D; [2F, 05, 05][, C4, 05]
+1E0C; [2F, 05, 9C][, C4, 05]
+1E13; [2F, 05, 05][, CC, 05]
+1E12; [2F, 05, 9C][, CC, 05]
+1E0F; [2F, 05, 05][, D2, 05]
+1E0E; [2F, 05, 9C][, D2, 05]
+00F0; [2F, 70, 10]
+1DD9; [2F, 70, 10]
+00D0; [2F, 70, 9E]
+1D9E; [2F, 70, 2C]
+1DD8; [2F, 78, 20]
+A77A; [2F, 78, 20]
+A779; [2F, 78, AE]
+3372; [2F, 05, 2E][29, 05, 31]
+0238; [2F, 05, 13][2B, 05, 13]
+33C8; [2F, 05, 2E][2B, 05, B1]
+1F190; [2F, 05, B1][3B, 05, B1]
+3397; [2F, 05, 2E][3F, 05, 31]
+3377; [2F, 05, 2E][41, 05, 31]
+3378; [2F, 05, 2E][41, 05, 31][18, 05, 2E]
+3379; [2F, 05, 2E][41, 05, 31][1A, 05, 2E]
+01F3; [2F, 05, 13][5B, 05, 13]
+02A3; [2F, 05, 13][5B, 05, 13]
+01F2; [2F, 05, A2][5B, 05, 13]
+01F1; [2F, 05, A2][5B, 05, A2]
+01C6; [2F, 05, 13][5B, 05, 13][, 90, 20]
+01C5; [2F, 05, A2][5B, 05, 13][, 90, 20]
+01C4; [2F, 05, A2][5B, 05, A2][, 90, 20]
+02A5; [2F, 05, 13][5C 12, 05, 20]
+02A4; [2F, 05, 13][5C 1A, 05, 10]
+
+1D05; [30 06, 05, 05]
+
+1D06; [30 08, 05, 05]
+
+1D6D; [30 0A, 05, 05]
+
+1D81; [30 0C, 05, 05]
+
+0256; [30 0E, 05, 05]
+0189; [30 0E, 05, A0]
+
+0257; [30 10, 05, 05]
+018A; [30 10, 05, A0]
+
+1D91; [30 12, 05, 05]
+
+018C; [30 14, 05, 05]
+018B; [30 14, 05, A0]
+
+0221; [30 16, 05, 05]
+
+A771; [30 18, 05, 05]
+
+1E9F; [30 1A, 05, 05]
+
+0065; [31, 05, 05]
+FF45; [31, 05, 10]
+0364; [31, 05, 13]
+212F; [31, 05, 16]
+2147; [31, 05, 16]
+1D41E; [31, 05, 16]
+1D452; [31, 05, 16]
+1D486; [31, 05, 16]
+1D4EE; [31, 05, 16]
+1D522; [31, 05, 16]
+1D556; [31, 05, 16]
+1D58A; [31, 05, 16]
+1D5BE; [31, 05, 16]
+1D5F2; [31, 05, 16]
+1D626; [31, 05, 16]
+1D65A; [31, 05, 16]
+1D68E; [31, 05, 16]
+24D4; [31, 05, 19]
+0045; [31, 05, 9C]
+FF25; [31, 05, 9F]
+2130; [31, 05, A5]
+1D404; [31, 05, A5]
+1D438; [31, 05, A5]
+1D46C; [31, 05, A5]
+1D4D4; [31, 05, A5]
+1D508; [31, 05, A5]
+1D53C; [31, 05, A5]
+1D570; [31, 05, A5]
+1D5A4; [31, 05, A5]
+1D5D8; [31, 05, A5]
+1D60C; [31, 05, A5]
+1D640; [31, 05, A5]
+1D674; [31, 05, A5]
+24BA; [31, 05, A8]
+1F154; [31, 05, A8]
+1D49; [31, 05, 2B]
+2091; [31, 05, 2E]
+1D31; [31, 05, B4]
+1F134; [31, 05, B4]
+1F174; [31, 05, B4]
+00E9; [31, 05, 05][, 88, 05]
+00C9; [31, 05, 9C][, 88, 05]
+00E8; [31, 05, 05][, 8A, 05]
+00C8; [31, 05, 9C][, 8A, 05]
+0115; [31, 05, 05][, 8C, 05]
+0114; [31, 05, 9C][, 8C, 05]
+00EA; [31, 05, 05][, 8E, 05]
+00CA; [31, 05, 9C][, 8E, 05]
+1EBF; [31, 05, 05][, 8E, 05][, 88, 05]
+1EBE; [31, 05, 9C][, 8E, 05][, 88, 05]
+1EC1; [31, 05, 05][, 8E, 05][, 8A, 05]
+1EC0; [31, 05, 9C][, 8E, 05][, 8A, 05]
+1EC5; [31, 05, 05][, 8E, 05][, 9A, 05]
+1EC4; [31, 05, 9C][, 8E, 05][, 9A, 05]
+1EC3; [31, 05, 05][, 8E, 05][, B6, 05]
+1EC2; [31, 05, 9C][, 8E, 05][, B6, 05]
+011B; [31, 05, 05][, 90, 05]
+011A; [31, 05, 9C][, 90, 05]
+00EB; [31, 05, 05][, 96, 05]
+00CB; [31, 05, 9C][, 96, 05]
+1EBD; [31, 05, 05][, 9A, 05]
+1EBC; [31, 05, 9C][, 9A, 05]
+0117; [31, 05, 05][, 9C, 05]
+0116; [31, 05, 9C][, 9C, 05]
+0229; [31, 05, 05][, A0, 05]
+0228; [31, 05, 9C][, A0, 05]
+1E1D; [31, 05, 05][, A0, 05][, 8C, 05]
+1E1C; [31, 05, 9C][, A0, 05][, 8C, 05]
+0119; [31, 05, 05][, A2, 05]
+0118; [31, 05, 9C][, A2, 05]
+0113; [31, 05, 05][, A4, 05]
+0112; [31, 05, 9C][, A4, 05]
+1E17; [31, 05, 05][, A4, 05][, 88, 05]
+1E16; [31, 05, 9C][, A4, 05][, 88, 05]
+1E15; [31, 05, 05][, A4, 05][, 8A, 05]
+1E14; [31, 05, 9C][, A4, 05][, 8A, 05]
+1EBB; [31, 05, 05][, B6, 05]
+1EBA; [31, 05, 9C][, B6, 05]
+0205; [31, 05, 05][, B8, 05]
+0204; [31, 05, 9C][, B8, 05]
+0207; [31, 05, 05][, BC, 05]
+0206; [31, 05, 9C][, BC, 05]
+1EB9; [31, 05, 05][, C4, 05]
+1EB8; [31, 05, 9C][, C4, 05]
+1EC7; [31, 05, 05][, C4, 05][, 8E, 05]
+1EC6; [31, 05, 9C][, C4, 05][, 8E, 05]
+1E19; [31, 05, 05][, CC, 05]
+1E18; [31, 05, 9C][, CC, 05]
+1E1B; [31, 05, 05][, D0, 05]
+1E1A; [31, 05, 9C][, D0, 05]
+32CD; [31, 05, 31][4B, 05, 31][35, 05, 2E]
+32CE; [31, 05, 31][53, 05, B4]
+
+1D07; [32 06, 05, 05]
+
+0247; [32 08, 05, 05]
+0246; [32 08, 05, A0]
+
+1D92; [32 0A, 05, 05]
+
+2C78; [32 0C, 05, 05]
+
+01DD; [32 0E, 05, 05]
+018E; [32 0E, 05, A0]
+1D32; [32 0E, 05, AE]
+
+2C7B; [32 10, 05, 05]
+
+0259; [32 12, 05, 05]
+018F; [32 12, 05, 90]
+1D4A; [32 12, 05, 1E]
+2094; [32 12, 05, 2C]
+
+1D95; [32 14, 05, 05]
+
+025B; [32 16, 05, 05]
+0190; [32 16, 05, 90]
+2107; [32 16, 05, 9E]
+1D4B; [32 16, 05, 2C]
+
+1D93; [32 18, 05, 05]
+
+0258; [32 1A, 05, 05]
+
+025A; [32 1C, 05, 05]
+
+025C; [32 1E, 05, 05]
+1D9F; [32 1E, 05, 20]
+
+1D94; [32 20, 05, 05]
+
+1D08; [32 22, 05, 05]
+1D4C; [32 22, 05, 20]
+
+025D; [32 24, 05, 05]
+
+025E; [32 26, 05, 05]
+
+029A; [32 28, 05, 05]
+
+0264; [32 2A, 05, 05]
+
+0066; [33, 05, 05]
+FF46; [33, 05, 10]
+1D41F; [33, 05, 16]
+1D453; [33, 05, 16]
+1D487; [33, 05, 16]
+1D4BB; [33, 05, 16]
+1D4EF; [33, 05, 16]
+1D523; [33, 05, 16]
+1D557; [33, 05, 16]
+1D58B; [33, 05, 16]
+1D5BF; [33, 05, 16]
+1D5F3; [33, 05, 16]
+1D627; [33, 05, 16]
+1D65B; [33, 05, 16]
+1D68F; [33, 05, 16]
+24D5; [33, 05, 19]
+0046; [33, 05, 9C]
+FF26; [33, 05, 9F]
+2131; [33, 05, A5]
+1D405; [33, 05, A5]
+1D439; [33, 05, A5]
+1D46D; [33, 05, A5]
+1D4D5; [33, 05, A5]
+1D509; [33, 05, A5]
+1D53D; [33, 05, A5]
+1D571; [33, 05, A5]
+1D5A5; [33, 05, A5]
+1D5D9; [33, 05, A5]
+1D60D; [33, 05, A5]
+1D641; [33, 05, A5]
+1D675; [33, 05, A5]
+24BB; [33, 05, A8]
+1F155; [33, 05, A8]
+1DA0; [33, 05, 2B]
+1F135; [33, 05, B1]
+1F175; [33, 05, B1]
+1E1F; [33, 05, 05][, 9C, 05]
+1E1E; [33, 05, 9C][, 9C, 05]
+A77C; [33, 70, 20]
+A77B; [33, 70, AE]
+213B; [33, 05, A2][29, 05, A2][57, 05, A2]
+FB00; [33, 05, 13][33, 05, 13]
+FB03; [33, 05, 13][33, 05, 13][39, 05, 13]
+FB04; [33, 05, 13][33, 05, 13][3F, 05, 13]
+FB01; [33, 05, 13][39, 05, 13]
+FB02; [33, 05, 13][3F, 05, 13]
+3399; [33, 05, 2E][41, 05, 31]
+02A9; [33, 05, 13][44 1C, 05, 10]
+1F193; [33, 05, B1][4B, 05, B4][31, 05, B4][31, 05, B4]
+
+A730; [34 06, 05, 05]
+
+1D6E; [34 08, 05, 05]
+
+1D82; [34 0A, 05, 05]
+
+0192; [34 0C, 05, 05]
+0191; [34 0C, 05, A0]
+
+214E; [34 0E, 05, 05]
+2132; [34 0E, 05, A0]
+
+A7FB; [34 10, 05, 05]
+
+0067; [35, 05, 05]
+FF47; [35, 05, 10]
+1DDA; [35, 05, 13]
+210A; [35, 05, 16]
+1D420; [35, 05, 16]
+1D454; [35, 05, 16]
+1D488; [35, 05, 16]
+1D4F0; [35, 05, 16]
+1D524; [35, 05, 16]
+1D558; [35, 05, 16]
+1D58C; [35, 05, 16]
+1D5C0; [35, 05, 16]
+1D5F4; [35, 05, 16]
+1D628; [35, 05, 16]
+1D65C; [35, 05, 16]
+1D690; [35, 05, 16]
+24D6; [35, 05, 19]
+0047; [35, 05, 9C]
+FF27; [35, 05, 9F]
+1D406; [35, 05, A5]
+1D43A; [35, 05, A5]
+1D46E; [35, 05, A5]
+1D4A2; [35, 05, A5]
+1D4D6; [35, 05, A5]
+1D50A; [35, 05, A5]
+1D53E; [35, 05, A5]
+1D572; [35, 05, A5]
+1D5A6; [35, 05, A5]
+1D5DA; [35, 05, A5]
+1D60E; [35, 05, A5]
+1D642; [35, 05, A5]
+1D676; [35, 05, A5]
+24BC; [35, 05, A8]
+1F156; [35, 05, A8]
+1D4D; [35, 05, 2B]
+1D33; [35, 05, B1]
+1F136; [35, 05, B1]
+1F176; [35, 05, B1]
+01F5; [35, 05, 05][, 88, 05]
+01F4; [35, 05, 9C][, 88, 05]
+011F; [35, 05, 05][, 8C, 05]
+011E; [35, 05, 9C][, 8C, 05]
+011D; [35, 05, 05][, 8E, 05]
+011C; [35, 05, 9C][, 8E, 05]
+01E7; [35, 05, 05][, 90, 05]
+01E6; [35, 05, 9C][, 90, 05]
+0121; [35, 05, 05][, 9C, 05]
+0120; [35, 05, 9C][, 9C, 05]
+0123; [35, 05, 05][, A0, 05]
+0122; [35, 05, 9C][, A0, 05]
+1E21; [35, 05, 05][, A4, 05]
+1E20; [35, 05, 9C][, A4, 05]
+A7A1; [35, 05, 13][, AA, 20]
+A7A0; [35, 05, A2][, AA, 20]
+1D79; [35, 70, 20]
+A77D; [35, 70, AE]
+33FF; [35, 05, 2E][29, 05, 31][3F, 05, 31]
+3387; [35, 05, B1][2B, 05, B1]
+3393; [35, 05, B1][37, 05, B4][5B, 05, 2E]
+33AC; [35, 05, B1][47, 05, B4][29, 05, 31]
+33C9; [35, 05, B1][59, 05, 2E]
+
+0261; [36 06, 05, 05]
+1DA2; [36 06, 05, 20]
+
+0262; [36 08, 05, 05]
+1DDB; [36 08, 05, 20]
+
+01E5; [36 0A, 05, 05]
+01E4; [36 0A, 05, A0]
+
+1D83; [36 0C, 05, 05]
+
+0260; [36 0E, 05, 05]
+0193; [36 0E, 05, A0]
+
+029B; [36 10, 05, 05]
+
+1D77; [36 12, 05, 05]
+
+A77F; [36 14, 05, 05]
+A77E; [36 14, 05, A0]
+
+0263; [36 16, 05, 05]
+0194; [36 16, 05, A0]
+02E0; [36 16, 05, 2E]
+
+01A3; [36 18, 05, 05]
+01A2; [36 18, 05, A0]
+
+0068; [37, 05, 05]
+FF48; [37, 05, 10]
+036A; [37, 05, 13]
+210E; [37, 05, 16]
+1D421; [37, 05, 16]
+1D489; [37, 05, 16]
+1D4BD; [37, 05, 16]
+1D4F1; [37, 05, 16]
+1D525; [37, 05, 16]
+1D559; [37, 05, 16]
+1D58D; [37, 05, 16]
+1D5C1; [37, 05, 16]
+1D5F5; [37, 05, 16]
+1D629; [37, 05, 16]
+1D65D; [37, 05, 16]
+1D691; [37, 05, 16]
+24D7; [37, 05, 19]
+0048; [37, 05, 9C]
+FF28; [37, 05, 9F]
+210B; [37, 05, A5]
+210C; [37, 05, A5]
+210D; [37, 05, A5]
+1D407; [37, 05, A5]
+1D43B; [37, 05, A5]
+1D46F; [37, 05, A5]
+1D4D7; [37, 05, A5]
+1D573; [37, 05, A5]
+1D5A7; [37, 05, A5]
+1D5DB; [37, 05, A5]
+1D60F; [37, 05, A5]
+1D643; [37, 05, A5]
+1D677; [37, 05, A5]
+24BD; [37, 05, A8]
+1F157; [37, 05, A8]
+02B0; [37, 05, 2B]
+2095; [37, 05, 2E]
+1D34; [37, 05, B4]
+1F137; [37, 05, B4]
+1F177; [37, 05, B4]
+0125; [37, 05, 05][, 8E, 05]
+0124; [37, 05, 9C][, 8E, 05]
+021F; [37, 05, 05][, 90, 05]
+021E; [37, 05, 9C][, 90, 05]
+1E27; [37, 05, 05][, 96, 05]
+1E26; [37, 05, 9C][, 96, 05]
+1E23; [37, 05, 05][, 9C, 05]
+1E22; [37, 05, 9C][, 9C, 05]
+1E29; [37, 05, 05][, A0, 05]
+1E28; [37, 05, 9C][, A0, 05]
+0127; [37, 05, 05][, B2, 05]
+210F; [37, 05, 05][, B2, 05]
+0126; [37, 05, 9C][, B2, 05]
+A7F8; [37, 05, 2B][, B2, 20]
+1E25; [37, 05, 05][, C4, 05]
+1E24; [37, 05, 9C][, C4, 05]
+1E2B; [37, 05, 05][, CE, 05]
+1E2A; [37, 05, 9C][, CE, 05]
+1E96; [37, 05, 05][, D2, 05]
+33CA; [37, 05, 31][29, 05, 31]
+32CC; [37, 05, B4][35, 05, 2E]
+33CB; [37, 05, B4][47, 05, B4]
+3371; [37, 05, 31][47, 05, B4][29, 05, 31]
+1F14A; [37, 05, B4][53, 05, B4]
+3390; [37, 05, B4][5B, 05, 2E]
+
+029C; [38 06, 05, 05]
+
+0195; [38 08, 05, 05]
+01F6; [38 08, 05, A0]
+
+0266; [38 0A, 05, 05]
+A7AA; [38 0A, 05, A0]
+02B1; [38 0A, 05, 2E]
+
+2C68; [38 0C, 05, 05]
+2C67; [38 0C, 05, A0]
+
+2C76; [38 0E, 05, 05]
+2C75; [38 0E, 05, A0]
+
+A727; [38 10, 05, 05]
+A726; [38 10, 05, A0]
+
+0267; [38 12, 05, 05]
+
+02BB; [38 14, 05, 05]
+
+02BD; [38 16, 05, 05]
+
+0069; [39, 05, 05]
+FF49; [39, 05, 10]
+0365; [39, 05, 13]
+2170; [39, 05, 13]
+2139; [39, 05, 16]
+2148; [39, 05, 16]
+1D422; [39, 05, 16]
+1D456; [39, 05, 16]
+1D48A; [39, 05, 16]
+1D4BE; [39, 05, 16]
+1D4F2; [39, 05, 16]
+1D526; [39, 05, 16]
+1D55A; [39, 05, 16]
+1D58E; [39, 05, 16]
+1D5C2; [39, 05, 16]
+1D5F6; [39, 05, 16]
+1D62A; [39, 05, 16]
+1D65E; [39, 05, 16]
+1D692; [39, 05, 16]
+24D8; [39, 05, 19]
+0049; [39, 05, 9C]
+FF29; [39, 05, 9F]
+2160; [39, 05, A2]
+2110; [39, 05, A5]
+2111; [39, 05, A5]
+1D408; [39, 05, A5]
+1D43C; [39, 05, A5]
+1D470; [39, 05, A5]
+1D4D8; [39, 05, A5]
+1D540; [39, 05, A5]
+1D574; [39, 05, A5]
+1D5A8; [39, 05, A5]
+1D5DC; [39, 05, A5]
+1D610; [39, 05, A5]
+1D644; [39, 05, A5]
+1D678; [39, 05, A5]
+24BE; [39, 05, A8]
+1F158; [39, 05, A8]
+2071; [39, 05, 2B]
+1D62; [39, 05, 2E]
+1D35; [39, 05, B4]
+1F138; [39, 05, B4]
+1F178; [39, 05, B4]
+00ED; [39, 05, 05][, 88, 05]
+00CD; [39, 05, 9C][, 88, 05]
+00EC; [39, 05, 05][, 8A, 05]
+00CC; [39, 05, 9C][, 8A, 05]
+012D; [39, 05, 05][, 8C, 05]
+012C; [39, 05, 9C][, 8C, 05]
+00EE; [39, 05, 05][, 8E, 05]
+00CE; [39, 05, 9C][, 8E, 05]
+01D0; [39, 05, 05][, 90, 05]
+01CF; [39, 05, 9C][, 90, 05]
+00EF; [39, 05, 05][, 96, 05]
+00CF; [39, 05, 9C][, 96, 05]
+1E2F; [39, 05, 05][, 96, 05][, 88, 05]
+1E2E; [39, 05, 9C][, 96, 05][, 88, 05]
+0129; [39, 05, 05][, 9A, 05]
+0128; [39, 05, 9C][, 9A, 05]
+0130; [39, 05, 9C][, 9C, 05]
+012F; [39, 05, 05][, A2, 05]
+012E; [39, 05, 9C][, A2, 05]
+012B; [39, 05, 05][, A4, 05]
+012A; [39, 05, 9C][, A4, 05]
+1EC9; [39, 05, 05][, B6, 05]
+1EC8; [39, 05, 9C][, B6, 05]
+0209; [39, 05, 05][, B8, 05]
+0208; [39, 05, 9C][, B8, 05]
+020B; [39, 05, 05][, BC, 05]
+020A; [39, 05, 9C][, BC, 05]
+1ECB; [39, 05, 05][, C4, 05]
+1ECA; [39, 05, 9C][, C4, 05]
+1E2D; [39, 05, 05][, D0, 05]
+1E2C; [39, 05, 9C][, D0, 05]
+1F18B; [39, 05, B4][2D, 05, B1]
+1F194; [39, 05, B4][2F, 05, B1]
+2171; [39, 05, 13][39, 05, 13]
+2161; [39, 05, A2][39, 05, A2]
+2172; [39, 05, 13][39, 05, 13][39, 05, 13]
+2162; [39, 05, A2][39, 05, A2][39, 05, A2]
+0133; [39, 05, 13][3B, 05, 13]
+0132; [39, 05, A2][3B, 05, A2]
+33CC; [39, 05, 31][43, 05, 31]
+337A; [39, 05, B4][51, 05, B1]
+2173; [39, 05, 13][53, 05, 13]
+2163; [39, 05, A2][53, 05, A2]
+2178; [39, 05, 13][57, 05, 13]
+2168; [39, 05, A2][57, 05, A2]
+
+0131; [3A 06, 05, 05]
+1D6A4; [3A 06, 05, 20]
+
+026A; [3A 08, 05, 05]
+1DA6; [3A 08, 05, 20]
+
+A7FE; [3A 0A, 05, 05]
+
+1D09; [3A 0C, 05, 05]
+1D4E; [3A 0C, 05, 20]
+
+0268; [3A 0E, 05, 05]
+0197; [3A 0E, 05, A0]
+1DA4; [3A 0E, 05, 2E]
+
+1D7B; [3A 10, 05, 05]
+1DA7; [3A 10, 05, 20]
+
+1D96; [3A 12, 05, 05]
+
+0269; [3A 14, 05, 05]
+0196; [3A 14, 05, A0]
+1DA5; [3A 14, 05, 2E]
+
+1D7C; [3A 16, 05, 05]
+
+006A; [3B, 05, 05]
+FF4A; [3B, 05, 10]
+2149; [3B, 05, 16]
+1D423; [3B, 05, 16]
+1D457; [3B, 05, 16]
+1D48B; [3B, 05, 16]
+1D4BF; [3B, 05, 16]
+1D4F3; [3B, 05, 16]
+1D527; [3B, 05, 16]
+1D55B; [3B, 05, 16]
+1D58F; [3B, 05, 16]
+1D5C3; [3B, 05, 16]
+1D5F7; [3B, 05, 16]
+1D62B; [3B, 05, 16]
+1D65F; [3B, 05, 16]
+1D693; [3B, 05, 16]
+24D9; [3B, 05, 19]
+004A; [3B, 05, 9C]
+FF2A; [3B, 05, 9F]
+1D409; [3B, 05, A5]
+1D43D; [3B, 05, A5]
+1D471; [3B, 05, A5]
+1D4A5; [3B, 05, A5]
+1D4D9; [3B, 05, A5]
+1D50D; [3B, 05, A5]
+1D541; [3B, 05, A5]
+1D575; [3B, 05, A5]
+1D5A9; [3B, 05, A5]
+1D5DD; [3B, 05, A5]
+1D611; [3B, 05, A5]
+1D645; [3B, 05, A5]
+1D679; [3B, 05, A5]
+24BF; [3B, 05, A8]
+1F159; [3B, 05, A8]
+02B2; [3B, 05, 2B]
+2C7C; [3B, 05, 2E]
+1D36; [3B, 05, B1]
+1F139; [3B, 05, B1]
+1F179; [3B, 05, B1]
+0135; [3B, 05, 05][, 8E, 05]
+0134; [3B, 05, 9C][, 8E, 05]
+01F0; [3B, 05, 05][, 90, 05]
+
+0237; [3C 06, 05, 05]
+1D6A5; [3C 06, 05, 20]
+
+1D0A; [3C 08, 05, 05]
+
+0249; [3C 0A, 05, 05]
+0248; [3C 0A, 05, A0]
+
+029D; [3C 0C, 05, 05]
+1DA8; [3C 0C, 05, 20]
+
+025F; [3C 0E, 05, 05]
+1DA1; [3C 0E, 05, 20]
+
+0284; [3C 10, 05, 05]
+
+006B; [3D, 05, 05]
+FF4B; [3D, 05, 10]
+1DDC; [3D, 05, 13]
+1D424; [3D, 05, 16]
+1D458; [3D, 05, 16]
+1D48C; [3D, 05, 16]
+1D4C0; [3D, 05, 16]
+1D4F4; [3D, 05, 16]
+1D528; [3D, 05, 16]
+1D55C; [3D, 05, 16]
+1D590; [3D, 05, 16]
+1D5C4; [3D, 05, 16]
+1D5F8; [3D, 05, 16]
+1D62C; [3D, 05, 16]
+1D660; [3D, 05, 16]
+1D694; [3D, 05, 16]
+24DA; [3D, 05, 19]
+004B; [3D, 05, 9C]
+212A; [3D, 05, 9C]
+FF2B; [3D, 05, 9F]
+1D40A; [3D, 05, A5]
+1D43E; [3D, 05, A5]
+1D472; [3D, 05, A5]
+1D4A6; [3D, 05, A5]
+1D4DA; [3D, 05, A5]
+1D50E; [3D, 05, A5]
+1D542; [3D, 05, A5]
+1D576; [3D, 05, A5]
+1D5AA; [3D, 05, A5]
+1D5DE; [3D, 05, A5]
+1D612; [3D, 05, A5]
+1D646; [3D, 05, A5]
+1D67A; [3D, 05, A5]
+24C0; [3D, 05, A8]
+1F15A; [3D, 05, A8]
+1D4F; [3D, 05, 2B]
+2096; [3D, 05, 2E]
+1D37; [3D, 05, B4]
+1F13A; [3D, 05, B4]
+1F17A; [3D, 05, B4]
+1E31; [3D, 05, 05][, 88, 05]
+1E30; [3D, 05, 9C][, 88, 05]
+01E9; [3D, 05, 05][, 90, 05]
+01E8; [3D, 05, 9C][, 90, 05]
+0137; [3D, 05, 05][, A0, 05]
+0136; [3D, 05, 9C][, A0, 05]
+A7A3; [3D, 05, 13][, AA, 20]
+A7A2; [3D, 05, A2][, AA, 20]
+1E33; [3D, 05, 05][, C4, 05]
+1E32; [3D, 05, 9C][, C4, 05]
+1E35; [3D, 05, 05][, D2, 05]
+1E34; [3D, 05, 9C][, D2, 05]
+3384; [3D, 05, 31][29, 05, B4]
+3385; [3D, 05, B4][2B, 05, B1]
+3389; [3D, 05, 31][2D, 05, 2E][29, 05, 31][3F, 05, 31]
+338F; [3D, 05, 31][35, 05, 2E]
+3391; [3D, 05, 31][37, 05, B4][5B, 05, 2E]
+33CD; [3D, 05, B4][3D, 05, B4]
+3398; [3D, 05, 31][3F, 05, 31]
+339E; [3D, 05, 31][41, 05, 31]
+33CE; [3D, 05, B4][41, 05, B4]
+33A2; [3D, 05, 31][41, 05, 31][18, 05, 2E]
+33A6; [3D, 05, 31][41, 05, 31][1A, 05, 2E]
+33AA; [3D, 05, 31][47, 05, B4][29, 05, 31]
+33CF; [3D, 05, 31][4F, 05, 31]
+33B8; [3D, 05, 31][53, 05, B4]
+33BE; [3D, 05, 31][55, 05, B8]
+33C0; [3D, 05, 31][5D 59, 05, B1]
+
+1D0B; [3E 06, 05, 05]
+
+1D84; [3E 08, 05, 05]
+
+0199; [3E 0A, 05, 05]
+0198; [3E 0A, 05, A0]
+
+2C6A; [3E 0C, 05, 05]
+2C69; [3E 0C, 05, A0]
+
+A741; [3E 0E, 05, 05]
+A740; [3E 0E, 05, A0]
+
+A743; [3E 10, 05, 05]
+A742; [3E 10, 05, A0]
+
+A745; [3E 12, 05, 05]
+A744; [3E 12, 05, A0]
+
+029E; [3E 14, 05, 05]
+
+006C; [3F, 05, 05]
+FF4C; [3F, 05, 10]
+1DDD; [3F, 05, 13]
+217C; [3F, 05, 13]
+2113; [3F, 05, 16]
+1D425; [3F, 05, 16]
+1D459; [3F, 05, 16]
+1D48D; [3F, 05, 16]
+1D4C1; [3F, 05, 16]
+1D4F5; [3F, 05, 16]
+1D529; [3F, 05, 16]
+1D55D; [3F, 05, 16]
+1D591; [3F, 05, 16]
+1D5C5; [3F, 05, 16]
+1D5F9; [3F, 05, 16]
+1D62D; [3F, 05, 16]
+1D661; [3F, 05, 16]
+1D695; [3F, 05, 16]
+24DB; [3F, 05, 19]
+004C; [3F, 05, 9C]
+FF2C; [3F, 05, 9F]
+216C; [3F, 05, A2]
+2112; [3F, 05, A5]
+1D40B; [3F, 05, A5]
+1D43F; [3F, 05, A5]
+1D473; [3F, 05, A5]
+1D4DB; [3F, 05, A5]
+1D50F; [3F, 05, A5]
+1D543; [3F, 05, A5]
+1D577; [3F, 05, A5]
+1D5AB; [3F, 05, A5]
+1D5DF; [3F, 05, A5]
+1D613; [3F, 05, A5]
+1D647; [3F, 05, A5]
+1D67B; [3F, 05, A5]
+24C1; [3F, 05, A8]
+1F15B; [3F, 05, A8]
+02E1; [3F, 05, 2B]
+2097; [3F, 05, 2E]
+1D38; [3F, 05, B4]
+1F13B; [3F, 05, B4]
+1F17B; [3F, 05, B4]
+013A; [3F, 05, 05][, 88, 05]
+0139; [3F, 05, 9C][, 88, 05]
+013E; [3F, 05, 05][, 90, 05]
+013D; [3F, 05, 9C][, 90, 05]
+013C; [3F, 05, 05][, A0, 05]
+013B; [3F, 05, 9C][, A0, 05]
+0142; [3F, 05, 05][, B2, 05]
+0141; [3F, 05, 9C][, B2, 05]
+1E37; [3F, 05, 05][, C4, 05]
+1E36; [3F, 05, 9C][, C4, 05]
+1E39; [3F, 05, 05][, C4, 05][, A4, 05]
+1E38; [3F, 05, 9C][, C4, 05][, A4, 05]
+1E3D; [3F, 05, 05][, CC, 05]
+1E3C; [3F, 05, 9C][, CC, 05]
+1E3B; [3F, 05, 05][, D2, 05]
+1E3A; [3F, 05, 9C][, D2, 05]
+0140; [3F, 05, 05][, FB 4C, 05]
+013F; [3F, 05, 9C][, FB 4C, 05]
+01C9; [3F, 05, 13][3B, 05, 13]
+01C8; [3F, 05, A2][3B, 05, 13]
+01C7; [3F, 05, A2][3B, 05, A2]
+1EFB; [3F, 05, 13][3F, 05, 13]
+1EFA; [3F, 05, A2][3F, 05, A2]
+33D0; [3F, 05, 31][41, 05, 31]
+33D1; [3F, 05, 31][43, 05, 31]
+33D2; [3F, 05, 31][45, 05, 31][35, 05, 2E]
+02AA; [3F, 05, 13][4D, 05, 13]
+32CF; [3F, 05, B4][4F, 05, B4][2F, 05, B1]
+33D3; [3F, 05, 31][57, 05, 31]
+02AB; [3F, 05, 13][5B, 05, 13]
+
+029F; [40 06, 05, 05]
+1DDE; [40 06, 05, 20]
+1DAB; [40 06, 05, 2E]
+
+A747; [40 08, 05, 05]
+A746; [40 08, 05, A0]
+
+1D0C; [40 0A, 05, 05]
+
+A749; [40 0C, 05, 05]
+A748; [40 0C, 05, A0]
+
+019A; [40 0E, 05, 05]
+023D; [40 0E, 05, A0]
+
+2C61; [40 10, 05, 05]
+2C60; [40 10, 05, A0]
+
+026B; [40 12, 05, 05]
+2C62; [40 12, 05, A0]
+
+026C; [40 14, 05, 05]
+
+1D85; [40 16, 05, 05]
+1DAA; [40 16, 05, 20]
+
+026D; [40 18, 05, 05]
+1DA9; [40 18, 05, 20]
+
+A78E; [40 1A, 05, 05]
+
+0234; [40 1C, 05, 05]
+
+A772; [40 1E, 05, 05]
+
+026E; [40 20, 05, 05]
+
+A781; [40 22, 05, 05]
+A780; [40 22, 05, A0]
+
+019B; [40 24, 05, 05]
+
+028E; [40 26, 05, 05]
+
+006D; [41, 05, 05]
+FF4D; [41, 05, 10]
+036B; [41, 05, 13]
+217F; [41, 05, 13]
+1D426; [41, 05, 16]
+1D45A; [41, 05, 16]
+1D48E; [41, 05, 16]
+1D4C2; [41, 05, 16]
+1D4F6; [41, 05, 16]
+1D52A; [41, 05, 16]
+1D55E; [41, 05, 16]
+1D592; [41, 05, 16]
+1D5C6; [41, 05, 16]
+1D5FA; [41, 05, 16]
+1D62E; [41, 05, 16]
+1D662; [41, 05, 16]
+1D696; [41, 05, 16]
+24DC; [41, 05, 19]
+004D; [41, 05, 9C]
+FF2D; [41, 05, 9F]
+216F; [41, 05, A2]
+2133; [41, 05, A5]
+1D40C; [41, 05, A5]
+1D440; [41, 05, A5]
+1D474; [41, 05, A5]
+1D4DC; [41, 05, A5]
+1D510; [41, 05, A5]
+1D544; [41, 05, A5]
+1D578; [41, 05, A5]
+1D5AC; [41, 05, A5]
+1D5E0; [41, 05, A5]
+1D614; [41, 05, A5]
+1D648; [41, 05, A5]
+1D67C; [41, 05, A5]
+24C2; [41, 05, A8]
+1F15C; [41, 05, A8]
+1D50; [41, 05, 2B]
+2098; [41, 05, 2E]
+1D39; [41, 05, B4]
+1F13C; [41, 05, B4]
+1F17C; [41, 05, B4]
+1E3F; [41, 05, 05][, 88, 05]
+1E3E; [41, 05, 9C][, 88, 05]
+1E41; [41, 05, 05][, 9C, 05]
+1E40; [41, 05, 9C][, 9C, 05]
+1E43; [41, 05, 05][, C4, 05]
+1E42; [41, 05, 9C][, C4, 05]
+33A7; [41, 05, 31][0D 7E 22, 05, 20][4D, 05, 31]
+33A8; [41, 05, 31][0D 7E 22, 05, 20][4D, 05, 31][18, 05, 2E]
+33A1; [41, 05, 31][18, 05, 2E]
+33A5; [41, 05, 31][1A, 05, 2E]
+3383; [41, 05, 31][29, 05, B4]
+33D4; [41, 05, 31][2B, 05, 2E]
+3386; [41, 05, B4][2B, 05, B1]
+1F16A; [41, 05, 2B][2D, 05, 2B]
+1F16B; [41, 05, 2B][2F, 05, 2B]
+338E; [41, 05, 31][35, 05, 2E]
+3392; [41, 05, B4][37, 05, B4][5B, 05, 2E]
+33D5; [41, 05, 31][39, 05, 31][3F, 05, 31]
+3396; [41, 05, 31][3F, 05, 31]
+339C; [41, 05, 31][41, 05, 31]
+339F; [41, 05, 31][41, 05, 31][18, 05, 2E]
+33A3; [41, 05, 31][41, 05, 31][1A, 05, 2E]
+33D6; [41, 05, 31][45, 05, 31][3F, 05, 31]
+33AB; [41, 05, B4][47, 05, B4][29, 05, 31]
+33B3; [41, 05, 31][4D, 05, 31]
+33B7; [41, 05, 31][53, 05, B4]
+33B9; [41, 05, B4][53, 05, B4]
+1F14B; [41, 05, B4][53, 05, B4]
+33BD; [41, 05, 31][55, 05, B8]
+33BF; [41, 05, B4][55, 05, B8]
+33C1; [41, 05, B4][5D 59, 05, B1]
+
+1D0D; [42 06, 05, 05]
+1DDF; [42 06, 05, 20]
+
+1D6F; [42 08, 05, 05]
+
+1D86; [42 0A, 05, 05]
+
+0271; [42 0C, 05, 05]
+2C6E; [42 0C, 05, A0]
+1DAC; [42 0C, 05, 2E]
+
+A7FD; [42 0E, 05, 05]
+
+A7FF; [42 10, 05, 05]
+
+A773; [42 12, 05, 05]
+
+006E; [43, 05, 05]
+FF4E; [43, 05, 10]
+1DE0; [43, 05, 13]
+1D427; [43, 05, 16]
+1D45B; [43, 05, 16]
+1D48F; [43, 05, 16]
+1D4C3; [43, 05, 16]
+1D4F7; [43, 05, 16]
+1D52B; [43, 05, 16]
+1D55F; [43, 05, 16]
+1D593; [43, 05, 16]
+1D5C7; [43, 05, 16]
+1D5FB; [43, 05, 16]
+1D62F; [43, 05, 16]
+1D663; [43, 05, 16]
+1D697; [43, 05, 16]
+24DD; [43, 05, 19]
+004E; [43, 05, 9C]
+FF2E; [43, 05, 9F]
+2115; [43, 05, A5]
+1D40D; [43, 05, A5]
+1D441; [43, 05, A5]
+1D475; [43, 05, A5]
+1D4A9; [43, 05, A5]
+1D4DD; [43, 05, A5]
+1D511; [43, 05, A5]
+1D579; [43, 05, A5]
+1D5AD; [43, 05, A5]
+1D5E1; [43, 05, A5]
+1D615; [43, 05, A5]
+1D649; [43, 05, A5]
+1D67D; [43, 05, A5]
+24C3; [43, 05, A8]
+1F15D; [43, 05, A8]
+207F; [43, 05, 2B]
+2099; [43, 05, 2E]
+1D3A; [43, 05, B4]
+1F13D; [43, 05, B4]
+1F17D; [43, 05, B4]
+0144; [43, 05, 05][, 88, 05]
+0143; [43, 05, 9C][, 88, 05]
+01F9; [43, 05, 05][, 8A, 05]
+01F8; [43, 05, 9C][, 8A, 05]
+0148; [43, 05, 05][, 90, 05]
+0147; [43, 05, 9C][, 90, 05]
+00F1; [43, 05, 05][, 9A, 05]
+00D1; [43, 05, 9C][, 9A, 05]
+1E45; [43, 05, 05][, 9C, 05]
+1E44; [43, 05, 9C][, 9C, 05]
+0146; [43, 05, 05][, A0, 05]
+0145; [43, 05, 9C][, A0, 05]
+A7A5; [43, 05, 13][, AA, 20]
+A7A4; [43, 05, A2][, AA, 20]
+1E47; [43, 05, 05][, C4, 05]
+1E46; [43, 05, 9C][, C4, 05]
+1E4B; [43, 05, 05][, CC, 05]
+1E4A; [43, 05, 9C][, CC, 05]
+1E49; [43, 05, 05][, D2, 05]
+1E48; [43, 05, 9C][, D2, 05]
+3381; [43, 05, 31][29, 05, B4]
+1F195; [43, 05, B4][31, 05, B4][55, 05, B8]
+338B; [43, 05, 31][33, 05, B1]
+1F196; [43, 05, B4][35, 05, B1]
+01CC; [43, 05, 13][3B, 05, 13]
+01CB; [43, 05, A2][3B, 05, 13]
+01CA; [43, 05, A2][3B, 05, A2]
+339A; [43, 05, 31][41, 05, 31]
+2116; [43, 05, A2][45, 05, 13]
+33B1; [43, 05, 31][4D, 05, 31]
+33B5; [43, 05, 31][53, 05, B4]
+33BB; [43, 05, 31][55, 05, B8]
+
+0274; [44 06, 05, 05]
+1DE1; [44 06, 05, 20]
+1DB0; [44 06, 05, 2E]
+
+1D3B; [44 08, 05, 05]
+
+1D0E; [44 0A, 05, 05]
+
+1D70; [44 0C, 05, 05]
+
+0272; [44 0E, 05, 05]
+019D; [44 0E, 05, A0]
+1DAE; [44 0E, 05, 2E]
+
+019E; [44 10, 05, 05]
+0220; [44 10, 05, A0]
+
+A791; [44 12, 05, 05]
+A790; [44 12, 05, A0]
+
+1D87; [44 14, 05, 05]
+
+0273; [44 16, 05, 05]
+1DAF; [44 16, 05, 20]
+
+0235; [44 18, 05, 05]
+
+A774; [44 1A, 05, 05]
+
+014B; [44 1C, 05, 05]
+014A; [44 1C, 05, 9E]
+1D51; [44 1C, 05, 2C]
+
+006F; [45, 05, 05]
+FF4F; [45, 05, 10]
+0366; [45, 05, 13]
+2134; [45, 05, 16]
+1D428; [45, 05, 16]
+1D45C; [45, 05, 16]
+1D490; [45, 05, 16]
+1D4F8; [45, 05, 16]
+1D52C; [45, 05, 16]
+1D560; [45, 05, 16]
+1D594; [45, 05, 16]
+1D5C8; [45, 05, 16]
+1D5FC; [45, 05, 16]
+1D630; [45, 05, 16]
+1D664; [45, 05, 16]
+1D698; [45, 05, 16]
+24DE; [45, 05, 19]
+004F; [45, 05, 9C]
+FF2F; [45, 05, 9F]
+1D40E; [45, 05, A5]
+1D442; [45, 05, A5]
+1D476; [45, 05, A5]
+1D4AA; [45, 05, A5]
+1D4DE; [45, 05, A5]
+1D512; [45, 05, A5]
+1D546; [45, 05, A5]
+1D57A; [45, 05, A5]
+1D5AE; [45, 05, A5]
+1D5E2; [45, 05, A5]
+1D616; [45, 05, A5]
+1D64A; [45, 05, A5]
+1D67E; [45, 05, A5]
+24C4; [45, 05, A8]
+1F15E; [45, 05, A8]
+00BA; [45, 05, 2B]
+1D52; [45, 05, 2B]
+2092; [45, 05, 2E]
+1D3C; [45, 05, B4]
+1F13E; [45, 05, B4]
+1F17E; [45, 05, B4]
+00F3; [45, 05, 05][, 88, 05]
+00D3; [45, 05, 9C][, 88, 05]
+00F2; [45, 05, 05][, 8A, 05]
+00D2; [45, 05, 9C][, 8A, 05]
+014F; [45, 05, 05][, 8C, 05]
+014E; [45, 05, 9C][, 8C, 05]
+00F4; [45, 05, 05][, 8E, 05]
+00D4; [45, 05, 9C][, 8E, 05]
+1ED1; [45, 05, 05][, 8E, 05][, 88, 05]
+1ED0; [45, 05, 9C][, 8E, 05][, 88, 05]
+1ED3; [45, 05, 05][, 8E, 05][, 8A, 05]
+1ED2; [45, 05, 9C][, 8E, 05][, 8A, 05]
+1ED7; [45, 05, 05][, 8E, 05][, 9A, 05]
+1ED6; [45, 05, 9C][, 8E, 05][, 9A, 05]
+1ED5; [45, 05, 05][, 8E, 05][, B6, 05]
+1ED4; [45, 05, 9C][, 8E, 05][, B6, 05]
+01D2; [45, 05, 05][, 90, 05]
+01D1; [45, 05, 9C][, 90, 05]
+00F6; [45, 05, 05][, 96, 05]
+00D6; [45, 05, 9C][, 96, 05]
+022B; [45, 05, 05][, 96, 05][, A4, 05]
+022A; [45, 05, 9C][, 96, 05][, A4, 05]
+0151; [45, 05, 05][, 98, 05]
+0150; [45, 05, 9C][, 98, 05]
+00F5; [45, 05, 05][, 9A, 05]
+00D5; [45, 05, 9C][, 9A, 05]
+1E4D; [45, 05, 05][, 9A, 05][, 88, 05]
+1E4C; [45, 05, 9C][, 9A, 05][, 88, 05]
+1E4F; [45, 05, 05][, 9A, 05][, 96, 05]
+1E4E; [45, 05, 9C][, 9A, 05][, 96, 05]
+022D; [45, 05, 05][, 9A, 05][, A4, 05]
+022C; [45, 05, 9C][, 9A, 05][, A4, 05]
+022F; [45, 05, 05][, 9C, 05]
+022E; [45, 05, 9C][, 9C, 05]
+0231; [45, 05, 05][, 9C, 05][, A4, 05]
+0230; [45, 05, 9C][, 9C, 05][, A4, 05]
+00F8; [45, 05, 05][, 9E, 05]
+00D8; [45, 05, 9C][, 9E, 05]
+01FF; [45, 05, 05][, 9E, 05][, 88, 05]
+01FE; [45, 05, 9C][, 9E, 05][, 88, 05]
+01EB; [45, 05, 05][, A2, 05]
+01EA; [45, 05, 9C][, A2, 05]
+01ED; [45, 05, 05][, A2, 05][, A4, 05]
+01EC; [45, 05, 9C][, A2, 05][, A4, 05]
+014D; [45, 05, 05][, A4, 05]
+014C; [45, 05, 9C][, A4, 05]
+1E53; [45, 05, 05][, A4, 05][, 88, 05]
+1E52; [45, 05, 9C][, A4, 05][, 88, 05]
+1E51; [45, 05, 05][, A4, 05][, 8A, 05]
+1E50; [45, 05, 9C][, A4, 05][, 8A, 05]
+1ECF; [45, 05, 05][, B6, 05]
+1ECE; [45, 05, 9C][, B6, 05]
+020D; [45, 05, 05][, B8, 05]
+020C; [45, 05, 9C][, B8, 05]
+020F; [45, 05, 05][, BC, 05]
+020E; [45, 05, 9C][, BC, 05]
+01A1; [45, 05, 05][, BE, 05]
+01A0; [45, 05, 9C][, BE, 05]
+1EDB; [45, 05, 05][, BE, 05][, 88, 05]
+1EDA; [45, 05, 9C][, BE, 05][, 88, 05]
+1EDD; [45, 05, 05][, BE, 05][, 8A, 05]
+1EDC; [45, 05, 9C][, BE, 05][, 8A, 05]
+1EE1; [45, 05, 05][, BE, 05][, 9A, 05]
+1EE0; [45, 05, 9C][, BE, 05][, 9A, 05]
+1EDF; [45, 05, 05][, BE, 05][, B6, 05]
+1EDE; [45, 05, 9C][, BE, 05][, B6, 05]
+1EE3; [45, 05, 05][, BE, 05][, C4, 05]
+1EE2; [45, 05, 9C][, BE, 05][, C4, 05]
+1ECD; [45, 05, 05][, C4, 05]
+1ECC; [45, 05, 9C][, C4, 05]
+1ED9; [45, 05, 05][, C4, 05][, 8E, 05]
+1ED8; [45, 05, 9C][, C4, 05][, 8E, 05]
+0153; [45, 70, 10][31, 05, 13]
+0152; [45, 70, 9E][31, 05, A2]
+A7F9; [45, 70, 2C][31, 05, 2B]
+1F197; [45, 05, B4][3D, 05, B4]
+A74F; [45, 05, 13][45, 05, 13]
+A74E; [45, 05, A2][45, 05, A2]
+3375; [45, 05, 31][53, 05, B4]
+
+1D0F; [46 06, 05, 05]
+
+1D11; [46 08, 05, 05]
+
+0276; [46 0A, 05, 05]
+
+1D14; [46 0C, 05, 05]
+
+1D13; [46 0E, 05, 05]
+
+0254; [46 10, 05, 05]
+0186; [46 10, 05, A0]
+1D53; [46 10, 05, 2E]
+
+1D10; [46 12, 05, 05]
+
+1D12; [46 14, 05, 05]
+
+1D97; [46 16, 05, 05]
+
+A74D; [46 18, 05, 05]
+A74C; [46 18, 05, A0]
+
+1D16; [46 1A, 05, 05]
+1D54; [46 1A, 05, 20]
+
+1D17; [46 1C, 05, 05]
+1D55; [46 1C, 05, 20]
+
+2C7A; [46 1E, 05, 05]
+
+0275; [46 20, 05, 05]
+019F; [46 20, 05, A0]
+1DB1; [46 20, 05, 2E]
+
+A74B; [46 22, 05, 05]
+A74A; [46 22, 05, A0]
+
+0277; [46 24, 05, 05]
+
+0223; [46 26, 05, 05]
+0222; [46 26, 05, A0]
+1D3D; [46 26, 05, AE]
+
+1D15; [46 28, 05, 05]
+
+0070; [47, 05, 05]
+FF50; [47, 05, 10]
+1D429; [47, 05, 16]
+1D45D; [47, 05, 16]
+1D491; [47, 05, 16]
+1D4C5; [47, 05, 16]
+1D4F9; [47, 05, 16]
+1D52D; [47, 05, 16]
+1D561; [47, 05, 16]
+1D595; [47, 05, 16]
+1D5C9; [47, 05, 16]
+1D5FD; [47, 05, 16]
+1D631; [47, 05, 16]
+1D665; [47, 05, 16]
+1D699; [47, 05, 16]
+24DF; [47, 05, 19]
+0050; [47, 05, 9C]
+FF30; [47, 05, 9F]
+2119; [47, 05, A5]
+1D40F; [47, 05, A5]
+1D443; [47, 05, A5]
+1D477; [47, 05, A5]
+1D4AB; [47, 05, A5]
+1D4DF; [47, 05, A5]
+1D513; [47, 05, A5]
+1D57B; [47, 05, A5]
+1D5AF; [47, 05, A5]
+1D5E3; [47, 05, A5]
+1D617; [47, 05, A5]
+1D64B; [47, 05, A5]
+1D67F; [47, 05, A5]
+24C5; [47, 05, A8]
+1F15F; [47, 05, A8]
+1D56; [47, 05, 2B]
+209A; [47, 05, 2E]
+1D3E; [47, 05, B4]
+1F13F; [47, 05, B4]
+1F17F; [47, 05, B4]
+1F18A; [47, 05, B4]
+1E55; [47, 05, 05][, 88, 05]
+1E54; [47, 05, 9C][, 88, 05]
+1E57; [47, 05, 05][, 9C, 05]
+1E56; [47, 05, 9C][, 9C, 05]
+33D8; [47, 05, 31][09, 05, 30][41, 05, 31][09, 05, 30]
+3380; [47, 05, 31][29, 05, B4]
+33A9; [47, 05, B4][29, 05, 31]
+1F18C; [47, 05, B4][29, 05, B4]
+3376; [47, 05, 31][2D, 05, 2E]
+338A; [47, 05, 31][33, 05, B1]
+33D7; [47, 05, B4][37, 05, B4]
+33D9; [47, 05, B4][47, 05, B4][41, 05, B4]
+1F14E; [47, 05, B4][47, 05, B4][53, 05, B4]
+33DA; [47, 05, B4][4B, 05, B4]
+33B0; [47, 05, 31][4D, 05, 31]
+3250; [47, 05, B4][4F, 05, B4][31, 05, B4]
+33B4; [47, 05, 31][53, 05, B4]
+33BA; [47, 05, 31][55, 05, B8]
+
+1D18; [48 06, 05, 05]
+
+1D7D; [48 08, 05, 05]
+2C63; [48 08, 05, A0]
+
+A751; [48 0A, 05, 05]
+A750; [48 0A, 05, A0]
+
+1D71; [48 0C, 05, 05]
+
+1D88; [48 0E, 05, 05]
+
+01A5; [48 10, 05, 05]
+01A4; [48 10, 05, A0]
+
+A753; [48 12, 05, 05]
+A752; [48 12, 05, A0]
+
+A755; [48 14, 05, 05]
+A754; [48 14, 05, A0]
+
+A7FC; [48 16, 05, 05]
+
+0278; [48 18, 05, 05]
+1DB2; [48 18, 05, 20]
+
+2C77; [48 1A, 05, 05]
+
+0071; [49, 05, 05]
+FF51; [49, 05, 10]
+1D42A; [49, 05, 18]
+1D45E; [49, 05, 18]
+1D492; [49, 05, 18]
+1D4C6; [49, 05, 18]
+1D4FA; [49, 05, 18]
+1D52E; [49, 05, 18]
+1D562; [49, 05, 18]
+1D596; [49, 05, 18]
+1D5CA; [49, 05, 18]
+1D5FE; [49, 05, 18]
+1D632; [49, 05, 18]
+1D666; [49, 05, 18]
+1D69A; [49, 05, 18]
+24E0; [49, 05, 1C]
+0051; [49, 05, A0]
+FF31; [49, 05, A4]
+211A; [49, 05, AC]
+1D410; [49, 05, AC]
+1D444; [49, 05, AC]
+1D478; [49, 05, AC]
+1D4AC; [49, 05, AC]
+1D4E0; [49, 05, AC]
+1D514; [49, 05, AC]
+1D57C; [49, 05, AC]
+1D5B0; [49, 05, AC]
+1D5E4; [49, 05, AC]
+1D618; [49, 05, AC]
+1D64C; [49, 05, AC]
+1D680; [49, 05, AC]
+24C6; [49, 05, B0]
+1F160; [49, 05, B0]
+1F140; [49, 05, B8]
+1F180; [49, 05, B8]
+0239; [49, 05, 14][47, 05, 13]
+
+A757; [4A 06, 05, 05]
+A756; [4A 06, 05, A0]
+
+A759; [4A 08, 05, 05]
+A758; [4A 08, 05, A0]
+
+02A0; [4A 0A, 05, 05]
+
+024B; [4A 0C, 05, 05]
+024A; [4A 0C, 05, A0]
+
+0138; [4A 0E, 05, 05]
+
+0072; [4B, 05, 05]
+FF52; [4B, 05, 10]
+036C; [4B, 05, 13]
+1DCA; [4B, 05, 13]
+1D42B; [4B, 05, 16]
+1D45F; [4B, 05, 16]
+1D493; [4B, 05, 16]
+1D4C7; [4B, 05, 16]
+1D4FB; [4B, 05, 16]
+1D52F; [4B, 05, 16]
+1D563; [4B, 05, 16]
+1D597; [4B, 05, 16]
+1D5CB; [4B, 05, 16]
+1D5FF; [4B, 05, 16]
+1D633; [4B, 05, 16]
+1D667; [4B, 05, 16]
+1D69B; [4B, 05, 16]
+24E1; [4B, 05, 19]
+0052; [4B, 05, 9C]
+FF32; [4B, 05, 9F]
+211B; [4B, 05, A5]
+211C; [4B, 05, A5]
+211D; [4B, 05, A5]
+1D411; [4B, 05, A5]
+1D445; [4B, 05, A5]
+1D479; [4B, 05, A5]
+1D4E1; [4B, 05, A5]
+1D57D; [4B, 05, A5]
+1D5B1; [4B, 05, A5]
+1D5E5; [4B, 05, A5]
+1D619; [4B, 05, A5]
+1D64D; [4B, 05, A5]
+1D681; [4B, 05, A5]
+24C7; [4B, 05, A8]
+1F12C; [4B, 05, A8]
+1F161; [4B, 05, A8]
+02B3; [4B, 05, 2B]
+1D63; [4B, 05, 2E]
+1D3F; [4B, 05, B4]
+1F141; [4B, 05, B4]
+1F181; [4B, 05, B4]
+0155; [4B, 05, 05][, 88, 05]
+0154; [4B, 05, 9C][, 88, 05]
+0159; [4B, 05, 05][, 90, 05]
+0158; [4B, 05, 9C][, 90, 05]
+1E59; [4B, 05, 05][, 9C, 05]
+1E58; [4B, 05, 9C][, 9C, 05]
+0157; [4B, 05, 05][, A0, 05]
+0156; [4B, 05, 9C][, A0, 05]
+A7A7; [4B, 05, 13][, AA, 20]
+A7A6; [4B, 05, A2][, AA, 20]
+0211; [4B, 05, 05][, B8, 05]
+0210; [4B, 05, 9C][, B8, 05]
+0213; [4B, 05, 05][, BC, 05]
+0212; [4B, 05, 9C][, BC, 05]
+1E5B; [4B, 05, 05][, C4, 05]
+1E5A; [4B, 05, 9C][, C4, 05]
+1E5D; [4B, 05, 05][, C4, 05][, A4, 05]
+1E5C; [4B, 05, 9C][, C4, 05][, A4, 05]
+1E5F; [4B, 05, 05][, D2, 05]
+1E5E; [4B, 05, 9C][, D2, 05]
+A783; [4B, 70, 20]
+A782; [4B, 70, AE]
+33AD; [4B, 05, 31][29, 05, 31][2F, 05, 2E]
+33AE; [4B, 05, 31][29, 05, 31][2F, 05, 2E][0D 7E 22, 05, 20][4D, 05, 31]
+33AF; [4B, 05, 31][29, 05, 31][2F, 05, 2E][0D 7E 22, 05, 20][4D, 05, 31][18, 05, 2E]
+
+0280; [4C 06, 05, 05]
+1DE2; [4C 06, 05, 20]
+01A6; [4C 06, 05, AE]
+
+A75B; [4C 08, 05, 05]
+1DE3; [4C 08, 05, 20]
+A75A; [4C 08, 05, AE]
+
+1D19; [4C 0A, 05, 05]
+
+024D; [4C 0C, 05, 05]
+024C; [4C 0C, 05, A0]
+
+1D72; [4C 0E, 05, 05]
+
+0279; [4C 10, 05, 05]
+02B4; [4C 10, 05, 20]
+
+1D1A; [4C 12, 05, 05]
+
+027A; [4C 14, 05, 05]
+
+1D89; [4C 16, 05, 05]
+
+027B; [4C 18, 05, 05]
+02B5; [4C 18, 05, 20]
+
+2C79; [4C 1A, 05, 05]
+
+027C; [4C 1C, 05, 05]
+
+027D; [4C 1E, 05, 05]
+2C64; [4C 1E, 05, A0]
+
+027E; [4C 20, 05, 05]
+
+1D73; [4C 22, 05, 05]
+
+027F; [4C 24, 05, 05]
+
+0281; [4C 26, 05, 05]
+02B6; [4C 26, 05, 20]
+
+A775; [4C 28, 05, 05]
+
+A776; [4C 2A, 05, 05]
+
+A75D; [4C 2C, 05, 05]
+A75C; [4C 2C, 05, A0]
+
+0073; [4D, 05, 05]
+FF53; [4D, 05, 10]
+1DE4; [4D, 05, 13]
+1D42C; [4D, 05, 16]
+1D460; [4D, 05, 16]
+1D494; [4D, 05, 16]
+1D4C8; [4D, 05, 16]
+1D4FC; [4D, 05, 16]
+1D530; [4D, 05, 16]
+1D564; [4D, 05, 16]
+1D598; [4D, 05, 16]
+1D5CC; [4D, 05, 16]
+1D600; [4D, 05, 16]
+1D634; [4D, 05, 16]
+1D668; [4D, 05, 16]
+1D69C; [4D, 05, 16]
+24E2; [4D, 05, 19]
+0053; [4D, 05, 9C]
+FF33; [4D, 05, 9F]
+1D412; [4D, 05, A5]
+1D446; [4D, 05, A5]
+1D47A; [4D, 05, A5]
+1D4AE; [4D, 05, A5]
+1D4E2; [4D, 05, A5]
+1D516; [4D, 05, A5]
+1D54A; [4D, 05, A5]
+1D57E; [4D, 05, A5]
+1D5B2; [4D, 05, A5]
+1D5E6; [4D, 05, A5]
+1D61A; [4D, 05, A5]
+1D64E; [4D, 05, A5]
+1D682; [4D, 05, A5]
+24C8; [4D, 05, A8]
+1F162; [4D, 05, A8]
+02E2; [4D, 05, 2B]
+209B; [4D, 05, 2E]
+1F142; [4D, 05, B4]
+1F182; [4D, 05, B4]
+015B; [4D, 05, 05][, 88, 05]
+015A; [4D, 05, 9C][, 88, 05]
+1E65; [4D, 05, 05][, 88, 05][, 9C, 05]
+1E64; [4D, 05, 9C][, 88, 05][, 9C, 05]
+015D; [4D, 05, 05][, 8E, 05]
+015C; [4D, 05, 9C][, 8E, 05]
+0161; [4D, 05, 05][, 90, 05]
+0160; [4D, 05, 9C][, 90, 05]
+1E67; [4D, 05, 05][, 90, 05][, 9C, 05]
+1E66; [4D, 05, 9C][, 90, 05][, 9C, 05]
+1E61; [4D, 05, 05][, 9C, 05]
+1E60; [4D, 05, 9C][, 9C, 05]
+015F; [4D, 05, 05][, A0, 05]
+015E; [4D, 05, 9C][, A0, 05]
+A7A9; [4D, 05, 13][, AA, 20]
+A7A8; [4D, 05, A2][, AA, 20]
+1E63; [4D, 05, 05][, C4, 05]
+1E62; [4D, 05, 9C][, C4, 05]
+1E69; [4D, 05, 05][, C4, 05][, 9C, 05]
+1E68; [4D, 05, 9C][, C4, 05][, 9C, 05]
+0219; [4D, 05, 05][, CA, 05]
+0218; [4D, 05, 9C][, CA, 05]
+017F; [4D, 78, 20]
+1DE5; [4D, 78, 20]
+A785; [4D, 78, 20]
+A784; [4D, 78, AE]
+1E9B; [4D, 78, 20][, 9C, 05]
+1F18D; [4D, 05, B4][29, 05, B4]
+1F14C; [4D, 05, B4][2F, 05, B1]
+2120; [4D, 05, 2B][41, 05, 2B]
+1F198; [4D, 05, B4][45, 05, B4][4D, 05, B4]
+33DB; [4D, 05, 31][4B, 05, 31]
+1F14D; [4D, 05, B4][4D, 05, B4]
+00DF; [4D, 70, 20][4D, 05, 13]
+1E9E; [4D, 70, AE][4D, 05, A2]
+FB06; [4D, 05, 13][4F, 05, 13]
+FB05; [4D, 78, 20][4F, 05, 13]
+33DC; [4D, 05, B4][53, 05, 31]
+
+A731; [4E 06, 05, 05]
+
+1D74; [4E 08, 05, 05]
+
+1D8A; [4E 0A, 05, 05]
+
+0282; [4E 0C, 05, 05]
+1DB3; [4E 0C, 05, 20]
+
+023F; [4E 0E, 05, 05]
+2C7E; [4E 0E, 05, A0]
+
+1E9C; [4E 10, 05, 05]
+
+1E9D; [4E 12, 05, 05]
+
+0283; [4E 14, 05, 05]
+01A9; [4E 14, 05, 9E]
+1DB4; [4E 14, 05, 2C]
+
+1D8B; [4E 16, 05, 05]
+
+01AA; [4E 18, 05, 05]
+
+0285; [4E 1A, 05, 05]
+
+1D98; [4E 1C, 05, 05]
+
+0286; [4E 1E, 05, 05]
+
+0074; [4F, 05, 05]
+FF54; [4F, 05, 10]
+036D; [4F, 05, 13]
+1D42D; [4F, 05, 16]
+1D461; [4F, 05, 16]
+1D495; [4F, 05, 16]
+1D4C9; [4F, 05, 16]
+1D4FD; [4F, 05, 16]
+1D531; [4F, 05, 16]
+1D565; [4F, 05, 16]
+1D599; [4F, 05, 16]
+1D5CD; [4F, 05, 16]
+1D601; [4F, 05, 16]
+1D635; [4F, 05, 16]
+1D669; [4F, 05, 16]
+1D69D; [4F, 05, 16]
+24E3; [4F, 05, 19]
+0054; [4F, 05, 9C]
+FF34; [4F, 05, 9F]
+1D413; [4F, 05, A5]
+1D447; [4F, 05, A5]
+1D47B; [4F, 05, A5]
+1D4AF; [4F, 05, A5]
+1D4E3; [4F, 05, A5]
+1D517; [4F, 05, A5]
+1D54B; [4F, 05, A5]
+1D57F; [4F, 05, A5]
+1D5B3; [4F, 05, A5]
+1D5E7; [4F, 05, A5]
+1D61B; [4F, 05, A5]
+1D64F; [4F, 05, A5]
+1D683; [4F, 05, A5]
+24C9; [4F, 05, A8]
+1F163; [4F, 05, A8]
+1D57; [4F, 05, 2B]
+209C; [4F, 05, 2E]
+1D40; [4F, 05, B4]
+1F143; [4F, 05, B4]
+1F183; [4F, 05, B4]
+0165; [4F, 05, 05][, 90, 05]
+0164; [4F, 05, 9C][, 90, 05]
+1E97; [4F, 05, 05][, 96, 05]
+1E6B; [4F, 05, 05][, 9C, 05]
+1E6A; [4F, 05, 9C][, 9C, 05]
+0163; [4F, 05, 05][, A0, 05]
+0162; [4F, 05, 9C][, A0, 05]
+1E6D; [4F, 05, 05][, C4, 05]
+1E6C; [4F, 05, 9C][, C4, 05]
+021B; [4F, 05, 05][, CA, 05]
+021A; [4F, 05, 9C][, CA, 05]
+1E71; [4F, 05, 05][, CC, 05]
+1E70; [4F, 05, 9C][, CC, 05]
+1E6F; [4F, 05, 05][, D2, 05]
+1E6E; [4F, 05, 9C][, D2, 05]
+A787; [4F, 78, 20]
+A786; [4F, 78, AE]
+02A8; [4F, 05, 13][2E 0E, 05, 20]
+2121; [4F, 05, A2][31, 05, A2][3F, 05, A2]
+1D7A; [4F, 70, 20][37, 05, 13]
+3394; [4F, 05, B4][37, 05, B4][5B, 05, 2E]
+2122; [4F, 05, 2B][41, 05, 2B]
+01BE; [4F, 05, 13][4D, 05, 13]
+02A6; [4F, 05, 13][4D, 05, 13]
+02A7; [4F, 05, 13][4E 14, 05, 10]
+A729; [4F, 05, 13][5B, 05, 13]
+A728; [4F, 05, A2][5B, 05, 13]
+
+1D1B; [50 06, 05, 05]
+
+0167; [50 08, 05, 05]
+0166; [50 08, 05, A0]
+
+2C66; [50 0A, 05, 05]
+023E; [50 0A, 05, A0]
+
+1D75; [50 0C, 05, 05]
+
+01AB; [50 0E, 05, 05]
+1DB5; [50 0E, 05, 20]
+
+01AD; [50 10, 05, 05]
+01AC; [50 10, 05, A0]
+
+0288; [50 12, 05, 05]
+01AE; [50 12, 05, A0]
+
+0236; [50 14, 05, 05]
+
+A777; [50 16, 05, 05]
+
+0287; [50 18, 05, 05]
+
+0075; [51, 05, 05]
+FF55; [51, 05, 10]
+0367; [51, 05, 13]
+1D42E; [51, 05, 16]
+1D462; [51, 05, 16]
+1D496; [51, 05, 16]
+1D4CA; [51, 05, 16]
+1D4FE; [51, 05, 16]
+1D532; [51, 05, 16]
+1D566; [51, 05, 16]
+1D59A; [51, 05, 16]
+1D5CE; [51, 05, 16]
+1D602; [51, 05, 16]
+1D636; [51, 05, 16]
+1D66A; [51, 05, 16]
+1D69E; [51, 05, 16]
+24E4; [51, 05, 19]
+0055; [51, 05, 9C]
+FF35; [51, 05, 9F]
+1D414; [51, 05, A5]
+1D448; [51, 05, A5]
+1D47C; [51, 05, A5]
+1D4B0; [51, 05, A5]
+1D4E4; [51, 05, A5]
+1D518; [51, 05, A5]
+1D54C; [51, 05, A5]
+1D580; [51, 05, A5]
+1D5B4; [51, 05, A5]
+1D5E8; [51, 05, A5]
+1D61C; [51, 05, A5]
+1D650; [51, 05, A5]
+1D684; [51, 05, A5]
+24CA; [51, 05, A8]
+1F164; [51, 05, A8]
+1D58; [51, 05, 2B]
+1D64; [51, 05, 2E]
+1D41; [51, 05, B1]
+1F144; [51, 05, B1]
+1F184; [51, 05, B1]
+00FA; [51, 05, 05][, 88, 05]
+00DA; [51, 05, 9C][, 88, 05]
+00F9; [51, 05, 05][, 8A, 05]
+00D9; [51, 05, 9C][, 8A, 05]
+016D; [51, 05, 05][, 8C, 05]
+016C; [51, 05, 9C][, 8C, 05]
+00FB; [51, 05, 05][, 8E, 05]
+00DB; [51, 05, 9C][, 8E, 05]
+01D4; [51, 05, 05][, 90, 05]
+01D3; [51, 05, 9C][, 90, 05]
+016F; [51, 05, 05][, 92, 05]
+016E; [51, 05, 9C][, 92, 05]
+00FC; [51, 05, 05][, 96, 05]
+00DC; [51, 05, 9C][, 96, 05]
+01D8; [51, 05, 05][, 96, 05][, 88, 05]
+01D7; [51, 05, 9C][, 96, 05][, 88, 05]
+01DC; [51, 05, 05][, 96, 05][, 8A, 05]
+01DB; [51, 05, 9C][, 96, 05][, 8A, 05]
+01DA; [51, 05, 05][, 96, 05][, 90, 05]
+01D9; [51, 05, 9C][, 96, 05][, 90, 05]
+01D6; [51, 05, 05][, 96, 05][, A4, 05]
+01D5; [51, 05, 9C][, 96, 05][, A4, 05]
+0171; [51, 05, 05][, 98, 05]
+0170; [51, 05, 9C][, 98, 05]
+0169; [51, 05, 05][, 9A, 05]
+0168; [51, 05, 9C][, 9A, 05]
+1E79; [51, 05, 05][, 9A, 05][, 88, 05]
+1E78; [51, 05, 9C][, 9A, 05][, 88, 05]
+0173; [51, 05, 05][, A2, 05]
+0172; [51, 05, 9C][, A2, 05]
+016B; [51, 05, 05][, A4, 05]
+016A; [51, 05, 9C][, A4, 05]
+1E7B; [51, 05, 05][, A4, 05][, 96, 05]
+1E7A; [51, 05, 9C][, A4, 05][, 96, 05]
+1EE7; [51, 05, 05][, B6, 05]
+1EE6; [51, 05, 9C][, B6, 05]
+0215; [51, 05, 05][, B8, 05]
+0214; [51, 05, 9C][, B8, 05]
+0217; [51, 05, 05][, BC, 05]
+0216; [51, 05, 9C][, BC, 05]
+01B0; [51, 05, 05][, BE, 05]
+01AF; [51, 05, 9C][, BE, 05]
+1EE9; [51, 05, 05][, BE, 05][, 88, 05]
+1EE8; [51, 05, 9C][, BE, 05][, 88, 05]
+1EEB; [51, 05, 05][, BE, 05][, 8A, 05]
+1EEA; [51, 05, 9C][, BE, 05][, 8A, 05]
+1EEF; [51, 05, 05][, BE, 05][, 9A, 05]
+1EEE; [51, 05, 9C][, BE, 05][, 9A, 05]
+1EED; [51, 05, 05][, BE, 05][, B6, 05]
+1EEC; [51, 05, 9C][, BE, 05][, B6, 05]
+1EF1; [51, 05, 05][, BE, 05][, C4, 05]
+1EF0; [51, 05, 9C][, BE, 05][, C4, 05]
+1EE5; [51, 05, 05][, C4, 05]
+1EE4; [51, 05, 9C][, C4, 05]
+1E73; [51, 05, 05][, C6, 05]
+1E72; [51, 05, 9C][, C6, 05]
+1E77; [51, 05, 05][, CC, 05]
+1E76; [51, 05, 9C][, CC, 05]
+1E75; [51, 05, 05][, D0, 05]
+1E74; [51, 05, 9C][, D0, 05]
+1F199; [51, 05, B1][47, 05, B4][08 4E, 05, 30]
+
+1D1C; [52 06, 05, 05]
+1DB8; [52 06, 05, 20]
+
+1D1D; [52 08, 05, 05]
+1D59; [52 08, 05, 20]
+
+1D1E; [52 0A, 05, 05]
+
+1D6B; [52 0C, 05, 05]
+
+0289; [52 0E, 05, 05]
+0244; [52 0E, 05, A0]
+1DB6; [52 0E, 05, 2E]
+
+1D7E; [52 10, 05, 05]
+
+1D99; [52 12, 05, 05]
+
+0265; [52 14, 05, 05]
+A78D; [52 14, 05, A0]
+1DA3; [52 14, 05, 2E]
+
+02AE; [52 16, 05, 05]
+
+02AF; [52 18, 05, 05]
+
+026F; [52 1A, 05, 05]
+019C; [52 1A, 05, A0]
+1D5A; [52 1A, 05, 2E]
+
+A7FA; [52 1C, 05, 05]
+
+1D1F; [52 1E, 05, 05]
+
+0270; [52 20, 05, 05]
+1DAD; [52 20, 05, 20]
+
+028A; [52 22, 05, 05]
+01B1; [52 22, 05, A0]
+1DB7; [52 22, 05, 2E]
+
+1D7F; [52 24, 05, 05]
+
+0076; [53, 05, 05]
+FF56; [53, 05, 10]
+036E; [53, 05, 13]
+2174; [53, 05, 13]
+1D42F; [53, 05, 16]
+1D463; [53, 05, 16]
+1D497; [53, 05, 16]
+1D4CB; [53, 05, 16]
+1D4FF; [53, 05, 16]
+1D533; [53, 05, 16]
+1D567; [53, 05, 16]
+1D59B; [53, 05, 16]
+1D5CF; [53, 05, 16]
+1D603; [53, 05, 16]
+1D637; [53, 05, 16]
+1D66B; [53, 05, 16]
+1D69F; [53, 05, 16]
+24E5; [53, 05, 19]
+0056; [53, 05, 9C]
+FF36; [53, 05, 9F]
+2164; [53, 05, A2]
+1D415; [53, 05, A5]
+1D449; [53, 05, A5]
+1D47D; [53, 05, A5]
+1D4B1; [53, 05, A5]
+1D4E5; [53, 05, A5]
+1D519; [53, 05, A5]
+1D54D; [53, 05, A5]
+1D581; [53, 05, A5]
+1D5B5; [53, 05, A5]
+1D5E9; [53, 05, A5]
+1D61D; [53, 05, A5]
+1D651; [53, 05, A5]
+1D685; [53, 05, A5]
+24CB; [53, 05, A8]
+1F165; [53, 05, A8]
+1D5B; [53, 05, 2B]
+1D65; [53, 05, 2E]
+2C7D; [53, 05, B4]
+1F145; [53, 05, B4]
+1F185; [53, 05, B4]
+1E7D; [53, 05, 05][, 9A, 05]
+1E7C; [53, 05, 9C][, 9A, 05]
+1E7F; [53, 05, 05][, C4, 05]
+1E7E; [53, 05, 9C][, C4, 05]
+33DE; [53, 05, B4][0D 7E 22, 05, 20][41, 05, 31]
+2175; [53, 05, 13][39, 05, 13]
+2165; [53, 05, A2][39, 05, A2]
+2176; [53, 05, 13][39, 05, 13][39, 05, 13]
+2166; [53, 05, A2][39, 05, A2][39, 05, A2]
+2177; [53, 05, 13][39, 05, 13][39, 05, 13][39, 05, 13]
+2167; [53, 05, A2][39, 05, A2][39, 05, A2][39, 05, A2]
+1F19A; [53, 05, B4][4D, 05, B4]
+A761; [53, 05, 13][59, 05, 13]
+A760; [53, 05, A2][59, 05, A2]
+
+1D20; [54 06, 05, 05]
+
+A75F; [54 08, 05, 05]
+A75E; [54 08, 05, A0]
+
+1D8C; [54 0A, 05, 05]
+
+028B; [54 0C, 05, 05]
+01B2; [54 0C, 05, A0]
+1DB9; [54 0C, 05, 2E]
+
+2C71; [54 0E, 05, 05]
+
+2C74; [54 10, 05, 05]
+
+1EFD; [54 12, 05, 05]
+1EFC; [54 12, 05, A0]
+
+028C; [54 14, 05, 05]
+0245; [54 14, 05, A0]
+1DBA; [54 14, 05, 2E]
+
+0077; [55, 05, 05]
+FF57; [55, 05, 10]
+1D430; [55, 05, 18]
+1D464; [55, 05, 18]
+1D498; [55, 05, 18]
+1D4CC; [55, 05, 18]
+1D500; [55, 05, 18]
+1D534; [55, 05, 18]
+1D568; [55, 05, 18]
+1D59C; [55, 05, 18]
+1D5D0; [55, 05, 18]
+1D604; [55, 05, 18]
+1D638; [55, 05, 18]
+1D66C; [55, 05, 18]
+1D6A0; [55, 05, 18]
+24E6; [55, 05, 1C]
+0057; [55, 05, A0]
+FF37; [55, 05, A4]
+1D416; [55, 05, AC]
+1D44A; [55, 05, AC]
+1D47E; [55, 05, AC]
+1D4B2; [55, 05, AC]
+1D4E6; [55, 05, AC]
+1D51A; [55, 05, AC]
+1D54E; [55, 05, AC]
+1D582; [55, 05, AC]
+1D5B6; [55, 05, AC]
+1D5EA; [55, 05, AC]
+1D61E; [55, 05, AC]
+1D652; [55, 05, AC]
+1D686; [55, 05, AC]
+24CC; [55, 05, B0]
+1F166; [55, 05, B0]
+02B7; [55, 05, 34]
+1D42; [55, 05, B8]
+1F146; [55, 05, B8]
+1F186; [55, 05, B8]
+1E83; [55, 05, 05][, 88, 05]
+1E82; [55, 05, A0][, 88, 05]
+1E81; [55, 05, 05][, 8A, 05]
+1E80; [55, 05, A0][, 8A, 05]
+0175; [55, 05, 05][, 8E, 05]
+0174; [55, 05, A0][, 8E, 05]
+1E98; [55, 05, 05][, 92, 05]
+1E85; [55, 05, 05][, 96, 05]
+1E84; [55, 05, A0][, 96, 05]
+1E87; [55, 05, 05][, 9C, 05]
+1E86; [55, 05, A0][, 9C, 05]
+1E89; [55, 05, 05][, C4, 05]
+1E88; [55, 05, A0][, C4, 05]
+33DD; [55, 05, B8][2B, 05, 2E]
+1F14F; [55, 05, B8][2D, 05, B1]
+1F18F; [55, 05, B8][2D, 05, B1]
+1F12E; [55, 05, B0][5B, 05, A8]
+
+1D21; [56 06, 05, 05]
+
+2C73; [56 08, 05, 05]
+2C72; [56 08, 05, A0]
+
+028D; [56 0A, 05, 05]
+
+0078; [57, 05, 05]
+FF58; [57, 05, 10]
+036F; [57, 05, 13]
+2179; [57, 05, 13]
+1D431; [57, 05, 16]
+1D465; [57, 05, 16]
+1D499; [57, 05, 16]
+1D4CD; [57, 05, 16]
+1D501; [57, 05, 16]
+1D535; [57, 05, 16]
+1D569; [57, 05, 16]
+1D59D; [57, 05, 16]
+1D5D1; [57, 05, 16]
+1D605; [57, 05, 16]
+1D639; [57, 05, 16]
+1D66D; [57, 05, 16]
+1D6A1; [57, 05, 16]
+24E7; [57, 05, 19]
+0058; [57, 05, 9C]
+FF38; [57, 05, 9F]
+2169; [57, 05, A2]
+1D417; [57, 05, A5]
+1D44B; [57, 05, A5]
+1D47F; [57, 05, A5]
+1D4B3; [57, 05, A5]
+1D4E7; [57, 05, A5]
+1D51B; [57, 05, A5]
+1D54F; [57, 05, A5]
+1D583; [57, 05, A5]
+1D5B7; [57, 05, A5]
+1D5EB; [57, 05, A5]
+1D61F; [57, 05, A5]
+1D653; [57, 05, A5]
+1D687; [57, 05, A5]
+24CD; [57, 05, A8]
+1F167; [57, 05, A8]
+02E3; [57, 05, 2B]
+2093; [57, 05, 2E]
+1F147; [57, 05, B4]
+1F187; [57, 05, B4]
+1E8D; [57, 05, 05][, 96, 05]
+1E8C; [57, 05, 9C][, 96, 05]
+1E8B; [57, 05, 05][, 9C, 05]
+1E8A; [57, 05, 9C][, 9C, 05]
+217A; [57, 05, 13][39, 05, 13]
+216A; [57, 05, A2][39, 05, A2]
+217B; [57, 05, 13][39, 05, 13][39, 05, 13]
+216B; [57, 05, A2][39, 05, A2][39, 05, A2]
+
+1D8D; [58 06, 05, 05]
+
+0079; [59, 05, 05]
+FF59; [59, 05, 10]
+1D432; [59, 05, 16]
+1D466; [59, 05, 16]
+1D49A; [59, 05, 16]
+1D4CE; [59, 05, 16]
+1D502; [59, 05, 16]
+1D536; [59, 05, 16]
+1D56A; [59, 05, 16]
+1D59E; [59, 05, 16]
+1D5D2; [59, 05, 16]
+1D606; [59, 05, 16]
+1D63A; [59, 05, 16]
+1D66E; [59, 05, 16]
+1D6A2; [59, 05, 16]
+24E8; [59, 05, 19]
+0059; [59, 05, 9C]
+FF39; [59, 05, 9F]
+1D418; [59, 05, A5]
+1D44C; [59, 05, A5]
+1D480; [59, 05, A5]
+1D4B4; [59, 05, A5]
+1D4E8; [59, 05, A5]
+1D51C; [59, 05, A5]
+1D550; [59, 05, A5]
+1D584; [59, 05, A5]
+1D5B8; [59, 05, A5]
+1D5EC; [59, 05, A5]
+1D620; [59, 05, A5]
+1D654; [59, 05, A5]
+1D688; [59, 05, A5]
+24CE; [59, 05, A8]
+1F168; [59, 05, A8]
+02B8; [59, 05, 2B]
+1F148; [59, 05, B1]
+1F188; [59, 05, B1]
+00FD; [59, 05, 05][, 88, 05]
+00DD; [59, 05, 9C][, 88, 05]
+1EF3; [59, 05, 05][, 8A, 05]
+1EF2; [59, 05, 9C][, 8A, 05]
+0177; [59, 05, 05][, 8E, 05]
+0176; [59, 05, 9C][, 8E, 05]
+1E99; [59, 05, 05][, 92, 05]
+00FF; [59, 05, 05][, 96, 05]
+0178; [59, 05, 9C][, 96, 05]
+1EF9; [59, 05, 05][, 9A, 05]
+1EF8; [59, 05, 9C][, 9A, 05]
+1E8F; [59, 05, 05][, 9C, 05]
+1E8E; [59, 05, 9C][, 9C, 05]
+0233; [59, 05, 05][, A4, 05]
+0232; [59, 05, 9C][, A4, 05]
+1EF7; [59, 05, 05][, B6, 05]
+1EF6; [59, 05, 9C][, B6, 05]
+1EF5; [59, 05, 05][, C4, 05]
+1EF4; [59, 05, 9C][, C4, 05]
+
+028F; [5A 06, 05, 05]
+
+024F; [5A 08, 05, 05]
+024E; [5A 08, 05, A0]
+
+01B4; [5A 0A, 05, 05]
+01B3; [5A 0A, 05, A0]
+
+1EFF; [5A 0C, 05, 05]
+1EFE; [5A 0C, 05, A0]
+
+021D; [5A 0E, 05, 05]
+021C; [5A 0E, 05, A0]
+
+007A; [5B, 05, 05]
+FF5A; [5B, 05, 10]
+1DE6; [5B, 05, 13]
+1D433; [5B, 05, 16]
+1D467; [5B, 05, 16]
+1D49B; [5B, 05, 16]
+1D4CF; [5B, 05, 16]
+1D503; [5B, 05, 16]
+1D537; [5B, 05, 16]
+1D56B; [5B, 05, 16]
+1D59F; [5B, 05, 16]
+1D5D3; [5B, 05, 16]
+1D607; [5B, 05, 16]
+1D63B; [5B, 05, 16]
+1D66F; [5B, 05, 16]
+1D6A3; [5B, 05, 16]
+24E9; [5B, 05, 19]
+005A; [5B, 05, 9C]
+FF3A; [5B, 05, 9F]
+2124; [5B, 05, A5]
+2128; [5B, 05, A5]
+1D419; [5B, 05, A5]
+1D44D; [5B, 05, A5]
+1D481; [5B, 05, A5]
+1D4B5; [5B, 05, A5]
+1D4E9; [5B, 05, A5]
+1D585; [5B, 05, A5]
+1D5B9; [5B, 05, A5]
+1D5ED; [5B, 05, A5]
+1D621; [5B, 05, A5]
+1D655; [5B, 05, A5]
+1D689; [5B, 05, A5]
+24CF; [5B, 05, A8]
+1F169; [5B, 05, A8]
+1DBB; [5B, 05, 2B]
+1F149; [5B, 05, B1]
+1F189; [5B, 05, B1]
+017A; [5B, 05, 05][, 88, 05]
+0179; [5B, 05, 9C][, 88, 05]
+1E91; [5B, 05, 05][, 8E, 05]
+1E90; [5B, 05, 9C][, 8E, 05]
+017E; [5B, 05, 05][, 90, 05]
+017D; [5B, 05, 9C][, 90, 05]
+017C; [5B, 05, 05][, 9C, 05]
+017B; [5B, 05, 9C][, 9C, 05]
+1E93; [5B, 05, 05][, C4, 05]
+1E92; [5B, 05, 9C][, C4, 05]
+1E95; [5B, 05, 05][, D2, 05]
+1E94; [5B, 05, 9C][, D2, 05]
+018D; [5B, 05, 13][55, 05, 14]
+
+1D22; [5C 06, 05, 05]
+
+01B6; [5C 08, 05, 05]
+01B5; [5C 08, 05, A0]
+
+1D76; [5C 0A, 05, 05]
+
+1D8E; [5C 0C, 05, 05]
+
+0225; [5C 0E, 05, 05]
+0224; [5C 0E, 05, A0]
+
+0290; [5C 10, 05, 05]
+1DBC; [5C 10, 05, 20]
+
+0291; [5C 12, 05, 05]
+1DBD; [5C 12, 05, 2E]
+
+0240; [5C 14, 05, 05]
+2C7F; [5C 14, 05, A0]
 
-1085C; [11 38 44, 05, 05]
+2C6C; [5C 16, 05, 05]
+2C6B; [5C 16, 05, A0]
 
-1085D; [11 38 4C, 05, 05]
+A763; [5C 18, 05, 05]
+A762; [5C 18, 05, A0]
 
-1085E; [11 38 54, 05, 05]
+0292; [5C 1A, 05, 05]
+01B7; [5C 1A, 05, 9E]
+1DBE; [5C 1A, 05, 2C]
+01EF; [5C 1A, 05, 05][, 90, 05]
+01EE; [5C 1A, 05, 9E][, 90, 05]
 
-1085F; [11 38 5C, 05, 05]
+1D23; [5C 1C, 05, 05]
 
-10B5C; [11 38 64, 05, 05]
+01B9; [5C 1E, 05, 05]
+01B8; [5C 1E, 05, A0]
 
-10B5D; [11 38 6C, 05, 05]
+1D9A; [5C 20, 05, 05]
 
-10B5E; [11 38 74, 05, 05]
+01BA; [5C 22, 05, 05]
 
-10B5F; [11 38 7C, 05, 05]
+0293; [5C 24, 05, 05]
 
-10B7C; [11 38 84, 05, 05]
+00FE; [5C 26, 05, 05]
+00DE; [5C 26, 05, A0]
 
-10B7D; [11 38 8C, 05, 05]
+A765; [5C 28, 05, 05]
+A764; [5C 28, 05, A0]
 
-10B7E; [11 38 94, 05, 05]
+A767; [5C 2A, 05, 05]
+A766; [5C 2A, 05, A0]
 
-10B7F; [11 38 9C, 05, 05]
+01BF; [5C 2C, 05, 05]
+01F7; [5C 2C, 05, A0]
 
-1105B; [11 38 A4, 05, 05]
+A769; [5C 2E, 05, 05]
+A768; [5C 2E, 05, A0]
 
-1105C; [11 38 AC, 05, 05]
+A76B; [5C 30, 05, 05]
+A76A; [5C 30, 05, A0]
 
-1105D; [11 38 B4, 05, 05]
+A76D; [5C 32, 05, 05]
+A76C; [5C 32, 05, A0]
 
-1105E; [11 38 BC, 05, 05]
+A76F; [5C 34, 05, 05]
+1DD2; [5C 34, 05, 10]
+A76E; [5C 34, 05, 9E]
+A770; [5C 34, 05, 2C]
 
-1105F; [11 38 C4, 05, 05]
+A778; [5C 36, 05, 05]
 
-11060; [11 38 CC, 05, 05]
+01BB; [5C 38, 05, 05]
 
-11061; [11 38 D4, 05, 05]
+A72B; [5C 3A, 05, 05]
+A72A; [5C 3A, 05, A0]
 
-11062; [11 38 DC, 05, 05]
+A72D; [5C 3C, 05, 05]
+A72C; [5C 3C, 05, A0]
 
-11063; [11 38 E4, 05, 05]
+A72F; [5C 3E, 05, 05]
+A72E; [5C 3E, 05, A0]
 
-11064; [11 38 EC, 05, 05]
+01A8; [5C 40, 05, 05]
+01A7; [5C 40, 05, A0]
 
-11065; [11 38 F4, 05, 05]
+01BD; [5C 42, 05, 05]
+01BC; [5C 42, 05, A0]
 
-10A44; [11 38 FC, 05, 05]
+0185; [5C 44, 05, 05]
+0184; [5C 44, 05, A0]
 
-10A45; [11 39 0A, 05, 05]
+0294; [5C 46, 05, 05]
 
-10A46; [11 39 12, 05, 05]
+0242; [5C 48, 05, 05]
+0241; [5C 48, 05, A0]
 
-10A47; [11 39 1A, 05, 05]
+02C0; [5C 4A, 05, 05]
 
-12432; [11 39 22, 05, 05]
+02BC; [5C 4C, 05, 05]
+0149; [5C 4C, 05, 20][43, 05, 13]
 
-12433; [11 39 2A, 05, 05]
+02EE; [5C 4E, 05, 05]
 
-12456; [11 39 32, 05, 05]
+02BE; [5C 50, 05, 05]
 
-12457; [11 39 3A, 05, 05]
+A723; [5C 52, 05, 05]
+A722; [5C 52, 05, A0]
 
-1245A; [11 39 42, 05, 05]
+A78C; [5C 54, 05, 05]
+A78B; [5C 54, 05, A0]
 
-1245B; [11 39 4A, 05, 05]
+0295; [5C 56, 05, 05]
+02E4; [5C 56, 05, 20]
 
-1245C; [11 39 52, 05, 05]
+02BF; [5C 58, 05, 05]
 
-1245D; [11 39 5A, 05, 05]
+02C1; [5C 5A, 05, 05]
 
-1245E; [11 39 62, 05, 05]
+1D24; [5C 5C, 05, 05]
 
-1245F; [11 39 6A, 05, 05]
+1D25; [5C 5E, 05, 05]
+1D5C; [5C 5E, 05, 20]
 
-12460; [11 39 72, 05, 05]
+A725; [5C 60, 05, 05]
+A724; [5C 60, 05, A0]
 
-12461; [11 39 7A, 05, 05]
+02A1; [5C 62, 05, 05]
 
-12462; [11 39 82, 05, 05]
+02A2; [5C 64, 05, 05]
 
-1D369; [11 3A, 05, 05]
+0296; [5C 66, 05, 05]
 
-1D36A; [11 3C, 05, 05]
+01C0; [5C 68, 05, 05]
+
+01C1; [5C 6A, 05, 05]
+
+01C2; [5C 6C, 05, 05]
+
+01C3; [5C 6E, 05, 05]
+
+0297; [5C 70, 05, 05]
+
+0298; [5C 72, 05, 05]
+
+02AC; [5C 74, 05, 05]
+
+02AD; [5C 76, 05, 05]
+
+FDD1 03A9;     [5D 04 02, 05, 05]      # GREEK first primary starts reordering group (compressible)
+
+03B1; [5D 09, 05, 05]
+1D6C2; [5D 09, 05, 1B]
+1D6FC; [5D 09, 05, 1B]
+1D736; [5D 09, 05, 1B]
+1D770; [5D 09, 05, 1B]
+1D7AA; [5D 09, 05, 1B]
+0391; [5D 09, 05, A6]
+1D6A8; [5D 09, 05, B1]
+1D6E2; [5D 09, 05, B1]
+1D71C; [5D 09, 05, B1]
+1D756; [5D 09, 05, B1]
+1D790; [5D 09, 05, B1]
+1F00; [5D 09, 05, 05][, 84, 05]
+1F08; [5D 09, 05, A6][, 84, 05]
+1F04; [5D 09, 05, 05][, 84, 05][, 88, 05]
+1F0C; [5D 09, 05, A6][, 84, 05][, 88, 05]
+1F84; [5D 09, 05, 05][, 84, 05][, 88, 05][, D8, 05]
+1F8C; [5D 09, 05, A6][, 84, 05][, 88, 05][, D8, 05]
+1F02; [5D 09, 05, 05][, 84, 05][, 8A, 05]
+1F0A; [5D 09, 05, A6][, 84, 05][, 8A, 05]
+1F82; [5D 09, 05, 05][, 84, 05][, 8A, 05][, D8, 05]
+1F8A; [5D 09, 05, A6][, 84, 05][, 8A, 05][, D8, 05]
+1F06; [5D 09, 05, 05][, 84, 05][, 94, 05]
+1F0E; [5D 09, 05, A6][, 84, 05][, 94, 05]
+1F86; [5D 09, 05, 05][, 84, 05][, 94, 05][, D8, 05]
+1F8E; [5D 09, 05, A6][, 84, 05][, 94, 05][, D8, 05]
+1F80; [5D 09, 05, 05][, 84, 05][, D8, 05]
+1F88; [5D 09, 05, A6][, 84, 05][, D8, 05]
+1F01; [5D 09, 05, 05][, 86, 05]
+1F09; [5D 09, 05, A6][, 86, 05]
+1F05; [5D 09, 05, 05][, 86, 05][, 88, 05]
+1F0D; [5D 09, 05, A6][, 86, 05][, 88, 05]
+1F85; [5D 09, 05, 05][, 86, 05][, 88, 05][, D8, 05]
+1F8D; [5D 09, 05, A6][, 86, 05][, 88, 05][, D8, 05]
+1F03; [5D 09, 05, 05][, 86, 05][, 8A, 05]
+1F0B; [5D 09, 05, A6][, 86, 05][, 8A, 05]
+1F83; [5D 09, 05, 05][, 86, 05][, 8A, 05][, D8, 05]
+1F8B; [5D 09, 05, A6][, 86, 05][, 8A, 05][, D8, 05]
+1F07; [5D 09, 05, 05][, 86, 05][, 94, 05]
+1F0F; [5D 09, 05, A6][, 86, 05][, 94, 05]
+1F87; [5D 09, 05, 05][, 86, 05][, 94, 05][, D8, 05]
+1F8F; [5D 09, 05, A6][, 86, 05][, 94, 05][, D8, 05]
+1F81; [5D 09, 05, 05][, 86, 05][, D8, 05]
+1F89; [5D 09, 05, A6][, 86, 05][, D8, 05]
+03AC; [5D 09, 05, 05][, 88, 05]
+1F71; [5D 09, 05, 05][, 88, 05]
+0386; [5D 09, 05, A6][, 88, 05]
+1FBB; [5D 09, 05, A6][, 88, 05]
+1FB4; [5D 09, 05, 05][, 88, 05][, D8, 05]
+1F70; [5D 09, 05, 05][, 8A, 05]
+1FBA; [5D 09, 05, A6][, 8A, 05]
+1FB2; [5D 09, 05, 05][, 8A, 05][, D8, 05]
+1FB0; [5D 09, 05, 05][, 8C, 05]
+1FB8; [5D 09, 05, A6][, 8C, 05]
+1FB6; [5D 09, 05, 05][, 94, 05]
+1FB7; [5D 09, 05, 05][, 94, 05][, D8, 05]
+1FB1; [5D 09, 05, 05][, A4, 05]
+1FB9; [5D 09, 05, A6][, A4, 05]
+1FB3; [5D 09, 05, 05][, D8, 05]
+1FBC; [5D 09, 05, A6][, D8, 05]
+
+03B2; [5D 0B, 05, 05]
+03D0; [5D 0B, 05, 10]
+1D6C3; [5D 0B, 05, 17]
+1D6FD; [5D 0B, 05, 17]
+1D737; [5D 0B, 05, 17]
+1D771; [5D 0B, 05, 17]
+1D7AB; [5D 0B, 05, 17]
+0392; [5D 0B, 05, 9E]
+1D6A9; [5D 0B, 05, A5]
+1D6E3; [5D 0B, 05, A5]
+1D71D; [5D 0B, 05, A5]
+1D757; [5D 0B, 05, A5]
+1D791; [5D 0B, 05, A5]
+1D5D; [5D 0B, 05, 2C]
+1D66; [5D 0B, 05, 33]
+
+03B3; [5D 0D, 05, 05]
+213D; [5D 0D, 05, 10]
+1D6C4; [5D 0D, 05, 10]
+1D6FE; [5D 0D, 05, 10]
+1D738; [5D 0D, 05, 10]
+1D772; [5D 0D, 05, 10]
+1D7AC; [5D 0D, 05, 10]
+0393; [5D 0D, 05, 98]
+213E; [5D 0D, 05, A0]
+1D6AA; [5D 0D, 05, A0]
+1D6E4; [5D 0D, 05, A0]
+1D71E; [5D 0D, 05, A0]
+1D758; [5D 0D, 05, A0]
+1D792; [5D 0D, 05, A0]
+1D5E; [5D 0D, 05, 28]
+1D67; [5D 0D, 05, 30]
+
+1D26; [5D 0F, 05, 05]
+
+03B4; [5D 11, 05, 05]
+1D6C5; [5D 11, 05, 10]
+1D6FF; [5D 11, 05, 10]
+1D739; [5D 11, 05, 10]
+1D773; [5D 11, 05, 10]
+1D7AD; [5D 11, 05, 10]
+0394; [5D 11, 05, 9B]
+1D6AB; [5D 11, 05, A6]
+1D6E5; [5D 11, 05, A6]
+1D71F; [5D 11, 05, A6]
+1D759; [5D 11, 05, A6]
+1D793; [5D 11, 05, A6]
+1D5F; [5D 11, 05, 31]
+
+03B5; [5D 13, 05, 05]
+03F5; [5D 13, 05, 10]
+1D6C6; [5D 13, 05, 1B]
+1D6DC; [5D 13, 05, 1B]
+1D700; [5D 13, 05, 1B]
+1D716; [5D 13, 05, 1B]
+1D73A; [5D 13, 05, 1B]
+1D750; [5D 13, 05, 1B]
+1D774; [5D 13, 05, 1B]
+1D78A; [5D 13, 05, 1B]
+1D7AE; [5D 13, 05, 1B]
+1D7C4; [5D 13, 05, 1B]
+0395; [5D 13, 05, A6]
+1D6AC; [5D 13, 05, B1]
+1D6E6; [5D 13, 05, B1]
+1D720; [5D 13, 05, B1]
+1D75A; [5D 13, 05, B1]
+1D794; [5D 13, 05, B1]
+1F10; [5D 13, 05, 05][, 84, 05]
+1F18; [5D 13, 05, A6][, 84, 05]
+1F14; [5D 13, 05, 05][, 84, 05][, 88, 05]
+1F1C; [5D 13, 05, A6][, 84, 05][, 88, 05]
+1F12; [5D 13, 05, 05][, 84, 05][, 8A, 05]
+1F1A; [5D 13, 05, A6][, 84, 05][, 8A, 05]
+1F11; [5D 13, 05, 05][, 86, 05]
+1F19; [5D 13, 05, A6][, 86, 05]
+1F15; [5D 13, 05, 05][, 86, 05][, 88, 05]
+1F1D; [5D 13, 05, A6][, 86, 05][, 88, 05]
+1F13; [5D 13, 05, 05][, 86, 05][, 8A, 05]
+1F1B; [5D 13, 05, A6][, 86, 05][, 8A, 05]
+03AD; [5D 13, 05, 05][, 88, 05]
+1F73; [5D 13, 05, 05][, 88, 05]
+0388; [5D 13, 05, A6][, 88, 05]
+1FC9; [5D 13, 05, A6][, 88, 05]
+1F72; [5D 13, 05, 05][, 8A, 05]
+1FC8; [5D 13, 05, A6][, 8A, 05]
+
+03DD; [5D 15, 05, 05]
+1D7CB; [5D 15, 05, 10]
+03DC; [5D 15, 05, 9E]
+1D7CA; [5D 15, 05, AC]
+
+0377; [5D 17, 05, 05]
+0376; [5D 17, 05, A0]
+
+03DB; [5D 19, 05, 05]
+03DA; [5D 19, 05, A0]
+
+03B6; [5D 1B, 05, 05]
+1D6C7; [5D 1B, 05, 10]
+1D701; [5D 1B, 05, 10]
+1D73B; [5D 1B, 05, 10]
+1D775; [5D 1B, 05, 10]
+1D7AF; [5D 1B, 05, 10]
+0396; [5D 1B, 05, 9E]
+1D6AD; [5D 1B, 05, AC]
+1D6E7; [5D 1B, 05, AC]
+1D721; [5D 1B, 05, AC]
+1D75B; [5D 1B, 05, AC]
+1D795; [5D 1B, 05, AC]
+
+0371; [5D 1D, 05, 05]
+0370; [5D 1D, 05, A0]
+
+03B7; [5D 1F, 05, 05]
+1D6C8; [5D 1F, 05, 10]
+1D702; [5D 1F, 05, 10]
+1D73C; [5D 1F, 05, 10]
+1D776; [5D 1F, 05, 10]
+1D7B0; [5D 1F, 05, 10]
+0397; [5D 1F, 05, 9E]
+1D6AE; [5D 1F, 05, AC]
+1D6E8; [5D 1F, 05, AC]
+1D722; [5D 1F, 05, AC]
+1D75C; [5D 1F, 05, AC]
+1D796; [5D 1F, 05, AC]
+1F20; [5D 1F, 05, 05][, 84, 05]
+1F28; [5D 1F, 05, 9E][, 84, 05]
+1F24; [5D 1F, 05, 05][, 84, 05][, 88, 05]
+1F2C; [5D 1F, 05, 9E][, 84, 05][, 88, 05]
+1F94; [5D 1F, 05, 05][, 84, 05][, 88, 05][, D8, 05]
+1F9C; [5D 1F, 05, 9E][, 84, 05][, 88, 05][, D8, 05]
+1F22; [5D 1F, 05, 05][, 84, 05][, 8A, 05]
+1F2A; [5D 1F, 05, 9E][, 84, 05][, 8A, 05]
+1F92; [5D 1F, 05, 05][, 84, 05][, 8A, 05][, D8, 05]
+1F9A; [5D 1F, 05, 9E][, 84, 05][, 8A, 05][, D8, 05]
+1F26; [5D 1F, 05, 05][, 84, 05][, 94, 05]
+1F2E; [5D 1F, 05, 9E][, 84, 05][, 94, 05]
+1F96; [5D 1F, 05, 05][, 84, 05][, 94, 05][, D8, 05]
+1F9E; [5D 1F, 05, 9E][, 84, 05][, 94, 05][, D8, 05]
+1F90; [5D 1F, 05, 05][, 84, 05][, D8, 05]
+1F98; [5D 1F, 05, 9E][, 84, 05][, D8, 05]
+1F21; [5D 1F, 05, 05][, 86, 05]
+1F29; [5D 1F, 05, 9E][, 86, 05]
+1F25; [5D 1F, 05, 05][, 86, 05][, 88, 05]
+1F2D; [5D 1F, 05, 9E][, 86, 05][, 88, 05]
+1F95; [5D 1F, 05, 05][, 86, 05][, 88, 05][, D8, 05]
+1F9D; [5D 1F, 05, 9E][, 86, 05][, 88, 05][, D8, 05]
+1F23; [5D 1F, 05, 05][, 86, 05][, 8A, 05]
+1F2B; [5D 1F, 05, 9E][, 86, 05][, 8A, 05]
+1F93; [5D 1F, 05, 05][, 86, 05][, 8A, 05][, D8, 05]
+1F9B; [5D 1F, 05, 9E][, 86, 05][, 8A, 05][, D8, 05]
+1F27; [5D 1F, 05, 05][, 86, 05][, 94, 05]
+1F2F; [5D 1F, 05, 9E][, 86, 05][, 94, 05]
+1F97; [5D 1F, 05, 05][, 86, 05][, 94, 05][, D8, 05]
+1F9F; [5D 1F, 05, 9E][, 86, 05][, 94, 05][, D8, 05]
+1F91; [5D 1F, 05, 05][, 86, 05][, D8, 05]
+1F99; [5D 1F, 05, 9E][, 86, 05][, D8, 05]
+03AE; [5D 1F, 05, 05][, 88, 05]
+1F75; [5D 1F, 05, 05][, 88, 05]
+0389; [5D 1F, 05, 9E][, 88, 05]
+1FCB; [5D 1F, 05, 9E][, 88, 05]
+1FC4; [5D 1F, 05, 05][, 88, 05][, D8, 05]
+1F74; [5D 1F, 05, 05][, 8A, 05]
+1FCA; [5D 1F, 05, 9E][, 8A, 05]
+1FC2; [5D 1F, 05, 05][, 8A, 05][, D8, 05]
+1FC6; [5D 1F, 05, 05][, 94, 05]
+1FC7; [5D 1F, 05, 05][, 94, 05][, D8, 05]
+1FC3; [5D 1F, 05, 05][, D8, 05]
+1FCC; [5D 1F, 05, 9E][, D8, 05]
+
+03B8; [5D 21, 05, 05]
+03D1; [5D 21, 05, 10]
+1D6C9; [5D 21, 05, 17]
+1D6DD; [5D 21, 05, 17]
+1D703; [5D 21, 05, 17]
+1D717; [5D 21, 05, 17]
+1D73D; [5D 21, 05, 17]
+1D751; [5D 21, 05, 17]
+1D777; [5D 21, 05, 17]
+1D78B; [5D 21, 05, 17]
+1D7B1; [5D 21, 05, 17]
+1D7C5; [5D 21, 05, 17]
+0398; [5D 21, 05, 9E]
+03F4; [5D 21, 05, A5]
+1D6AF; [5D 21, 05, AC]
+1D6B9; [5D 21, 05, AC]
+1D6E9; [5D 21, 05, AC]
+1D6F3; [5D 21, 05, AC]
+1D723; [5D 21, 05, AC]
+1D72D; [5D 21, 05, AC]
+1D75D; [5D 21, 05, AC]
+1D767; [5D 21, 05, AC]
+1D797; [5D 21, 05, AC]
+1D7A1; [5D 21, 05, AC]
+1DBF; [5D 21, 05, 33]
+
+03B9; [5D 23, 05, 05]
+1FBE; [5D 23, 05, 05]
+037A; [5D 23, 05, 10]
+1D6CA; [5D 23, 05, 1B]
+1D704; [5D 23, 05, 1B]
+1D73E; [5D 23, 05, 1B]
+1D778; [5D 23, 05, 1B]
+1D7B2; [5D 23, 05, 1B]
+0399; [5D 23, 05, A6]
+1D6B0; [5D 23, 05, B1]
+1D6EA; [5D 23, 05, B1]
+1D724; [5D 23, 05, B1]
+1D75E; [5D 23, 05, B1]
+1D798; [5D 23, 05, B1]
+1F30; [5D 23, 05, 05][, 84, 05]
+1F38; [5D 23, 05, A6][, 84, 05]
+1F34; [5D 23, 05, 05][, 84, 05][, 88, 05]
+1F3C; [5D 23, 05, A6][, 84, 05][, 88, 05]
+1F32; [5D 23, 05, 05][, 84, 05][, 8A, 05]
+1F3A; [5D 23, 05, A6][, 84, 05][, 8A, 05]
+1F36; [5D 23, 05, 05][, 84, 05][, 94, 05]
+1F3E; [5D 23, 05, A6][, 84, 05][, 94, 05]
+1F31; [5D 23, 05, 05][, 86, 05]
+1F39; [5D 23, 05, A6][, 86, 05]
+1F35; [5D 23, 05, 05][, 86, 05][, 88, 05]
+1F3D; [5D 23, 05, A6][, 86, 05][, 88, 05]
+1F33; [5D 23, 05, 05][, 86, 05][, 8A, 05]
+1F3B; [5D 23, 05, A6][, 86, 05][, 8A, 05]
+1F37; [5D 23, 05, 05][, 86, 05][, 94, 05]
+1F3F; [5D 23, 05, A6][, 86, 05][, 94, 05]
+03AF; [5D 23, 05, 05][, 88, 05]
+1F77; [5D 23, 05, 05][, 88, 05]
+038A; [5D 23, 05, A6][, 88, 05]
+1FDB; [5D 23, 05, A6][, 88, 05]
+1F76; [5D 23, 05, 05][, 8A, 05]
+1FDA; [5D 23, 05, A6][, 8A, 05]
+1FD0; [5D 23, 05, 05][, 8C, 05]
+1FD8; [5D 23, 05, A6][, 8C, 05]
+1FD6; [5D 23, 05, 05][, 94, 05]
+03CA; [5D 23, 05, 05][, 96, 05]
+03AA; [5D 23, 05, A6][, 96, 05]
+0390; [5D 23, 05, 05][, 96, 05][, 88, 05]
+1FD3; [5D 23, 05, 05][, 96, 05][, 88, 05]
+1FD2; [5D 23, 05, 05][, 96, 05][, 8A, 05]
+1FD7; [5D 23, 05, 05][, 96, 05][, 94, 05]
+1FD1; [5D 23, 05, 05][, A4, 05]
+1FD9; [5D 23, 05, A6][, A4, 05]
+
+03F3; [5D 25, 05, 05]
+
+03BA; [5D 27, 05, 05]
+03F0; [5D 27, 05, 10]
+1D6CB; [5D 27, 05, 18]
+1D6DE; [5D 27, 05, 18]
+1D705; [5D 27, 05, 18]
+1D718; [5D 27, 05, 18]
+1D73F; [5D 27, 05, 18]
+1D752; [5D 27, 05, 18]
+1D779; [5D 27, 05, 18]
+1D78C; [5D 27, 05, 18]
+1D7B3; [5D 27, 05, 18]
+1D7C6; [5D 27, 05, 18]
+039A; [5D 27, 05, A0]
+1D6B1; [5D 27, 05, B0]
+1D6EB; [5D 27, 05, B0]
+1D725; [5D 27, 05, B0]
+1D75F; [5D 27, 05, B0]
+1D799; [5D 27, 05, B0]
+03D7; [5D 27, 05, 10][5D 09, 05, 10][5D 23, 05, 10]
+03CF; [5D 27, 05, A8][5D 09, 05, 10][5D 23, 05, 10]
+
+03BB; [5D 29, 05, 05]
+1D6CC; [5D 29, 05, 10]
+1D706; [5D 29, 05, 10]
+1D740; [5D 29, 05, 10]
+1D77A; [5D 29, 05, 10]
+1D7B4; [5D 29, 05, 10]
+039B; [5D 29, 05, 9E]
+1D6B2; [5D 29, 05, AC]
+1D6EC; [5D 29, 05, AC]
+1D726; [5D 29, 05, AC]
+1D760; [5D 29, 05, AC]
+1D79A; [5D 29, 05, AC]
+
+1D27; [5D 2B, 05, 05]
+
+03BC; [5D 2D, 05, 05]
+00B5; [5D 2D, 05, 10]
+1D6CD; [5D 2D, 05, 18]
+1D707; [5D 2D, 05, 18]
+1D741; [5D 2D, 05, 18]
+1D77B; [5D 2D, 05, 18]
+1D7B5; [5D 2D, 05, 18]
+039C; [5D 2D, 05, A0]
+1D6B3; [5D 2D, 05, A8]
+1D6ED; [5D 2D, 05, A8]
+1D727; [5D 2D, 05, A8]
+1D761; [5D 2D, 05, A8]
+1D79B; [5D 2D, 05, A8]
+3382; [5D 2D, 05, 30][29, 05, B4]
+338C; [5D 2D, 05, 30][33, 05, B1]
+338D; [5D 2D, 05, 30][35, 05, 2E]
+3395; [5D 2D, 05, 30][3F, 05, 31]
+339B; [5D 2D, 05, 30][41, 05, 31]
+33B2; [5D 2D, 05, 30][4D, 05, 31]
+33B6; [5D 2D, 05, 30][53, 05, B4]
+33BC; [5D 2D, 05, 30][55, 05, B8]
+
+03BD; [5D 2F, 05, 05]
+1D6CE; [5D 2F, 05, 10]
+1D708; [5D 2F, 05, 10]
+1D742; [5D 2F, 05, 10]
+1D77C; [5D 2F, 05, 10]
+1D7B6; [5D 2F, 05, 10]
+039D; [5D 2F, 05, 9E]
+1D6B4; [5D 2F, 05, AC]
+1D6EE; [5D 2F, 05, AC]
+1D728; [5D 2F, 05, AC]
+1D762; [5D 2F, 05, AC]
+1D79C; [5D 2F, 05, AC]
+
+03BE; [5D 31, 05, 05]
+1D6CF; [5D 31, 05, 10]
+1D709; [5D 31, 05, 10]
+1D743; [5D 31, 05, 10]
+1D77D; [5D 31, 05, 10]
+1D7B7; [5D 31, 05, 10]
+039E; [5D 31, 05, 9E]
+1D6B5; [5D 31, 05, AC]
+1D6EF; [5D 31, 05, AC]
+1D729; [5D 31, 05, AC]
+1D763; [5D 31, 05, AC]
+1D79D; [5D 31, 05, AC]
+
+03BF; [5D 33, 05, 05]
+1D6D0; [5D 33, 05, 10]
+1D70A; [5D 33, 05, 10]
+1D744; [5D 33, 05, 10]
+1D77E; [5D 33, 05, 10]
+1D7B8; [5D 33, 05, 10]
+039F; [5D 33, 05, 9E]
+1D6B6; [5D 33, 05, AC]
+1D6F0; [5D 33, 05, AC]
+1D72A; [5D 33, 05, AC]
+1D764; [5D 33, 05, AC]
+1D79E; [5D 33, 05, AC]
+1F40; [5D 33, 05, 05][, 84, 05]
+1F48; [5D 33, 05, 9E][, 84, 05]
+1F44; [5D 33, 05, 05][, 84, 05][, 88, 05]
+1F4C; [5D 33, 05, 9E][, 84, 05][, 88, 05]
+1F42; [5D 33, 05, 05][, 84, 05][, 8A, 05]
+1F4A; [5D 33, 05, 9E][, 84, 05][, 8A, 05]
+1F41; [5D 33, 05, 05][, 86, 05]
+1F49; [5D 33, 05, 9E][, 86, 05]
+1F45; [5D 33, 05, 05][, 86, 05][, 88, 05]
+1F4D; [5D 33, 05, 9E][, 86, 05][, 88, 05]
+1F43; [5D 33, 05, 05][, 86, 05][, 8A, 05]
+1F4B; [5D 33, 05, 9E][, 86, 05][, 8A, 05]
+03CC; [5D 33, 05, 05][, 88, 05]
+1F79; [5D 33, 05, 05][, 88, 05]
+038C; [5D 33, 05, 9E][, 88, 05]
+1FF9; [5D 33, 05, 9E][, 88, 05]
+1F78; [5D 33, 05, 05][, 8A, 05]
+1FF8; [5D 33, 05, 9E][, 8A, 05]
+
+03C0; [5D 35, 05, 05]
+03D6; [5D 35, 05, 10]
+213C; [5D 35, 05, 1B]
+1D6D1; [5D 35, 05, 1B]
+1D6E1; [5D 35, 05, 1B]
+1D70B; [5D 35, 05, 1B]
+1D71B; [5D 35, 05, 1B]
+1D745; [5D 35, 05, 1B]
+1D755; [5D 35, 05, 1B]
+1D77F; [5D 35, 05, 1B]
+1D78F; [5D 35, 05, 1B]
+1D7B9; [5D 35, 05, 1B]
+1D7C9; [5D 35, 05, 1B]
+03A0; [5D 35, 05, A6]
+213F; [5D 35, 05, B1]
+1D6B7; [5D 35, 05, B1]
+1D6F1; [5D 35, 05, B1]
+1D72B; [5D 35, 05, B1]
+1D765; [5D 35, 05, B1]
+1D79F; [5D 35, 05, B1]
+
+1D28; [5D 37, 05, 05]
+
+03FB; [5D 39, 05, 05]
+03FA; [5D 39, 05, A0]
+
+03DF; [5D 3B, 05, 05]
+03DE; [5D 3B, 05, A0]
+
+03D9; [5D 3D, 05, 05]
+03D8; [5D 3D, 05, A0]
+
+03C1; [5D 3F, 05, 05]
+03F1; [5D 3F, 05, 10]
+1D6D2; [5D 3F, 05, 18]
+1D6E0; [5D 3F, 05, 18]
+1D70C; [5D 3F, 05, 18]
+1D71A; [5D 3F, 05, 18]
+1D746; [5D 3F, 05, 18]
+1D754; [5D 3F, 05, 18]
+1D780; [5D 3F, 05, 18]
+1D78E; [5D 3F, 05, 18]
+1D7BA; [5D 3F, 05, 18]
+1D7C8; [5D 3F, 05, 18]
+03A1; [5D 3F, 05, A0]
+1D6B8; [5D 3F, 05, A8]
+1D6F2; [5D 3F, 05, A8]
+1D72C; [5D 3F, 05, A8]
+1D766; [5D 3F, 05, A8]
+1D7A0; [5D 3F, 05, A8]
+1D68; [5D 3F, 05, 30]
+1FE4; [5D 3F, 05, 05][, 84, 05]
+1FE5; [5D 3F, 05, 05][, 86, 05]
+1FEC; [5D 3F, 05, A0][, 86, 05]
+
+1D29; [5D 41, 05, 05]
+
+03FC; [5D 43, 05, 05]
+
+03C3; [5D 45, 05, 05]
+03F2; [5D 45, 05, 10]
+1D6D3; [5D 45, 05, 17]
+1D6D4; [5D 45, 05, 17]
+1D70D; [5D 45, 05, 17]
+1D70E; [5D 45, 05, 17]
+1D747; [5D 45, 05, 17]
+1D748; [5D 45, 05, 17]
+1D781; [5D 45, 05, 17]
+1D782; [5D 45, 05, 17]
+1D7BB; [5D 45, 05, 17]
+1D7BC; [5D 45, 05, 17]
+03A3; [5D 45, 05, 9E]
+03F9; [5D 45, 05, A5]
+1D6BA; [5D 45, 05, AC]
+1D6F4; [5D 45, 05, AC]
+1D72E; [5D 45, 05, AC]
+1D768; [5D 45, 05, AC]
+1D7A2; [5D 45, 05, AC]
+03C2; [5D 45, 05, 33]
+
+037C; [5D 47, 05, 05]
+03FE; [5D 47, 05, A0]
+
+037B; [5D 49, 05, 05]
+03FD; [5D 49, 05, A0]
+
+037D; [5D 4B, 05, 05]
+03FF; [5D 4B, 05, A0]
+
+03C4; [5D 4D, 05, 05]
+1D6D5; [5D 4D, 05, 10]
+1D70F; [5D 4D, 05, 10]
+1D749; [5D 4D, 05, 10]
+1D783; [5D 4D, 05, 10]
+1D7BD; [5D 4D, 05, 10]
+03A4; [5D 4D, 05, 9E]
+1D6BB; [5D 4D, 05, AC]
+1D6F5; [5D 4D, 05, AC]
+1D72F; [5D 4D, 05, AC]
+1D769; [5D 4D, 05, AC]
+1D7A3; [5D 4D, 05, AC]
+
+03C5; [5D 4F, 05, 05]
+1D6D6; [5D 4F, 05, 10]
+1D710; [5D 4F, 05, 10]
+1D74A; [5D 4F, 05, 10]
+1D784; [5D 4F, 05, 10]
+1D7BE; [5D 4F, 05, 10]
+03A5; [5D 4F, 05, 9B]
+03D2; [5D 4F, 05, A6]
+1D6BC; [5D 4F, 05, B1]
+1D6F6; [5D 4F, 05, B1]
+1D730; [5D 4F, 05, B1]
+1D76A; [5D 4F, 05, B1]
+1D7A4; [5D 4F, 05, B1]
+1F50; [5D 4F, 05, 05][, 84, 05]
+1F54; [5D 4F, 05, 05][, 84, 05][, 88, 05]
+1F52; [5D 4F, 05, 05][, 84, 05][, 8A, 05]
+1F56; [5D 4F, 05, 05][, 84, 05][, 94, 05]
+1F51; [5D 4F, 05, 05][, 86, 05]
+1F59; [5D 4F, 05, 9B][, 86, 05]
+1F55; [5D 4F, 05, 05][, 86, 05][, 88, 05]
+1F5D; [5D 4F, 05, 9B][, 86, 05][, 88, 05]
+1F53; [5D 4F, 05, 05][, 86, 05][, 8A, 05]
+1F5B; [5D 4F, 05, 9B][, 86, 05][, 8A, 05]
+1F57; [5D 4F, 05, 05][, 86, 05][, 94, 05]
+1F5F; [5D 4F, 05, 9B][, 86, 05][, 94, 05]
+03CD; [5D 4F, 05, 05][, 88, 05]
+1F7B; [5D 4F, 05, 05][, 88, 05]
+038E; [5D 4F, 05, 9B][, 88, 05]
+1FEB; [5D 4F, 05, 9B][, 88, 05]
+03D3; [5D 4F, 05, A6][, 88, 05]
+1F7A; [5D 4F, 05, 05][, 8A, 05]
+1FEA; [5D 4F, 05, 9B][, 8A, 05]
+1FE0; [5D 4F, 05, 05][, 8C, 05]
+1FE8; [5D 4F, 05, 9B][, 8C, 05]
+1FE6; [5D 4F, 05, 05][, 94, 05]
+03CB; [5D 4F, 05, 05][, 96, 05]
+03AB; [5D 4F, 05, 9B][, 96, 05]
+03D4; [5D 4F, 05, A6][, 96, 05]
+03B0; [5D 4F, 05, 05][, 96, 05][, 88, 05]
+1FE3; [5D 4F, 05, 05][, 96, 05][, 88, 05]
+1FE2; [5D 4F, 05, 05][, 96, 05][, 8A, 05]
+1FE7; [5D 4F, 05, 05][, 96, 05][, 94, 05]
+1FE1; [5D 4F, 05, 05][, A4, 05]
+1FE9; [5D 4F, 05, 9B][, A4, 05]
+
+03C6; [5D 51, 05, 05]
+03D5; [5D 51, 05, 10]
+1D6D7; [5D 51, 05, 17]
+1D6DF; [5D 51, 05, 17]
+1D711; [5D 51, 05, 17]
+1D719; [5D 51, 05, 17]
+1D74B; [5D 51, 05, 17]
+1D753; [5D 51, 05, 17]
+1D785; [5D 51, 05, 17]
+1D78D; [5D 51, 05, 17]
+1D7BF; [5D 51, 05, 17]
+1D7C7; [5D 51, 05, 17]
+03A6; [5D 51, 05, 9E]
+1D6BD; [5D 51, 05, A5]
+1D6F7; [5D 51, 05, A5]
+1D731; [5D 51, 05, A5]
+1D76B; [5D 51, 05, A5]
+1D7A5; [5D 51, 05, A5]
+1D60; [5D 51, 05, 2C]
+1D69; [5D 51, 05, 33]
+
+03C7; [5D 53, 05, 05]
+1D6D8; [5D 53, 05, 10]
+1D712; [5D 53, 05, 10]
+1D74C; [5D 53, 05, 10]
+1D786; [5D 53, 05, 10]
+1D7C0; [5D 53, 05, 10]
+03A7; [5D 53, 05, 98]
+1D6BE; [5D 53, 05, A0]
+1D6F8; [5D 53, 05, A0]
+1D732; [5D 53, 05, A0]
+1D76C; [5D 53, 05, A0]
+1D7A6; [5D 53, 05, A0]
+1D61; [5D 53, 05, 28]
+1D6A; [5D 53, 05, 30]
+
+03C8; [5D 55, 05, 05]
+1D6D9; [5D 55, 05, 10]
+1D713; [5D 55, 05, 10]
+1D74D; [5D 55, 05, 10]
+1D787; [5D 55, 05, 10]
+1D7C1; [5D 55, 05, 10]
+03A8; [5D 55, 05, 9E]
+1D6BF; [5D 55, 05, AC]
+1D6F9; [5D 55, 05, AC]
+1D733; [5D 55, 05, AC]
+1D76D; [5D 55, 05, AC]
+1D7A7; [5D 55, 05, AC]
+
+1D2A; [5D 57, 05, 05]
+
+03C9; [5D 59, 05, 05]
+1D6DA; [5D 59, 05, 10]
+1D714; [5D 59, 05, 10]
+1D74E; [5D 59, 05, 10]
+1D788; [5D 59, 05, 10]
+1D7C2; [5D 59, 05, 10]
+03A9; [5D 59, 05, 9B]
+2126; [5D 59, 05, 9B]
+1D6C0; [5D 59, 05, A6]
+1D6FA; [5D 59, 05, A6]
+1D734; [5D 59, 05, A6]
+1D76E; [5D 59, 05, A6]
+1D7A8; [5D 59, 05, A6]
+1F60; [5D 59, 05, 05][, 84, 05]
+1F68; [5D 59, 05, 9B][, 84, 05]
+1F64; [5D 59, 05, 05][, 84, 05][, 88, 05]
+1F6C; [5D 59, 05, 9B][, 84, 05][, 88, 05]
+1FA4; [5D 59, 05, 05][, 84, 05][, 88, 05][, D8, 05]
+1FAC; [5D 59, 05, 9B][, 84, 05][, 88, 05][, D8, 05]
+1F62; [5D 59, 05, 05][, 84, 05][, 8A, 05]
+1F6A; [5D 59, 05, 9B][, 84, 05][, 8A, 05]
+1FA2; [5D 59, 05, 05][, 84, 05][, 8A, 05][, D8, 05]
+1FAA; [5D 59, 05, 9B][, 84, 05][, 8A, 05][, D8, 05]
+1F66; [5D 59, 05, 05][, 84, 05][, 94, 05]
+1F6E; [5D 59, 05, 9B][, 84, 05][, 94, 05]
+1FA6; [5D 59, 05, 05][, 84, 05][, 94, 05][, D8, 05]
+1FAE; [5D 59, 05, 9B][, 84, 05][, 94, 05][, D8, 05]
+1FA0; [5D 59, 05, 05][, 84, 05][, D8, 05]
+1FA8; [5D 59, 05, 9B][, 84, 05][, D8, 05]
+1F61; [5D 59, 05, 05][, 86, 05]
+1F69; [5D 59, 05, 9B][, 86, 05]
+1F65; [5D 59, 05, 05][, 86, 05][, 88, 05]
+1F6D; [5D 59, 05, 9B][, 86, 05][, 88, 05]
+1FA5; [5D 59, 05, 05][, 86, 05][, 88, 05][, D8, 05]
+1FAD; [5D 59, 05, 9B][, 86, 05][, 88, 05][, D8, 05]
+1F63; [5D 59, 05, 05][, 86, 05][, 8A, 05]
+1F6B; [5D 59, 05, 9B][, 86, 05][, 8A, 05]
+1FA3; [5D 59, 05, 05][, 86, 05][, 8A, 05][, D8, 05]
+1FAB; [5D 59, 05, 9B][, 86, 05][, 8A, 05][, D8, 05]
+1F67; [5D 59, 05, 05][, 86, 05][, 94, 05]
+1F6F; [5D 59, 05, 9B][, 86, 05][, 94, 05]
+1FA7; [5D 59, 05, 05][, 86, 05][, 94, 05][, D8, 05]
+1FAF; [5D 59, 05, 9B][, 86, 05][, 94, 05][, D8, 05]
+1FA1; [5D 59, 05, 05][, 86, 05][, D8, 05]
+1FA9; [5D 59, 05, 9B][, 86, 05][, D8, 05]
+03CE; [5D 59, 05, 05][, 88, 05]
+1F7D; [5D 59, 05, 05][, 88, 05]
+038F; [5D 59, 05, 9B][, 88, 05]
+1FFB; [5D 59, 05, 9B][, 88, 05]
+1FF4; [5D 59, 05, 05][, 88, 05][, D8, 05]
+1F7C; [5D 59, 05, 05][, 8A, 05]
+1FFA; [5D 59, 05, 9B][, 8A, 05]
+1FF2; [5D 59, 05, 05][, 8A, 05][, D8, 05]
+1FF6; [5D 59, 05, 05][, 94, 05]
+1FF7; [5D 59, 05, 05][, 94, 05][, D8, 05]
+1FF3; [5D 59, 05, 05][, D8, 05]
+1FFC; [5D 59, 05, 9B][, D8, 05]
+
+03E1; [5D 5B, 05, 05]
+03E0; [5D 5B, 05, A0]
+
+0373; [5D 5D, 05, 05]
+0372; [5D 5D, 05, A0]
+
+03F8; [5D 5F, 05, 05]
+03F7; [5D 5F, 05, A0]
+
+FDD1 03E2;     [5D 64 02, 05, 05]      # COPTIC first primary
+
+2C81; [5D 66, 05, 05]
+2C80; [5D 66, 05, AE]
+
+2C83; [5D 68, 05, 05]
+2C82; [5D 68, 05, A0]
+
+2C85; [5D 6A, 05, 05]
+2C84; [5D 6A, 05, A0]
+
+2C87; [5D 6C, 05, 05]
+2C86; [5D 6C, 05, A0]
+
+2C89; [5D 6E, 05, 05]
+2C88; [5D 6E, 05, A0]
+
+2CB7; [5D 70, 05, 05]
+2CB6; [5D 70, 05, A0]
+
+2C8B; [5D 72, 05, 05]
+2C8A; [5D 72, 05, A0]
+
+2C8D; [5D 74, 05, 05]
+2C8C; [5D 74, 05, A0]
+
+2C8F; [5D 76, 05, 05]
+2C8E; [5D 76, 05, A0]
+
+2C91; [5D 78, 05, 05]
+2C90; [5D 78, 05, A0]
+
+2C93; [5D 7A, 05, 05]
+2C92; [5D 7A, 05, AE]
+
+2C95; [5D 7C, 05, 05]
+2C94; [5D 7C, 05, AE]
+2CE4; [5D 7C, 05, 20][5D 66, 05, 20][5D 7A, 05, 20]
 
-1D36B; [11 3E, 05, 05]
+2CB9; [5D 7E, 05, 05]
+2CB8; [5D 7E, 05, A0]
 
-1D36C; [11 40, 05, 05]
+2C97; [5D 80, 05, 05]
+2C96; [5D 80, 05, A0]
 
-1D36D; [11 42, 05, 05]
+2C99; [5D 82, 05, 05]
+2C98; [5D 82, 05, A0]
 
-1D36E; [11 44, 05, 05]
+2C9B; [5D 84, 05, 05]
+2C9A; [5D 84, 05, A0]
 
-1D36F; [11 46, 05, 05]
+2CBB; [5D 86, 05, 05]
+2CBA; [5D 86, 05, A0]
 
-1D370; [11 48, 05, 05]
+2CBD; [5D 88, 05, 05]
+2CBC; [5D 88, 05, A0]
 
-1D371; [11 4A, 05, 05]
+2C9D; [5D 8A, 05, 05]
+2C9C; [5D 8A, 05, A0]
 
-0030; [12, 05, 05]
-FF10; [12, 05, 07]
-1D7CE; [12, 05, 0B]
-1D7D8; [12, 05, 0B]
-1D7E2; [12, 05, 0B]
-1D7EC; [12, 05, 0B]
-1D7F6; [12, 05, 0B]
-24EA; [12, 05, 0D]
-24FF; [12, 05, 0D]
-2070; [12, 05, 27]
-2080; [12, 05, 29]
-0660; [12, 05, 05][, DB F9, 05]
-06F0; [12, 05, 05][, DC 0D, 05]
-07C0; [12, 05, 05][, DC 2D, 05]
-104A0; [12, 05, 05][, DC 4D, 05]
-0966; [12, 05, 05][, DC 5D, 05]
-09E6; [12, 05, 05][, DC 6D, 05]
-0A66; [12, 05, 05][, DC 7D, 05]
-0AE6; [12, 05, 05][, DC 8D, 05]
-0B66; [12, 05, 05][, DC 9D, 05]
-0BE6; [12, 05, 05][, DC AD, 05]
-0C66; [12, 05, 05][, DC BD, 05]
-0C78; [12, 05, 05][, DC BD, 05]
-0CE6; [12, 05, 05][, DC CD, 05]
-0D66; [12, 05, 05][, DC DD, 05]
-ABF0; [12, 05, 05][, DC ED, 05]
-A8D0; [12, 05, 05][, DC FD, 05]
-1946; [12, 05, 05][, DD 11, 05]
-19D0; [12, 05, 05][, DD 21, 05]
-1A80; [12, 05, 05][, DD 31, 05]
-1A90; [12, 05, 05][, DD 41, 05]
-0E50; [12, 05, 05][, DF 59, 05]
-0ED0; [12, 05, 05][, DF 69, 05]
-0F20; [12, 05, 05][, DF 79, 05]
-0F33; [12, 05, 09][, DF 79, 09]
-1C40; [12, 05, 05][, DF 89, 05]
-A900; [12, 05, 05][, E0 1D, 05]
-1040; [12, 05, 05][, E0 2D, 05]
-1090; [12, 05, 05][, E0 3D, 05]
-11136; [12, 05, 05][, E0 4D, 05]
-17E0; [12, 05, 05][, E0 5D, 05]
-17F0; [12, 05, 05][, E0 6D, 05]
-AA50; [12, 05, 05][, E0 7D, 05]
-1B50; [12, 05, 05][, E0 8D, 05]
-A9D0; [12, 05, 05][, E0 9D, 05]
-1BB0; [12, 05, 05][, E0 AD, 05]
-1810; [12, 05, 05][, E0 BD, 05]
-1C50; [12, 05, 05][, E0 CD, 05]
-A620; [12, 05, 05][, E0 DD, 05]
-110F0; [12, 05, 05][, E0 ED, 05]
-3007; [12, 05, 05][, E0 FD, 05]
-1018A; [12, 05, 05][, E1 21, 05]
-111D0; [12, 05, 05][, E1 C1, 05]
-116C0; [12, 05, 05][, E1 D1, 05]
-11066; [12, 05, 05][, E1 E1, 05]
-1F101; [12, 05, 09][07, 05, 3D]
-1F100; [12, 05, 09][09, 05, 3D]
-2189; [12, 05, 3B][0D 75 2C, 05, 3B][18, 05, 3B]
-3358; [12, 05, 09][E0 4B 22, 05, 3D]
-
-0031; [14, 05, 05]
-FF11; [14, 05, 07]
-1D7CF; [14, 05, 0B]
-1D7D9; [14, 05, 0B]
-1D7E3; [14, 05, 0B]
-1D7ED; [14, 05, 0B]
-1D7F7; [14, 05, 0B]
-2460; [14, 05, 0D]
-24F5; [14, 05, 0D]
-2776; [14, 05, 0D]
-2780; [14, 05, 0D]
-278A; [14, 05, 0D]
-00B9; [14, 05, 27]
-2081; [14, 05, 29]
-0661; [14, 05, 05][, DB F9, 05]
-06F1; [14, 05, 05][, DC 0D, 05]
-10E60; [14, 05, 05][, DC 1D, 05]
-07C1; [14, 05, 05][, DC 2D, 05]
-1369; [14, 05, 05][, DC 3D, 05]
-104A1; [14, 05, 05][, DC 4D, 05]
-0967; [14, 05, 05][, DC 5D, 05]
-09E7; [14, 05, 05][, DC 6D, 05]
-0A67; [14, 05, 05][, DC 7D, 05]
-0AE7; [14, 05, 05][, DC 8D, 05]
-0B67; [14, 05, 05][, DC 9D, 05]
-0BE7; [14, 05, 05][, DC AD, 05]
-0C67; [14, 05, 05][, DC BD, 05]
-0C79; [14, 05, 05][, DC BD, 05]
-0C7C; [14, 05, 05][, DC BD, 05]
-0CE7; [14, 05, 05][, DC CD, 05]
-0D67; [14, 05, 05][, DC DD, 05]
-ABF1; [14, 05, 05][, DC ED, 05]
-A8D1; [14, 05, 05][, DC FD, 05]
-1947; [14, 05, 05][, DD 11, 05]
-19D1; [14, 05, 05][, DD 21, 05]
-19DA; [14, 05, 05][, DD 21, 05]
-1A81; [14, 05, 05][, DD 31, 05]
-1A91; [14, 05, 05][, DD 41, 05]
-0E51; [14, 05, 05][, DF 59, 05]
-0ED1; [14, 05, 05][, DF 69, 05]
-0F21; [14, 05, 05][, DF 79, 05]
-0F2A; [14, 05, 09][, DF 79, 09]
-1C41; [14, 05, 05][, DF 89, 05]
-A901; [14, 05, 05][, E0 1D, 05]
-1041; [14, 05, 05][, E0 2D, 05]
-1091; [14, 05, 05][, E0 3D, 05]
-11137; [14, 05, 05][, E0 4D, 05]
-17E1; [14, 05, 05][, E0 5D, 05]
-17F1; [14, 05, 05][, E0 6D, 05]
-AA51; [14, 05, 05][, E0 7D, 05]
-1B51; [14, 05, 05][, E0 8D, 05]
-A9D1; [14, 05, 05][, E0 9D, 05]
-1BB1; [14, 05, 05][, E0 AD, 05]
-1811; [14, 05, 05][, E0 BD, 05]
-1C51; [14, 05, 05][, E0 CD, 05]
-A621; [14, 05, 05][, E0 DD, 05]
-110F1; [14, 05, 05][, E0 ED, 05]
-3021; [14, 05, 05][, E0 FD, 05]
-10107; [14, 05, 05][, E1 11, 05]
-10142; [14, 05, 05][, E1 21, 05]
-10158; [14, 05, 05][, E1 21, 05]
-10159; [14, 05, 05][, E1 21, 05]
-1015A; [14, 05, 05][, E1 21, 05]
-10320; [14, 05, 05][, E1 41, 05]
-103D1; [14, 05, 05][, E1 51, 05]
-12415; [14, 05, 05][, E1 61, 05]
-1241E; [14, 05, 05][, E1 61, 05]
-1242C; [14, 05, 05][, E1 61, 05]
-12434; [14, 05, 05][, E1 61, 05]
-1244F; [14, 05, 05][, E1 61, 05]
-12458; [14, 05, 05][, E1 61, 05]
-10A7D; [14, 05, 05][, E1 71, 05]
-10916; [14, 05, 05][, E1 81, 05]
-10858; [14, 05, 05][, E1 91, 05]
-10B58; [14, 05, 05][, E1 A1, 05]
-10B78; [14, 05, 05][, E1 B1, 05]
-111D1; [14, 05, 05][, E1 C1, 05]
-116C1; [14, 05, 05][, E1 D1, 05]
-11067; [14, 05, 05][, E1 E1, 05]
-11052; [14, 05, 05][, E1 F1, 05]
-10A40; [14, 05, 05][, E2 05, 05]
-1D360; [14, 05, 05][, E2 15, 05]
-1F102; [14, 05, 09][07, 05, 3D]
-2488; [14, 05, 09][09, 05, 3D]
-215F; [14, 05, 3B][0D 75 2C, 05, 3B]
-2152; [14, 05, 3B][0D 75 2C, 05, 3B][14, 05, 3B][12, 05, 3B]
-00BD; [14, 05, 3B][0D 75 2C, 05, 3B][16, 05, 3B]
-2153; [14, 05, 3B][0D 75 2C, 05, 3B][18, 05, 3B]
-00BC; [14, 05, 3B][0D 75 2C, 05, 3B][1A, 05, 3B]
-2155; [14, 05, 3B][0D 75 2C, 05, 3B][1C, 05, 3B]
-2159; [14, 05, 3B][0D 75 2C, 05, 3B][1E, 05, 3B]
-2150; [14, 05, 3B][0D 75 2C, 05, 3B][20, 05, 3B]
-215B; [14, 05, 3B][0D 75 2C, 05, 3B][22, 05, 3B]
-2151; [14, 05, 3B][0D 75 2C, 05, 3B][24, 05, 3B]
-2469; [14, 05, 0D][12, 05, 0D]
-24FE; [14, 05, 0D][12, 05, 0D]
-277F; [14, 05, 0D][12, 05, 0D]
-2789; [14, 05, 0D][12, 05, 0D]
-2793; [14, 05, 0D][12, 05, 0D]
-3248; [14, 05, 0D][12, 05, 0D]
-2491; [14, 05, 09][12, 05, 09][09, 05, 3D]
-33E9; [14, 05, 09][12, 05, 09][E0 34 F0, 05, 3D]
-32C9; [14, 05, 09][12, 05, 09][E0 37 48, 05, 3D]
-3362; [14, 05, 09][12, 05, 09][E0 4B 22, 05, 3D]
-246A; [14, 05, 0D][14, 05, 0D]
-24EB; [14, 05, 0D][14, 05, 0D]
-2492; [14, 05, 09][14, 05, 09][09, 05, 3D]
-33EA; [14, 05, 09][14, 05, 09][E0 34 F0, 05, 3D]
-32CA; [14, 05, 09][14, 05, 09][E0 37 48, 05, 3D]
-3363; [14, 05, 09][14, 05, 09][E0 4B 22, 05, 3D]
-246B; [14, 05, 0D][16, 05, 0D]
-24EC; [14, 05, 0D][16, 05, 0D]
-2493; [14, 05, 09][16, 05, 09][09, 05, 3D]
-33EB; [14, 05, 09][16, 05, 09][E0 34 F0, 05, 3D]
-32CB; [14, 05, 09][16, 05, 09][E0 37 48, 05, 3D]
-3364; [14, 05, 09][16, 05, 09][E0 4B 22, 05, 3D]
-246C; [14, 05, 0D][18, 05, 0D]
-24ED; [14, 05, 0D][18, 05, 0D]
-2494; [14, 05, 09][18, 05, 09][09, 05, 3D]
-33EC; [14, 05, 09][18, 05, 09][E0 34 F0, 05, 3D]
-3365; [14, 05, 09][18, 05, 09][E0 4B 22, 05, 3D]
-246D; [14, 05, 0D][1A, 05, 0D]
-24EE; [14, 05, 0D][1A, 05, 0D]
-2495; [14, 05, 09][1A, 05, 09][09, 05, 3D]
-33ED; [14, 05, 09][1A, 05, 09][E0 34 F0, 05, 3D]
-3366; [14, 05, 09][1A, 05, 09][E0 4B 22, 05, 3D]
-246E; [14, 05, 0D][1C, 05, 0D]
-24EF; [14, 05, 0D][1C, 05, 0D]
-2496; [14, 05, 09][1C, 05, 09][09, 05, 3D]
-33EE; [14, 05, 09][1C, 05, 09][E0 34 F0, 05, 3D]
-3367; [14, 05, 09][1C, 05, 09][E0 4B 22, 05, 3D]
-246F; [14, 05, 0D][1E, 05, 0D]
-24F0; [14, 05, 0D][1E, 05, 0D]
-2497; [14, 05, 09][1E, 05, 09][09, 05, 3D]
-33EF; [14, 05, 09][1E, 05, 09][E0 34 F0, 05, 3D]
-3368; [14, 05, 09][1E, 05, 09][E0 4B 22, 05, 3D]
-2470; [14, 05, 0D][20, 05, 0D]
-24F1; [14, 05, 0D][20, 05, 0D]
-2498; [14, 05, 09][20, 05, 09][09, 05, 3D]
-33F0; [14, 05, 09][20, 05, 09][E0 34 F0, 05, 3D]
-3369; [14, 05, 09][20, 05, 09][E0 4B 22, 05, 3D]
-2471; [14, 05, 0D][22, 05, 0D]
-24F2; [14, 05, 0D][22, 05, 0D]
-2499; [14, 05, 09][22, 05, 09][09, 05, 3D]
-33F1; [14, 05, 09][22, 05, 09][E0 34 F0, 05, 3D]
-336A; [14, 05, 09][22, 05, 09][E0 4B 22, 05, 3D]
-2472; [14, 05, 0D][24, 05, 0D]
-24F3; [14, 05, 0D][24, 05, 0D]
-249A; [14, 05, 09][24, 05, 09][09, 05, 3D]
-33F2; [14, 05, 09][24, 05, 09][E0 34 F0, 05, 3D]
-336B; [14, 05, 09][24, 05, 09][E0 4B 22, 05, 3D]
-33E0; [14, 05, 09][E0 34 F0, 05, 3D]
-32C0; [14, 05, 09][E0 37 48, 05, 3D]
-3359; [14, 05, 09][E0 4B 22, 05, 3D]
-
-0032; [16, 05, 05]
-FF12; [16, 05, 07]
-1D7D0; [16, 05, 0B]
-1D7DA; [16, 05, 0B]
-1D7E4; [16, 05, 0B]
-1D7EE; [16, 05, 0B]
-1D7F8; [16, 05, 0B]
-2461; [16, 05, 0D]
-24F6; [16, 05, 0D]
-2777; [16, 05, 0D]
-2781; [16, 05, 0D]
-278B; [16, 05, 0D]
-00B2; [16, 05, 27]
-2082; [16, 05, 29]
-0662; [16, 05, 05][, DB F9, 05]
-06F2; [16, 05, 05][, DC 0D, 05]
-10E61; [16, 05, 05][, DC 1D, 05]
-07C2; [16, 05, 05][, DC 2D, 05]
-136A; [16, 05, 05][, DC 3D, 05]
-104A2; [16, 05, 05][, DC 4D, 05]
-0968; [16, 05, 05][, DC 5D, 05]
-09E8; [16, 05, 05][, DC 6D, 05]
-0A68; [16, 05, 05][, DC 7D, 05]
-0AE8; [16, 05, 05][, DC 8D, 05]
-0B68; [16, 05, 05][, DC 9D, 05]
-0BE8; [16, 05, 05][, DC AD, 05]
-0C68; [16, 05, 05][, DC BD, 05]
-0C7A; [16, 05, 05][, DC BD, 05]
-0C7D; [16, 05, 05][, DC BD, 05]
-0CE8; [16, 05, 05][, DC CD, 05]
-0D68; [16, 05, 05][, DC DD, 05]
-ABF2; [16, 05, 05][, DC ED, 05]
-A8D2; [16, 05, 05][, DC FD, 05]
-1948; [16, 05, 05][, DD 11, 05]
-19D2; [16, 05, 05][, DD 21, 05]
-1A82; [16, 05, 05][, DD 31, 05]
-1A92; [16, 05, 05][, DD 41, 05]
-0E52; [16, 05, 05][, DF 59, 05]
-0ED2; [16, 05, 05][, DF 69, 05]
-0F22; [16, 05, 05][, DF 79, 05]
-0F2B; [16, 05, 09][, DF 79, 09]
-1C42; [16, 05, 05][, DF 89, 05]
-A902; [16, 05, 05][, E0 1D, 05]
-1042; [16, 05, 05][, E0 2D, 05]
-1092; [16, 05, 05][, E0 3D, 05]
-11138; [16, 05, 05][, E0 4D, 05]
-17E2; [16, 05, 05][, E0 5D, 05]
-17F2; [16, 05, 05][, E0 6D, 05]
-AA52; [16, 05, 05][, E0 7D, 05]
-1B52; [16, 05, 05][, E0 8D, 05]
-A9D2; [16, 05, 05][, E0 9D, 05]
-1BB2; [16, 05, 05][, E0 AD, 05]
-1812; [16, 05, 05][, E0 BD, 05]
-1C52; [16, 05, 05][, E0 CD, 05]
-A622; [16, 05, 05][, E0 DD, 05]
-110F2; [16, 05, 05][, E0 ED, 05]
-3022; [16, 05, 05][, E0 FD, 05]
-10108; [16, 05, 05][, E1 11, 05]
-1015B; [16, 05, 05][, E1 21, 05]
-1015C; [16, 05, 05][, E1 21, 05]
-1015D; [16, 05, 05][, E1 21, 05]
-1015E; [16, 05, 05][, E1 21, 05]
-103D2; [16, 05, 05][, E1 51, 05]
-12400; [16, 05, 05][, E1 61, 05]
-12416; [16, 05, 05][, E1 61, 05]
-1241F; [16, 05, 05][, E1 61, 05]
-12423; [16, 05, 05][, E1 61, 05]
-1242D; [16, 05, 05][, E1 61, 05]
-12435; [16, 05, 05][, E1 61, 05]
-1244A; [16, 05, 05][, E1 61, 05]
-12450; [16, 05, 05][, E1 61, 05]
-12459; [16, 05, 05][, E1 61, 05]
-1091A; [16, 05, 05][, E1 81, 05]
-10859; [16, 05, 05][, E1 91, 05]
-10B59; [16, 05, 05][, E1 A1, 05]
-10B79; [16, 05, 05][, E1 B1, 05]
-111D2; [16, 05, 05][, E1 C1, 05]
-116C2; [16, 05, 05][, E1 D1, 05]
-11068; [16, 05, 05][, E1 E1, 05]
-11053; [16, 05, 05][, E1 F1, 05]
-10A41; [16, 05, 05][, E2 05, 05]
-1D361; [16, 05, 05][, E2 15, 05]
-1F103; [16, 05, 09][07, 05, 3D]
-2489; [16, 05, 09][09, 05, 3D]
-2154; [16, 05, 3B][0D 75 2C, 05, 3B][18, 05, 3B]
-2156; [16, 05, 3B][0D 75 2C, 05, 3B][1C, 05, 3B]
-2473; [16, 05, 0D][12, 05, 0D]
-24F4; [16, 05, 0D][12, 05, 0D]
-3249; [16, 05, 0D][12, 05, 0D]
-249B; [16, 05, 09][12, 05, 09][09, 05, 3D]
-33F3; [16, 05, 09][12, 05, 09][E0 34 F0, 05, 3D]
-336C; [16, 05, 09][12, 05, 09][E0 4B 22, 05, 3D]
-3251; [16, 05, 0D][14, 05, 0D]
-33F4; [16, 05, 09][14, 05, 09][E0 34 F0, 05, 3D]
-336D; [16, 05, 09][14, 05, 09][E0 4B 22, 05, 3D]
-3252; [16, 05, 0D][16, 05, 0D]
-33F5; [16, 05, 09][16, 05, 09][E0 34 F0, 05, 3D]
-336E; [16, 05, 09][16, 05, 09][E0 4B 22, 05, 3D]
-3253; [16, 05, 0D][18, 05, 0D]
-33F6; [16, 05, 09][18, 05, 09][E0 34 F0, 05, 3D]
-336F; [16, 05, 09][18, 05, 09][E0 4B 22, 05, 3D]
-3254; [16, 05, 0D][1A, 05, 0D]
-33F7; [16, 05, 09][1A, 05, 09][E0 34 F0, 05, 3D]
-3370; [16, 05, 09][1A, 05, 09][E0 4B 22, 05, 3D]
-3255; [16, 05, 0D][1C, 05, 0D]
-33F8; [16, 05, 09][1C, 05, 09][E0 34 F0, 05, 3D]
-3256; [16, 05, 0D][1E, 05, 0D]
-33F9; [16, 05, 09][1E, 05, 09][E0 34 F0, 05, 3D]
-3257; [16, 05, 0D][20, 05, 0D]
-33FA; [16, 05, 09][20, 05, 09][E0 34 F0, 05, 3D]
-3258; [16, 05, 0D][22, 05, 0D]
-33FB; [16, 05, 09][22, 05, 09][E0 34 F0, 05, 3D]
-3259; [16, 05, 0D][24, 05, 0D]
-33FC; [16, 05, 09][24, 05, 09][E0 34 F0, 05, 3D]
-33E1; [16, 05, 09][E0 34 F0, 05, 3D]
-32C1; [16, 05, 09][E0 37 48, 05, 3D]
-335A; [16, 05, 09][E0 4B 22, 05, 3D]
-
-0033; [18, 05, 05]
-FF13; [18, 05, 07]
-1D7D1; [18, 05, 0B]
-1D7DB; [18, 05, 0B]
-1D7E5; [18, 05, 0B]
-1D7EF; [18, 05, 0B]
-1D7F9; [18, 05, 0B]
-2462; [18, 05, 0D]
-24F7; [18, 05, 0D]
-2778; [18, 05, 0D]
-2782; [18, 05, 0D]
-278C; [18, 05, 0D]
-00B3; [18, 05, 27]
-2083; [18, 05, 29]
-0663; [18, 05, 05][, DB F9, 05]
-06F3; [18, 05, 05][, DC 0D, 05]
-10E62; [18, 05, 05][, DC 1D, 05]
-07C3; [18, 05, 05][, DC 2D, 05]
-136B; [18, 05, 05][, DC 3D, 05]
-104A3; [18, 05, 05][, DC 4D, 05]
-0969; [18, 05, 05][, DC 5D, 05]
-09E9; [18, 05, 05][, DC 6D, 05]
-0A69; [18, 05, 05][, DC 7D, 05]
-0AE9; [18, 05, 05][, DC 8D, 05]
-0B69; [18, 05, 05][, DC 9D, 05]
-0BE9; [18, 05, 05][, DC AD, 05]
-0C69; [18, 05, 05][, DC BD, 05]
-0C7B; [18, 05, 05][, DC BD, 05]
-0C7E; [18, 05, 05][, DC BD, 05]
-0CE9; [18, 05, 05][, DC CD, 05]
-0D69; [18, 05, 05][, DC DD, 05]
-ABF3; [18, 05, 05][, DC ED, 05]
-A8D3; [18, 05, 05][, DC FD, 05]
-1949; [18, 05, 05][, DD 11, 05]
-19D3; [18, 05, 05][, DD 21, 05]
-1A83; [18, 05, 05][, DD 31, 05]
-1A93; [18, 05, 05][, DD 41, 05]
-0E53; [18, 05, 05][, DF 59, 05]
-0ED3; [18, 05, 05][, DF 69, 05]
-0F23; [18, 05, 05][, DF 79, 05]
-0F2C; [18, 05, 09][, DF 79, 09]
-1C43; [18, 05, 05][, DF 89, 05]
-A903; [18, 05, 05][, E0 1D, 05]
-1043; [18, 05, 05][, E0 2D, 05]
-1093; [18, 05, 05][, E0 3D, 05]
-11139; [18, 05, 05][, E0 4D, 05]
-17E3; [18, 05, 05][, E0 5D, 05]
-17F3; [18, 05, 05][, E0 6D, 05]
-AA53; [18, 05, 05][, E0 7D, 05]
-1B53; [18, 05, 05][, E0 8D, 05]
-A9D3; [18, 05, 05][, E0 9D, 05]
-1BB3; [18, 05, 05][, E0 AD, 05]
-1813; [18, 05, 05][, E0 BD, 05]
-1C53; [18, 05, 05][, E0 CD, 05]
-A623; [18, 05, 05][, E0 DD, 05]
-110F3; [18, 05, 05][, E0 ED, 05]
-3023; [18, 05, 05][, E0 FD, 05]
-10109; [18, 05, 05][, E1 11, 05]
-12401; [18, 05, 05][, E1 61, 05]
-12408; [18, 05, 05][, E1 61, 05]
-12417; [18, 05, 05][, E1 61, 05]
-12420; [18, 05, 05][, E1 61, 05]
-12424; [18, 05, 05][, E1 61, 05]
-12425; [18, 05, 05][, E1 61, 05]
-1242E; [18, 05, 05][, E1 61, 05]
-1242F; [18, 05, 05][, E1 61, 05]
-12436; [18, 05, 05][, E1 61, 05]
-12437; [18, 05, 05][, E1 61, 05]
-1243A; [18, 05, 05][, E1 61, 05]
-1243B; [18, 05, 05][, E1 61, 05]
-1244B; [18, 05, 05][, E1 61, 05]
-12451; [18, 05, 05][, E1 61, 05]
-1091B; [18, 05, 05][, E1 81, 05]
-1085A; [18, 05, 05][, E1 91, 05]
-10B5A; [18, 05, 05][, E1 A1, 05]
-10B7A; [18, 05, 05][, E1 B1, 05]
-111D3; [18, 05, 05][, E1 C1, 05]
-116C3; [18, 05, 05][, E1 D1, 05]
-11069; [18, 05, 05][, E1 E1, 05]
-11054; [18, 05, 05][, E1 F1, 05]
-10A42; [18, 05, 05][, E2 05, 05]
-1D362; [18, 05, 05][, E2 15, 05]
-1F104; [18, 05, 09][07, 05, 3D]
-248A; [18, 05, 09][09, 05, 3D]
-00BE; [18, 05, 3B][0D 75 2C, 05, 3B][1A, 05, 3B]
-2157; [18, 05, 3B][0D 75 2C, 05, 3B][1C, 05, 3B]
-215C; [18, 05, 3B][0D 75 2C, 05, 3B][22, 05, 3B]
-324A; [18, 05, 0D][12, 05, 0D]
-325A; [18, 05, 0D][12, 05, 0D]
-33FD; [18, 05, 09][12, 05, 09][E0 34 F0, 05, 3D]
-325B; [18, 05, 0D][14, 05, 0D]
-33FE; [18, 05, 09][14, 05, 09][E0 34 F0, 05, 3D]
-325C; [18, 05, 0D][16, 05, 0D]
-325D; [18, 05, 0D][18, 05, 0D]
-325E; [18, 05, 0D][1A, 05, 0D]
-325F; [18, 05, 0D][1C, 05, 0D]
-32B1; [18, 05, 0D][1E, 05, 0D]
-32B2; [18, 05, 0D][20, 05, 0D]
-32B3; [18, 05, 0D][22, 05, 0D]
-32B4; [18, 05, 0D][24, 05, 0D]
-33E2; [18, 05, 09][E0 34 F0, 05, 3D]
-32C2; [18, 05, 09][E0 37 48, 05, 3D]
-335B; [18, 05, 09][E0 4B 22, 05, 3D]
-
-0034; [1A, 05, 05]
-FF14; [1A, 05, 07]
-1D7D2; [1A, 05, 0B]
-1D7DC; [1A, 05, 0B]
-1D7E6; [1A, 05, 0B]
-1D7F0; [1A, 05, 0B]
-1D7FA; [1A, 05, 0B]
-2463; [1A, 05, 0D]
-24F8; [1A, 05, 0D]
-2779; [1A, 05, 0D]
-2783; [1A, 05, 0D]
-278D; [1A, 05, 0D]
-2074; [1A, 05, 27]
-2084; [1A, 05, 29]
-0664; [1A, 05, 05][, DB F9, 05]
-06F4; [1A, 05, 05][, DC 0D, 05]
-10E63; [1A, 05, 05][, DC 1D, 05]
-07C4; [1A, 05, 05][, DC 2D, 05]
-136C; [1A, 05, 05][, DC 3D, 05]
-104A4; [1A, 05, 05][, DC 4D, 05]
-096A; [1A, 05, 05][, DC 5D, 05]
-09EA; [1A, 05, 05][, DC 6D, 05]
-0A6A; [1A, 05, 05][, DC 7D, 05]
-0AEA; [1A, 05, 05][, DC 8D, 05]
-0B6A; [1A, 05, 05][, DC 9D, 05]
-0BEA; [1A, 05, 05][, DC AD, 05]
-0C6A; [1A, 05, 05][, DC BD, 05]
-0CEA; [1A, 05, 05][, DC CD, 05]
-0D6A; [1A, 05, 05][, DC DD, 05]
-ABF4; [1A, 05, 05][, DC ED, 05]
-A8D4; [1A, 05, 05][, DC FD, 05]
-194A; [1A, 05, 05][, DD 11, 05]
-19D4; [1A, 05, 05][, DD 21, 05]
-1A84; [1A, 05, 05][, DD 31, 05]
-1A94; [1A, 05, 05][, DD 41, 05]
-0E54; [1A, 05, 05][, DF 59, 05]
-0ED4; [1A, 05, 05][, DF 69, 05]
-0F24; [1A, 05, 05][, DF 79, 05]
-0F2D; [1A, 05, 09][, DF 79, 09]
-1C44; [1A, 05, 05][, DF 89, 05]
-A904; [1A, 05, 05][, E0 1D, 05]
-1044; [1A, 05, 05][, E0 2D, 05]
-1094; [1A, 05, 05][, E0 3D, 05]
-1113A; [1A, 05, 05][, E0 4D, 05]
-17E4; [1A, 05, 05][, E0 5D, 05]
-17F4; [1A, 05, 05][, E0 6D, 05]
-AA54; [1A, 05, 05][, E0 7D, 05]
-1B54; [1A, 05, 05][, E0 8D, 05]
-A9D4; [1A, 05, 05][, E0 9D, 05]
-1BB4; [1A, 05, 05][, E0 AD, 05]
-1814; [1A, 05, 05][, E0 BD, 05]
-1C54; [1A, 05, 05][, E0 CD, 05]
-A624; [1A, 05, 05][, E0 DD, 05]
-110F4; [1A, 05, 05][, E0 ED, 05]
-3024; [1A, 05, 05][, E0 FD, 05]
-1010A; [1A, 05, 05][, E1 11, 05]
-12402; [1A, 05, 05][, E1 61, 05]
-12409; [1A, 05, 05][, E1 61, 05]
-1240F; [1A, 05, 05][, E1 61, 05]
-12418; [1A, 05, 05][, E1 61, 05]
-12421; [1A, 05, 05][, E1 61, 05]
-12426; [1A, 05, 05][, E1 61, 05]
-12430; [1A, 05, 05][, E1 61, 05]
-12438; [1A, 05, 05][, E1 61, 05]
-1243C; [1A, 05, 05][, E1 61, 05]
-1243D; [1A, 05, 05][, E1 61, 05]
-1243E; [1A, 05, 05][, E1 61, 05]
-1243F; [1A, 05, 05][, E1 61, 05]
-1244C; [1A, 05, 05][, E1 61, 05]
-12452; [1A, 05, 05][, E1 61, 05]
-12453; [1A, 05, 05][, E1 61, 05]
-10B5B; [1A, 05, 05][, E1 A1, 05]
-10B7B; [1A, 05, 05][, E1 B1, 05]
-111D4; [1A, 05, 05][, E1 C1, 05]
-116C4; [1A, 05, 05][, E1 D1, 05]
-1106A; [1A, 05, 05][, E1 E1, 05]
-11055; [1A, 05, 05][, E1 F1, 05]
-10A43; [1A, 05, 05][, E2 05, 05]
-1D363; [1A, 05, 05][, E2 15, 05]
-1F105; [1A, 05, 09][07, 05, 3D]
-248B; [1A, 05, 09][09, 05, 3D]
-2158; [1A, 05, 3B][0D 75 2C, 05, 3B][1C, 05, 3B]
-324B; [1A, 05, 0D][12, 05, 0D]
-32B5; [1A, 05, 0D][12, 05, 0D]
-32B6; [1A, 05, 0D][14, 05, 0D]
-32B7; [1A, 05, 0D][16, 05, 0D]
-32B8; [1A, 05, 0D][18, 05, 0D]
-32B9; [1A, 05, 0D][1A, 05, 0D]
-32BA; [1A, 05, 0D][1C, 05, 0D]
-32BB; [1A, 05, 0D][1E, 05, 0D]
-32BC; [1A, 05, 0D][20, 05, 0D]
-32BD; [1A, 05, 0D][22, 05, 0D]
-32BE; [1A, 05, 0D][24, 05, 0D]
-33E3; [1A, 05, 09][E0 34 F0, 05, 3D]
-32C3; [1A, 05, 09][E0 37 48, 05, 3D]
-335C; [1A, 05, 09][E0 4B 22, 05, 3D]
-
-0035; [1C, 05, 05]
-FF15; [1C, 05, 07]
-1D7D3; [1C, 05, 0B]
-1D7DD; [1C, 05, 0B]
-1D7E7; [1C, 05, 0B]
-1D7F1; [1C, 05, 0B]
-1D7FB; [1C, 05, 0B]
-2464; [1C, 05, 0D]
-24F9; [1C, 05, 0D]
-277A; [1C, 05, 0D]
-2784; [1C, 05, 0D]
-278E; [1C, 05, 0D]
-2075; [1C, 05, 27]
-2085; [1C, 05, 29]
-0665; [1C, 05, 05][, DB F9, 05]
-06F5; [1C, 05, 05][, DC 0D, 05]
-10E64; [1C, 05, 05][, DC 1D, 05]
-07C5; [1C, 05, 05][, DC 2D, 05]
-136D; [1C, 05, 05][, DC 3D, 05]
-104A5; [1C, 05, 05][, DC 4D, 05]
-096B; [1C, 05, 05][, DC 5D, 05]
-09EB; [1C, 05, 05][, DC 6D, 05]
-0A6B; [1C, 05, 05][, DC 7D, 05]
-0AEB; [1C, 05, 05][, DC 8D, 05]
-0B6B; [1C, 05, 05][, DC 9D, 05]
-0BEB; [1C, 05, 05][, DC AD, 05]
-0C6B; [1C, 05, 05][, DC BD, 05]
-0CEB; [1C, 05, 05][, DC CD, 05]
-0D6B; [1C, 05, 05][, DC DD, 05]
-ABF5; [1C, 05, 05][, DC ED, 05]
-A8D5; [1C, 05, 05][, DC FD, 05]
-194B; [1C, 05, 05][, DD 11, 05]
-19D5; [1C, 05, 05][, DD 21, 05]
-1A85; [1C, 05, 05][, DD 31, 05]
-1A95; [1C, 05, 05][, DD 41, 05]
-0E55; [1C, 05, 05][, DF 59, 05]
-0ED5; [1C, 05, 05][, DF 69, 05]
-0F25; [1C, 05, 05][, DF 79, 05]
-0F2E; [1C, 05, 09][, DF 79, 09]
-1C45; [1C, 05, 05][, DF 89, 05]
-A905; [1C, 05, 05][, E0 1D, 05]
-1045; [1C, 05, 05][, E0 2D, 05]
-1095; [1C, 05, 05][, E0 3D, 05]
-1113B; [1C, 05, 05][, E0 4D, 05]
-17E5; [1C, 05, 05][, E0 5D, 05]
-17F5; [1C, 05, 05][, E0 6D, 05]
-AA55; [1C, 05, 05][, E0 7D, 05]
-1B55; [1C, 05, 05][, E0 8D, 05]
-A9D5; [1C, 05, 05][, E0 9D, 05]
-1BB5; [1C, 05, 05][, E0 AD, 05]
-1815; [1C, 05, 05][, E0 BD, 05]
-1C55; [1C, 05, 05][, E0 CD, 05]
-A625; [1C, 05, 05][, E0 DD, 05]
-110F5; [1C, 05, 05][, E0 ED, 05]
-3025; [1C, 05, 05][, E0 FD, 05]
-1010B; [1C, 05, 05][, E1 11, 05]
-10143; [1C, 05, 05][, E1 21, 05]
-10148; [1C, 05, 05][, E1 21, 05]
-1014F; [1C, 05, 05][, E1 21, 05]
-1015F; [1C, 05, 05][, E1 21, 05]
-10173; [1C, 05, 05][, E1 21, 05]
-10321; [1C, 05, 05][, E1 41, 05]
-12403; [1C, 05, 05][, E1 61, 05]
-1240A; [1C, 05, 05][, E1 61, 05]
-12410; [1C, 05, 05][, E1 61, 05]
-12419; [1C, 05, 05][, E1 61, 05]
-12422; [1C, 05, 05][, E1 61, 05]
-12427; [1C, 05, 05][, E1 61, 05]
-12431; [1C, 05, 05][, E1 61, 05]
-12439; [1C, 05, 05][, E1 61, 05]
-1244D; [1C, 05, 05][, E1 61, 05]
-12454; [1C, 05, 05][, E1 61, 05]
-12455; [1C, 05, 05][, E1 61, 05]
-111D5; [1C, 05, 05][, E1 C1, 05]
-116C5; [1C, 05, 05][, E1 D1, 05]
-1106B; [1C, 05, 05][, E1 E1, 05]
-11056; [1C, 05, 05][, E1 F1, 05]
-1D364; [1C, 05, 05][, E2 15, 05]
-1F106; [1C, 05, 09][07, 05, 3D]
-248C; [1C, 05, 09][09, 05, 3D]
-215A; [1C, 05, 3B][0D 75 2C, 05, 3B][1E, 05, 3B]
-215D; [1C, 05, 3B][0D 75 2C, 05, 3B][22, 05, 3B]
-324C; [1C, 05, 0D][12, 05, 0D]
-32BF; [1C, 05, 0D][12, 05, 0D]
-33E4; [1C, 05, 09][E0 34 F0, 05, 3D]
-32C4; [1C, 05, 09][E0 37 48, 05, 3D]
-335D; [1C, 05, 09][E0 4B 22, 05, 3D]
-
-0036; [1E, 05, 05]
-FF16; [1E, 05, 07]
-1D7D4; [1E, 05, 0B]
-1D7DE; [1E, 05, 0B]
-1D7E8; [1E, 05, 0B]
-1D7F2; [1E, 05, 0B]
-1D7FC; [1E, 05, 0B]
-2465; [1E, 05, 0D]
-24FA; [1E, 05, 0D]
-277B; [1E, 05, 0D]
-2785; [1E, 05, 0D]
-278F; [1E, 05, 0D]
-2076; [1E, 05, 27]
-2086; [1E, 05, 29]
-0666; [1E, 05, 05][, DB F9, 05]
-06F6; [1E, 05, 05][, DC 0D, 05]
-10E65; [1E, 05, 05][, DC 1D, 05]
-07C6; [1E, 05, 05][, DC 2D, 05]
-136E; [1E, 05, 05][, DC 3D, 05]
-104A6; [1E, 05, 05][, DC 4D, 05]
-096C; [1E, 05, 05][, DC 5D, 05]
-09EC; [1E, 05, 05][, DC 6D, 05]
-0A6C; [1E, 05, 05][, DC 7D, 05]
-0AEC; [1E, 05, 05][, DC 8D, 05]
-0B6C; [1E, 05, 05][, DC 9D, 05]
-0BEC; [1E, 05, 05][, DC AD, 05]
-0C6C; [1E, 05, 05][, DC BD, 05]
-0CEC; [1E, 05, 05][, DC CD, 05]
-0D6C; [1E, 05, 05][, DC DD, 05]
-ABF6; [1E, 05, 05][, DC ED, 05]
-A8D6; [1E, 05, 05][, DC FD, 05]
-194C; [1E, 05, 05][, DD 11, 05]
-19D6; [1E, 05, 05][, DD 21, 05]
-1A86; [1E, 05, 05][, DD 31, 05]
-1A96; [1E, 05, 05][, DD 41, 05]
-0E56; [1E, 05, 05][, DF 59, 05]
-0ED6; [1E, 05, 05][, DF 69, 05]
-0F26; [1E, 05, 05][, DF 79, 05]
-0F2F; [1E, 05, 09][, DF 79, 09]
-1C46; [1E, 05, 05][, DF 89, 05]
-A906; [1E, 05, 05][, E0 1D, 05]
-1046; [1E, 05, 05][, E0 2D, 05]
-1096; [1E, 05, 05][, E0 3D, 05]
-1113C; [1E, 05, 05][, E0 4D, 05]
-17E6; [1E, 05, 05][, E0 5D, 05]
-17F6; [1E, 05, 05][, E0 6D, 05]
-AA56; [1E, 05, 05][, E0 7D, 05]
-1B56; [1E, 05, 05][, E0 8D, 05]
-A9D6; [1E, 05, 05][, E0 9D, 05]
-1BB6; [1E, 05, 05][, E0 AD, 05]
-1816; [1E, 05, 05][, E0 BD, 05]
-1C56; [1E, 05, 05][, E0 CD, 05]
-A626; [1E, 05, 05][, E0 DD, 05]
-110F6; [1E, 05, 05][, E0 ED, 05]
-3026; [1E, 05, 05][, E0 FD, 05]
-1010C; [1E, 05, 05][, E1 11, 05]
-2185; [1E, 05, 05][, E1 31, 05]
-12404; [1E, 05, 05][, E1 61, 05]
-1240B; [1E, 05, 05][, E1 61, 05]
-12411; [1E, 05, 05][, E1 61, 05]
-1241A; [1E, 05, 05][, E1 61, 05]
-12428; [1E, 05, 05][, E1 61, 05]
-12440; [1E, 05, 05][, E1 61, 05]
-1244E; [1E, 05, 05][, E1 61, 05]
-111D6; [1E, 05, 05][, E1 C1, 05]
-116C6; [1E, 05, 05][, E1 D1, 05]
-1106C; [1E, 05, 05][, E1 E1, 05]
-11057; [1E, 05, 05][, E1 F1, 05]
-1D365; [1E, 05, 05][, E2 15, 05]
-1F107; [1E, 05, 09][07, 05, 3D]
-248D; [1E, 05, 09][09, 05, 3D]
-324D; [1E, 05, 0D][12, 05, 0D]
-33E5; [1E, 05, 09][E0 34 F0, 05, 3D]
-32C5; [1E, 05, 09][E0 37 48, 05, 3D]
-335E; [1E, 05, 09][E0 4B 22, 05, 3D]
-
-0037; [20, 05, 05]
-FF17; [20, 05, 07]
-1D7D5; [20, 05, 0B]
-1D7DF; [20, 05, 0B]
-1D7E9; [20, 05, 0B]
-1D7F3; [20, 05, 0B]
-1D7FD; [20, 05, 0B]
-2466; [20, 05, 0D]
-24FB; [20, 05, 0D]
-277C; [20, 05, 0D]
-2786; [20, 05, 0D]
-2790; [20, 05, 0D]
-2077; [20, 05, 27]
-2087; [20, 05, 29]
-0667; [20, 05, 05][, DB F9, 05]
-06F7; [20, 05, 05][, DC 0D, 05]
-10E66; [20, 05, 05][, DC 1D, 05]
-07C7; [20, 05, 05][, DC 2D, 05]
-136F; [20, 05, 05][, DC 3D, 05]
-104A7; [20, 05, 05][, DC 4D, 05]
-096D; [20, 05, 05][, DC 5D, 05]
-09ED; [20, 05, 05][, DC 6D, 05]
-0A6D; [20, 05, 05][, DC 7D, 05]
-0AED; [20, 05, 05][, DC 8D, 05]
-0B6D; [20, 05, 05][, DC 9D, 05]
-0BED; [20, 05, 05][, DC AD, 05]
-0C6D; [20, 05, 05][, DC BD, 05]
-0CED; [20, 05, 05][, DC CD, 05]
-0D6D; [20, 05, 05][, DC DD, 05]
-ABF7; [20, 05, 05][, DC ED, 05]
-A8D7; [20, 05, 05][, DC FD, 05]
-194D; [20, 05, 05][, DD 11, 05]
-19D7; [20, 05, 05][, DD 21, 05]
-1A87; [20, 05, 05][, DD 31, 05]
-1A97; [20, 05, 05][, DD 41, 05]
-0E57; [20, 05, 05][, DF 59, 05]
-0ED7; [20, 05, 05][, DF 69, 05]
-0F27; [20, 05, 05][, DF 79, 05]
-0F30; [20, 05, 09][, DF 79, 09]
-1C47; [20, 05, 05][, DF 89, 05]
-A907; [20, 05, 05][, E0 1D, 05]
-1047; [20, 05, 05][, E0 2D, 05]
-1097; [20, 05, 05][, E0 3D, 05]
-1113D; [20, 05, 05][, E0 4D, 05]
-17E7; [20, 05, 05][, E0 5D, 05]
-17F7; [20, 05, 05][, E0 6D, 05]
-AA57; [20, 05, 05][, E0 7D, 05]
-1B57; [20, 05, 05][, E0 8D, 05]
-A9D7; [20, 05, 05][, E0 9D, 05]
-1BB7; [20, 05, 05][, E0 AD, 05]
-1817; [20, 05, 05][, E0 BD, 05]
-1C57; [20, 05, 05][, E0 CD, 05]
-A627; [20, 05, 05][, E0 DD, 05]
-110F7; [20, 05, 05][, E0 ED, 05]
-3027; [20, 05, 05][, E0 FD, 05]
-1010D; [20, 05, 05][, E1 11, 05]
-12405; [20, 05, 05][, E1 61, 05]
-1240C; [20, 05, 05][, E1 61, 05]
-12412; [20, 05, 05][, E1 61, 05]
-1241B; [20, 05, 05][, E1 61, 05]
-12429; [20, 05, 05][, E1 61, 05]
-12441; [20, 05, 05][, E1 61, 05]
-12442; [20, 05, 05][, E1 61, 05]
-12443; [20, 05, 05][, E1 61, 05]
-111D7; [20, 05, 05][, E1 C1, 05]
-116C7; [20, 05, 05][, E1 D1, 05]
-1106D; [20, 05, 05][, E1 E1, 05]
-11058; [20, 05, 05][, E1 F1, 05]
-1D366; [20, 05, 05][, E2 15, 05]
-1F108; [20, 05, 09][07, 05, 3D]
-248E; [20, 05, 09][09, 05, 3D]
-215E; [20, 05, 3B][0D 75 2C, 05, 3B][22, 05, 3B]
-324E; [20, 05, 0D][12, 05, 0D]
-33E6; [20, 05, 09][E0 34 F0, 05, 3D]
-32C6; [20, 05, 09][E0 37 48, 05, 3D]
-335F; [20, 05, 09][E0 4B 22, 05, 3D]
-
-0038; [22, 05, 05]
-FF18; [22, 05, 07]
-1D7D6; [22, 05, 0B]
-1D7E0; [22, 05, 0B]
-1D7EA; [22, 05, 0B]
-1D7F4; [22, 05, 0B]
-1D7FE; [22, 05, 0B]
-2467; [22, 05, 0D]
-24FC; [22, 05, 0D]
-277D; [22, 05, 0D]
-2787; [22, 05, 0D]
-2791; [22, 05, 0D]
-2078; [22, 05, 27]
-2088; [22, 05, 29]
-0668; [22, 05, 05][, DB F9, 05]
-06F8; [22, 05, 05][, DC 0D, 05]
-10E67; [22, 05, 05][, DC 1D, 05]
-07C8; [22, 05, 05][, DC 2D, 05]
-1370; [22, 05, 05][, DC 3D, 05]
-104A8; [22, 05, 05][, DC 4D, 05]
-096E; [22, 05, 05][, DC 5D, 05]
-09EE; [22, 05, 05][, DC 6D, 05]
-0A6E; [22, 05, 05][, DC 7D, 05]
-0AEE; [22, 05, 05][, DC 8D, 05]
-0B6E; [22, 05, 05][, DC 9D, 05]
-0BEE; [22, 05, 05][, DC AD, 05]
-0C6E; [22, 05, 05][, DC BD, 05]
-0CEE; [22, 05, 05][, DC CD, 05]
-0D6E; [22, 05, 05][, DC DD, 05]
-ABF8; [22, 05, 05][, DC ED, 05]
-A8D8; [22, 05, 05][, DC FD, 05]
-194E; [22, 05, 05][, DD 11, 05]
-19D8; [22, 05, 05][, DD 21, 05]
-1A88; [22, 05, 05][, DD 31, 05]
-1A98; [22, 05, 05][, DD 41, 05]
-0E58; [22, 05, 05][, DF 59, 05]
-0ED8; [22, 05, 05][, DF 69, 05]
-0F28; [22, 05, 05][, DF 79, 05]
-0F31; [22, 05, 09][, DF 79, 09]
-1C48; [22, 05, 05][, DF 89, 05]
-A908; [22, 05, 05][, E0 1D, 05]
-1048; [22, 05, 05][, E0 2D, 05]
-1098; [22, 05, 05][, E0 3D, 05]
-1113E; [22, 05, 05][, E0 4D, 05]
-17E8; [22, 05, 05][, E0 5D, 05]
-17F8; [22, 05, 05][, E0 6D, 05]
-AA58; [22, 05, 05][, E0 7D, 05]
-1B58; [22, 05, 05][, E0 8D, 05]
-A9D8; [22, 05, 05][, E0 9D, 05]
-1BB8; [22, 05, 05][, E0 AD, 05]
-1818; [22, 05, 05][, E0 BD, 05]
-1C58; [22, 05, 05][, E0 CD, 05]
-A628; [22, 05, 05][, E0 DD, 05]
-110F8; [22, 05, 05][, E0 ED, 05]
-3028; [22, 05, 05][, E0 FD, 05]
-1010E; [22, 05, 05][, E1 11, 05]
-12406; [22, 05, 05][, E1 61, 05]
-1240D; [22, 05, 05][, E1 61, 05]
-12413; [22, 05, 05][, E1 61, 05]
-1241C; [22, 05, 05][, E1 61, 05]
-1242A; [22, 05, 05][, E1 61, 05]
-12444; [22, 05, 05][, E1 61, 05]
-12445; [22, 05, 05][, E1 61, 05]
-111D8; [22, 05, 05][, E1 C1, 05]
-116C8; [22, 05, 05][, E1 D1, 05]
-1106E; [22, 05, 05][, E1 E1, 05]
-11059; [22, 05, 05][, E1 F1, 05]
-1D367; [22, 05, 05][, E2 15, 05]
-1F109; [22, 05, 09][07, 05, 3D]
-248F; [22, 05, 09][09, 05, 3D]
-324F; [22, 05, 0D][12, 05, 0D]
-33E7; [22, 05, 09][E0 34 F0, 05, 3D]
-32C7; [22, 05, 09][E0 37 48, 05, 3D]
-3360; [22, 05, 09][E0 4B 22, 05, 3D]
-
-0039; [24, 05, 05]
-FF19; [24, 05, 07]
-1D7D7; [24, 05, 0B]
-1D7E1; [24, 05, 0B]
-1D7EB; [24, 05, 0B]
-1D7F5; [24, 05, 0B]
-1D7FF; [24, 05, 0B]
-2468; [24, 05, 0D]
-24FD; [24, 05, 0D]
-277E; [24, 05, 0D]
-2788; [24, 05, 0D]
-2792; [24, 05, 0D]
-2079; [24, 05, 27]
-2089; [24, 05, 29]
-0669; [24, 05, 05][, DB F9, 05]
-06F9; [24, 05, 05][, DC 0D, 05]
-10E68; [24, 05, 05][, DC 1D, 05]
-07C9; [24, 05, 05][, DC 2D, 05]
-1371; [24, 05, 05][, DC 3D, 05]
-104A9; [24, 05, 05][, DC 4D, 05]
-096F; [24, 05, 05][, DC 5D, 05]
-09EF; [24, 05, 05][, DC 6D, 05]
-0A6F; [24, 05, 05][, DC 7D, 05]
-0AEF; [24, 05, 05][, DC 8D, 05]
-0B6F; [24, 05, 05][, DC 9D, 05]
-0BEF; [24, 05, 05][, DC AD, 05]
-0C6F; [24, 05, 05][, DC BD, 05]
-0CEF; [24, 05, 05][, DC CD, 05]
-0D6F; [24, 05, 05][, DC DD, 05]
-ABF9; [24, 05, 05][, DC ED, 05]
-A8D9; [24, 05, 05][, DC FD, 05]
-194F; [24, 05, 05][, DD 11, 05]
-19D9; [24, 05, 05][, DD 21, 05]
-1A89; [24, 05, 05][, DD 31, 05]
-1A99; [24, 05, 05][, DD 41, 05]
-0E59; [24, 05, 05][, DF 59, 05]
-0ED9; [24, 05, 05][, DF 69, 05]
-0F29; [24, 05, 05][, DF 79, 05]
-0F32; [24, 05, 09][, DF 79, 09]
-1C49; [24, 05, 05][, DF 89, 05]
-A909; [24, 05, 05][, E0 1D, 05]
-1049; [24, 05, 05][, E0 2D, 05]
-1099; [24, 05, 05][, E0 3D, 05]
-1113F; [24, 05, 05][, E0 4D, 05]
-17E9; [24, 05, 05][, E0 5D, 05]
-17F9; [24, 05, 05][, E0 6D, 05]
-AA59; [24, 05, 05][, E0 7D, 05]
-1B59; [24, 05, 05][, E0 8D, 05]
-A9D9; [24, 05, 05][, E0 9D, 05]
-1BB9; [24, 05, 05][, E0 AD, 05]
-1819; [24, 05, 05][, E0 BD, 05]
-1C59; [24, 05, 05][, E0 CD, 05]
-A629; [24, 05, 05][, E0 DD, 05]
-110F9; [24, 05, 05][, E0 ED, 05]
-3029; [24, 05, 05][, E0 FD, 05]
-1010F; [24, 05, 05][, E1 11, 05]
-12407; [24, 05, 05][, E1 61, 05]
-1240E; [24, 05, 05][, E1 61, 05]
-12414; [24, 05, 05][, E1 61, 05]
-1241D; [24, 05, 05][, E1 61, 05]
-1242B; [24, 05, 05][, E1 61, 05]
-12446; [24, 05, 05][, E1 61, 05]
-12447; [24, 05, 05][, E1 61, 05]
-12448; [24, 05, 05][, E1 61, 05]
-12449; [24, 05, 05][, E1 61, 05]
-111D9; [24, 05, 05][, E1 C1, 05]
-116C9; [24, 05, 05][, E1 D1, 05]
-1106F; [24, 05, 05][, E1 E1, 05]
-1105A; [24, 05, 05][, E1 F1, 05]
-1D368; [24, 05, 05][, E2 15, 05]
-1F10A; [24, 05, 09][07, 05, 3D]
-2490; [24, 05, 09][09, 05, 3D]
-33E8; [24, 05, 09][E0 34 F0, 05, 3D]
-32C8; [24, 05, 09][E0 37 48, 05, 3D]
-3361; [24, 05, 09][E0 4B 22, 05, 3D]
-
-0061; [27, 05, 05]
-FF41; [27, 05, 07]
-0363; [27, 05, 09]
-1D41A; [27, 05, 0B]
-1D44E; [27, 05, 0B]
-1D482; [27, 05, 0B]
-1D4B6; [27, 05, 0B]
-1D4EA; [27, 05, 0B]
-1D51E; [27, 05, 0B]
-1D552; [27, 05, 0B]
-1D586; [27, 05, 0B]
-1D5BA; [27, 05, 0B]
-1D5EE; [27, 05, 0B]
-1D622; [27, 05, 0B]
-1D656; [27, 05, 0B]
-1D68A; [27, 05, 0B]
-24D0; [27, 05, 0D]
-0041; [27, 05, 8F]
-FF21; [27, 05, 91]
-1D400; [27, 05, 95]
-1D434; [27, 05, 95]
-1D468; [27, 05, 95]
-1D49C; [27, 05, 95]
-1D4D0; [27, 05, 95]
-1D504; [27, 05, 95]
-1D538; [27, 05, 95]
-1D56C; [27, 05, 95]
-1D5A0; [27, 05, 95]
-1D5D4; [27, 05, 95]
-1D608; [27, 05, 95]
-1D63C; [27, 05, 95]
-1D670; [27, 05, 95]
-24B6; [27, 05, 97]
-1F150; [27, 05, 97]
-00AA; [27, 05, 27]
-1D43; [27, 05, 27]
-2090; [27, 05, 29]
-1D2C; [27, 05, B9]
-1F130; [27, 05, B9]
-1F170; [27, 05, B9]
-00E1; [27, 05, 05][, 8D, 05]
-00C1; [27, 05, 8F][, 8D, 05]
-00E0; [27, 05, 05][, 8F, 05]
-00C0; [27, 05, 8F][, 8F, 05]
-0103; [27, 05, 05][, 91, 05]
-0102; [27, 05, 8F][, 91, 05]
-1EAF; [27, 05, 05][, 91, 05][, 8D, 05]
-1EAE; [27, 05, 8F][, 91, 05][, 8D, 05]
-1EB1; [27, 05, 05][, 91, 05][, 8F, 05]
-1EB0; [27, 05, 8F][, 91, 05][, 8F, 05]
-1EB5; [27, 05, 05][, 91, 05][, A1, 05]
-1EB4; [27, 05, 8F][, 91, 05][, A1, 05]
-1EB3; [27, 05, 05][, 91, 05][, B7, 05]
-1EB2; [27, 05, 8F][, 91, 05][, B7, 05]
-00E2; [27, 05, 05][, 93, 05]
-00C2; [27, 05, 8F][, 93, 05]
-1EA5; [27, 05, 05][, 93, 05][, 8D, 05]
-1EA4; [27, 05, 8F][, 93, 05][, 8D, 05]
-1EA7; [27, 05, 05][, 93, 05][, 8F, 05]
-1EA6; [27, 05, 8F][, 93, 05][, 8F, 05]
-1EAB; [27, 05, 05][, 93, 05][, A1, 05]
-1EAA; [27, 05, 8F][, 93, 05][, A1, 05]
-1EA9; [27, 05, 05][, 93, 05][, B7, 05]
-1EA8; [27, 05, 8F][, 93, 05][, B7, 05]
-01CE; [27, 05, 05][, 97, 05]
-01CD; [27, 05, 8F][, 97, 05]
-00E5; [27, 05, 05][, 99, 05]
-00C5; [27, 05, 8F][, 99, 05]
-212B; [27, 05, 8F][, 99, 05]
-01FB; [27, 05, 05][, 99, 05][, 8D, 05]
-01FA; [27, 05, 8F][, 99, 05][, 8D, 05]
-00E4; [27, 05, 05][, 9D, 05]
-00C4; [27, 05, 8F][, 9D, 05]
-01DF; [27, 05, 05][, 9D, 05][, AB, 05]
-01DE; [27, 05, 8F][, 9D, 05][, AB, 05]
-00E3; [27, 05, 05][, A1, 05]
-00C3; [27, 05, 8F][, A1, 05]
-0227; [27, 05, 05][, A3, 05]
-0226; [27, 05, 8F][, A3, 05]
-01E1; [27, 05, 05][, A3, 05][, AB, 05]
-01E0; [27, 05, 8F][, A3, 05][, AB, 05]
-0105; [27, 05, 05][, A9, 05]
-0104; [27, 05, 8F][, A9, 05]
-0101; [27, 05, 05][, AB, 05]
-0100; [27, 05, 8F][, AB, 05]
-1EA3; [27, 05, 05][, B7, 05]
-1EA2; [27, 05, 8F][, B7, 05]
-0201; [27, 05, 05][, B9, 05]
-0200; [27, 05, 8F][, B9, 05]
-0203; [27, 05, 05][, BD, 05]
-0202; [27, 05, 8F][, BD, 05]
-1EA1; [27, 05, 05][, C5, 05]
-1EA0; [27, 05, 8F][, C5, 05]
-1EB7; [27, 05, 05][, C5, 05][, 91, 05]
-1EB6; [27, 05, 8F][, C5, 05][, 91, 05]
-1EAD; [27, 05, 05][, C5, 05][, 93, 05]
-1EAC; [27, 05, 8F][, C5, 05][, 93, 05]
-1E01; [27, 05, 05][, C9, 05]
-1E00; [27, 05, 8F][, C9, 05]
-1DD3; [27, 05, 09][, DB A9, 09]
-33C2; [27, 05, 37][09, 05, 37][3F, 05, 37][09, 05, 37]
-2100; [27, 05, 09][0B A9, 05, 09][2B, 05, 09]
-2101; [27, 05, 09][0B A9, 05, 09][4B, 05, 09]
-214D; [27, 05, 93][0B A9, 05, 09][4B, 05, 93]
-33DF; [27, 05, B9][0D 75 24, 05, 37][3F, 05, 37]
-A733; [27, 05, 09][27, 05, 09]
-A732; [27, 05, 93][27, 05, 93]
-1F18E; [27, 05, B9][29, 05, B9]
-00E6; [27, 05, 09][, DB A9, 09][2F, 05, 09]
-1DD4; [27, 05, 09][, DB A9, 09][2F, 05, 09]
-00C6; [27, 05, 93][, DB A9, 09][2F, 05, 93]
-1D2D; [27, 05, 27][, DB A9, 27][2F, 05, 27]
-01FD; [27, 05, 09][, DB A9, 09][2F, 05, 09][, 8D, 05]
-01FC; [27, 05, 93][, DB A9, 09][2F, 05, 93][, 8D, 05]
-01E3; [27, 05, 09][, DB A9, 09][2F, 05, 09][, AB, 05]
-01E2; [27, 05, 93][, DB A9, 09][2F, 05, 93][, AB, 05]
-1DD5; [27, 05, 09][43, 05, 09]
-A735; [27, 05, 09][43, 05, 09]
-A734; [27, 05, 93][43, 05, 93]
-A737; [27, 05, 09][4F, 05, 09]
-A736; [27, 05, 93][4F, 05, 93]
-3373; [27, 05, B9][4F, 05, B9]
-1DD6; [27, 05, 09][51, 05, 09]
-A739; [27, 05, 09][51, 05, 09]
-A738; [27, 05, 93][51, 05, 93]
-A73B; [27, 05, 09][, DB A9, 09][51, 05, 09]
-A73A; [27, 05, 93][, DB A9, 09][51, 05, 93]
-A73D; [27, 05, 09][57, 05, 09]
-A73C; [27, 05, 93][57, 05, 93]
-1E9A; [27, 05, 09][5A 8A, 05, 09]
-
-1D00; [28 40, 05, 05]
-
-2C65; [28 42, 05, 05]
-023A; [28 42, 05, 8F]
-
-1D8F; [28 44, 05, 05]
-
-1D01; [28 46, 05, 05]
-
-1D02; [28 48, 05, 05]
-1D46; [28 48, 05, 27]
-
-0250; [28 4A, 05, 05]
-2C6F; [28 4A, 05, 8F]
-1D44; [28 4A, 05, 27]
-
-0251; [28 4C, 05, 05]
-2C6D; [28 4C, 05, 8F]
-1D45; [28 4C, 05, 27]
-
-1D90; [28 4E, 05, 05]
-
-0252; [28 50, 05, 05]
-2C70; [28 50, 05, 8F]
-1D9B; [28 50, 05, 27]
-
-0062; [29, 05, 05]
-FF42; [29, 05, 07]
-1D41B; [29, 05, 0B]
-1D44F; [29, 05, 0B]
-1D483; [29, 05, 0B]
-1D4B7; [29, 05, 0B]
-1D4EB; [29, 05, 0B]
-1D51F; [29, 05, 0B]
-1D553; [29, 05, 0B]
-1D587; [29, 05, 0B]
-1D5BB; [29, 05, 0B]
-1D5EF; [29, 05, 0B]
-1D623; [29, 05, 0B]
-1D657; [29, 05, 0B]
-1D68B; [29, 05, 0B]
-24D1; [29, 05, 0D]
-0042; [29, 05, 8F]
-FF22; [29, 05, 91]
-212C; [29, 05, 95]
-1D401; [29, 05, 95]
-1D435; [29, 05, 95]
-1D469; [29, 05, 95]
-1D4D1; [29, 05, 95]
-1D505; [29, 05, 95]
-1D539; [29, 05, 95]
-1D56D; [29, 05, 95]
-1D5A1; [29, 05, 95]
-1D5D5; [29, 05, 95]
-1D609; [29, 05, 95]
-1D63D; [29, 05, 95]
-1D671; [29, 05, 95]
-24B7; [29, 05, 97]
-1F151; [29, 05, 97]
-1D47; [29, 05, 27]
-1D2E; [29, 05, B9]
-1F131; [29, 05, B9]
-1F171; [29, 05, B9]
-1E03; [29, 05, 05][, A3, 05]
-1E02; [29, 05, 8F][, A3, 05]
-1E05; [29, 05, 05][, C5, 05]
-1E04; [29, 05, 8F][, C5, 05]
-1E07; [29, 05, 05][, D0 1D, 05]
-1E06; [29, 05, 8F][, D0 1D, 05]
-3374; [29, 05, 37][27, 05, 37][49, 05, 37]
-33C3; [29, 05, B9][47, 05, 37]
-
-0299; [2A 40, 05, 05]
-
-0180; [2A 42, 05, 05]
-0243; [2A 42, 05, 8F]
-
-1D2F; [2A 44, 05, 05]
-
-1D03; [2A 46, 05, 05]
-
-1D6C; [2A 48, 05, 05]
-
-1D80; [2A 4A, 05, 05]
-
-0253; [2A 4C, 05, 05]
-0181; [2A 4C, 05, 8F]
-
-0183; [2A 4E, 05, 05]
-0182; [2A 4E, 05, 8F]
-
-0063; [2B, 05, 05]
-FF43; [2B, 05, 07]
-0368; [2B, 05, 09]
-217D; [2B, 05, 09]
-1D41C; [2B, 05, 0B]
-1D450; [2B, 05, 0B]
-1D484; [2B, 05, 0B]
-1D4B8; [2B, 05, 0B]
-1D4EC; [2B, 05, 0B]
-1D520; [2B, 05, 0B]
-1D554; [2B, 05, 0B]
-1D588; [2B, 05, 0B]
-1D5BC; [2B, 05, 0B]
-1D5F0; [2B, 05, 0B]
-1D624; [2B, 05, 0B]
-1D658; [2B, 05, 0B]
-1D68C; [2B, 05, 0B]
-24D2; [2B, 05, 0D]
-0043; [2B, 05, 8F]
-FF23; [2B, 05, 91]
-216D; [2B, 05, 93]
-2102; [2B, 05, 95]
-212D; [2B, 05, 95]
-1D402; [2B, 05, 95]
-1D436; [2B, 05, 95]
-1D46A; [2B, 05, 95]
-1D49E; [2B, 05, 95]
-1D4D2; [2B, 05, 95]
-1D56E; [2B, 05, 95]
-1D5A2; [2B, 05, 95]
-1D5D6; [2B, 05, 95]
-1D60A; [2B, 05, 95]
-1D63E; [2B, 05, 95]
-1D672; [2B, 05, 95]
-24B8; [2B, 05, 97]
-1F12B; [2B, 05, 97]
-1F152; [2B, 05, 97]
-1D9C; [2B, 05, 27]
-1F132; [2B, 05, B9]
-1F172; [2B, 05, B9]
-0107; [2B, 05, 05][, 8D, 05]
-0106; [2B, 05, 8F][, 8D, 05]
-0109; [2B, 05, 05][, 93, 05]
-0108; [2B, 05, 8F][, 93, 05]
-010D; [2B, 05, 05][, 97, 05]
-010C; [2B, 05, 8F][, 97, 05]
-010B; [2B, 05, 05][, A3, 05]
-010A; [2B, 05, 8F][, A3, 05]
-00E7; [2B, 05, 05][, A7, 05]
-1DD7; [2B, 05, 09][, A7, 09]
-00C7; [2B, 05, 8F][, A7, 05]
-1E09; [2B, 05, 05][, A7, 05][, 8D, 05]
-1E08; [2B, 05, 8F][, A7, 05][, 8D, 05]
-2105; [2B, 05, 09][0B A9, 05, 09][43, 05, 09]
-2106; [2B, 05, 09][0B A9, 05, 09][4F, 05, 09]
-33C6; [2B, 05, B9][0D 75 24, 05, 37][3B, 05, 37][33, 05, 37]
-3388; [2B, 05, 37][27, 05, 37][3D, 05, 37]
-33C4; [2B, 05, 37][2B, 05, 37]
-1F12D; [2B, 05, 97][2D, 05, 97]
-33C5; [2B, 05, 37][2D, 05, 37]
-1F191; [2B, 05, B9][3D, 05, B9]
-339D; [2B, 05, 37][3F, 05, 37]
-33A0; [2B, 05, 37][3F, 05, 37][16, 05, 37]
-33A4; [2B, 05, 37][3F, 05, 37][18, 05, 37]
-33C7; [2B, 05, B9][43, 05, 37][09, 05, 37]
-1F192; [2B, 05, B9][43, 05, B9][43, 05, B9][3D, 05, B9]
-
-1D04; [2C 40, 05, 05]
-
-023C; [2C 42, 05, 05]
-023B; [2C 42, 05, 8F]
-
-A793; [2C 44, 05, 05]
-A792; [2C 44, 05, 8F]
-
-0188; [2C 46, 05, 05]
-0187; [2C 46, 05, 8F]
-
-0255; [2C 48, 05, 05]
-1D9D; [2C 48, 05, 27]
-
-2184; [2C 4A, 05, 05]
-2183; [2C 4A, 05, 8F]
-
-A73F; [2C 4C, 05, 05]
-A73E; [2C 4C, 05, 8F]
-
-0064; [2D, 05, 05]
-FF44; [2D, 05, 07]
-0369; [2D, 05, 09]
-217E; [2D, 05, 09]
-2146; [2D, 05, 0B]
-1D41D; [2D, 05, 0B]
-1D451; [2D, 05, 0B]
-1D485; [2D, 05, 0B]
-1D4B9; [2D, 05, 0B]
-1D4ED; [2D, 05, 0B]
-1D521; [2D, 05, 0B]
-1D555; [2D, 05, 0B]
-1D589; [2D, 05, 0B]
-1D5BD; [2D, 05, 0B]
-1D5F1; [2D, 05, 0B]
-1D625; [2D, 05, 0B]
-1D659; [2D, 05, 0B]
-1D68D; [2D, 05, 0B]
-24D3; [2D, 05, 0D]
-0044; [2D, 05, 8F]
-FF24; [2D, 05, 91]
-216E; [2D, 05, 93]
-2145; [2D, 05, 95]
-1D403; [2D, 05, 95]
-1D437; [2D, 05, 95]
-1D46B; [2D, 05, 95]
-1D49F; [2D, 05, 95]
-1D4D3; [2D, 05, 95]
-1D507; [2D, 05, 95]
-1D53B; [2D, 05, 95]
-1D56F; [2D, 05, 95]
-1D5A3; [2D, 05, 95]
-1D5D7; [2D, 05, 95]
-1D60B; [2D, 05, 95]
-1D63F; [2D, 05, 95]
-1D673; [2D, 05, 95]
-24B9; [2D, 05, 97]
-1F153; [2D, 05, 97]
-1D48; [2D, 05, 27]
-1D30; [2D, 05, B9]
-1F133; [2D, 05, B9]
-1F173; [2D, 05, B9]
-010F; [2D, 05, 05][, 97, 05]
-010E; [2D, 05, 8F][, 97, 05]
-1E0B; [2D, 05, 05][, A3, 05]
-1E0A; [2D, 05, 8F][, A3, 05]
-1E11; [2D, 05, 05][, A7, 05]
-1E10; [2D, 05, 8F][, A7, 05]
-1E0D; [2D, 05, 05][, C5, 05]
-1E0C; [2D, 05, 8F][, C5, 05]
-1E13; [2D, 05, 05][, CD, 05]
-1E12; [2D, 05, 8F][, CD, 05]
-1E0F; [2D, 05, 05][, D0 1D, 05]
-1E0E; [2D, 05, 8F][, D0 1D, 05]
-0111; [2D, 05, 05][, D0 3D, 05]
-0110; [2D, 05, 8F][, D0 3D, 05]
-00F0; [2D, 05, 09][, DB A9, 09]
-1DD9; [2D, 05, 09][, DB A9, 09]
-00D0; [2D, 05, 93][, DB A9, 09]
-1D9E; [2D, 05, 27][, DB A9, 27]
-1DD8; [2D, 05, 09][, DB B9, 09]
-A77A; [2D, 05, 09][, DB B9, 09]
-A779; [2D, 05, 93][, DB B9, 09]
-3372; [2D, 05, 37][27, 05, 37]
-0238; [2D, 05, 09][29, 05, 09]
-33C8; [2D, 05, 37][29, 05, B9]
-1F190; [2D, 05, B9][39, 05, B9]
-3397; [2D, 05, 37][3D, 05, 37]
-3377; [2D, 05, 37][3F, 05, 37]
-3378; [2D, 05, 37][3F, 05, 37][16, 05, 37]
-3379; [2D, 05, 37][3F, 05, 37][18, 05, 37]
-01F3; [2D, 05, 09][59, 05, 09]
-02A3; [2D, 05, 09][59, 05, 09]
-01F2; [2D, 05, 93][59, 05, 09]
-01F1; [2D, 05, 93][59, 05, 93]
-01C6; [2D, 05, 09][59, 05, 09][, 97, 09]
-01C5; [2D, 05, 93][59, 05, 09][, 97, 09]
-01C4; [2D, 05, 93][59, 05, 93][, 97, 09]
-02A5; [2D, 05, 09][5A 4C, 05, 09]
-02A4; [2D, 05, 09][5A 54, 05, 09]
-
-1D05; [2E 40, 05, 05]
-
-1D06; [2E 42, 05, 05]
-
-1D6D; [2E 44, 05, 05]
-
-1D81; [2E 46, 05, 05]
-
-0256; [2E 48, 05, 05]
-0189; [2E 48, 05, 8F]
-
-0257; [2E 4A, 05, 05]
-018A; [2E 4A, 05, 8F]
-
-1D91; [2E 4C, 05, 05]
-
-018C; [2E 4E, 05, 05]
-018B; [2E 4E, 05, 8F]
-
-0221; [2E 50, 05, 05]
-
-A771; [2E 52, 05, 05]
-
-1E9F; [2E 54, 05, 05]
-
-0065; [2F, 05, 05]
-FF45; [2F, 05, 07]
-0364; [2F, 05, 09]
-212F; [2F, 05, 0B]
-2147; [2F, 05, 0B]
-1D41E; [2F, 05, 0B]
-1D452; [2F, 05, 0B]
-1D486; [2F, 05, 0B]
-1D4EE; [2F, 05, 0B]
-1D522; [2F, 05, 0B]
-1D556; [2F, 05, 0B]
-1D58A; [2F, 05, 0B]
-1D5BE; [2F, 05, 0B]
-1D5F2; [2F, 05, 0B]
-1D626; [2F, 05, 0B]
-1D65A; [2F, 05, 0B]
-1D68E; [2F, 05, 0B]
-24D4; [2F, 05, 0D]
-0045; [2F, 05, 8F]
-FF25; [2F, 05, 91]
-2130; [2F, 05, 95]
-1D404; [2F, 05, 95]
-1D438; [2F, 05, 95]
-1D46C; [2F, 05, 95]
-1D4D4; [2F, 05, 95]
-1D508; [2F, 05, 95]
-1D53C; [2F, 05, 95]
-1D570; [2F, 05, 95]
-1D5A4; [2F, 05, 95]
-1D5D8; [2F, 05, 95]
-1D60C; [2F, 05, 95]
-1D640; [2F, 05, 95]
-1D674; [2F, 05, 95]
-24BA; [2F, 05, 97]
-1F154; [2F, 05, 97]
-1D49; [2F, 05, 27]
-2091; [2F, 05, 29]
-1D31; [2F, 05, B9]
-1F134; [2F, 05, B9]
-1F174; [2F, 05, B9]
-00E9; [2F, 05, 05][, 8D, 05]
-00C9; [2F, 05, 8F][, 8D, 05]
-00E8; [2F, 05, 05][, 8F, 05]
-00C8; [2F, 05, 8F][, 8F, 05]
-0115; [2F, 05, 05][, 91, 05]
-0114; [2F, 05, 8F][, 91, 05]
-00EA; [2F, 05, 05][, 93, 05]
-00CA; [2F, 05, 8F][, 93, 05]
-1EBF; [2F, 05, 05][, 93, 05][, 8D, 05]
-1EBE; [2F, 05, 8F][, 93, 05][, 8D, 05]
-1EC1; [2F, 05, 05][, 93, 05][, 8F, 05]
-1EC0; [2F, 05, 8F][, 93, 05][, 8F, 05]
-1EC5; [2F, 05, 05][, 93, 05][, A1, 05]
-1EC4; [2F, 05, 8F][, 93, 05][, A1, 05]
-1EC3; [2F, 05, 05][, 93, 05][, B7, 05]
-1EC2; [2F, 05, 8F][, 93, 05][, B7, 05]
-011B; [2F, 05, 05][, 97, 05]
-011A; [2F, 05, 8F][, 97, 05]
-00EB; [2F, 05, 05][, 9D, 05]
-00CB; [2F, 05, 8F][, 9D, 05]
-1EBD; [2F, 05, 05][, A1, 05]
-1EBC; [2F, 05, 8F][, A1, 05]
-0117; [2F, 05, 05][, A3, 05]
-0116; [2F, 05, 8F][, A3, 05]
-0229; [2F, 05, 05][, A7, 05]
-0228; [2F, 05, 8F][, A7, 05]
-1E1D; [2F, 05, 05][, A7, 05][, 91, 05]
-1E1C; [2F, 05, 8F][, A7, 05][, 91, 05]
-0119; [2F, 05, 05][, A9, 05]
-0118; [2F, 05, 8F][, A9, 05]
-0113; [2F, 05, 05][, AB, 05]
-0112; [2F, 05, 8F][, AB, 05]
-1E17; [2F, 05, 05][, AB, 05][, 8D, 05]
-1E16; [2F, 05, 8F][, AB, 05][, 8D, 05]
-1E15; [2F, 05, 05][, AB, 05][, 8F, 05]
-1E14; [2F, 05, 8F][, AB, 05][, 8F, 05]
-1EBB; [2F, 05, 05][, B7, 05]
-1EBA; [2F, 05, 8F][, B7, 05]
-0205; [2F, 05, 05][, B9, 05]
-0204; [2F, 05, 8F][, B9, 05]
-0207; [2F, 05, 05][, BD, 05]
-0206; [2F, 05, 8F][, BD, 05]
-1EB9; [2F, 05, 05][, C5, 05]
-1EB8; [2F, 05, 8F][, C5, 05]
-1EC7; [2F, 05, 05][, C5, 05][, 93, 05]
-1EC6; [2F, 05, 8F][, C5, 05][, 93, 05]
-1E19; [2F, 05, 05][, CD, 05]
-1E18; [2F, 05, 8F][, CD, 05]
-1E1B; [2F, 05, 05][, D0 0D, 05]
-1E1A; [2F, 05, 8F][, D0 0D, 05]
-32CD; [2F, 05, 37][49, 05, 37][33, 05, 37]
-32CE; [2F, 05, 37][51, 05, B9]
-
-1D07; [30 40, 05, 05]
-
-0247; [30 42, 05, 05]
-0246; [30 42, 05, 8F]
-
-1D92; [30 44, 05, 05]
-
-2C78; [30 46, 05, 05]
-
-01DD; [30 48, 05, 05]
-018E; [30 48, 05, 8F]
-1D32; [30 48, 05, B9]
-
-2C7B; [30 4A, 05, 05]
-
-0259; [30 4C, 05, 05]
-018F; [30 4C, 05, 8F]
-1D4A; [30 4C, 05, 27]
-2094; [30 4C, 05, 29]
-
-1D95; [30 4E, 05, 05]
-
-025B; [30 50, 05, 05]
-0190; [30 50, 05, 8F]
-2107; [30 50, 05, 93]
-1D4B; [30 50, 05, 27]
-
-1D93; [30 52, 05, 05]
-
-0258; [30 54, 05, 05]
-
-025A; [30 56, 05, 05]
-
-025C; [30 58, 05, 05]
-1D9F; [30 58, 05, 27]
-
-1D94; [30 5A, 05, 05]
-
-1D08; [30 5C, 05, 05]
-1D4C; [30 5C, 05, 27]
-
-025D; [30 5E, 05, 05]
-
-025E; [30 60, 05, 05]
-
-029A; [30 62, 05, 05]
-
-0264; [30 64, 05, 05]
-
-0066; [31, 05, 05]
-FF46; [31, 05, 07]
-1D41F; [31, 05, 0B]
-1D453; [31, 05, 0B]
-1D487; [31, 05, 0B]
-1D4BB; [31, 05, 0B]
-1D4EF; [31, 05, 0B]
-1D523; [31, 05, 0B]
-1D557; [31, 05, 0B]
-1D58B; [31, 05, 0B]
-1D5BF; [31, 05, 0B]
-1D5F3; [31, 05, 0B]
-1D627; [31, 05, 0B]
-1D65B; [31, 05, 0B]
-1D68F; [31, 05, 0B]
-24D5; [31, 05, 0D]
-0046; [31, 05, 8F]
-FF26; [31, 05, 91]
-2131; [31, 05, 95]
-1D405; [31, 05, 95]
-1D439; [31, 05, 95]
-1D46D; [31, 05, 95]
-1D4D5; [31, 05, 95]
-1D509; [31, 05, 95]
-1D53D; [31, 05, 95]
-1D571; [31, 05, 95]
-1D5A5; [31, 05, 95]
-1D5D9; [31, 05, 95]
-1D60D; [31, 05, 95]
-1D641; [31, 05, 95]
-1D675; [31, 05, 95]
-24BB; [31, 05, 97]
-1F155; [31, 05, 97]
-1DA0; [31, 05, 27]
-1F135; [31, 05, B9]
-1F175; [31, 05, B9]
-1E1F; [31, 05, 05][, A3, 05]
-1E1E; [31, 05, 8F][, A3, 05]
-A77C; [31, 05, 09][, DB B9, 09]
-A77B; [31, 05, 93][, DB B9, 09]
-213B; [31, 05, 93][27, 05, 93][55, 05, 93]
-FB00; [31, 05, 09][31, 05, 09]
-FB03; [31, 05, 09][31, 05, 09][37, 05, 09]
-FB04; [31, 05, 09][31, 05, 09][3D, 05, 09]
-FB01; [31, 05, 09][37, 05, 09]
-FB02; [31, 05, 09][3D, 05, 09]
-3399; [31, 05, 37][3F, 05, 37]
-02A9; [31, 05, 09][42 56, 05, 09]
-1F193; [31, 05, B9][49, 05, B9][2F, 05, B9][2F, 05, B9]
-
-A730; [32 40, 05, 05]
-
-1D6E; [32 42, 05, 05]
-
-1D82; [32 44, 05, 05]
-
-0192; [32 46, 05, 05]
-0191; [32 46, 05, 8F]
-
-214E; [32 48, 05, 05]
-2132; [32 48, 05, 8F]
-
-A7FB; [32 4A, 05, 05]
-
-0067; [33, 05, 05]
-FF47; [33, 05, 07]
-1DDA; [33, 05, 09]
-210A; [33, 05, 0B]
-1D420; [33, 05, 0B]
-1D454; [33, 05, 0B]
-1D488; [33, 05, 0B]
-1D4F0; [33, 05, 0B]
-1D524; [33, 05, 0B]
-1D558; [33, 05, 0B]
-1D58C; [33, 05, 0B]
-1D5C0; [33, 05, 0B]
-1D5F4; [33, 05, 0B]
-1D628; [33, 05, 0B]
-1D65C; [33, 05, 0B]
-1D690; [33, 05, 0B]
-24D6; [33, 05, 0D]
-0047; [33, 05, 8F]
-FF27; [33, 05, 91]
-1D406; [33, 05, 95]
-1D43A; [33, 05, 95]
-1D46E; [33, 05, 95]
-1D4A2; [33, 05, 95]
-1D4D6; [33, 05, 95]
-1D50A; [33, 05, 95]
-1D53E; [33, 05, 95]
-1D572; [33, 05, 95]
-1D5A6; [33, 05, 95]
-1D5DA; [33, 05, 95]
-1D60E; [33, 05, 95]
-1D642; [33, 05, 95]
-1D676; [33, 05, 95]
-24BC; [33, 05, 97]
-1F156; [33, 05, 97]
-1D4D; [33, 05, 27]
-1D33; [33, 05, B9]
-1F136; [33, 05, B9]
-1F176; [33, 05, B9]
-01F5; [33, 05, 05][, 8D, 05]
-01F4; [33, 05, 8F][, 8D, 05]
-011F; [33, 05, 05][, 91, 05]
-011E; [33, 05, 8F][, 91, 05]
-011D; [33, 05, 05][, 93, 05]
-011C; [33, 05, 8F][, 93, 05]
-01E7; [33, 05, 05][, 97, 05]
-01E6; [33, 05, 8F][, 97, 05]
-0121; [33, 05, 05][, A3, 05]
-0120; [33, 05, 8F][, A3, 05]
-0123; [33, 05, 05][, A7, 05]
-0122; [33, 05, 8F][, A7, 05]
-1E21; [33, 05, 05][, AB, 05]
-1E20; [33, 05, 8F][, AB, 05]
-A7A1; [33, 05, 09][, B1, 09]
-A7A0; [33, 05, 93][, B1, 09]
-1D79; [33, 05, 09][, DB B9, 09]
-A77D; [33, 05, 93][, DB B9, 09]
-33FF; [33, 05, 37][27, 05, 37][3D, 05, 37]
-3387; [33, 05, B9][29, 05, B9]
-3393; [33, 05, B9][35, 05, B9][59, 05, 37]
-33AC; [33, 05, B9][45, 05, B9][27, 05, 37]
-33C9; [33, 05, B9][57, 05, 37]
-
-0261; [34 40, 05, 05]
-1DA2; [34 40, 05, 27]
-
-0262; [34 42, 05, 05]
-1DDB; [34 42, 05, 09]
-
-01E5; [34 44, 05, 05]
-01E4; [34 44, 05, 8F]
-
-1D83; [34 46, 05, 05]
-
-0260; [34 48, 05, 05]
-0193; [34 48, 05, 8F]
-
-029B; [34 4A, 05, 05]
-
-1D77; [34 4C, 05, 05]
-
-A77F; [34 4E, 05, 05]
-A77E; [34 4E, 05, 8F]
-
-0263; [34 50, 05, 05]
-0194; [34 50, 05, 8F]
-02E0; [34 50, 05, 27]
-
-01A3; [34 52, 05, 05]
-01A2; [34 52, 05, 8F]
-
-0068; [35, 05, 05]
-FF48; [35, 05, 07]
-036A; [35, 05, 09]
-210E; [35, 05, 0B]
-1D421; [35, 05, 0B]
-1D489; [35, 05, 0B]
-1D4BD; [35, 05, 0B]
-1D4F1; [35, 05, 0B]
-1D525; [35, 05, 0B]
-1D559; [35, 05, 0B]
-1D58D; [35, 05, 0B]
-1D5C1; [35, 05, 0B]
-1D5F5; [35, 05, 0B]
-1D629; [35, 05, 0B]
-1D65D; [35, 05, 0B]
-1D691; [35, 05, 0B]
-24D7; [35, 05, 0D]
-0048; [35, 05, 8F]
-FF28; [35, 05, 91]
-210B; [35, 05, 95]
-210C; [35, 05, 95]
-210D; [35, 05, 95]
-1D407; [35, 05, 95]
-1D43B; [35, 05, 95]
-1D46F; [35, 05, 95]
-1D4D7; [35, 05, 95]
-1D573; [35, 05, 95]
-1D5A7; [35, 05, 95]
-1D5DB; [35, 05, 95]
-1D60F; [35, 05, 95]
-1D643; [35, 05, 95]
-1D677; [35, 05, 95]
-24BD; [35, 05, 97]
-1F157; [35, 05, 97]
-02B0; [35, 05, 27]
-2095; [35, 05, 29]
-1D34; [35, 05, B9]
-1F137; [35, 05, B9]
-1F177; [35, 05, B9]
-0125; [35, 05, 05][, 93, 05]
-0124; [35, 05, 8F][, 93, 05]
-021F; [35, 05, 05][, 97, 05]
-021E; [35, 05, 8F][, 97, 05]
-1E27; [35, 05, 05][, 9D, 05]
-1E26; [35, 05, 8F][, 9D, 05]
-1E23; [35, 05, 05][, A3, 05]
-1E22; [35, 05, 8F][, A3, 05]
-1E29; [35, 05, 05][, A7, 05]
-1E28; [35, 05, 8F][, A7, 05]
-1E25; [35, 05, 05][, C5, 05]
-1E24; [35, 05, 8F][, C5, 05]
-1E2B; [35, 05, 05][, CF, 05]
-1E2A; [35, 05, 8F][, CF, 05]
-1E96; [35, 05, 05][, D0 1D, 05]
-0127; [35, 05, 05][, D0 3D, 05]
-210F; [35, 05, 05][, D0 3D, 05]
-0126; [35, 05, 8F][, D0 3D, 05]
-A7F8; [35, 05, 27][, D0 3D, 27]
-33CA; [35, 05, 37][27, 05, 37]
-32CC; [35, 05, B9][33, 05, 37]
-33CB; [35, 05, B9][45, 05, B9]
-3371; [35, 05, 37][45, 05, B9][27, 05, 37]
-1F14A; [35, 05, B9][51, 05, B9]
-3390; [35, 05, B9][59, 05, 37]
-
-029C; [36 40, 05, 05]
-
-0195; [36 42, 05, 05]
-01F6; [36 42, 05, 8F]
-
-0266; [36 44, 05, 05]
-A7AA; [36 44, 05, 8F]
-02B1; [36 44, 05, 27]
-
-2C68; [36 46, 05, 05]
-2C67; [36 46, 05, 8F]
-
-2C76; [36 48, 05, 05]
-2C75; [36 48, 05, 8F]
-
-A727; [36 4A, 05, 05]
-A726; [36 4A, 05, 8F]
-
-0267; [36 4C, 05, 05]
-
-02BB; [36 4E, 05, 05]
-
-02BD; [36 50, 05, 05]
-
-0069; [37, 05, 05]
-FF49; [37, 05, 07]
-0365; [37, 05, 09]
-2170; [37, 05, 09]
-2139; [37, 05, 0B]
-2148; [37, 05, 0B]
-1D422; [37, 05, 0B]
-1D456; [37, 05, 0B]
-1D48A; [37, 05, 0B]
-1D4BE; [37, 05, 0B]
-1D4F2; [37, 05, 0B]
-1D526; [37, 05, 0B]
-1D55A; [37, 05, 0B]
-1D58E; [37, 05, 0B]
-1D5C2; [37, 05, 0B]
-1D5F6; [37, 05, 0B]
-1D62A; [37, 05, 0B]
-1D65E; [37, 05, 0B]
-1D692; [37, 05, 0B]
-24D8; [37, 05, 0D]
-0049; [37, 05, 8F]
-FF29; [37, 05, 91]
-2160; [37, 05, 93]
-2110; [37, 05, 95]
-2111; [37, 05, 95]
-1D408; [37, 05, 95]
-1D43C; [37, 05, 95]
-1D470; [37, 05, 95]
-1D4D8; [37, 05, 95]
-1D540; [37, 05, 95]
-1D574; [37, 05, 95]
-1D5A8; [37, 05, 95]
-1D5DC; [37, 05, 95]
-1D610; [37, 05, 95]
-1D644; [37, 05, 95]
-1D678; [37, 05, 95]
-24BE; [37, 05, 97]
-1F158; [37, 05, 97]
-2071; [37, 05, 27]
-1D62; [37, 05, 29]
-1D35; [37, 05, B9]
-1F138; [37, 05, B9]
-1F178; [37, 05, B9]
-00ED; [37, 05, 05][, 8D, 05]
-00CD; [37, 05, 8F][, 8D, 05]
-00EC; [37, 05, 05][, 8F, 05]
-00CC; [37, 05, 8F][, 8F, 05]
-012D; [37, 05, 05][, 91, 05]
-012C; [37, 05, 8F][, 91, 05]
-00EE; [37, 05, 05][, 93, 05]
-00CE; [37, 05, 8F][, 93, 05]
-01D0; [37, 05, 05][, 97, 05]
-01CF; [37, 05, 8F][, 97, 05]
-00EF; [37, 05, 05][, 9D, 05]
-00CF; [37, 05, 8F][, 9D, 05]
-1E2F; [37, 05, 05][, 9D, 05][, 8D, 05]
-1E2E; [37, 05, 8F][, 9D, 05][, 8D, 05]
-0129; [37, 05, 05][, A1, 05]
-0128; [37, 05, 8F][, A1, 05]
-0130; [37, 05, 8F][, A3, 05]
-012F; [37, 05, 05][, A9, 05]
-012E; [37, 05, 8F][, A9, 05]
-012B; [37, 05, 05][, AB, 05]
-012A; [37, 05, 8F][, AB, 05]
-1EC9; [37, 05, 05][, B7, 05]
-1EC8; [37, 05, 8F][, B7, 05]
-0209; [37, 05, 05][, B9, 05]
-0208; [37, 05, 8F][, B9, 05]
-020B; [37, 05, 05][, BD, 05]
-020A; [37, 05, 8F][, BD, 05]
-1ECB; [37, 05, 05][, C5, 05]
-1ECA; [37, 05, 8F][, C5, 05]
-1E2D; [37, 05, 05][, D0 0D, 05]
-1E2C; [37, 05, 8F][, D0 0D, 05]
-1F18B; [37, 05, B9][2B, 05, B9]
-1F194; [37, 05, B9][2D, 05, B9]
-2171; [37, 05, 09][37, 05, 3D]
-2161; [37, 05, 93][37, 05, 3D]
-2172; [37, 05, 09][37, 05, 09][37, 05, 3D]
-2162; [37, 05, 93][37, 05, 93][37, 05, 3D]
-0133; [37, 05, 09][39, 05, 09]
-0132; [37, 05, 93][39, 05, 93]
-33CC; [37, 05, 37][41, 05, 37]
-337A; [37, 05, B9][4F, 05, B9]
-2173; [37, 05, 09][51, 05, 3D]
-2163; [37, 05, 93][51, 05, 3D]
-2178; [37, 05, 09][55, 05, 3D]
-2168; [37, 05, 93][55, 05, 3D]
-
-0131; [38 40, 05, 05]
-1D6A4; [38 40, 05, 0B]
-
-026A; [38 42, 05, 05]
-1DA6; [38 42, 05, 27]
-
-A7FE; [38 44, 05, 05]
-
-1D09; [38 46, 05, 05]
-1D4E; [38 46, 05, 27]
-
-0268; [38 48, 05, 05]
-0197; [38 48, 05, 8F]
-1DA4; [38 48, 05, 27]
-
-1D7B; [38 4A, 05, 05]
-1DA7; [38 4A, 05, 27]
-
-1D96; [38 4C, 05, 05]
-
-0269; [38 4E, 05, 05]
-0196; [38 4E, 05, 8F]
-1DA5; [38 4E, 05, 27]
-
-1D7C; [38 50, 05, 05]
-
-006A; [39, 05, 05]
-FF4A; [39, 05, 07]
-2149; [39, 05, 0B]
-1D423; [39, 05, 0B]
-1D457; [39, 05, 0B]
-1D48B; [39, 05, 0B]
-1D4BF; [39, 05, 0B]
-1D4F3; [39, 05, 0B]
-1D527; [39, 05, 0B]
-1D55B; [39, 05, 0B]
-1D58F; [39, 05, 0B]
-1D5C3; [39, 05, 0B]
-1D5F7; [39, 05, 0B]
-1D62B; [39, 05, 0B]
-1D65F; [39, 05, 0B]
-1D693; [39, 05, 0B]
-24D9; [39, 05, 0D]
-004A; [39, 05, 8F]
-FF2A; [39, 05, 91]
-1D409; [39, 05, 95]
-1D43D; [39, 05, 95]
-1D471; [39, 05, 95]
-1D4A5; [39, 05, 95]
-1D4D9; [39, 05, 95]
-1D50D; [39, 05, 95]
-1D541; [39, 05, 95]
-1D575; [39, 05, 95]
-1D5A9; [39, 05, 95]
-1D5DD; [39, 05, 95]
-1D611; [39, 05, 95]
-1D645; [39, 05, 95]
-1D679; [39, 05, 95]
-24BF; [39, 05, 97]
-1F159; [39, 05, 97]
-02B2; [39, 05, 27]
-2C7C; [39, 05, 29]
-1D36; [39, 05, B9]
-1F139; [39, 05, B9]
-1F179; [39, 05, B9]
-0135; [39, 05, 05][, 93, 05]
-0134; [39, 05, 8F][, 93, 05]
-01F0; [39, 05, 05][, 97, 05]
-
-0237; [3A 40, 05, 05]
-1D6A5; [3A 40, 05, 0B]
-
-1D0A; [3A 42, 05, 05]
-
-0249; [3A 44, 05, 05]
-0248; [3A 44, 05, 8F]
-
-029D; [3A 46, 05, 05]
-1DA8; [3A 46, 05, 27]
-
-025F; [3A 48, 05, 05]
-1DA1; [3A 48, 05, 27]
-
-0284; [3A 4A, 05, 05]
-
-006B; [3B, 05, 05]
-FF4B; [3B, 05, 07]
-1DDC; [3B, 05, 09]
-1D424; [3B, 05, 0B]
-1D458; [3B, 05, 0B]
-1D48C; [3B, 05, 0B]
-1D4C0; [3B, 05, 0B]
-1D4F4; [3B, 05, 0B]
-1D528; [3B, 05, 0B]
-1D55C; [3B, 05, 0B]
-1D590; [3B, 05, 0B]
-1D5C4; [3B, 05, 0B]
-1D5F8; [3B, 05, 0B]
-1D62C; [3B, 05, 0B]
-1D660; [3B, 05, 0B]
-1D694; [3B, 05, 0B]
-24DA; [3B, 05, 0D]
-004B; [3B, 05, 8F]
-212A; [3B, 05, 8F]
-FF2B; [3B, 05, 91]
-1D40A; [3B, 05, 95]
-1D43E; [3B, 05, 95]
-1D472; [3B, 05, 95]
-1D4A6; [3B, 05, 95]
-1D4DA; [3B, 05, 95]
-1D50E; [3B, 05, 95]
-1D542; [3B, 05, 95]
-1D576; [3B, 05, 95]
-1D5AA; [3B, 05, 95]
-1D5DE; [3B, 05, 95]
-1D612; [3B, 05, 95]
-1D646; [3B, 05, 95]
-1D67A; [3B, 05, 95]
-24C0; [3B, 05, 97]
-1F15A; [3B, 05, 97]
-1D4F; [3B, 05, 27]
-2096; [3B, 05, 29]
-1D37; [3B, 05, B9]
-1F13A; [3B, 05, B9]
-1F17A; [3B, 05, B9]
-1E31; [3B, 05, 05][, 8D, 05]
-1E30; [3B, 05, 8F][, 8D, 05]
-01E9; [3B, 05, 05][, 97, 05]
-01E8; [3B, 05, 8F][, 97, 05]
-0137; [3B, 05, 05][, A7, 05]
-0136; [3B, 05, 8F][, A7, 05]
-A7A3; [3B, 05, 09][, B1, 09]
-A7A2; [3B, 05, 93][, B1, 09]
-1E33; [3B, 05, 05][, C5, 05]
-1E32; [3B, 05, 8F][, C5, 05]
-1E35; [3B, 05, 05][, D0 1D, 05]
-1E34; [3B, 05, 8F][, D0 1D, 05]
-3384; [3B, 05, 37][27, 05, B9]
-3385; [3B, 05, B9][29, 05, B9]
-3389; [3B, 05, 37][2B, 05, 37][27, 05, 37][3D, 05, 37]
-338F; [3B, 05, 37][33, 05, 37]
-3391; [3B, 05, 37][35, 05, B9][59, 05, 37]
-33CD; [3B, 05, B9][3B, 05, B9]
-3398; [3B, 05, 37][3D, 05, 37]
-339E; [3B, 05, 37][3F, 05, 37]
-33CE; [3B, 05, B9][3F, 05, B9]
-33A2; [3B, 05, 37][3F, 05, 37][16, 05, 37]
-33A6; [3B, 05, 37][3F, 05, 37][18, 05, 37]
-33AA; [3B, 05, 37][45, 05, B9][27, 05, 37]
-33CF; [3B, 05, 37][4D, 05, 37]
-33B8; [3B, 05, 37][51, 05, B9]
-33BE; [3B, 05, 37][53, 05, B9]
-33C0; [3B, 05, 37][5B 5A, 05, B9]
-
-1D0B; [3C 40, 05, 05]
-
-1D84; [3C 42, 05, 05]
-
-0199; [3C 44, 05, 05]
-0198; [3C 44, 05, 8F]
-
-2C6A; [3C 46, 05, 05]
-2C69; [3C 46, 05, 8F]
-
-A741; [3C 48, 05, 05]
-A740; [3C 48, 05, 8F]
-
-A743; [3C 4A, 05, 05]
-A742; [3C 4A, 05, 8F]
-
-A745; [3C 4C, 05, 05]
-A744; [3C 4C, 05, 8F]
-
-029E; [3C 4E, 05, 05]
-
-006C; [3D, 05, 05]
-FF4C; [3D, 05, 07]
-1DDD; [3D, 05, 09]
-217C; [3D, 05, 09]
-2113; [3D, 05, 0B]
-1D425; [3D, 05, 0B]
-1D459; [3D, 05, 0B]
-1D48D; [3D, 05, 0B]
-1D4C1; [3D, 05, 0B]
-1D4F5; [3D, 05, 0B]
-1D529; [3D, 05, 0B]
-1D55D; [3D, 05, 0B]
-1D591; [3D, 05, 0B]
-1D5C5; [3D, 05, 0B]
-1D5F9; [3D, 05, 0B]
-1D62D; [3D, 05, 0B]
-1D661; [3D, 05, 0B]
-1D695; [3D, 05, 0B]
-24DB; [3D, 05, 0D]
-004C; [3D, 05, 8F]
-FF2C; [3D, 05, 91]
-216C; [3D, 05, 93]
-2112; [3D, 05, 95]
-1D40B; [3D, 05, 95]
-1D43F; [3D, 05, 95]
-1D473; [3D, 05, 95]
-1D4DB; [3D, 05, 95]
-1D50F; [3D, 05, 95]
-1D543; [3D, 05, 95]
-1D577; [3D, 05, 95]
-1D5AB; [3D, 05, 95]
-1D5DF; [3D, 05, 95]
-1D613; [3D, 05, 95]
-1D647; [3D, 05, 95]
-1D67B; [3D, 05, 95]
-24C1; [3D, 05, 97]
-1F15B; [3D, 05, 97]
-02E1; [3D, 05, 27]
-2097; [3D, 05, 29]
-1D38; [3D, 05, B9]
-1F13B; [3D, 05, B9]
-1F17B; [3D, 05, B9]
-013A; [3D, 05, 05][, 8D, 05]
-0139; [3D, 05, 8F][, 8D, 05]
-013E; [3D, 05, 05][, 97, 05]
-013D; [3D, 05, 8F][, 97, 05]
-013C; [3D, 05, 05][, A7, 05]
-013B; [3D, 05, 8F][, A7, 05]
-1E37; [3D, 05, 05][, C5, 05]
-1E36; [3D, 05, 8F][, C5, 05]
-1E39; [3D, 05, 05][, C5, 05][, AB, 05]
-1E38; [3D, 05, 8F][, C5, 05][, AB, 05]
-1E3D; [3D, 05, 05][, CD, 05]
-1E3C; [3D, 05, 8F][, CD, 05]
-1E3B; [3D, 05, 05][, D0 1D, 05]
-1E3A; [3D, 05, 8F][, D0 1D, 05]
-0142; [3D, 05, 05][, D0 3D, 05]
-0141; [3D, 05, 8F][, D0 3D, 05]
-006C | 00B7; [, DB A9, 05]
-006C | 0387; [, DB A9, 05]
-0140; [3D, 05, 05][, DB A9, 05]
-004C | 00B7; [, DB A9, 05]
-004C | 0387; [, DB A9, 05]
-013F; [3D, 05, 8F][, DB A9, 05]
-01C9; [3D, 05, 09][39, 05, 09]
-01C8; [3D, 05, 93][39, 05, 09]
-01C7; [3D, 05, 93][39, 05, 93]
-1EFB; [3D, 05, 09][3D, 05, 09]
-1EFA; [3D, 05, 93][3D, 05, 93]
-33D0; [3D, 05, 37][3F, 05, 37]
-33D1; [3D, 05, 37][41, 05, 37]
-33D2; [3D, 05, 37][43, 05, 37][33, 05, 37]
-02AA; [3D, 05, 09][4B, 05, 09]
-32CF; [3D, 05, B9][4D, 05, B9][2D, 05, B9]
-33D3; [3D, 05, 37][55, 05, 37]
-02AB; [3D, 05, 09][59, 05, 09]
-
-029F; [3E 40, 05, 05]
-1DDE; [3E 40, 05, 09]
-1DAB; [3E 40, 05, 27]
-
-A747; [3E 42, 05, 05]
-A746; [3E 42, 05, 8F]
-
-1D0C; [3E 44, 05, 05]
-
-A749; [3E 46, 05, 05]
-A748; [3E 46, 05, 8F]
-
-019A; [3E 48, 05, 05]
-023D; [3E 48, 05, 8F]
-
-2C61; [3E 4A, 05, 05]
-2C60; [3E 4A, 05, 8F]
-
-026B; [3E 4C, 05, 05]
-2C62; [3E 4C, 05, 8F]
-
-026C; [3E 4E, 05, 05]
-
-1D85; [3E 50, 05, 05]
-1DAA; [3E 50, 05, 27]
-
-026D; [3E 52, 05, 05]
-1DA9; [3E 52, 05, 27]
-
-A78E; [3E 54, 05, 05]
-
-0234; [3E 56, 05, 05]
-
-A772; [3E 58, 05, 05]
-
-026E; [3E 5A, 05, 05]
-
-A781; [3E 5C, 05, 05]
-A780; [3E 5C, 05, 8F]
-
-019B; [3E 5E, 05, 05]
-
-028E; [3E 60, 05, 05]
-
-006D; [3F, 05, 05]
-FF4D; [3F, 05, 07]
-036B; [3F, 05, 09]
-217F; [3F, 05, 09]
-1D426; [3F, 05, 0B]
-1D45A; [3F, 05, 0B]
-1D48E; [3F, 05, 0B]
-1D4C2; [3F, 05, 0B]
-1D4F6; [3F, 05, 0B]
-1D52A; [3F, 05, 0B]
-1D55E; [3F, 05, 0B]
-1D592; [3F, 05, 0B]
-1D5C6; [3F, 05, 0B]
-1D5FA; [3F, 05, 0B]
-1D62E; [3F, 05, 0B]
-1D662; [3F, 05, 0B]
-1D696; [3F, 05, 0B]
-24DC; [3F, 05, 0D]
-004D; [3F, 05, 8F]
-FF2D; [3F, 05, 91]
-216F; [3F, 05, 93]
-2133; [3F, 05, 95]
-1D40C; [3F, 05, 95]
-1D440; [3F, 05, 95]
-1D474; [3F, 05, 95]
-1D4DC; [3F, 05, 95]
-1D510; [3F, 05, 95]
-1D544; [3F, 05, 95]
-1D578; [3F, 05, 95]
-1D5AC; [3F, 05, 95]
-1D5E0; [3F, 05, 95]
-1D614; [3F, 05, 95]
-1D648; [3F, 05, 95]
-1D67C; [3F, 05, 95]
-24C2; [3F, 05, 97]
-1F15C; [3F, 05, 97]
-1D50; [3F, 05, 27]
-2098; [3F, 05, 29]
-1D39; [3F, 05, B9]
-1F13C; [3F, 05, B9]
-1F17C; [3F, 05, B9]
-1E3F; [3F, 05, 05][, 8D, 05]
-1E3E; [3F, 05, 8F][, 8D, 05]
-1E41; [3F, 05, 05][, A3, 05]
-1E40; [3F, 05, 8F][, A3, 05]
-1E43; [3F, 05, 05][, C5, 05]
-1E42; [3F, 05, 8F][, C5, 05]
-33A7; [3F, 05, 37][0D 75 24, 05, 37][4B, 05, 37]
-33A8; [3F, 05, 37][0D 75 24, 05, 37][4B, 05, 37][16, 05, 37]
-33A1; [3F, 05, 37][16, 05, 37]
-33A5; [3F, 05, 37][18, 05, 37]
-3383; [3F, 05, 37][27, 05, B9]
-33D4; [3F, 05, 37][29, 05, 37]
-3386; [3F, 05, B9][29, 05, B9]
-1F16A; [3F, 05, 27][2B, 05, 27]
-1F16B; [3F, 05, 27][2D, 05, 27]
-338E; [3F, 05, 37][33, 05, 37]
-3392; [3F, 05, B9][35, 05, B9][59, 05, 37]
-33D5; [3F, 05, 37][37, 05, 37][3D, 05, 37]
-3396; [3F, 05, 37][3D, 05, 37]
-339C; [3F, 05, 37][3F, 05, 37]
-339F; [3F, 05, 37][3F, 05, 37][16, 05, 37]
-33A3; [3F, 05, 37][3F, 05, 37][18, 05, 37]
-33D6; [3F, 05, 37][43, 05, 37][3D, 05, 37]
-33AB; [3F, 05, B9][45, 05, B9][27, 05, 37]
-33B3; [3F, 05, 37][4B, 05, 37]
-33B7; [3F, 05, 37][51, 05, B9]
-33B9; [3F, 05, B9][51, 05, B9]
-1F14B; [3F, 05, B9][51, 05, B9]
-33BD; [3F, 05, 37][53, 05, B9]
-33BF; [3F, 05, B9][53, 05, B9]
-33C1; [3F, 05, B9][5B 5A, 05, B9]
-
-1D0D; [40 40, 05, 05]
-1DDF; [40 40, 05, 09]
-
-1D6F; [40 42, 05, 05]
-
-1D86; [40 44, 05, 05]
-
-0271; [40 46, 05, 05]
-2C6E; [40 46, 05, 8F]
-1DAC; [40 46, 05, 27]
-
-A7FD; [40 48, 05, 05]
-
-A7FF; [40 4A, 05, 05]
-
-A773; [40 4C, 05, 05]
-
-006E; [41, 05, 05]
-FF4E; [41, 05, 07]
-1DE0; [41, 05, 09]
-1D427; [41, 05, 0B]
-1D45B; [41, 05, 0B]
-1D48F; [41, 05, 0B]
-1D4C3; [41, 05, 0B]
-1D4F7; [41, 05, 0B]
-1D52B; [41, 05, 0B]
-1D55F; [41, 05, 0B]
-1D593; [41, 05, 0B]
-1D5C7; [41, 05, 0B]
-1D5FB; [41, 05, 0B]
-1D62F; [41, 05, 0B]
-1D663; [41, 05, 0B]
-1D697; [41, 05, 0B]
-24DD; [41, 05, 0D]
-004E; [41, 05, 8F]
-FF2E; [41, 05, 91]
-2115; [41, 05, 95]
-1D40D; [41, 05, 95]
-1D441; [41, 05, 95]
-1D475; [41, 05, 95]
-1D4A9; [41, 05, 95]
-1D4DD; [41, 05, 95]
-1D511; [41, 05, 95]
-1D579; [41, 05, 95]
-1D5AD; [41, 05, 95]
-1D5E1; [41, 05, 95]
-1D615; [41, 05, 95]
-1D649; [41, 05, 95]
-1D67D; [41, 05, 95]
-24C3; [41, 05, 97]
-1F15D; [41, 05, 97]
-207F; [41, 05, 27]
-2099; [41, 05, 29]
-1D3A; [41, 05, B9]
-1F13D; [41, 05, B9]
-1F17D; [41, 05, B9]
-0144; [41, 05, 05][, 8D, 05]
-0143; [41, 05, 8F][, 8D, 05]
-01F9; [41, 05, 05][, 8F, 05]
-01F8; [41, 05, 8F][, 8F, 05]
-0148; [41, 05, 05][, 97, 05]
-0147; [41, 05, 8F][, 97, 05]
-00F1; [41, 05, 05][, A1, 05]
-00D1; [41, 05, 8F][, A1, 05]
-1E45; [41, 05, 05][, A3, 05]
-1E44; [41, 05, 8F][, A3, 05]
-0146; [41, 05, 05][, A7, 05]
-0145; [41, 05, 8F][, A7, 05]
-A7A5; [41, 05, 09][, B1, 09]
-A7A4; [41, 05, 93][, B1, 09]
-1E47; [41, 05, 05][, C5, 05]
-1E46; [41, 05, 8F][, C5, 05]
-1E4B; [41, 05, 05][, CD, 05]
-1E4A; [41, 05, 8F][, CD, 05]
-1E49; [41, 05, 05][, D0 1D, 05]
-1E48; [41, 05, 8F][, D0 1D, 05]
-3381; [41, 05, 37][27, 05, B9]
-1F195; [41, 05, B9][2F, 05, B9][53, 05, B9]
-338B; [41, 05, 37][31, 05, B9]
-1F196; [41, 05, B9][33, 05, B9]
-01CC; [41, 05, 09][39, 05, 09]
-01CB; [41, 05, 93][39, 05, 09]
-01CA; [41, 05, 93][39, 05, 93]
-339A; [41, 05, 37][3F, 05, 37]
-2116; [41, 05, 93][43, 05, 09]
-33B1; [41, 05, 37][4B, 05, 37]
-33B5; [41, 05, 37][51, 05, B9]
-33BB; [41, 05, 37][53, 05, B9]
-
-0274; [42 40, 05, 05]
-1DE1; [42 40, 05, 09]
-1DB0; [42 40, 05, 27]
-
-1D3B; [42 42, 05, 05]
-
-1D0E; [42 44, 05, 05]
-
-1D70; [42 46, 05, 05]
-
-0272; [42 48, 05, 05]
-019D; [42 48, 05, 8F]
-1DAE; [42 48, 05, 27]
-
-019E; [42 4A, 05, 05]
-0220; [42 4A, 05, 8F]
-
-A791; [42 4C, 05, 05]
-A790; [42 4C, 05, 8F]
-
-1D87; [42 4E, 05, 05]
-
-0273; [42 50, 05, 05]
-1DAF; [42 50, 05, 27]
-
-0235; [42 52, 05, 05]
-
-A774; [42 54, 05, 05]
-
-014B; [42 56, 05, 05]
-014A; [42 56, 05, 8F]
-1D51; [42 56, 05, 27]
-
-006F; [43, 05, 05]
-FF4F; [43, 05, 07]
-0366; [43, 05, 09]
-2134; [43, 05, 0B]
-1D428; [43, 05, 0B]
-1D45C; [43, 05, 0B]
-1D490; [43, 05, 0B]
-1D4F8; [43, 05, 0B]
-1D52C; [43, 05, 0B]
-1D560; [43, 05, 0B]
-1D594; [43, 05, 0B]
-1D5C8; [43, 05, 0B]
-1D5FC; [43, 05, 0B]
-1D630; [43, 05, 0B]
-1D664; [43, 05, 0B]
-1D698; [43, 05, 0B]
-24DE; [43, 05, 0D]
-004F; [43, 05, 8F]
-FF2F; [43, 05, 91]
-1D40E; [43, 05, 95]
-1D442; [43, 05, 95]
-1D476; [43, 05, 95]
-1D4AA; [43, 05, 95]
-1D4DE; [43, 05, 95]
-1D512; [43, 05, 95]
-1D546; [43, 05, 95]
-1D57A; [43, 05, 95]
-1D5AE; [43, 05, 95]
-1D5E2; [43, 05, 95]
-1D616; [43, 05, 95]
-1D64A; [43, 05, 95]
-1D67E; [43, 05, 95]
-24C4; [43, 05, 97]
-1F15E; [43, 05, 97]
-00BA; [43, 05, 27]
-1D52; [43, 05, 27]
-2092; [43, 05, 29]
-1D3C; [43, 05, B9]
-1F13E; [43, 05, B9]
-1F17E; [43, 05, B9]
-00F3; [43, 05, 05][, 8D, 05]
-00D3; [43, 05, 8F][, 8D, 05]
-00F2; [43, 05, 05][, 8F, 05]
-00D2; [43, 05, 8F][, 8F, 05]
-014F; [43, 05, 05][, 91, 05]
-014E; [43, 05, 8F][, 91, 05]
-00F4; [43, 05, 05][, 93, 05]
-00D4; [43, 05, 8F][, 93, 05]
-1ED1; [43, 05, 05][, 93, 05][, 8D, 05]
-1ED0; [43, 05, 8F][, 93, 05][, 8D, 05]
-1ED3; [43, 05, 05][, 93, 05][, 8F, 05]
-1ED2; [43, 05, 8F][, 93, 05][, 8F, 05]
-1ED7; [43, 05, 05][, 93, 05][, A1, 05]
-1ED6; [43, 05, 8F][, 93, 05][, A1, 05]
-1ED5; [43, 05, 05][, 93, 05][, B7, 05]
-1ED4; [43, 05, 8F][, 93, 05][, B7, 05]
-01D2; [43, 05, 05][, 97, 05]
-01D1; [43, 05, 8F][, 97, 05]
-00F6; [43, 05, 05][, 9D, 05]
-00D6; [43, 05, 8F][, 9D, 05]
-022B; [43, 05, 05][, 9D, 05][, AB, 05]
-022A; [43, 05, 8F][, 9D, 05][, AB, 05]
-0151; [43, 05, 05][, 9F, 05]
-0150; [43, 05, 8F][, 9F, 05]
-00F5; [43, 05, 05][, A1, 05]
-00D5; [43, 05, 8F][, A1, 05]
-1E4D; [43, 05, 05][, A1, 05][, 8D, 05]
-1E4C; [43, 05, 8F][, A1, 05][, 8D, 05]
-1E4F; [43, 05, 05][, A1, 05][, 9D, 05]
-1E4E; [43, 05, 8F][, A1, 05][, 9D, 05]
-022D; [43, 05, 05][, A1, 05][, AB, 05]
-022C; [43, 05, 8F][, A1, 05][, AB, 05]
-022F; [43, 05, 05][, A3, 05]
-022E; [43, 05, 8F][, A3, 05]
-0231; [43, 05, 05][, A3, 05][, AB, 05]
-0230; [43, 05, 8F][, A3, 05][, AB, 05]
-00F8; [43, 05, 05][, A5, 05]
-00D8; [43, 05, 8F][, A5, 05]
-01FF; [43, 05, 05][, A5, 05][, 8D, 05]
-01FE; [43, 05, 8F][, A5, 05][, 8D, 05]
-01EB; [43, 05, 05][, A9, 05]
-01EA; [43, 05, 8F][, A9, 05]
-01ED; [43, 05, 05][, A9, 05][, AB, 05]
-01EC; [43, 05, 8F][, A9, 05][, AB, 05]
-014D; [43, 05, 05][, AB, 05]
-014C; [43, 05, 8F][, AB, 05]
-1E53; [43, 05, 05][, AB, 05][, 8D, 05]
-1E52; [43, 05, 8F][, AB, 05][, 8D, 05]
-1E51; [43, 05, 05][, AB, 05][, 8F, 05]
-1E50; [43, 05, 8F][, AB, 05][, 8F, 05]
-1ECF; [43, 05, 05][, B7, 05]
-1ECE; [43, 05, 8F][, B7, 05]
-020D; [43, 05, 05][, B9, 05]
-020C; [43, 05, 8F][, B9, 05]
-020F; [43, 05, 05][, BD, 05]
-020E; [43, 05, 8F][, BD, 05]
-01A1; [43, 05, 05][, BF, 05]
-01A0; [43, 05, 8F][, BF, 05]
-1EDB; [43, 05, 05][, BF, 05][, 8D, 05]
-1EDA; [43, 05, 8F][, BF, 05][, 8D, 05]
-1EDD; [43, 05, 05][, BF, 05][, 8F, 05]
-1EDC; [43, 05, 8F][, BF, 05][, 8F, 05]
-1EE1; [43, 05, 05][, BF, 05][, A1, 05]
-1EE0; [43, 05, 8F][, BF, 05][, A1, 05]
-1EDF; [43, 05, 05][, BF, 05][, B7, 05]
-1EDE; [43, 05, 8F][, BF, 05][, B7, 05]
-1EE3; [43, 05, 05][, BF, 05][, C5, 05]
-1EE2; [43, 05, 8F][, BF, 05][, C5, 05]
-1ECD; [43, 05, 05][, C5, 05]
-1ECC; [43, 05, 8F][, C5, 05]
-1ED9; [43, 05, 05][, C5, 05][, 93, 05]
-1ED8; [43, 05, 8F][, C5, 05][, 93, 05]
-0153; [43, 05, 09][, DB A9, 09][2F, 05, 09]
-0152; [43, 05, 93][, DB A9, 09][2F, 05, 93]
-A7F9; [43, 05, 27][, DB A9, 27][2F, 05, 27]
-1F197; [43, 05, B9][3B, 05, B9]
-A74F; [43, 05, 09][43, 05, 09]
-A74E; [43, 05, 93][43, 05, 93]
-3375; [43, 05, 37][51, 05, B9]
-
-1D0F; [44 40, 05, 05]
-
-1D11; [44 42, 05, 05]
-
-0276; [44 44, 05, 05]
-
-1D14; [44 46, 05, 05]
-
-1D13; [44 48, 05, 05]
-
-0254; [44 4A, 05, 05]
-0186; [44 4A, 05, 8F]
-1D53; [44 4A, 05, 27]
-
-1D10; [44 4C, 05, 05]
-
-1D12; [44 4E, 05, 05]
-
-1D97; [44 50, 05, 05]
-
-A74D; [44 52, 05, 05]
-A74C; [44 52, 05, 8F]
-
-1D16; [44 54, 05, 05]
-1D54; [44 54, 05, 27]
-
-1D17; [44 56, 05, 05]
-1D55; [44 56, 05, 27]
-
-2C7A; [44 58, 05, 05]
-
-0275; [44 5A, 05, 05]
-019F; [44 5A, 05, 8F]
-1DB1; [44 5A, 05, 27]
-
-A74B; [44 5C, 05, 05]
-A74A; [44 5C, 05, 8F]
-
-0277; [44 5E, 05, 05]
-
-0223; [44 60, 05, 05]
-0222; [44 60, 05, 8F]
-1D3D; [44 60, 05, B9]
-
-1D15; [44 62, 05, 05]
-
-0070; [45, 05, 05]
-FF50; [45, 05, 07]
-1D429; [45, 05, 0B]
-1D45D; [45, 05, 0B]
-1D491; [45, 05, 0B]
-1D4C5; [45, 05, 0B]
-1D4F9; [45, 05, 0B]
-1D52D; [45, 05, 0B]
-1D561; [45, 05, 0B]
-1D595; [45, 05, 0B]
-1D5C9; [45, 05, 0B]
-1D5FD; [45, 05, 0B]
-1D631; [45, 05, 0B]
-1D665; [45, 05, 0B]
-1D699; [45, 05, 0B]
-24DF; [45, 05, 0D]
-0050; [45, 05, 8F]
-FF30; [45, 05, 91]
-2119; [45, 05, 95]
-1D40F; [45, 05, 95]
-1D443; [45, 05, 95]
-1D477; [45, 05, 95]
-1D4AB; [45, 05, 95]
-1D4DF; [45, 05, 95]
-1D513; [45, 05, 95]
-1D57B; [45, 05, 95]
-1D5AF; [45, 05, 95]
-1D5E3; [45, 05, 95]
-1D617; [45, 05, 95]
-1D64B; [45, 05, 95]
-1D67F; [45, 05, 95]
-24C5; [45, 05, 97]
-1F15F; [45, 05, 97]
-1D56; [45, 05, 27]
-209A; [45, 05, 29]
-1D3E; [45, 05, B9]
-1F13F; [45, 05, B9]
-1F17F; [45, 05, B9]
-1F18A; [45, 05, B9]
-1E55; [45, 05, 05][, 8D, 05]
-1E54; [45, 05, 8F][, 8D, 05]
-1E57; [45, 05, 05][, A3, 05]
-1E56; [45, 05, 8F][, A3, 05]
-33D8; [45, 05, 37][09, 05, 37][3F, 05, 37][09, 05, 37]
-3380; [45, 05, 37][27, 05, B9]
-33A9; [45, 05, B9][27, 05, 37]
-1F18C; [45, 05, B9][27, 05, B9]
-3376; [45, 05, 37][2B, 05, 37]
-338A; [45, 05, 37][31, 05, B9]
-33D7; [45, 05, B9][35, 05, B9]
-33D9; [45, 05, B9][45, 05, B9][3F, 05, B9]
-1F14E; [45, 05, B9][45, 05, B9][51, 05, B9]
-33DA; [45, 05, B9][49, 05, B9]
-33B0; [45, 05, 37][4B, 05, 37]
-3250; [45, 05, B9][4D, 05, B9][2F, 05, B9]
-33B4; [45, 05, 37][51, 05, B9]
-33BA; [45, 05, 37][53, 05, B9]
-
-1D18; [46 40, 05, 05]
-
-1D7D; [46 42, 05, 05]
-2C63; [46 42, 05, 8F]
-
-A751; [46 44, 05, 05]
-A750; [46 44, 05, 8F]
-
-1D71; [46 46, 05, 05]
-
-1D88; [46 48, 05, 05]
-
-01A5; [46 4A, 05, 05]
-01A4; [46 4A, 05, 8F]
-
-A753; [46 4C, 05, 05]
-A752; [46 4C, 05, 8F]
-
-A755; [46 4E, 05, 05]
-A754; [46 4E, 05, 8F]
-
-A7FC; [46 50, 05, 05]
-
-0278; [46 52, 05, 05]
-1DB2; [46 52, 05, 27]
-
-2C77; [46 54, 05, 05]
-
-0071; [47, 05, 05]
-FF51; [47, 05, 07]
-1D42A; [47, 05, 0B]
-1D45E; [47, 05, 0B]
-1D492; [47, 05, 0B]
-1D4C6; [47, 05, 0B]
-1D4FA; [47, 05, 0B]
-1D52E; [47, 05, 0B]
-1D562; [47, 05, 0B]
-1D596; [47, 05, 0B]
-1D5CA; [47, 05, 0B]
-1D5FE; [47, 05, 0B]
-1D632; [47, 05, 0B]
-1D666; [47, 05, 0B]
-1D69A; [47, 05, 0B]
-24E0; [47, 05, 0D]
-0051; [47, 05, 8F]
-FF31; [47, 05, 91]
-211A; [47, 05, 95]
-1D410; [47, 05, 95]
-1D444; [47, 05, 95]
-1D478; [47, 05, 95]
-1D4AC; [47, 05, 95]
-1D4E0; [47, 05, 95]
-1D514; [47, 05, 95]
-1D57C; [47, 05, 95]
-1D5B0; [47, 05, 95]
-1D5E4; [47, 05, 95]
-1D618; [47, 05, 95]
-1D64C; [47, 05, 95]
-1D680; [47, 05, 95]
-24C6; [47, 05, 97]
-1F160; [47, 05, 97]
-1F140; [47, 05, B9]
-1F180; [47, 05, B9]
-0239; [47, 05, 09][45, 05, 09]
-
-A757; [48 40, 05, 05]
-A756; [48 40, 05, 8F]
-
-A759; [48 42, 05, 05]
-A758; [48 42, 05, 8F]
-
-02A0; [48 44, 05, 05]
-
-024B; [48 46, 05, 05]
-024A; [48 46, 05, 8F]
-
-0138; [48 48, 05, 05]
-
-0072; [49, 05, 05]
-FF52; [49, 05, 07]
-036C; [49, 05, 09]
-1DCA; [49, 05, 09]
-1D42B; [49, 05, 0B]
-1D45F; [49, 05, 0B]
-1D493; [49, 05, 0B]
-1D4C7; [49, 05, 0B]
-1D4FB; [49, 05, 0B]
-1D52F; [49, 05, 0B]
-1D563; [49, 05, 0B]
-1D597; [49, 05, 0B]
-1D5CB; [49, 05, 0B]
-1D5FF; [49, 05, 0B]
-1D633; [49, 05, 0B]
-1D667; [49, 05, 0B]
-1D69B; [49, 05, 0B]
-24E1; [49, 05, 0D]
-0052; [49, 05, 8F]
-FF32; [49, 05, 91]
-211B; [49, 05, 95]
-211C; [49, 05, 95]
-211D; [49, 05, 95]
-1D411; [49, 05, 95]
-1D445; [49, 05, 95]
-1D479; [49, 05, 95]
-1D4E1; [49, 05, 95]
-1D57D; [49, 05, 95]
-1D5B1; [49, 05, 95]
-1D5E5; [49, 05, 95]
-1D619; [49, 05, 95]
-1D64D; [49, 05, 95]
-1D681; [49, 05, 95]
-24C7; [49, 05, 97]
-1F12C; [49, 05, 97]
-1F161; [49, 05, 97]
-02B3; [49, 05, 27]
-1D63; [49, 05, 29]
-1D3F; [49, 05, B9]
-1F141; [49, 05, B9]
-1F181; [49, 05, B9]
-0155; [49, 05, 05][, 8D, 05]
-0154; [49, 05, 8F][, 8D, 05]
-0159; [49, 05, 05][, 97, 05]
-0158; [49, 05, 8F][, 97, 05]
-1E59; [49, 05, 05][, A3, 05]
-1E58; [49, 05, 8F][, A3, 05]
-0157; [49, 05, 05][, A7, 05]
-0156; [49, 05, 8F][, A7, 05]
-A7A7; [49, 05, 09][, B1, 09]
-A7A6; [49, 05, 93][, B1, 09]
-0211; [49, 05, 05][, B9, 05]
-0210; [49, 05, 8F][, B9, 05]
-0213; [49, 05, 05][, BD, 05]
-0212; [49, 05, 8F][, BD, 05]
-1E5B; [49, 05, 05][, C5, 05]
-1E5A; [49, 05, 8F][, C5, 05]
-1E5D; [49, 05, 05][, C5, 05][, AB, 05]
-1E5C; [49, 05, 8F][, C5, 05][, AB, 05]
-1E5F; [49, 05, 05][, D0 1D, 05]
-1E5E; [49, 05, 8F][, D0 1D, 05]
-A783; [49, 05, 09][, DB B9, 09]
-A782; [49, 05, 93][, DB B9, 09]
-33AD; [49, 05, 37][27, 05, 37][2D, 05, 37]
-33AE; [49, 05, 37][27, 05, 37][2D, 05, 37][0D 75 24, 05, 37][4B, 05, 37]
-33AF; [49, 05, 37][27, 05, 37][2D, 05, 37][0D 75 24, 05, 37][4B, 05, 37][16, 05, 37]
-
-0280; [4A 40, 05, 05]
-1DE2; [4A 40, 05, 09]
-01A6; [4A 40, 05, 8F]
-
-A75B; [4A 42, 05, 05]
-1DE3; [4A 42, 05, 09]
-A75A; [4A 42, 05, 8F]
-
-1D19; [4A 44, 05, 05]
-
-024D; [4A 46, 05, 05]
-024C; [4A 46, 05, 8F]
-
-1D72; [4A 48, 05, 05]
-
-0279; [4A 4A, 05, 05]
-02B4; [4A 4A, 05, 27]
-
-1D1A; [4A 4C, 05, 05]
-
-027A; [4A 4E, 05, 05]
-
-1D89; [4A 50, 05, 05]
-
-027B; [4A 52, 05, 05]
-02B5; [4A 52, 05, 27]
-
-2C79; [4A 54, 05, 05]
-
-027C; [4A 56, 05, 05]
-
-027D; [4A 58, 05, 05]
-2C64; [4A 58, 05, 8F]
-
-027E; [4A 5A, 05, 05]
-
-1D73; [4A 5C, 05, 05]
-
-027F; [4A 5E, 05, 05]
-
-0281; [4A 60, 05, 05]
-02B6; [4A 60, 05, 27]
-
-A775; [4A 62, 05, 05]
-
-A776; [4A 64, 05, 05]
-
-A75D; [4A 66, 05, 05]
-A75C; [4A 66, 05, 8F]
-
-0073; [4B, 05, 05]
-FF53; [4B, 05, 07]
-1DE4; [4B, 05, 09]
-1D42C; [4B, 05, 0B]
-1D460; [4B, 05, 0B]
-1D494; [4B, 05, 0B]
-1D4C8; [4B, 05, 0B]
-1D4FC; [4B, 05, 0B]
-1D530; [4B, 05, 0B]
-1D564; [4B, 05, 0B]
-1D598; [4B, 05, 0B]
-1D5CC; [4B, 05, 0B]
-1D600; [4B, 05, 0B]
-1D634; [4B, 05, 0B]
-1D668; [4B, 05, 0B]
-1D69C; [4B, 05, 0B]
-24E2; [4B, 05, 0D]
-0053; [4B, 05, 8F]
-FF33; [4B, 05, 91]
-1D412; [4B, 05, 95]
-1D446; [4B, 05, 95]
-1D47A; [4B, 05, 95]
-1D4AE; [4B, 05, 95]
-1D4E2; [4B, 05, 95]
-1D516; [4B, 05, 95]
-1D54A; [4B, 05, 95]
-1D57E; [4B, 05, 95]
-1D5B2; [4B, 05, 95]
-1D5E6; [4B, 05, 95]
-1D61A; [4B, 05, 95]
-1D64E; [4B, 05, 95]
-1D682; [4B, 05, 95]
-24C8; [4B, 05, 97]
-1F162; [4B, 05, 97]
-02E2; [4B, 05, 27]
-209B; [4B, 05, 29]
-1F142; [4B, 05, B9]
-1F182; [4B, 05, B9]
-015B; [4B, 05, 05][, 8D, 05]
-015A; [4B, 05, 8F][, 8D, 05]
-1E65; [4B, 05, 05][, 8D, 05][, A3, 05]
-1E64; [4B, 05, 8F][, 8D, 05][, A3, 05]
-015D; [4B, 05, 05][, 93, 05]
-015C; [4B, 05, 8F][, 93, 05]
-0161; [4B, 05, 05][, 97, 05]
-0160; [4B, 05, 8F][, 97, 05]
-1E67; [4B, 05, 05][, 97, 05][, A3, 05]
-1E66; [4B, 05, 8F][, 97, 05][, A3, 05]
-1E61; [4B, 05, 05][, A3, 05]
-1E60; [4B, 05, 8F][, A3, 05]
-015F; [4B, 05, 05][, A7, 05]
-015E; [4B, 05, 8F][, A7, 05]
-A7A9; [4B, 05, 09][, B1, 09]
-A7A8; [4B, 05, 93][, B1, 09]
-1E63; [4B, 05, 05][, C5, 05]
-1E62; [4B, 05, 8F][, C5, 05]
-1E69; [4B, 05, 05][, C5, 05][, A3, 05]
-1E68; [4B, 05, 8F][, C5, 05][, A3, 05]
-0219; [4B, 05, 05][, CB, 05]
-0218; [4B, 05, 8F][, CB, 05]
-017F; [4B, 05, 09][, DB B9, 09]
-1DE5; [4B, 05, 09][, DB B9, 09]
-A785; [4B, 05, 09][, DB B9, 09]
-A784; [4B, 05, 93][, DB B9, 09]
-1E9B; [4B, 05, 09][, DB B9, 09][, A3, 05]
-1F18D; [4B, 05, B9][27, 05, B9]
-1F14C; [4B, 05, B9][2D, 05, B9]
-2120; [4B, 05, 27][3F, 05, 27]
-1F198; [4B, 05, B9][43, 05, B9][4B, 05, B9]
-33DB; [4B, 05, 37][49, 05, 37]
-1F14D; [4B, 05, B9][4B, 05, B9]
-00DF; [4B, 05, 09][, DB A9, 09][4B, 05, 09]
-1E9E; [4B, 05, 93][, DB A9, 09][4B, 05, 93]
-FB06; [4B, 05, 09][4D, 05, 09]
-FB05; [4B, 05, 09][, DB B9, 09][4D, 05, 09]
-33DC; [4B, 05, B9][51, 05, 37]
-
-A731; [4C 40, 05, 05]
-
-1D74; [4C 42, 05, 05]
-
-1D8A; [4C 44, 05, 05]
-
-0282; [4C 46, 05, 05]
-1DB3; [4C 46, 05, 27]
-
-023F; [4C 48, 05, 05]
-2C7E; [4C 48, 05, 8F]
-
-1E9C; [4C 4A, 05, 05]
-
-1E9D; [4C 4C, 05, 05]
-
-0283; [4C 4E, 05, 05]
-01A9; [4C 4E, 05, 8F]
-1DB4; [4C 4E, 05, 27]
-
-1D8B; [4C 50, 05, 05]
-
-01AA; [4C 52, 05, 05]
-
-0285; [4C 54, 05, 05]
-
-1D98; [4C 56, 05, 05]
-
-0286; [4C 58, 05, 05]
-
-0074; [4D, 05, 05]
-FF54; [4D, 05, 07]
-036D; [4D, 05, 09]
-1D42D; [4D, 05, 0B]
-1D461; [4D, 05, 0B]
-1D495; [4D, 05, 0B]
-1D4C9; [4D, 05, 0B]
-1D4FD; [4D, 05, 0B]
-1D531; [4D, 05, 0B]
-1D565; [4D, 05, 0B]
-1D599; [4D, 05, 0B]
-1D5CD; [4D, 05, 0B]
-1D601; [4D, 05, 0B]
-1D635; [4D, 05, 0B]
-1D669; [4D, 05, 0B]
-1D69D; [4D, 05, 0B]
-24E3; [4D, 05, 0D]
-0054; [4D, 05, 8F]
-FF34; [4D, 05, 91]
-1D413; [4D, 05, 95]
-1D447; [4D, 05, 95]
-1D47B; [4D, 05, 95]
-1D4AF; [4D, 05, 95]
-1D4E3; [4D, 05, 95]
-1D517; [4D, 05, 95]
-1D54B; [4D, 05, 95]
-1D57F; [4D, 05, 95]
-1D5B3; [4D, 05, 95]
-1D5E7; [4D, 05, 95]
-1D61B; [4D, 05, 95]
-1D64F; [4D, 05, 95]
-1D683; [4D, 05, 95]
-24C9; [4D, 05, 97]
-1F163; [4D, 05, 97]
-1D57; [4D, 05, 27]
-209C; [4D, 05, 29]
-1D40; [4D, 05, B9]
-1F143; [4D, 05, B9]
-1F183; [4D, 05, B9]
-0165; [4D, 05, 05][, 97, 05]
-0164; [4D, 05, 8F][, 97, 05]
-1E97; [4D, 05, 05][, 9D, 05]
-1E6B; [4D, 05, 05][, A3, 05]
-1E6A; [4D, 05, 8F][, A3, 05]
-0163; [4D, 05, 05][, A7, 05]
-0162; [4D, 05, 8F][, A7, 05]
-1E6D; [4D, 05, 05][, C5, 05]
-1E6C; [4D, 05, 8F][, C5, 05]
-021B; [4D, 05, 05][, CB, 05]
-021A; [4D, 05, 8F][, CB, 05]
-1E71; [4D, 05, 05][, CD, 05]
-1E70; [4D, 05, 8F][, CD, 05]
-1E6F; [4D, 05, 05][, D0 1D, 05]
-1E6E; [4D, 05, 8F][, D0 1D, 05]
-A787; [4D, 05, 09][, DB B9, 09]
-A786; [4D, 05, 93][, DB B9, 09]
-02A8; [4D, 05, 09][2C 48, 05, 09]
-2121; [4D, 05, 93][2F, 05, 93][3D, 05, 93]
-1D7A; [4D, 05, 09][, DB A9, 09][35, 05, 09]
-3394; [4D, 05, B9][35, 05, B9][59, 05, 37]
-2122; [4D, 05, 27][3F, 05, 27]
-01BE; [4D, 05, 09][4B, 05, 09]
-02A6; [4D, 05, 09][4B, 05, 09]
-02A7; [4D, 05, 09][4C 4E, 05, 09]
-A729; [4D, 05, 09][59, 05, 09]
-A728; [4D, 05, 93][59, 05, 09]
-
-1D1B; [4E 40, 05, 05]
-
-0167; [4E 42, 05, 05]
-0166; [4E 42, 05, 8F]
-
-2C66; [4E 44, 05, 05]
-023E; [4E 44, 05, 8F]
-
-1D75; [4E 46, 05, 05]
-
-01AB; [4E 48, 05, 05]
-1DB5; [4E 48, 05, 27]
-
-01AD; [4E 4A, 05, 05]
-01AC; [4E 4A, 05, 8F]
-
-0288; [4E 4C, 05, 05]
-01AE; [4E 4C, 05, 8F]
-
-0236; [4E 4E, 05, 05]
-
-A777; [4E 50, 05, 05]
-
-0287; [4E 52, 05, 05]
-
-0075; [4F, 05, 05]
-FF55; [4F, 05, 07]
-0367; [4F, 05, 09]
-1D42E; [4F, 05, 0B]
-1D462; [4F, 05, 0B]
-1D496; [4F, 05, 0B]
-1D4CA; [4F, 05, 0B]
-1D4FE; [4F, 05, 0B]
-1D532; [4F, 05, 0B]
-1D566; [4F, 05, 0B]
-1D59A; [4F, 05, 0B]
-1D5CE; [4F, 05, 0B]
-1D602; [4F, 05, 0B]
-1D636; [4F, 05, 0B]
-1D66A; [4F, 05, 0B]
-1D69E; [4F, 05, 0B]
-24E4; [4F, 05, 0D]
-0055; [4F, 05, 8F]
-FF35; [4F, 05, 91]
-1D414; [4F, 05, 95]
-1D448; [4F, 05, 95]
-1D47C; [4F, 05, 95]
-1D4B0; [4F, 05, 95]
-1D4E4; [4F, 05, 95]
-1D518; [4F, 05, 95]
-1D54C; [4F, 05, 95]
-1D580; [4F, 05, 95]
-1D5B4; [4F, 05, 95]
-1D5E8; [4F, 05, 95]
-1D61C; [4F, 05, 95]
-1D650; [4F, 05, 95]
-1D684; [4F, 05, 95]
-24CA; [4F, 05, 97]
-1F164; [4F, 05, 97]
-1D58; [4F, 05, 27]
-1D64; [4F, 05, 29]
-1D41; [4F, 05, B9]
-1F144; [4F, 05, B9]
-1F184; [4F, 05, B9]
-00FA; [4F, 05, 05][, 8D, 05]
-00DA; [4F, 05, 8F][, 8D, 05]
-00F9; [4F, 05, 05][, 8F, 05]
-00D9; [4F, 05, 8F][, 8F, 05]
-016D; [4F, 05, 05][, 91, 05]
-016C; [4F, 05, 8F][, 91, 05]
-00FB; [4F, 05, 05][, 93, 05]
-00DB; [4F, 05, 8F][, 93, 05]
-01D4; [4F, 05, 05][, 97, 05]
-01D3; [4F, 05, 8F][, 97, 05]
-016F; [4F, 05, 05][, 99, 05]
-016E; [4F, 05, 8F][, 99, 05]
-00FC; [4F, 05, 05][, 9D, 05]
-00DC; [4F, 05, 8F][, 9D, 05]
-01D8; [4F, 05, 05][, 9D, 05][, 8D, 05]
-01D7; [4F, 05, 8F][, 9D, 05][, 8D, 05]
-01DC; [4F, 05, 05][, 9D, 05][, 8F, 05]
-01DB; [4F, 05, 8F][, 9D, 05][, 8F, 05]
-01DA; [4F, 05, 05][, 9D, 05][, 97, 05]
-01D9; [4F, 05, 8F][, 9D, 05][, 97, 05]
-01D6; [4F, 05, 05][, 9D, 05][, AB, 05]
-01D5; [4F, 05, 8F][, 9D, 05][, AB, 05]
-0171; [4F, 05, 05][, 9F, 05]
-0170; [4F, 05, 8F][, 9F, 05]
-0169; [4F, 05, 05][, A1, 05]
-0168; [4F, 05, 8F][, A1, 05]
-1E79; [4F, 05, 05][, A1, 05][, 8D, 05]
-1E78; [4F, 05, 8F][, A1, 05][, 8D, 05]
-0173; [4F, 05, 05][, A9, 05]
-0172; [4F, 05, 8F][, A9, 05]
-016B; [4F, 05, 05][, AB, 05]
-016A; [4F, 05, 8F][, AB, 05]
-1E7B; [4F, 05, 05][, AB, 05][, 9D, 05]
-1E7A; [4F, 05, 8F][, AB, 05][, 9D, 05]
-1EE7; [4F, 05, 05][, B7, 05]
-1EE6; [4F, 05, 8F][, B7, 05]
-0215; [4F, 05, 05][, B9, 05]
-0214; [4F, 05, 8F][, B9, 05]
-0217; [4F, 05, 05][, BD, 05]
-0216; [4F, 05, 8F][, BD, 05]
-01B0; [4F, 05, 05][, BF, 05]
-01AF; [4F, 05, 8F][, BF, 05]
-1EE9; [4F, 05, 05][, BF, 05][, 8D, 05]
-1EE8; [4F, 05, 8F][, BF, 05][, 8D, 05]
-1EEB; [4F, 05, 05][, BF, 05][, 8F, 05]
-1EEA; [4F, 05, 8F][, BF, 05][, 8F, 05]
-1EEF; [4F, 05, 05][, BF, 05][, A1, 05]
-1EEE; [4F, 05, 8F][, BF, 05][, A1, 05]
-1EED; [4F, 05, 05][, BF, 05][, B7, 05]
-1EEC; [4F, 05, 8F][, BF, 05][, B7, 05]
-1EF1; [4F, 05, 05][, BF, 05][, C5, 05]
-1EF0; [4F, 05, 8F][, BF, 05][, C5, 05]
-1EE5; [4F, 05, 05][, C5, 05]
-1EE4; [4F, 05, 8F][, C5, 05]
-1E73; [4F, 05, 05][, C7, 05]
-1E72; [4F, 05, 8F][, C7, 05]
-1E77; [4F, 05, 05][, CD, 05]
-1E76; [4F, 05, 8F][, CD, 05]
-1E75; [4F, 05, 05][, D0 0D, 05]
-1E74; [4F, 05, 8F][, D0 0D, 05]
-1F199; [4F, 05, B9][45, 05, B9][08 81, 05, 37]
-
-1D1C; [50 40, 05, 05]
-1DB8; [50 40, 05, 27]
-
-1D1D; [50 42, 05, 05]
-1D59; [50 42, 05, 27]
-
-1D1E; [50 44, 05, 05]
-
-1D6B; [50 46, 05, 05]
-
-0289; [50 48, 05, 05]
-0244; [50 48, 05, 8F]
-1DB6; [50 48, 05, 27]
-
-1D7E; [50 4A, 05, 05]
-
-1D99; [50 4C, 05, 05]
-
-0265; [50 4E, 05, 05]
-A78D; [50 4E, 05, 8F]
-1DA3; [50 4E, 05, 27]
-
-02AE; [50 50, 05, 05]
-
-02AF; [50 52, 05, 05]
-
-026F; [50 54, 05, 05]
-019C; [50 54, 05, 8F]
-1D5A; [50 54, 05, 27]
-
-A7FA; [50 56, 05, 05]
-
-1D1F; [50 58, 05, 05]
-
-0270; [50 5A, 05, 05]
-1DAD; [50 5A, 05, 27]
-
-028A; [50 5C, 05, 05]
-01B1; [50 5C, 05, 8F]
-1DB7; [50 5C, 05, 27]
-
-1D7F; [50 5E, 05, 05]
-
-0076; [51, 05, 05]
-FF56; [51, 05, 07]
-036E; [51, 05, 09]
-2174; [51, 05, 09]
-1D42F; [51, 05, 0B]
-1D463; [51, 05, 0B]
-1D497; [51, 05, 0B]
-1D4CB; [51, 05, 0B]
-1D4FF; [51, 05, 0B]
-1D533; [51, 05, 0B]
-1D567; [51, 05, 0B]
-1D59B; [51, 05, 0B]
-1D5CF; [51, 05, 0B]
-1D603; [51, 05, 0B]
-1D637; [51, 05, 0B]
-1D66B; [51, 05, 0B]
-1D69F; [51, 05, 0B]
-24E5; [51, 05, 0D]
-0056; [51, 05, 8F]
-FF36; [51, 05, 91]
-2164; [51, 05, 93]
-1D415; [51, 05, 95]
-1D449; [51, 05, 95]
-1D47D; [51, 05, 95]
-1D4B1; [51, 05, 95]
-1D4E5; [51, 05, 95]
-1D519; [51, 05, 95]
-1D54D; [51, 05, 95]
-1D581; [51, 05, 95]
-1D5B5; [51, 05, 95]
-1D5E9; [51, 05, 95]
-1D61D; [51, 05, 95]
-1D651; [51, 05, 95]
-1D685; [51, 05, 95]
-24CB; [51, 05, 97]
-1F165; [51, 05, 97]
-1D5B; [51, 05, 27]
-1D65; [51, 05, 29]
-2C7D; [51, 05, B9]
-1F145; [51, 05, B9]
-1F185; [51, 05, B9]
-1E7D; [51, 05, 05][, A1, 05]
-1E7C; [51, 05, 8F][, A1, 05]
-1E7F; [51, 05, 05][, C5, 05]
-1E7E; [51, 05, 8F][, C5, 05]
-33DE; [51, 05, B9][0D 75 24, 05, 37][3F, 05, 37]
-2175; [51, 05, 09][37, 05, 3D]
-2165; [51, 05, 93][37, 05, 3D]
-2176; [51, 05, 09][37, 05, 09][37, 05, 3D]
-2166; [51, 05, 93][37, 05, 93][37, 05, 3D]
-2177; [51, 05, 09][37, 05, 09][37, 05, 09][37, 05, 3D]
-2167; [51, 05, 93][37, 05, 93][37, 05, 93][37, 05, 3D]
-1F19A; [51, 05, B9][4B, 05, B9]
-A761; [51, 05, 09][57, 05, 09]
-A760; [51, 05, 93][57, 05, 93]
-
-1D20; [52 40, 05, 05]
-
-A75F; [52 42, 05, 05]
-A75E; [52 42, 05, 8F]
-
-1D8C; [52 44, 05, 05]
-
-028B; [52 46, 05, 05]
-01B2; [52 46, 05, 8F]
-1DB9; [52 46, 05, 27]
-
-2C71; [52 48, 05, 05]
-
-2C74; [52 4A, 05, 05]
-
-1EFD; [52 4C, 05, 05]
-1EFC; [52 4C, 05, 8F]
-
-028C; [52 4E, 05, 05]
-0245; [52 4E, 05, 8F]
-1DBA; [52 4E, 05, 27]
-
-0077; [53, 05, 05]
-FF57; [53, 05, 07]
-1D430; [53, 05, 0B]
-1D464; [53, 05, 0B]
-1D498; [53, 05, 0B]
-1D4CC; [53, 05, 0B]
-1D500; [53, 05, 0B]
-1D534; [53, 05, 0B]
-1D568; [53, 05, 0B]
-1D59C; [53, 05, 0B]
-1D5D0; [53, 05, 0B]
-1D604; [53, 05, 0B]
-1D638; [53, 05, 0B]
-1D66C; [53, 05, 0B]
-1D6A0; [53, 05, 0B]
-24E6; [53, 05, 0D]
-0057; [53, 05, 8F]
-FF37; [53, 05, 91]
-1D416; [53, 05, 95]
-1D44A; [53, 05, 95]
-1D47E; [53, 05, 95]
-1D4B2; [53, 05, 95]
-1D4E6; [53, 05, 95]
-1D51A; [53, 05, 95]
-1D54E; [53, 05, 95]
-1D582; [53, 05, 95]
-1D5B6; [53, 05, 95]
-1D5EA; [53, 05, 95]
-1D61E; [53, 05, 95]
-1D652; [53, 05, 95]
-1D686; [53, 05, 95]
-24CC; [53, 05, 97]
-1F166; [53, 05, 97]
-02B7; [53, 05, 27]
-1D42; [53, 05, B9]
-1F146; [53, 05, B9]
-1F186; [53, 05, B9]
-1E83; [53, 05, 05][, 8D, 05]
-1E82; [53, 05, 8F][, 8D, 05]
-1E81; [53, 05, 05][, 8F, 05]
-1E80; [53, 05, 8F][, 8F, 05]
-0175; [53, 05, 05][, 93, 05]
-0174; [53, 05, 8F][, 93, 05]
-1E98; [53, 05, 05][, 99, 05]
-1E85; [53, 05, 05][, 9D, 05]
-1E84; [53, 05, 8F][, 9D, 05]
-1E87; [53, 05, 05][, A3, 05]
-1E86; [53, 05, 8F][, A3, 05]
-1E89; [53, 05, 05][, C5, 05]
-1E88; [53, 05, 8F][, C5, 05]
-33DD; [53, 05, B9][29, 05, 37]
-1F14F; [53, 05, B9][2B, 05, B9]
-1F18F; [53, 05, B9][2B, 05, B9]
-1F12E; [53, 05, 97][59, 05, 97]
-
-1D21; [54 40, 05, 05]
-
-2C73; [54 42, 05, 05]
-2C72; [54 42, 05, 8F]
-
-028D; [54 44, 05, 05]
-
-0078; [55, 05, 05]
-FF58; [55, 05, 07]
-036F; [55, 05, 09]
-2179; [55, 05, 09]
-1D431; [55, 05, 0B]
-1D465; [55, 05, 0B]
-1D499; [55, 05, 0B]
-1D4CD; [55, 05, 0B]
-1D501; [55, 05, 0B]
-1D535; [55, 05, 0B]
-1D569; [55, 05, 0B]
-1D59D; [55, 05, 0B]
-1D5D1; [55, 05, 0B]
-1D605; [55, 05, 0B]
-1D639; [55, 05, 0B]
-1D66D; [55, 05, 0B]
-1D6A1; [55, 05, 0B]
-24E7; [55, 05, 0D]
-0058; [55, 05, 8F]
-FF38; [55, 05, 91]
-2169; [55, 05, 93]
-1D417; [55, 05, 95]
-1D44B; [55, 05, 95]
-1D47F; [55, 05, 95]
-1D4B3; [55, 05, 95]
-1D4E7; [55, 05, 95]
-1D51B; [55, 05, 95]
-1D54F; [55, 05, 95]
-1D583; [55, 05, 95]
-1D5B7; [55, 05, 95]
-1D5EB; [55, 05, 95]
-1D61F; [55, 05, 95]
-1D653; [55, 05, 95]
-1D687; [55, 05, 95]
-24CD; [55, 05, 97]
-1F167; [55, 05, 97]
-02E3; [55, 05, 27]
-2093; [55, 05, 29]
-1F147; [55, 05, B9]
-1F187; [55, 05, B9]
-1E8D; [55, 05, 05][, 9D, 05]
-1E8C; [55, 05, 8F][, 9D, 05]
-1E8B; [55, 05, 05][, A3, 05]
-1E8A; [55, 05, 8F][, A3, 05]
-217A; [55, 05, 09][37, 05, 3D]
-216A; [55, 05, 93][37, 05, 3D]
-217B; [55, 05, 09][37, 05, 09][37, 05, 3D]
-216B; [55, 05, 93][37, 05, 93][37, 05, 3D]
-
-1D8D; [56 40, 05, 05]
-
-0079; [57, 05, 05]
-FF59; [57, 05, 07]
-1D432; [57, 05, 0B]
-1D466; [57, 05, 0B]
-1D49A; [57, 05, 0B]
-1D4CE; [57, 05, 0B]
-1D502; [57, 05, 0B]
-1D536; [57, 05, 0B]
-1D56A; [57, 05, 0B]
-1D59E; [57, 05, 0B]
-1D5D2; [57, 05, 0B]
-1D606; [57, 05, 0B]
-1D63A; [57, 05, 0B]
-1D66E; [57, 05, 0B]
-1D6A2; [57, 05, 0B]
-24E8; [57, 05, 0D]
-0059; [57, 05, 8F]
-FF39; [57, 05, 91]
-1D418; [57, 05, 95]
-1D44C; [57, 05, 95]
-1D480; [57, 05, 95]
-1D4B4; [57, 05, 95]
-1D4E8; [57, 05, 95]
-1D51C; [57, 05, 95]
-1D550; [57, 05, 95]
-1D584; [57, 05, 95]
-1D5B8; [57, 05, 95]
-1D5EC; [57, 05, 95]
-1D620; [57, 05, 95]
-1D654; [57, 05, 95]
-1D688; [57, 05, 95]
-24CE; [57, 05, 97]
-1F168; [57, 05, 97]
-02B8; [57, 05, 27]
-1F148; [57, 05, B9]
-1F188; [57, 05, B9]
-00FD; [57, 05, 05][, 8D, 05]
-00DD; [57, 05, 8F][, 8D, 05]
-1EF3; [57, 05, 05][, 8F, 05]
-1EF2; [57, 05, 8F][, 8F, 05]
-0177; [57, 05, 05][, 93, 05]
-0176; [57, 05, 8F][, 93, 05]
-1E99; [57, 05, 05][, 99, 05]
-00FF; [57, 05, 05][, 9D, 05]
-0178; [57, 05, 8F][, 9D, 05]
-1EF9; [57, 05, 05][, A1, 05]
-1EF8; [57, 05, 8F][, A1, 05]
-1E8F; [57, 05, 05][, A3, 05]
-1E8E; [57, 05, 8F][, A3, 05]
-0233; [57, 05, 05][, AB, 05]
-0232; [57, 05, 8F][, AB, 05]
-1EF7; [57, 05, 05][, B7, 05]
-1EF6; [57, 05, 8F][, B7, 05]
-1EF5; [57, 05, 05][, C5, 05]
-1EF4; [57, 05, 8F][, C5, 05]
-
-028F; [58 40, 05, 05]
-
-024F; [58 42, 05, 05]
-024E; [58 42, 05, 8F]
-
-01B4; [58 44, 05, 05]
-01B3; [58 44, 05, 8F]
-
-1EFF; [58 46, 05, 05]
-1EFE; [58 46, 05, 8F]
-
-021D; [58 48, 05, 05]
-021C; [58 48, 05, 8F]
-
-007A; [59, 05, 05]
-FF5A; [59, 05, 07]
-1DE6; [59, 05, 09]
-1D433; [59, 05, 0B]
-1D467; [59, 05, 0B]
-1D49B; [59, 05, 0B]
-1D4CF; [59, 05, 0B]
-1D503; [59, 05, 0B]
-1D537; [59, 05, 0B]
-1D56B; [59, 05, 0B]
-1D59F; [59, 05, 0B]
-1D5D3; [59, 05, 0B]
-1D607; [59, 05, 0B]
-1D63B; [59, 05, 0B]
-1D66F; [59, 05, 0B]
-1D6A3; [59, 05, 0B]
-24E9; [59, 05, 0D]
-005A; [59, 05, 8F]
-FF3A; [59, 05, 91]
-2124; [59, 05, 95]
-2128; [59, 05, 95]
-1D419; [59, 05, 95]
-1D44D; [59, 05, 95]
-1D481; [59, 05, 95]
-1D4B5; [59, 05, 95]
-1D4E9; [59, 05, 95]
-1D585; [59, 05, 95]
-1D5B9; [59, 05, 95]
-1D5ED; [59, 05, 95]
-1D621; [59, 05, 95]
-1D655; [59, 05, 95]
-1D689; [59, 05, 95]
-24CF; [59, 05, 97]
-1F169; [59, 05, 97]
-1DBB; [59, 05, 27]
-1F149; [59, 05, B9]
-1F189; [59, 05, B9]
-017A; [59, 05, 05][, 8D, 05]
-0179; [59, 05, 8F][, 8D, 05]
-1E91; [59, 05, 05][, 93, 05]
-1E90; [59, 05, 8F][, 93, 05]
-017E; [59, 05, 05][, 97, 05]
-017D; [59, 05, 8F][, 97, 05]
-017C; [59, 05, 05][, A3, 05]
-017B; [59, 05, 8F][, A3, 05]
-1E93; [59, 05, 05][, C5, 05]
-1E92; [59, 05, 8F][, C5, 05]
-1E95; [59, 05, 05][, D0 1D, 05]
-1E94; [59, 05, 8F][, D0 1D, 05]
-018D; [59, 05, 09][53, 05, 09]
-
-1D22; [5A 40, 05, 05]
-
-01B6; [5A 42, 05, 05]
-01B5; [5A 42, 05, 8F]
-
-1D76; [5A 44, 05, 05]
-
-1D8E; [5A 46, 05, 05]
-
-0225; [5A 48, 05, 05]
-0224; [5A 48, 05, 8F]
-
-0290; [5A 4A, 05, 05]
-1DBC; [5A 4A, 05, 27]
-
-0291; [5A 4C, 05, 05]
-1DBD; [5A 4C, 05, 27]
-
-0240; [5A 4E, 05, 05]
-2C7F; [5A 4E, 05, 8F]
+2C9F; [5D 8C, 05, 05]
+2C9E; [5D 8C, 05, A0]
 
-2C6C; [5A 50, 05, 05]
-2C6B; [5A 50, 05, 8F]
+2CA1; [5D 8E, 05, 05]
+2CA0; [5D 8E, 05, A0]
 
-A763; [5A 52, 05, 05]
-A762; [5A 52, 05, 8F]
+2CA3; [5D 90, 05, 05]
+2CA2; [5D 90, 05, A0]
 
-0292; [5A 54, 05, 05]
-01B7; [5A 54, 05, 8F]
-1DBE; [5A 54, 05, 27]
-01EF; [5A 54, 05, 05][, 97, 05]
-01EE; [5A 54, 05, 8F][, 97, 05]
+2CA5; [5D 92, 05, 05]
+2CA4; [5D 92, 05, A0]
 
-1D23; [5A 56, 05, 05]
+2CA7; [5D 94, 05, 05]
+2CA6; [5D 94, 05, A0]
 
-01B9; [5A 58, 05, 05]
-01B8; [5A 58, 05, 8F]
+2CA9; [5D 96, 05, 05]
+2CA8; [5D 96, 05, A0]
 
-1D9A; [5A 5A, 05, 05]
+2CAB; [5D 98, 05, 05]
+2CAA; [5D 98, 05, A0]
 
-01BA; [5A 5C, 05, 05]
+2CAD; [5D 9A, 05, 05]
+2CAC; [5D 9A, 05, A0]
 
-0293; [5A 5E, 05, 05]
+2CAF; [5D 9C, 05, 05]
+2CAE; [5D 9C, 05, A0]
 
-00FE; [5A 60, 05, 05]
-00DE; [5A 60, 05, 8F]
+2CB1; [5D 9E, 05, 05]
+2CB0; [5D 9E, 05, A0]
 
-A765; [5A 62, 05, 05]
-A764; [5A 62, 05, 8F]
+2CBF; [5D A0, 05, 05]
+2CBE; [5D A0, 05, A0]
 
-A767; [5A 64, 05, 05]
-A766; [5A 64, 05, 8F]
+2CC1; [5D A2, 05, 05]
+2CC0; [5D A2, 05, A0]
 
-01BF; [5A 66, 05, 05]
-01F7; [5A 66, 05, 8F]
+03E3; [5D A4, 05, 05]
+03E2; [5D A4, 05, A0]
 
-A769; [5A 68, 05, 05]
-A768; [5A 68, 05, 8F]
+2CEC; [5D A6, 05, 05]
+2CEB; [5D A6, 05, A0]
 
-A76B; [5A 6A, 05, 05]
-A76A; [5A 6A, 05, 8F]
+2CC3; [5D A8, 05, 05]
+2CC2; [5D A8, 05, A0]
 
-A76D; [5A 6C, 05, 05]
-A76C; [5A 6C, 05, 8F]
+2CC5; [5D AA, 05, 05]
+2CC4; [5D AA, 05, A0]
 
-A76F; [5A 6E, 05, 05]
-1DD2; [5A 6E, 05, 09]
-A76E; [5A 6E, 05, 8F]
-A770; [5A 6E, 05, 27]
+2CC7; [5D AC, 05, 05]
+2CC6; [5D AC, 05, A0]
 
-A778; [5A 70, 05, 05]
+03E5; [5D AE, 05, 05]
+03E4; [5D AE, 05, A0]
 
-01BB; [5A 72, 05, 05]
+03E7; [5D B0, 05, 05]
+03E6; [5D B0, 05, A0]
 
-A72B; [5A 74, 05, 05]
-A72A; [5A 74, 05, 8F]
+2CF3; [5D B2, 05, 05]
+2CF2; [5D B2, 05, A0]
 
-A72D; [5A 76, 05, 05]
-A72C; [5A 76, 05, 8F]
+2CC9; [5D B4, 05, 05]
+2CC8; [5D B4, 05, A0]
 
-A72F; [5A 78, 05, 05]
-A72E; [5A 78, 05, 8F]
+03E9; [5D B6, 05, 05]
+03E8; [5D B6, 05, A0]
 
-01A8; [5A 7A, 05, 05]
-01A7; [5A 7A, 05, 8F]
+2CCB; [5D B8, 05, 05]
+2CCA; [5D B8, 05, A0]
 
-01BD; [5A 7C, 05, 05]
-01BC; [5A 7C, 05, 8F]
+2CCD; [5D BA, 05, 05]
+2CCC; [5D BA, 05, A0]
 
-0185; [5A 7E, 05, 05]
-0184; [5A 7E, 05, 8F]
+2CCF; [5D BC, 05, 05]
+2CCE; [5D BC, 05, A0]
 
-0294; [5A 80, 05, 05]
+2CD1; [5D BE, 05, 05]
+2CD0; [5D BE, 05, A0]
 
-0242; [5A 82, 05, 05]
-0241; [5A 82, 05, 8F]
+2CD3; [5D C0, 05, 05]
+2CD2; [5D C0, 05, A0]
 
-02C0; [5A 84, 05, 05]
+2CD5; [5D C2, 05, 05]
+2CD4; [5D C2, 05, A0]
 
-02BC; [5A 86, 05, 05]
-0149; [5A 86, 05, 09][41, 05, 09]
+03EB; [5D C4, 05, 05]
+03EA; [5D C4, 05, A0]
 
-02EE; [5A 88, 05, 05]
+2CEE; [5D C6, 05, 05]
+2CED; [5D C6, 05, A0]
 
-02BE; [5A 8A, 05, 05]
+2CD7; [5D C8, 05, 05]
+2CD6; [5D C8, 05, A0]
 
-A723; [5A 8C, 05, 05]
-A722; [5A 8C, 05, 8F]
+03ED; [5D CA, 05, 05]
+03EC; [5D CA, 05, A0]
 
-A78C; [5A 8E, 05, 05]
-A78B; [5A 8E, 05, 8F]
+2CD9; [5D CC, 05, 05]
+2CD8; [5D CC, 05, A0]
 
-0295; [5A 90, 05, 05]
-02E4; [5A 90, 05, 27]
+2CDB; [5D CE, 05, 05]
+2CDA; [5D CE, 05, A0]
 
-02BF; [5A 92, 05, 05]
+2CDD; [5D D0, 05, 05]
+2CDC; [5D D0, 05, A0]
 
-02C1; [5A 94, 05, 05]
+03EF; [5D D2, 05, 05]
+03EE; [5D D2, 05, A0]
 
-1D24; [5A 96, 05, 05]
+2CB3; [5D D4, 05, 05]
+2CB2; [5D D4, 05, A0]
 
-1D25; [5A 98, 05, 05]
-1D5C; [5A 98, 05, 27]
+2CB5; [5D D6, 05, 05]
+2CB4; [5D D6, 05, A0]
 
-A725; [5A 9A, 05, 05]
-A724; [5A 9A, 05, 8F]
+2CDF; [5D D8, 05, 05]
+2CDE; [5D D8, 05, A0]
 
-02A1; [5A 9C, 05, 05]
-
-02A2; [5A 9E, 05, 05]
-
-0296; [5A A0, 05, 05]
-
-01C0; [5A A2, 05, 05]
-
-01C1; [5A A4, 05, 05]
-
-01C2; [5A A6, 05, 05]
-
-01C3; [5A A8, 05, 05]
-
-0297; [5A AA, 05, 05]
-
-0298; [5A AC, 05, 05]
-
-02AC; [5A AE, 05, 05]
-
-02AD; [5A B0, 05, 05]
-
-03B1; [5B 0A, 05, 05]
-1D6C2; [5B 0A, 05, 0B]
-1D6FC; [5B 0A, 05, 0B]
-1D736; [5B 0A, 05, 0B]
-1D770; [5B 0A, 05, 0B]
-1D7AA; [5B 0A, 05, 0B]
-0391; [5B 0A, 05, 8F]
-1D6A8; [5B 0A, 05, 95]
-1D6E2; [5B 0A, 05, 95]
-1D71C; [5B 0A, 05, 95]
-1D756; [5B 0A, 05, 95]
-1D790; [5B 0A, 05, 95]
-1F00; [5B 0A, 05, 05][, 89, 05]
-1F08; [5B 0A, 05, 8F][, 89, 05]
-1F04; [5B 0A, 05, 05][, 89, 05][, 8D, 05]
-1F0C; [5B 0A, 05, 8F][, 89, 05][, 8D, 05]
-1F84; [5B 0A, 05, 05][, 89, 05][, 8D, 05][, D0 5D, 05]
-1F8C; [5B 0A, 05, 8F][, 89, 05][, 8D, 05][, D0 5D, 05]
-1F02; [5B 0A, 05, 05][, 89, 05][, 8F, 05]
-1F0A; [5B 0A, 05, 8F][, 89, 05][, 8F, 05]
-1F82; [5B 0A, 05, 05][, 89, 05][, 8F, 05][, D0 5D, 05]
-1F8A; [5B 0A, 05, 8F][, 89, 05][, 8F, 05][, D0 5D, 05]
-1F06; [5B 0A, 05, 05][, 89, 05][, 9B, 05]
-1F0E; [5B 0A, 05, 8F][, 89, 05][, 9B, 05]
-1F86; [5B 0A, 05, 05][, 89, 05][, 9B, 05][, D0 5D, 05]
-1F8E; [5B 0A, 05, 8F][, 89, 05][, 9B, 05][, D0 5D, 05]
-1F80; [5B 0A, 05, 05][, 89, 05][, D0 5D, 05]
-1F88; [5B 0A, 05, 8F][, 89, 05][, D0 5D, 05]
-1F01; [5B 0A, 05, 05][, 8B, 05]
-1F09; [5B 0A, 05, 8F][, 8B, 05]
-1F05; [5B 0A, 05, 05][, 8B, 05][, 8D, 05]
-1F0D; [5B 0A, 05, 8F][, 8B, 05][, 8D, 05]
-1F85; [5B 0A, 05, 05][, 8B, 05][, 8D, 05][, D0 5D, 05]
-1F8D; [5B 0A, 05, 8F][, 8B, 05][, 8D, 05][, D0 5D, 05]
-1F03; [5B 0A, 05, 05][, 8B, 05][, 8F, 05]
-1F0B; [5B 0A, 05, 8F][, 8B, 05][, 8F, 05]
-1F83; [5B 0A, 05, 05][, 8B, 05][, 8F, 05][, D0 5D, 05]
-1F8B; [5B 0A, 05, 8F][, 8B, 05][, 8F, 05][, D0 5D, 05]
-1F07; [5B 0A, 05, 05][, 8B, 05][, 9B, 05]
-1F0F; [5B 0A, 05, 8F][, 8B, 05][, 9B, 05]
-1F87; [5B 0A, 05, 05][, 8B, 05][, 9B, 05][, D0 5D, 05]
-1F8F; [5B 0A, 05, 8F][, 8B, 05][, 9B, 05][, D0 5D, 05]
-1F81; [5B 0A, 05, 05][, 8B, 05][, D0 5D, 05]
-1F89; [5B 0A, 05, 8F][, 8B, 05][, D0 5D, 05]
-03AC; [5B 0A, 05, 05][, 8D, 05]
-1F71; [5B 0A, 05, 05][, 8D, 05]
-0386; [5B 0A, 05, 8F][, 8D, 05]
-1FBB; [5B 0A, 05, 8F][, 8D, 05]
-1FB4; [5B 0A, 05, 05][, 8D, 05][, D0 5D, 05]
-1F70; [5B 0A, 05, 05][, 8F, 05]
-1FBA; [5B 0A, 05, 8F][, 8F, 05]
-1FB2; [5B 0A, 05, 05][, 8F, 05][, D0 5D, 05]
-1FB0; [5B 0A, 05, 05][, 91, 05]
-1FB8; [5B 0A, 05, 8F][, 91, 05]
-1FB6; [5B 0A, 05, 05][, 9B, 05]
-1FB7; [5B 0A, 05, 05][, 9B, 05][, D0 5D, 05]
-1FB1; [5B 0A, 05, 05][, AB, 05]
-1FB9; [5B 0A, 05, 8F][, AB, 05]
-1FB3; [5B 0A, 05, 05][, D0 5D, 05]
-1FBC; [5B 0A, 05, 8F][, D0 5D, 05]
-
-03B2; [5B 0C, 05, 05]
-03D0; [5B 0C, 05, 09]
-1D6C3; [5B 0C, 05, 0B]
-1D6FD; [5B 0C, 05, 0B]
-1D737; [5B 0C, 05, 0B]
-1D771; [5B 0C, 05, 0B]
-1D7AB; [5B 0C, 05, 0B]
-0392; [5B 0C, 05, 8F]
-1D6A9; [5B 0C, 05, 95]
-1D6E3; [5B 0C, 05, 95]
-1D71D; [5B 0C, 05, 95]
-1D757; [5B 0C, 05, 95]
-1D791; [5B 0C, 05, 95]
-1D5D; [5B 0C, 05, 27]
-1D66; [5B 0C, 05, 29]
-
-03B3; [5B 0E, 05, 05]
-213D; [5B 0E, 05, 0B]
-1D6C4; [5B 0E, 05, 0B]
-1D6FE; [5B 0E, 05, 0B]
-1D738; [5B 0E, 05, 0B]
-1D772; [5B 0E, 05, 0B]
-1D7AC; [5B 0E, 05, 0B]
-0393; [5B 0E, 05, 8F]
-213E; [5B 0E, 05, 95]
-1D6AA; [5B 0E, 05, 95]
-1D6E4; [5B 0E, 05, 95]
-1D71E; [5B 0E, 05, 95]
-1D758; [5B 0E, 05, 95]
-1D792; [5B 0E, 05, 95]
-1D5E; [5B 0E, 05, 27]
-1D67; [5B 0E, 05, 29]
-
-1D26; [5B 10, 05, 05]
-
-03B4; [5B 12, 05, 05]
-1D6C5; [5B 12, 05, 0B]
-1D6FF; [5B 12, 05, 0B]
-1D739; [5B 12, 05, 0B]
-1D773; [5B 12, 05, 0B]
-1D7AD; [5B 12, 05, 0B]
-0394; [5B 12, 05, 8F]
-1D6AB; [5B 12, 05, 95]
-1D6E5; [5B 12, 05, 95]
-1D71F; [5B 12, 05, 95]
-1D759; [5B 12, 05, 95]
-1D793; [5B 12, 05, 95]
-1D5F; [5B 12, 05, 27]
-
-03B5; [5B 14, 05, 05]
-03F5; [5B 14, 05, 09]
-1D6C6; [5B 14, 05, 0B]
-1D6DC; [5B 14, 05, 0B]
-1D700; [5B 14, 05, 0B]
-1D716; [5B 14, 05, 0B]
-1D73A; [5B 14, 05, 0B]
-1D750; [5B 14, 05, 0B]
-1D774; [5B 14, 05, 0B]
-1D78A; [5B 14, 05, 0B]
-1D7AE; [5B 14, 05, 0B]
-1D7C4; [5B 14, 05, 0B]
-0395; [5B 14, 05, 8F]
-1D6AC; [5B 14, 05, 95]
-1D6E6; [5B 14, 05, 95]
-1D720; [5B 14, 05, 95]
-1D75A; [5B 14, 05, 95]
-1D794; [5B 14, 05, 95]
-1F10; [5B 14, 05, 05][, 89, 05]
-1F18; [5B 14, 05, 8F][, 89, 05]
-1F14; [5B 14, 05, 05][, 89, 05][, 8D, 05]
-1F1C; [5B 14, 05, 8F][, 89, 05][, 8D, 05]
-1F12; [5B 14, 05, 05][, 89, 05][, 8F, 05]
-1F1A; [5B 14, 05, 8F][, 89, 05][, 8F, 05]
-1F11; [5B 14, 05, 05][, 8B, 05]
-1F19; [5B 14, 05, 8F][, 8B, 05]
-1F15; [5B 14, 05, 05][, 8B, 05][, 8D, 05]
-1F1D; [5B 14, 05, 8F][, 8B, 05][, 8D, 05]
-1F13; [5B 14, 05, 05][, 8B, 05][, 8F, 05]
-1F1B; [5B 14, 05, 8F][, 8B, 05][, 8F, 05]
-03AD; [5B 14, 05, 05][, 8D, 05]
-1F73; [5B 14, 05, 05][, 8D, 05]
-0388; [5B 14, 05, 8F][, 8D, 05]
-1FC9; [5B 14, 05, 8F][, 8D, 05]
-1F72; [5B 14, 05, 05][, 8F, 05]
-1FC8; [5B 14, 05, 8F][, 8F, 05]
-
-03DD; [5B 16, 05, 05]
-1D7CB; [5B 16, 05, 0B]
-03DC; [5B 16, 05, 8F]
-1D7CA; [5B 16, 05, 95]
-
-0377; [5B 18, 05, 05]
-0376; [5B 18, 05, 8F]
-
-03DB; [5B 1A, 05, 05]
-03DA; [5B 1A, 05, 8F]
-
-03B6; [5B 1C, 05, 05]
-1D6C7; [5B 1C, 05, 0B]
-1D701; [5B 1C, 05, 0B]
-1D73B; [5B 1C, 05, 0B]
-1D775; [5B 1C, 05, 0B]
-1D7AF; [5B 1C, 05, 0B]
-0396; [5B 1C, 05, 8F]
-1D6AD; [5B 1C, 05, 95]
-1D6E7; [5B 1C, 05, 95]
-1D721; [5B 1C, 05, 95]
-1D75B; [5B 1C, 05, 95]
-1D795; [5B 1C, 05, 95]
-
-0371; [5B 1E, 05, 05]
-0370; [5B 1E, 05, 8F]
-
-03B7; [5B 20, 05, 05]
-1D6C8; [5B 20, 05, 0B]
-1D702; [5B 20, 05, 0B]
-1D73C; [5B 20, 05, 0B]
-1D776; [5B 20, 05, 0B]
-1D7B0; [5B 20, 05, 0B]
-0397; [5B 20, 05, 8F]
-1D6AE; [5B 20, 05, 95]
-1D6E8; [5B 20, 05, 95]
-1D722; [5B 20, 05, 95]
-1D75C; [5B 20, 05, 95]
-1D796; [5B 20, 05, 95]
-1F20; [5B 20, 05, 05][, 89, 05]
-1F28; [5B 20, 05, 8F][, 89, 05]
-1F24; [5B 20, 05, 05][, 89, 05][, 8D, 05]
-1F2C; [5B 20, 05, 8F][, 89, 05][, 8D, 05]
-1F94; [5B 20, 05, 05][, 89, 05][, 8D, 05][, D0 5D, 05]
-1F9C; [5B 20, 05, 8F][, 89, 05][, 8D, 05][, D0 5D, 05]
-1F22; [5B 20, 05, 05][, 89, 05][, 8F, 05]
-1F2A; [5B 20, 05, 8F][, 89, 05][, 8F, 05]
-1F92; [5B 20, 05, 05][, 89, 05][, 8F, 05][, D0 5D, 05]
-1F9A; [5B 20, 05, 8F][, 89, 05][, 8F, 05][, D0 5D, 05]
-1F26; [5B 20, 05, 05][, 89, 05][, 9B, 05]
-1F2E; [5B 20, 05, 8F][, 89, 05][, 9B, 05]
-1F96; [5B 20, 05, 05][, 89, 05][, 9B, 05][, D0 5D, 05]
-1F9E; [5B 20, 05, 8F][, 89, 05][, 9B, 05][, D0 5D, 05]
-1F90; [5B 20, 05, 05][, 89, 05][, D0 5D, 05]
-1F98; [5B 20, 05, 8F][, 89, 05][, D0 5D, 05]
-1F21; [5B 20, 05, 05][, 8B, 05]
-1F29; [5B 20, 05, 8F][, 8B, 05]
-1F25; [5B 20, 05, 05][, 8B, 05][, 8D, 05]
-1F2D; [5B 20, 05, 8F][, 8B, 05][, 8D, 05]
-1F95; [5B 20, 05, 05][, 8B, 05][, 8D, 05][, D0 5D, 05]
-1F9D; [5B 20, 05, 8F][, 8B, 05][, 8D, 05][, D0 5D, 05]
-1F23; [5B 20, 05, 05][, 8B, 05][, 8F, 05]
-1F2B; [5B 20, 05, 8F][, 8B, 05][, 8F, 05]
-1F93; [5B 20, 05, 05][, 8B, 05][, 8F, 05][, D0 5D, 05]
-1F9B; [5B 20, 05, 8F][, 8B, 05][, 8F, 05][, D0 5D, 05]
-1F27; [5B 20, 05, 05][, 8B, 05][, 9B, 05]
-1F2F; [5B 20, 05, 8F][, 8B, 05][, 9B, 05]
-1F97; [5B 20, 05, 05][, 8B, 05][, 9B, 05][, D0 5D, 05]
-1F9F; [5B 20, 05, 8F][, 8B, 05][, 9B, 05][, D0 5D, 05]
-1F91; [5B 20, 05, 05][, 8B, 05][, D0 5D, 05]
-1F99; [5B 20, 05, 8F][, 8B, 05][, D0 5D, 05]
-03AE; [5B 20, 05, 05][, 8D, 05]
-1F75; [5B 20, 05, 05][, 8D, 05]
-0389; [5B 20, 05, 8F][, 8D, 05]
-1FCB; [5B 20, 05, 8F][, 8D, 05]
-1FC4; [5B 20, 05, 05][, 8D, 05][, D0 5D, 05]
-1F74; [5B 20, 05, 05][, 8F, 05]
-1FCA; [5B 20, 05, 8F][, 8F, 05]
-1FC2; [5B 20, 05, 05][, 8F, 05][, D0 5D, 05]
-1FC6; [5B 20, 05, 05][, 9B, 05]
-1FC7; [5B 20, 05, 05][, 9B, 05][, D0 5D, 05]
-1FC3; [5B 20, 05, 05][, D0 5D, 05]
-1FCC; [5B 20, 05, 8F][, D0 5D, 05]
-
-03B8; [5B 22, 05, 05]
-03D1; [5B 22, 05, 09]
-1D6C9; [5B 22, 05, 0B]
-1D6DD; [5B 22, 05, 0B]
-1D703; [5B 22, 05, 0B]
-1D717; [5B 22, 05, 0B]
-1D73D; [5B 22, 05, 0B]
-1D751; [5B 22, 05, 0B]
-1D777; [5B 22, 05, 0B]
-1D78B; [5B 22, 05, 0B]
-1D7B1; [5B 22, 05, 0B]
-1D7C5; [5B 22, 05, 0B]
-0398; [5B 22, 05, 8F]
-03F4; [5B 22, 05, 93]
-1D6AF; [5B 22, 05, 95]
-1D6B9; [5B 22, 05, 95]
-1D6E9; [5B 22, 05, 95]
-1D6F3; [5B 22, 05, 95]
-1D723; [5B 22, 05, 95]
-1D72D; [5B 22, 05, 95]
-1D75D; [5B 22, 05, 95]
-1D767; [5B 22, 05, 95]
-1D797; [5B 22, 05, 95]
-1D7A1; [5B 22, 05, 95]
-1DBF; [5B 22, 05, 27]
-
-03B9; [5B 24, 05, 05]
-1FBE; [5B 24, 05, 05]
-037A; [5B 24, 05, 09]
-1D6CA; [5B 24, 05, 0B]
-1D704; [5B 24, 05, 0B]
-1D73E; [5B 24, 05, 0B]
-1D778; [5B 24, 05, 0B]
-1D7B2; [5B 24, 05, 0B]
-0399; [5B 24, 05, 8F]
-1D6B0; [5B 24, 05, 95]
-1D6EA; [5B 24, 05, 95]
-1D724; [5B 24, 05, 95]
-1D75E; [5B 24, 05, 95]
-1D798; [5B 24, 05, 95]
-1F30; [5B 24, 05, 05][, 89, 05]
-1F38; [5B 24, 05, 8F][, 89, 05]
-1F34; [5B 24, 05, 05][, 89, 05][, 8D, 05]
-1F3C; [5B 24, 05, 8F][, 89, 05][, 8D, 05]
-1F32; [5B 24, 05, 05][, 89, 05][, 8F, 05]
-1F3A; [5B 24, 05, 8F][, 89, 05][, 8F, 05]
-1F36; [5B 24, 05, 05][, 89, 05][, 9B, 05]
-1F3E; [5B 24, 05, 8F][, 89, 05][, 9B, 05]
-1F31; [5B 24, 05, 05][, 8B, 05]
-1F39; [5B 24, 05, 8F][, 8B, 05]
-1F35; [5B 24, 05, 05][, 8B, 05][, 8D, 05]
-1F3D; [5B 24, 05, 8F][, 8B, 05][, 8D, 05]
-1F33; [5B 24, 05, 05][, 8B, 05][, 8F, 05]
-1F3B; [5B 24, 05, 8F][, 8B, 05][, 8F, 05]
-1F37; [5B 24, 05, 05][, 8B, 05][, 9B, 05]
-1F3F; [5B 24, 05, 8F][, 8B, 05][, 9B, 05]
-03AF; [5B 24, 05, 05][, 8D, 05]
-1F77; [5B 24, 05, 05][, 8D, 05]
-038A; [5B 24, 05, 8F][, 8D, 05]
-1FDB; [5B 24, 05, 8F][, 8D, 05]
-1F76; [5B 24, 05, 05][, 8F, 05]
-1FDA; [5B 24, 05, 8F][, 8F, 05]
-1FD0; [5B 24, 05, 05][, 91, 05]
-1FD8; [5B 24, 05, 8F][, 91, 05]
-1FD6; [5B 24, 05, 05][, 9B, 05]
-03CA; [5B 24, 05, 05][, 9D, 05]
-03AA; [5B 24, 05, 8F][, 9D, 05]
-0390; [5B 24, 05, 05][, 9D, 05][, 8D, 05]
-1FD3; [5B 24, 05, 05][, 9D, 05][, 8D, 05]
-1FD2; [5B 24, 05, 05][, 9D, 05][, 8F, 05]
-1FD7; [5B 24, 05, 05][, 9D, 05][, 9B, 05]
-1FD1; [5B 24, 05, 05][, AB, 05]
-1FD9; [5B 24, 05, 8F][, AB, 05]
-
-03F3; [5B 26, 05, 05]
-
-03BA; [5B 28, 05, 05]
-03F0; [5B 28, 05, 09]
-1D6CB; [5B 28, 05, 0B]
-1D6DE; [5B 28, 05, 0B]
-1D705; [5B 28, 05, 0B]
-1D718; [5B 28, 05, 0B]
-1D73F; [5B 28, 05, 0B]
-1D752; [5B 28, 05, 0B]
-1D779; [5B 28, 05, 0B]
-1D78C; [5B 28, 05, 0B]
-1D7B3; [5B 28, 05, 0B]
-1D7C6; [5B 28, 05, 0B]
-039A; [5B 28, 05, 8F]
-1D6B1; [5B 28, 05, 95]
-1D6EB; [5B 28, 05, 95]
-1D725; [5B 28, 05, 95]
-1D75F; [5B 28, 05, 95]
-1D799; [5B 28, 05, 95]
-03D7; [5B 28, 05, 09][5B 0A, 05, 09][5B 24, 05, 09]
-03CF; [5B 28, 05, 93][5B 0A, 05, 09][5B 24, 05, 09]
-
-03BB; [5B 2A, 05, 05]
-1D6CC; [5B 2A, 05, 0B]
-1D706; [5B 2A, 05, 0B]
-1D740; [5B 2A, 05, 0B]
-1D77A; [5B 2A, 05, 0B]
-1D7B4; [5B 2A, 05, 0B]
-039B; [5B 2A, 05, 8F]
-1D6B2; [5B 2A, 05, 95]
-1D6EC; [5B 2A, 05, 95]
-1D726; [5B 2A, 05, 95]
-1D760; [5B 2A, 05, 95]
-1D79A; [5B 2A, 05, 95]
-
-1D27; [5B 2C, 05, 05]
-
-03BC; [5B 2E, 05, 05]
-00B5; [5B 2E, 05, 09]
-1D6CD; [5B 2E, 05, 0B]
-1D707; [5B 2E, 05, 0B]
-1D741; [5B 2E, 05, 0B]
-1D77B; [5B 2E, 05, 0B]
-1D7B5; [5B 2E, 05, 0B]
-039C; [5B 2E, 05, 8F]
-1D6B3; [5B 2E, 05, 95]
-1D6ED; [5B 2E, 05, 95]
-1D727; [5B 2E, 05, 95]
-1D761; [5B 2E, 05, 95]
-1D79B; [5B 2E, 05, 95]
-3382; [5B 2E, 05, 37][27, 05, B9]
-338C; [5B 2E, 05, 37][31, 05, B9]
-338D; [5B 2E, 05, 37][33, 05, 37]
-3395; [5B 2E, 05, 37][3D, 05, 37]
-339B; [5B 2E, 05, 37][3F, 05, 37]
-33B2; [5B 2E, 05, 37][4B, 05, 37]
-33B6; [5B 2E, 05, 37][51, 05, B9]
-33BC; [5B 2E, 05, 37][53, 05, B9]
-
-03BD; [5B 30, 05, 05]
-1D6CE; [5B 30, 05, 0B]
-1D708; [5B 30, 05, 0B]
-1D742; [5B 30, 05, 0B]
-1D77C; [5B 30, 05, 0B]
-1D7B6; [5B 30, 05, 0B]
-039D; [5B 30, 05, 8F]
-1D6B4; [5B 30, 05, 95]
-1D6EE; [5B 30, 05, 95]
-1D728; [5B 30, 05, 95]
-1D762; [5B 30, 05, 95]
-1D79C; [5B 30, 05, 95]
-
-03BE; [5B 32, 05, 05]
-1D6CF; [5B 32, 05, 0B]
-1D709; [5B 32, 05, 0B]
-1D743; [5B 32, 05, 0B]
-1D77D; [5B 32, 05, 0B]
-1D7B7; [5B 32, 05, 0B]
-039E; [5B 32, 05, 8F]
-1D6B5; [5B 32, 05, 95]
-1D6EF; [5B 32, 05, 95]
-1D729; [5B 32, 05, 95]
-1D763; [5B 32, 05, 95]
-1D79D; [5B 32, 05, 95]
-
-03BF; [5B 34, 05, 05]
-1D6D0; [5B 34, 05, 0B]
-1D70A; [5B 34, 05, 0B]
-1D744; [5B 34, 05, 0B]
-1D77E; [5B 34, 05, 0B]
-1D7B8; [5B 34, 05, 0B]
-039F; [5B 34, 05, 8F]
-1D6B6; [5B 34, 05, 95]
-1D6F0; [5B 34, 05, 95]
-1D72A; [5B 34, 05, 95]
-1D764; [5B 34, 05, 95]
-1D79E; [5B 34, 05, 95]
-1F40; [5B 34, 05, 05][, 89, 05]
-1F48; [5B 34, 05, 8F][, 89, 05]
-1F44; [5B 34, 05, 05][, 89, 05][, 8D, 05]
-1F4C; [5B 34, 05, 8F][, 89, 05][, 8D, 05]
-1F42; [5B 34, 05, 05][, 89, 05][, 8F, 05]
-1F4A; [5B 34, 05, 8F][, 89, 05][, 8F, 05]
-1F41; [5B 34, 05, 05][, 8B, 05]
-1F49; [5B 34, 05, 8F][, 8B, 05]
-1F45; [5B 34, 05, 05][, 8B, 05][, 8D, 05]
-1F4D; [5B 34, 05, 8F][, 8B, 05][, 8D, 05]
-1F43; [5B 34, 05, 05][, 8B, 05][, 8F, 05]
-1F4B; [5B 34, 05, 8F][, 8B, 05][, 8F, 05]
-03CC; [5B 34, 05, 05][, 8D, 05]
-1F79; [5B 34, 05, 05][, 8D, 05]
-038C; [5B 34, 05, 8F][, 8D, 05]
-1FF9; [5B 34, 05, 8F][, 8D, 05]
-1F78; [5B 34, 05, 05][, 8F, 05]
-1FF8; [5B 34, 05, 8F][, 8F, 05]
-
-03C0; [5B 36, 05, 05]
-03D6; [5B 36, 05, 09]
-213C; [5B 36, 05, 0B]
-1D6D1; [5B 36, 05, 0B]
-1D6E1; [5B 36, 05, 0B]
-1D70B; [5B 36, 05, 0B]
-1D71B; [5B 36, 05, 0B]
-1D745; [5B 36, 05, 0B]
-1D755; [5B 36, 05, 0B]
-1D77F; [5B 36, 05, 0B]
-1D78F; [5B 36, 05, 0B]
-1D7B9; [5B 36, 05, 0B]
-1D7C9; [5B 36, 05, 0B]
-03A0; [5B 36, 05, 8F]
-213F; [5B 36, 05, 95]
-1D6B7; [5B 36, 05, 95]
-1D6F1; [5B 36, 05, 95]
-1D72B; [5B 36, 05, 95]
-1D765; [5B 36, 05, 95]
-1D79F; [5B 36, 05, 95]
-
-1D28; [5B 38, 05, 05]
-
-03FB; [5B 3A, 05, 05]
-03FA; [5B 3A, 05, 8F]
-
-03DF; [5B 3C, 05, 05]
-03DE; [5B 3C, 05, 8F]
-
-03D9; [5B 3E, 05, 05]
-03D8; [5B 3E, 05, 8F]
-
-03C1; [5B 40, 05, 05]
-03F1; [5B 40, 05, 09]
-1D6D2; [5B 40, 05, 0B]
-1D6E0; [5B 40, 05, 0B]
-1D70C; [5B 40, 05, 0B]
-1D71A; [5B 40, 05, 0B]
-1D746; [5B 40, 05, 0B]
-1D754; [5B 40, 05, 0B]
-1D780; [5B 40, 05, 0B]
-1D78E; [5B 40, 05, 0B]
-1D7BA; [5B 40, 05, 0B]
-1D7C8; [5B 40, 05, 0B]
-03A1; [5B 40, 05, 8F]
-1D6B8; [5B 40, 05, 95]
-1D6F2; [5B 40, 05, 95]
-1D72C; [5B 40, 05, 95]
-1D766; [5B 40, 05, 95]
-1D7A0; [5B 40, 05, 95]
-1D68; [5B 40, 05, 29]
-1FE4; [5B 40, 05, 05][, 89, 05]
-1FE5; [5B 40, 05, 05][, 8B, 05]
-1FEC; [5B 40, 05, 8F][, 8B, 05]
-
-1D29; [5B 42, 05, 05]
-
-03FC; [5B 44, 05, 05]
-
-03C3; [5B 46, 05, 05]
-03F2; [5B 46, 05, 09]
-1D6D3; [5B 46, 05, 0B]
-1D6D4; [5B 46, 05, 0B]
-1D70D; [5B 46, 05, 0B]
-1D70E; [5B 46, 05, 0B]
-1D747; [5B 46, 05, 0B]
-1D748; [5B 46, 05, 0B]
-1D781; [5B 46, 05, 0B]
-1D782; [5B 46, 05, 0B]
-1D7BB; [5B 46, 05, 0B]
-1D7BC; [5B 46, 05, 0B]
-03A3; [5B 46, 05, 8F]
-03F9; [5B 46, 05, 93]
-1D6BA; [5B 46, 05, 95]
-1D6F4; [5B 46, 05, 95]
-1D72E; [5B 46, 05, 95]
-1D768; [5B 46, 05, 95]
-1D7A2; [5B 46, 05, 95]
-03C2; [5B 46, 05, 31]
-
-037C; [5B 48, 05, 05]
-03FE; [5B 48, 05, 8F]
-
-037B; [5B 4A, 05, 05]
-03FD; [5B 4A, 05, 8F]
-
-037D; [5B 4C, 05, 05]
-03FF; [5B 4C, 05, 8F]
-
-03C4; [5B 4E, 05, 05]
-1D6D5; [5B 4E, 05, 0B]
-1D70F; [5B 4E, 05, 0B]
-1D749; [5B 4E, 05, 0B]
-1D783; [5B 4E, 05, 0B]
-1D7BD; [5B 4E, 05, 0B]
-03A4; [5B 4E, 05, 8F]
-1D6BB; [5B 4E, 05, 95]
-1D6F5; [5B 4E, 05, 95]
-1D72F; [5B 4E, 05, 95]
-1D769; [5B 4E, 05, 95]
-1D7A3; [5B 4E, 05, 95]
-
-03C5; [5B 50, 05, 05]
-1D6D6; [5B 50, 05, 0B]
-1D710; [5B 50, 05, 0B]
-1D74A; [5B 50, 05, 0B]
-1D784; [5B 50, 05, 0B]
-1D7BE; [5B 50, 05, 0B]
-03A5; [5B 50, 05, 8F]
-03D2; [5B 50, 05, 93]
-1D6BC; [5B 50, 05, 95]
-1D6F6; [5B 50, 05, 95]
-1D730; [5B 50, 05, 95]
-1D76A; [5B 50, 05, 95]
-1D7A4; [5B 50, 05, 95]
-1F50; [5B 50, 05, 05][, 89, 05]
-1F54; [5B 50, 05, 05][, 89, 05][, 8D, 05]
-1F52; [5B 50, 05, 05][, 89, 05][, 8F, 05]
-1F56; [5B 50, 05, 05][, 89, 05][, 9B, 05]
-1F51; [5B 50, 05, 05][, 8B, 05]
-1F59; [5B 50, 05, 8F][, 8B, 05]
-1F55; [5B 50, 05, 05][, 8B, 05][, 8D, 05]
-1F5D; [5B 50, 05, 8F][, 8B, 05][, 8D, 05]
-1F53; [5B 50, 05, 05][, 8B, 05][, 8F, 05]
-1F5B; [5B 50, 05, 8F][, 8B, 05][, 8F, 05]
-1F57; [5B 50, 05, 05][, 8B, 05][, 9B, 05]
-1F5F; [5B 50, 05, 8F][, 8B, 05][, 9B, 05]
-03CD; [5B 50, 05, 05][, 8D, 05]
-1F7B; [5B 50, 05, 05][, 8D, 05]
-038E; [5B 50, 05, 8F][, 8D, 05]
-1FEB; [5B 50, 05, 8F][, 8D, 05]
-03D3; [5B 50, 05, 93][, 8D, 05]
-1F7A; [5B 50, 05, 05][, 8F, 05]
-1FEA; [5B 50, 05, 8F][, 8F, 05]
-1FE0; [5B 50, 05, 05][, 91, 05]
-1FE8; [5B 50, 05, 8F][, 91, 05]
-1FE6; [5B 50, 05, 05][, 9B, 05]
-03CB; [5B 50, 05, 05][, 9D, 05]
-03AB; [5B 50, 05, 8F][, 9D, 05]
-03D4; [5B 50, 05, 93][, 9D, 05]
-03B0; [5B 50, 05, 05][, 9D, 05][, 8D, 05]
-1FE3; [5B 50, 05, 05][, 9D, 05][, 8D, 05]
-1FE2; [5B 50, 05, 05][, 9D, 05][, 8F, 05]
-1FE7; [5B 50, 05, 05][, 9D, 05][, 9B, 05]
-1FE1; [5B 50, 05, 05][, AB, 05]
-1FE9; [5B 50, 05, 8F][, AB, 05]
-
-03C6; [5B 52, 05, 05]
-03D5; [5B 52, 05, 09]
-1D6D7; [5B 52, 05, 0B]
-1D6DF; [5B 52, 05, 0B]
-1D711; [5B 52, 05, 0B]
-1D719; [5B 52, 05, 0B]
-1D74B; [5B 52, 05, 0B]
-1D753; [5B 52, 05, 0B]
-1D785; [5B 52, 05, 0B]
-1D78D; [5B 52, 05, 0B]
-1D7BF; [5B 52, 05, 0B]
-1D7C7; [5B 52, 05, 0B]
-03A6; [5B 52, 05, 8F]
-1D6BD; [5B 52, 05, 95]
-1D6F7; [5B 52, 05, 95]
-1D731; [5B 52, 05, 95]
-1D76B; [5B 52, 05, 95]
-1D7A5; [5B 52, 05, 95]
-1D60; [5B 52, 05, 27]
-1D69; [5B 52, 05, 29]
-
-03C7; [5B 54, 05, 05]
-1D6D8; [5B 54, 05, 0B]
-1D712; [5B 54, 05, 0B]
-1D74C; [5B 54, 05, 0B]
-1D786; [5B 54, 05, 0B]
-1D7C0; [5B 54, 05, 0B]
-03A7; [5B 54, 05, 8F]
-1D6BE; [5B 54, 05, 95]
-1D6F8; [5B 54, 05, 95]
-1D732; [5B 54, 05, 95]
-1D76C; [5B 54, 05, 95]
-1D7A6; [5B 54, 05, 95]
-1D61; [5B 54, 05, 27]
-1D6A; [5B 54, 05, 29]
-
-03C8; [5B 56, 05, 05]
-1D6D9; [5B 56, 05, 0B]
-1D713; [5B 56, 05, 0B]
-1D74D; [5B 56, 05, 0B]
-1D787; [5B 56, 05, 0B]
-1D7C1; [5B 56, 05, 0B]
-03A8; [5B 56, 05, 8F]
-1D6BF; [5B 56, 05, 95]
-1D6F9; [5B 56, 05, 95]
-1D733; [5B 56, 05, 95]
-1D76D; [5B 56, 05, 95]
-1D7A7; [5B 56, 05, 95]
-
-1D2A; [5B 58, 05, 05]
-
-03C9; [5B 5A, 05, 05]
-1D6DA; [5B 5A, 05, 0B]
-1D714; [5B 5A, 05, 0B]
-1D74E; [5B 5A, 05, 0B]
-1D788; [5B 5A, 05, 0B]
-1D7C2; [5B 5A, 05, 0B]
-03A9; [5B 5A, 05, 8F]
-2126; [5B 5A, 05, 8F]
-1D6C0; [5B 5A, 05, 95]
-1D6FA; [5B 5A, 05, 95]
-1D734; [5B 5A, 05, 95]
-1D76E; [5B 5A, 05, 95]
-1D7A8; [5B 5A, 05, 95]
-1F60; [5B 5A, 05, 05][, 89, 05]
-1F68; [5B 5A, 05, 8F][, 89, 05]
-1F64; [5B 5A, 05, 05][, 89, 05][, 8D, 05]
-1F6C; [5B 5A, 05, 8F][, 89, 05][, 8D, 05]
-1FA4; [5B 5A, 05, 05][, 89, 05][, 8D, 05][, D0 5D, 05]
-1FAC; [5B 5A, 05, 8F][, 89, 05][, 8D, 05][, D0 5D, 05]
-1F62; [5B 5A, 05, 05][, 89, 05][, 8F, 05]
-1F6A; [5B 5A, 05, 8F][, 89, 05][, 8F, 05]
-1FA2; [5B 5A, 05, 05][, 89, 05][, 8F, 05][, D0 5D, 05]
-1FAA; [5B 5A, 05, 8F][, 89, 05][, 8F, 05][, D0 5D, 05]
-1F66; [5B 5A, 05, 05][, 89, 05][, 9B, 05]
-1F6E; [5B 5A, 05, 8F][, 89, 05][, 9B, 05]
-1FA6; [5B 5A, 05, 05][, 89, 05][, 9B, 05][, D0 5D, 05]
-1FAE; [5B 5A, 05, 8F][, 89, 05][, 9B, 05][, D0 5D, 05]
-1FA0; [5B 5A, 05, 05][, 89, 05][, D0 5D, 05]
-1FA8; [5B 5A, 05, 8F][, 89, 05][, D0 5D, 05]
-1F61; [5B 5A, 05, 05][, 8B, 05]
-1F69; [5B 5A, 05, 8F][, 8B, 05]
-1F65; [5B 5A, 05, 05][, 8B, 05][, 8D, 05]
-1F6D; [5B 5A, 05, 8F][, 8B, 05][, 8D, 05]
-1FA5; [5B 5A, 05, 05][, 8B, 05][, 8D, 05][, D0 5D, 05]
-1FAD; [5B 5A, 05, 8F][, 8B, 05][, 8D, 05][, D0 5D, 05]
-1F63; [5B 5A, 05, 05][, 8B, 05][, 8F, 05]
-1F6B; [5B 5A, 05, 8F][, 8B, 05][, 8F, 05]
-1FA3; [5B 5A, 05, 05][, 8B, 05][, 8F, 05][, D0 5D, 05]
-1FAB; [5B 5A, 05, 8F][, 8B, 05][, 8F, 05][, D0 5D, 05]
-1F67; [5B 5A, 05, 05][, 8B, 05][, 9B, 05]
-1F6F; [5B 5A, 05, 8F][, 8B, 05][, 9B, 05]
-1FA7; [5B 5A, 05, 05][, 8B, 05][, 9B, 05][, D0 5D, 05]
-1FAF; [5B 5A, 05, 8F][, 8B, 05][, 9B, 05][, D0 5D, 05]
-1FA1; [5B 5A, 05, 05][, 8B, 05][, D0 5D, 05]
-1FA9; [5B 5A, 05, 8F][, 8B, 05][, D0 5D, 05]
-03CE; [5B 5A, 05, 05][, 8D, 05]
-1F7D; [5B 5A, 05, 05][, 8D, 05]
-038F; [5B 5A, 05, 8F][, 8D, 05]
-1FFB; [5B 5A, 05, 8F][, 8D, 05]
-1FF4; [5B 5A, 05, 05][, 8D, 05][, D0 5D, 05]
-1F7C; [5B 5A, 05, 05][, 8F, 05]
-1FFA; [5B 5A, 05, 8F][, 8F, 05]
-1FF2; [5B 5A, 05, 05][, 8F, 05][, D0 5D, 05]
-1FF6; [5B 5A, 05, 05][, 9B, 05]
-1FF7; [5B 5A, 05, 05][, 9B, 05][, D0 5D, 05]
-1FF3; [5B 5A, 05, 05][, D0 5D, 05]
-1FFC; [5B 5A, 05, 8F][, D0 5D, 05]
-
-03E1; [5B 5C, 05, 05]
-03E0; [5B 5C, 05, 8F]
-
-0373; [5B 5E, 05, 05]
-0372; [5B 5E, 05, 8F]
-
-03F8; [5B 60, 05, 05]
-03F7; [5B 60, 05, 8F]
-
-2C81; [5B 62 04, 05, 05]
-2C80; [5B 62 04, 05, 8F]
-
-2C83; [5B 62 0C, 05, 05]
-2C82; [5B 62 0C, 05, 8F]
-
-2C85; [5B 62 14, 05, 05]
-2C84; [5B 62 14, 05, 8F]
-
-2C87; [5B 62 1C, 05, 05]
-2C86; [5B 62 1C, 05, 8F]
-
-2C89; [5B 62 24, 05, 05]
-2C88; [5B 62 24, 05, 8F]
-
-2CB7; [5B 62 2C, 05, 05]
-2CB6; [5B 62 2C, 05, 8F]
-
-2C8B; [5B 62 34, 05, 05]
-2C8A; [5B 62 34, 05, 8F]
-
-2C8D; [5B 62 3C, 05, 05]
-2C8C; [5B 62 3C, 05, 8F]
-
-2C8F; [5B 62 44, 05, 05]
-2C8E; [5B 62 44, 05, 8F]
-
-2C91; [5B 62 4C, 05, 05]
-2C90; [5B 62 4C, 05, 8F]
-
-2C93; [5B 62 54, 05, 05]
-2C92; [5B 62 54, 05, 8F]
-
-2C95; [5B 62 5C, 05, 05]
-2C94; [5B 62 5C, 05, 8F]
-2CE4; [5B 62 5C, 05, 09][5B 62 04, 05, 09][5B 62 54, 05, 09]
-
-2CB9; [5B 62 64, 05, 05]
-2CB8; [5B 62 64, 05, 8F]
+2CE1; [5D DA, 05, 05]
+2CE0; [5D DA, 05, A0]
 
-2C97; [5B 62 6C, 05, 05]
-2C96; [5B 62 6C, 05, 8F]
+2CE3; [5D DC, 05, 05]
+2CE2; [5D DC, 05, A0]
 
-2C99; [5B 62 74, 05, 05]
-2C98; [5B 62 74, 05, 8F]
+FDD1 042F;     [5E 04 02, 05, 05]      # CYRILLIC first primary starts reordering group (compressible)
 
-2C9B; [5B 62 7C, 05, 05]
-2C9A; [5B 62 7C, 05, 8F]
+0430; [5E 09, 05, 05]
+2DF6; [5E 09, 05, 20]
+0410; [5E 09, 05, AE]
 
-2CBB; [5B 62 84, 05, 05]
-2CBA; [5B 62 84, 05, 8F]
+0430 0306; [5E 0B 02, 05, 05]
+04D1; [5E 0B 02, 05, 05]
+0410 0306; [5E 0B 02, 05, A0]
+04D0; [5E 0B 02, 05, A0]
 
-2CBD; [5B 62 8C, 05, 05]
-2CBC; [5B 62 8C, 05, 8F]
+0430 0308; [5E 0B 0A, 05, 05]
+04D3; [5E 0B 0A, 05, 05]
+0410 0308; [5E 0B 0A, 05, A0]
+04D2; [5E 0B 0A, 05, A0]
 
-2C9D; [5B 62 94, 05, 05]
-2C9C; [5B 62 94, 05, 8F]
+04D9; [5E 0D, 05, 05]
+04D8; [5E 0D, 05, A0]
 
-2C9F; [5B 62 9C, 05, 05]
-2C9E; [5B 62 9C, 05, 8F]
+04D9 0308; [5E 0F, 05, 05]
+04DB; [5E 0F, 05, 05]
+04D8 0308; [5E 0F, 05, A0]
+04DA; [5E 0F, 05, A0]
 
-2CA1; [5B 62 A4, 05, 05]
-2CA0; [5B 62 A4, 05, 8F]
+04D5; [5E 11, 05, 05]
+04D4; [5E 11, 05, A0]
 
-2CA3; [5B 62 AC, 05, 05]
-2CA2; [5B 62 AC, 05, 8F]
+0431; [5E 13, 05, 05]
+2DE0; [5E 13, 05, 20]
+0411; [5E 13, 05, AE]
 
-2CA5; [5B 62 B4, 05, 05]
-2CA4; [5B 62 B4, 05, 8F]
+0432; [5E 15, 05, 05]
+2DE1; [5E 15, 05, 20]
+0412; [5E 15, 05, AE]
 
-2CA7; [5B 62 BC, 05, 05]
-2CA6; [5B 62 BC, 05, 8F]
+0433; [5E 17, 05, 05]
+2DE2; [5E 17, 05, 20]
+0413; [5E 17, 05, AE]
+0491; [5E 17, 70, 20]
+0490; [5E 17, 70, AE]
 
-2CA9; [5B 62 C4, 05, 05]
-2CA8; [5B 62 C4, 05, 8F]
+0493; [5E 19, 05, 05]
+0492; [5E 19, 05, A0]
 
-2CAB; [5B 62 CC, 05, 05]
-2CAA; [5B 62 CC, 05, 8F]
+04FB; [5E 1B, 05, 05]
+04FA; [5E 1B, 05, A0]
 
-2CAD; [5B 62 D4, 05, 05]
-2CAC; [5B 62 D4, 05, 8F]
+0495; [5E 1D, 05, 05]
+0494; [5E 1D, 05, A0]
 
-2CAF; [5B 62 DC, 05, 05]
-2CAE; [5B 62 DC, 05, 8F]
+04F7; [5E 1F, 05, 05]
+04F6; [5E 1F, 05, A0]
 
-2CB1; [5B 62 E4, 05, 05]
-2CB0; [5B 62 E4, 05, 8F]
+0434; [5E 21, 05, 05]
+2DE3; [5E 21, 05, 20]
+0414; [5E 21, 05, AE]
 
-2CBF; [5B 62 EC, 05, 05]
-2CBE; [5B 62 EC, 05, 8F]
+0501; [5E 23 02, 05, 05]
+0500; [5E 23 02, 05, A0]
 
-2CC1; [5B 62 F4, 05, 05]
-2CC0; [5B 62 F4, 05, 8F]
+A681; [5E 23 0A, 05, 05]
+A680; [5E 23 0A, 05, A0]
 
-03E3; [5B 62 FC, 05, 05]
-03E2; [5B 62 FC, 05, 8F]
+0452; [5E 25, 05, 05]
+0402; [5E 25, 05, A0]
 
-2CEC; [5B 63 0A, 05, 05]
-2CEB; [5B 63 0A, 05, 8F]
+A663; [5E 27 02, 05, 05]
+A662; [5E 27 02, 05, A0]
 
-2CC3; [5B 63 12, 05, 05]
-2CC2; [5B 63 12, 05, 8F]
+0503; [5E 27 0A, 05, 05]
+0502; [5E 27 0A, 05, A0]
 
-2CC5; [5B 63 1A, 05, 05]
-2CC4; [5B 63 1A, 05, 8F]
+0433 0301; [5E 29, 05, 05]
+0433 0341; [5E 29, 05, 05]
+0453; [5E 29, 05, 05]
+0403; [5E 29, 05, A0]
+0413 0301; [5E 29, 05, A0]
+0413 0341; [5E 29, 05, A0]
 
-2CC7; [5B 63 22, 05, 05]
-2CC6; [5B 63 22, 05, 8F]
+0499; [5E 2B, 05, 05]
+0498; [5E 2B, 05, A0]
 
-03E5; [5B 63 2A, 05, 05]
-03E4; [5B 63 2A, 05, 8F]
+0435; [5E 2D, 05, 05]
+2DF7; [5E 2D, 05, 20]
+0415; [5E 2D, 05, AE]
+0450; [5E 2D, 05, 05][, 8A, 05]
+0400; [5E 2D, 05, AE][, 8A, 05]
+0451; [5E 2D, 05, 05][, 96, 05]
+0401; [5E 2D, 05, AE][, 96, 05]
 
-03E7; [5B 63 32, 05, 05]
-03E6; [5B 63 32, 05, 8F]
+0435 0306; [5E 2F, 05, 05]
+04D7; [5E 2F, 05, 05]
+0415 0306; [5E 2F, 05, A0]
+04D6; [5E 2F, 05, A0]
 
-2CF3; [5B 63 3A, 05, 05]
-2CF2; [5B 63 3A, 05, 8F]
+0454; [5E 31, 05, 05]
+A674; [5E 31, 05, 20]
+0404; [5E 31, 05, AE]
 
-2CC9; [5B 63 42, 05, 05]
-2CC8; [5B 63 42, 05, 8F]
+0436; [5E 33, 05, 05]
+2DE4; [5E 33, 05, 20]
+0416; [5E 33, 05, AE]
+04C2; [5E 33, 05, 05][, 8C, 05]
+04C1; [5E 33, 05, AE][, 8C, 05]
 
-03E9; [5B 63 4A, 05, 05]
-03E8; [5B 63 4A, 05, 8F]
+A685; [5E 35 02, 05, 05]
+A684; [5E 35 02, 05, A0]
 
-2CCB; [5B 63 52, 05, 05]
-2CCA; [5B 63 52, 05, 8F]
+0436 0308; [5E 35 0A, 05, 05]
+04DD; [5E 35 0A, 05, 05]
+0416 0308; [5E 35 0A, 05, A0]
+04DC; [5E 35 0A, 05, A0]
 
-2CCD; [5B 63 5A, 05, 05]
-2CCC; [5B 63 5A, 05, 8F]
+0497; [5E 35 12, 05, 05]
+0496; [5E 35 12, 05, A0]
 
-2CCF; [5B 63 62, 05, 05]
-2CCE; [5B 63 62, 05, 8F]
+0437; [5E 37, 05, 05]
+2DE5; [5E 37, 05, 20]
+0417; [5E 37, 05, AE]
 
-2CD1; [5B 63 6A, 05, 05]
-2CD0; [5B 63 6A, 05, 8F]
+A641; [5E 39 02, 05, 05]
+A640; [5E 39 02, 05, A0]
 
-2CD3; [5B 63 72, 05, 05]
-2CD2; [5B 63 72, 05, 8F]
+0505; [5E 39 0A, 05, 05]
+0504; [5E 39 0A, 05, A0]
 
-2CD5; [5B 63 7A, 05, 05]
-2CD4; [5B 63 7A, 05, 8F]
+0511; [5E 39 12, 05, 05]
+0510; [5E 39 12, 05, A0]
 
-03EB; [5B 63 82, 05, 05]
-03EA; [5B 63 82, 05, 8F]
+0437 0308; [5E 39 1A, 05, 05]
+04DF; [5E 39 1A, 05, 05]
+0417 0308; [5E 39 1A, 05, A0]
+04DE; [5E 39 1A, 05, A0]
 
-2CEE; [5B 63 8A, 05, 05]
-2CED; [5B 63 8A, 05, 8F]
+A643; [5E 39 22, 05, 05]
+A642; [5E 39 22, 05, A0]
 
-2CD7; [5B 63 92, 05, 05]
-2CD6; [5B 63 92, 05, 8F]
+0455; [5E 3B, 05, 05]
+0405; [5E 3B, 05, A0]
 
-03ED; [5B 63 9A, 05, 05]
-03EC; [5B 63 9A, 05, 8F]
+A645; [5E 3D 02, 05, 05]
+A644; [5E 3D 02, 05, A0]
 
-2CD9; [5B 63 A2, 05, 05]
-2CD8; [5B 63 A2, 05, 8F]
+04E1; [5E 3D 0A, 05, 05]
+04E0; [5E 3D 0A, 05, A0]
 
-2CDB; [5B 63 AA, 05, 05]
-2CDA; [5B 63 AA, 05, 8F]
+A689; [5E 3D 12, 05, 05]
+A688; [5E 3D 12, 05, A0]
 
-2CDD; [5B 63 B2, 05, 05]
-2CDC; [5B 63 B2, 05, 8F]
+0507; [5E 3D 1A, 05, 05]
+0506; [5E 3D 1A, 05, A0]
 
-03EF; [5B 63 BA, 05, 05]
-03EE; [5B 63 BA, 05, 8F]
+A683; [5E 3D 22, 05, 05]
+A682; [5E 3D 22, 05, A0]
 
-2CB3; [5B 63 C2, 05, 05]
-2CB2; [5B 63 C2, 05, 8F]
+0438; [5E 3F, 05, 05]
+A675; [5E 3F, 05, 20]
+0418; [5E 3F, 05, AE]
+045D; [5E 3F, 05, 05][, 8A, 05]
+040D; [5E 3F, 05, AE][, 8A, 05]
+04E3; [5E 3F, 05, 05][, A4, 05]
+04E2; [5E 3F, 05, AE][, A4, 05]
 
-2CB5; [5B 63 CA, 05, 05]
-2CB4; [5B 63 CA, 05, 8F]
+048B; [5E 41 02, 05, 05]
+048A; [5E 41 02, 05, A0]
 
-2CDF; [5B 63 D2, 05, 05]
-2CDE; [5B 63 D2, 05, 8F]
+0438 0308; [5E 41 0A, 05, 05]
+04E5; [5E 41 0A, 05, 05]
+0418 0308; [5E 41 0A, 05, A0]
+04E4; [5E 41 0A, 05, A0]
 
-2CE1; [5B 63 DA, 05, 05]
-2CE0; [5B 63 DA, 05, 8F]
+0456; [5E 43, 05, 05]
+0406; [5E 43, 05, A0]
 
-2CE3; [5B 63 E2, 05, 05]
-2CE2; [5B 63 E2, 05, 8F]
+A647; [5E 45, 05, 05]
+A646; [5E 45, 05, A0]
 
-0430; [5C 0A, 05, 05]
-2DF6; [5C 0A, 05, 09]
-0410; [5C 0A, 05, 8F]
+0456 0308; [5E 47, 05, 05]
+0457; [5E 47, 05, 05]
+A676; [5E 47, 05, 20]
+0406 0308; [5E 47, 05, AE]
+0407; [5E 47, 05, AE]
 
-0430 0306; [5C 0C, 05, 05]
-04D1; [5C 0C, 05, 05]
-0410 0306; [5C 0C, 05, 8F]
-04D0; [5C 0C, 05, 8F]
+0438 0306; [5E 49, 05, 05]
+0439; [5E 49, 05, 05]
+0418 0306; [5E 49, 05, A0]
+0419; [5E 49, 05, A0]
 
-0430 0308; [5C 0E, 05, 05]
-04D3; [5C 0E, 05, 05]
-0410 0308; [5C 0E, 05, 8F]
-04D2; [5C 0E, 05, 8F]
+0458; [5E 4B, 05, 05]
+0408; [5E 4B, 05, A0]
 
-04D9; [5C 10, 05, 05]
-04D8; [5C 10, 05, 8F]
+A649; [5E 4D, 05, 05]
+2DF8; [5E 4D, 05, 20]
+A648; [5E 4D, 05, AE]
 
-04D9 0308; [5C 12, 05, 05]
-04DB; [5C 12, 05, 05]
-04D8 0308; [5C 12, 05, 8F]
-04DA; [5C 12, 05, 8F]
+043A; [5E 4F, 05, 05]
+2DE6; [5E 4F, 05, 20]
+041A; [5E 4F, 05, AE]
 
-04D5; [5C 14, 05, 05]
-04D4; [5C 14, 05, 8F]
+049B; [5E 51, 05, 05]
+049A; [5E 51, 05, A0]
 
-0431; [5C 16, 05, 05]
-2DE0; [5C 16, 05, 09]
-0411; [5C 16, 05, 8F]
+04C4; [5E 53 02, 05, 05]
+04C3; [5E 53 02, 05, A0]
 
-0432; [5C 18, 05, 05]
-2DE1; [5C 18, 05, 09]
-0412; [5C 18, 05, 8F]
+04A1; [5E 53 0A, 05, 05]
+04A0; [5E 53 0A, 05, A0]
 
-0433; [5C 1A, 05, 05]
-2DE2; [5C 1A, 05, 09]
-0413; [5C 1A, 05, 8F]
-0491; [5C 1A, 05, 09][, DB B9, 09]
-0490; [5C 1A, 05, 93][, DB B9, 09]
+049F; [5E 53 12, 05, 05]
+049E; [5E 53 12, 05, A0]
 
-0493; [5C 1C, 05, 05]
-0492; [5C 1C, 05, 8F]
+049D; [5E 55, 05, 05]
+049C; [5E 55, 05, A0]
 
-04FB; [5C 1E, 05, 05]
-04FA; [5C 1E, 05, 8F]
+051F; [5E 57 02, 05, 05]
+051E; [5E 57 02, 05, A0]
 
-0495; [5C 20, 05, 05]
-0494; [5C 20, 05, 8F]
+051B; [5E 57 0A, 05, 05]
+051A; [5E 57 0A, 05, A0]
 
-04F7; [5C 22, 05, 05]
-04F6; [5C 22, 05, 8F]
+043B; [5E 59, 05, 05]
+2DE7; [5E 59, 05, 20]
+041B; [5E 59, 05, AE]
 
-0434; [5C 24, 05, 05]
-2DE3; [5C 24, 05, 09]
-0414; [5C 24, 05, 8F]
+1D2B; [5E 5B 02, 05, 05]
 
-0501; [5C 26, 05, 05]
-0500; [5C 26, 05, 8F]
+04C6; [5E 5B 0A, 05, 05]
+04C5; [5E 5B 0A, 05, A0]
 
-A681; [5C 28, 05, 05]
-A680; [5C 28, 05, 8F]
+0513; [5E 5B 12, 05, 05]
+0512; [5E 5B 12, 05, A0]
 
-0452; [5C 2A, 05, 05]
-0402; [5C 2A, 05, 8F]
+0521; [5E 5B 1A, 05, 05]
+0520; [5E 5B 1A, 05, A0]
 
-A663; [5C 2C, 05, 05]
-A662; [5C 2C, 05, 8F]
+0459; [5E 5D, 05, 05]
+0409; [5E 5D, 05, A0]
 
-0503; [5C 2E, 05, 05]
-0502; [5C 2E, 05, 8F]
+A665; [5E 5F 02, 05, 05]
+A664; [5E 5F 02, 05, A0]
 
-0433 0301; [5C 30, 05, 05]
-0433 0341; [5C 30, 05, 05]
-0453; [5C 30, 05, 05]
-0403; [5C 30, 05, 8F]
-0413 0301; [5C 30, 05, 8F]
-0413 0341; [5C 30, 05, 8F]
+0509; [5E 5F 0A, 05, 05]
+0508; [5E 5F 0A, 05, A0]
 
-0499; [5C 32, 05, 05]
-0498; [5C 32, 05, 8F]
+0515; [5E 5F 12, 05, 05]
+0514; [5E 5F 12, 05, A0]
 
-0435; [5C 34, 05, 05]
-2DF7; [5C 34, 05, 09]
-0415; [5C 34, 05, 8F]
-0450; [5C 34, 05, 05][, 8F, 05]
-0400; [5C 34, 05, 8F][, 8F, 05]
-0451; [5C 34, 05, 05][, 9D, 05]
-0401; [5C 34, 05, 8F][, 9D, 05]
+043C; [5E 61, 05, 05]
+2DE8; [5E 61, 05, 20]
+041C; [5E 61, 05, AE]
 
-0435 0306; [5C 36, 05, 05]
-04D7; [5C 36, 05, 05]
-0415 0306; [5C 36, 05, 8F]
-04D6; [5C 36, 05, 8F]
+04CE; [5E 63 02, 05, 05]
+04CD; [5E 63 02, 05, A0]
 
-0454; [5C 38, 05, 05]
-A674; [5C 38, 05, 09]
-0404; [5C 38, 05, 8F]
+A667; [5E 63 0A, 05, 05]
+A666; [5E 63 0A, 05, A0]
 
-0436; [5C 3A, 05, 05]
-2DE4; [5C 3A, 05, 09]
-0416; [5C 3A, 05, 8F]
-04C2; [5C 3A, 05, 05][, 91, 05]
-04C1; [5C 3A, 05, 8F][, 91, 05]
+043D; [5E 65, 05, 05]
+2DE9; [5E 65, 05, 10]
+041D; [5E 65, 05, 9E]
+1D78; [5E 65, 05, 2C]
 
-A685; [5C 3C, 05, 05]
-A684; [5C 3C, 05, 8F]
+04CA; [5E 67, 05, 05]
+04C9; [5E 67, 05, A0]
 
-0436 0308; [5C 3E, 05, 05]
-04DD; [5C 3E, 05, 05]
-0416 0308; [5C 3E, 05, 8F]
-04DC; [5C 3E, 05, 8F]
+04A3; [5E 69, 05, 05]
+04A2; [5E 69, 05, A0]
 
-0497; [5C 40, 05, 05]
-0496; [5C 40, 05, 8F]
+04C8; [5E 6B 02, 05, 05]
+04C7; [5E 6B 02, 05, A0]
 
-0437; [5C 42, 05, 05]
-2DE5; [5C 42, 05, 09]
-0417; [5C 42, 05, 8F]
+0523; [5E 6B 0A, 05, 05]
+0522; [5E 6B 0A, 05, A0]
 
-A641; [5C 44, 05, 05]
-A640; [5C 44, 05, 8F]
+04A5; [5E 6D, 05, 05]
+04A4; [5E 6D, 05, A0]
 
-0505; [5C 46, 05, 05]
-0504; [5C 46, 05, 8F]
+045A; [5E 6F, 05, 05]
+040A; [5E 6F, 05, A0]
 
-0511; [5C 48, 05, 05]
-0510; [5C 48, 05, 8F]
+050B; [5E 71, 05, 05]
+050A; [5E 71, 05, A0]
 
-0437 0308; [5C 4A, 05, 05]
-04DF; [5C 4A, 05, 05]
-0417 0308; [5C 4A, 05, 8F]
-04DE; [5C 4A, 05, 8F]
+043E; [5E 73, 05, 05]
+2DEA; [5E 73, 05, 10]
+A669; [5E 73, 05, 10]
+A66B; [5E 73, 05, 10]
+A66D; [5E 73, 05, 10]
+A66E; [5E 73, 05, 10]
+041E; [5E 73, 05, 9E]
+A668; [5E 73, 05, AC]
+A66A; [5E 73, 05, AC]
+A66C; [5E 73, 05, AC]
 
-A643; [5C 4C, 05, 05]
-A642; [5C 4C, 05, 8F]
+043E 0308; [5E 75, 05, 05]
+04E7; [5E 75, 05, 05]
+041E 0308; [5E 75, 05, A0]
+04E6; [5E 75, 05, A0]
 
-0455; [5C 4E, 05, 05]
-0405; [5C 4E, 05, 8F]
+04E9; [5E 77, 05, 05]
+04E8; [5E 77, 05, A0]
 
-A645; [5C 50, 05, 05]
-A644; [5C 50, 05, 8F]
+04E9 0308; [5E 79, 05, 05]
+04EB; [5E 79, 05, 05]
+04E8 0308; [5E 79, 05, A0]
+04EA; [5E 79, 05, A0]
 
-04E1; [5C 52, 05, 05]
-04E0; [5C 52, 05, 8F]
+043F; [5E 7B, 05, 05]
+2DEB; [5E 7B, 05, 20]
+041F; [5E 7B, 05, AE]
 
-A689; [5C 54, 05, 05]
-A688; [5C 54, 05, 8F]
+0525; [5E 7D 02, 05, 05]
+0524; [5E 7D 02, 05, A0]
 
-0507; [5C 56, 05, 05]
-0506; [5C 56, 05, 8F]
+04A7; [5E 7D 0A, 05, 05]
+04A6; [5E 7D 0A, 05, A0]
 
-A683; [5C 58, 05, 05]
-A682; [5C 58, 05, 8F]
+0481; [5E 7D 12, 05, 05]
+0480; [5E 7D 12, 05, A0]
 
-0438; [5C 5A, 05, 05]
-A675; [5C 5A, 05, 09]
-0418; [5C 5A, 05, 8F]
-045D; [5C 5A, 05, 05][, 8F, 05]
-040D; [5C 5A, 05, 8F][, 8F, 05]
-04E3; [5C 5A, 05, 05][, AB, 05]
-04E2; [5C 5A, 05, 8F][, AB, 05]
+0440; [5E 7F, 05, 05]
+2DEC; [5E 7F, 05, 20]
+0420; [5E 7F, 05, AE]
 
-048B; [5C 5C, 05, 05]
-048A; [5C 5C, 05, 8F]
+048F; [5E 81 02, 05, 05]
+048E; [5E 81 02, 05, A0]
 
-0438 0308; [5C 5E, 05, 05]
-04E5; [5C 5E, 05, 05]
-0418 0308; [5C 5E, 05, 8F]
-04E4; [5C 5E, 05, 8F]
+0517; [5E 81 0A, 05, 05]
+0516; [5E 81 0A, 05, A0]
 
-0456; [5C 60, 05, 05]
-0406; [5C 60, 05, 8F]
+0441; [5E 83, 05, 05]
+2DED; [5E 83, 05, 20]
+0421; [5E 83, 05, AE]
+2DF5; [5E 83, 05, 20][5E 87, 05, 20]
 
-A647; [5C 62, 05, 05]
-A646; [5C 62, 05, 8F]
+050D; [5E 85 02, 05, 05]
+050C; [5E 85 02, 05, A0]
 
-0456 0308; [5C 64, 05, 05]
-0457; [5C 64, 05, 05]
-A676; [5C 64, 05, 09]
-0406 0308; [5C 64, 05, 8F]
-0407; [5C 64, 05, 8F]
+04AB; [5E 85 0A, 05, 05]
+04AA; [5E 85 0A, 05, A0]
 
-0438 0306; [5C 66, 05, 05]
-0439; [5C 66, 05, 05]
-0418 0306; [5C 66, 05, 8F]
-0419; [5C 66, 05, 8F]
+0442; [5E 87, 05, 05]
+2DEE; [5E 87, 05, 20]
+0422; [5E 87, 05, AE]
 
-0458; [5C 68, 05, 05]
-0408; [5C 68, 05, 8F]
+A68D; [5E 89 02, 05, 05]
+A68C; [5E 89 02, 05, A0]
 
-A649; [5C 6A, 05, 05]
-2DF8; [5C 6A, 05, 09]
-A648; [5C 6A, 05, 8F]
+050F; [5E 89 0A, 05, 05]
+050E; [5E 89 0A, 05, A0]
 
-043A; [5C 6C, 05, 05]
-2DE6; [5C 6C, 05, 09]
-041A; [5C 6C, 05, 8F]
+04AD; [5E 89 12, 05, 05]
+04AC; [5E 89 12, 05, A0]
 
-049B; [5C 6E, 05, 05]
-049A; [5C 6E, 05, 8F]
+A68B; [5E 89 1A, 05, 05]
+A68A; [5E 89 1A, 05, A0]
 
-04C4; [5C 70, 05, 05]
-04C3; [5C 70, 05, 8F]
+045B; [5E 8B, 05, 05]
+040B; [5E 8B, 05, A0]
 
-04A1; [5C 72, 05, 05]
-04A0; [5C 72, 05, 8F]
+043A 0301; [5E 8D, 05, 05]
+043A 0341; [5E 8D, 05, 05]
+045C; [5E 8D, 05, 05]
+040C; [5E 8D, 05, A0]
+041A 0301; [5E 8D, 05, A0]
+041A 0341; [5E 8D, 05, A0]
 
-049F; [5C 74, 05, 05]
-049E; [5C 74, 05, 8F]
+0443; [5E 8F, 05, 05]
+A677; [5E 8F, 05, 20]
+0423; [5E 8F, 05, AE]
+04EF; [5E 8F, 05, 05][, A4, 05]
+04EE; [5E 8F, 05, AE][, A4, 05]
 
-049D; [5C 76, 05, 05]
-049C; [5C 76, 05, 8F]
+0443 0306; [5E 91, 05, 05]
+045E; [5E 91, 05, 05]
+040E; [5E 91, 05, A0]
+0423 0306; [5E 91, 05, A0]
 
-051F; [5C 78, 05, 05]
-051E; [5C 78, 05, 8F]
+0443 0308; [5E 93 02, 05, 05]
+04F1; [5E 93 02, 05, 05]
+0423 0308; [5E 93 02, 05, A0]
+04F0; [5E 93 02, 05, A0]
 
-051B; [5C 7A, 05, 05]
-051A; [5C 7A, 05, 8F]
+0443 030B; [5E 93 0A, 05, 05]
+04F3; [5E 93 0A, 05, 05]
+0423 030B; [5E 93 0A, 05, A0]
+04F2; [5E 93 0A, 05, A0]
 
-043B; [5C 7C, 05, 05]
-2DE7; [5C 7C, 05, 09]
-041B; [5C 7C, 05, 8F]
+04AF; [5E 95, 05, 05]
+04AE; [5E 95, 05, A0]
 
-1D2B; [5C 7E, 05, 05]
+04B1; [5E 97, 05, 05]
+04B0; [5E 97, 05, A0]
 
-04C6; [5C 80, 05, 05]
-04C5; [5C 80, 05, 8F]
+A64B; [5E 99 02, 05, 05]
+2DF9; [5E 99 02, 05, 20]
+A64A; [5E 99 02, 05, AE]
 
-0513; [5C 82, 05, 05]
-0512; [5C 82, 05, 8F]
+0479; [5E 99 0A, 05, 05]
+0478; [5E 99 0A, 05, A0]
 
-0521; [5C 84, 05, 05]
-0520; [5C 84, 05, 8F]
+0444; [5E 9B, 05, 05]
+0424; [5E 9B, 05, A0]
 
-0459; [5C 86, 05, 05]
-0409; [5C 86, 05, 8F]
+0445; [5E 9D, 05, 05]
+2DEF; [5E 9D, 05, 20]
+0425; [5E 9D, 05, AE]
 
-A665; [5C 88, 05, 05]
-A664; [5C 88, 05, 8F]
+04FD; [5E 9F 02, 05, 05]
+04FC; [5E 9F 02, 05, A0]
 
-0509; [5C 8A, 05, 05]
-0508; [5C 8A, 05, 8F]
+04FF; [5E 9F 0A, 05, 05]
+04FE; [5E 9F 0A, 05, A0]
 
-0515; [5C 8C, 05, 05]
-0514; [5C 8C, 05, 8F]
+04B3; [5E A1, 05, 05]
+04B2; [5E A1, 05, A0]
 
-043C; [5C 8E, 05, 05]
-2DE8; [5C 8E, 05, 09]
-041C; [5C 8E, 05, 8F]
+04BB; [5E A3, 05, 05]
+04BA; [5E A3, 05, A0]
 
-04CE; [5C 90, 05, 05]
-04CD; [5C 90, 05, 8F]
+0527; [5E A5 02, 05, 05]
+0526; [5E A5 02, 05, A0]
 
-A667; [5C 92, 05, 05]
-A666; [5C 92, 05, 8F]
+A695; [5E A5 0A, 05, 05]
+A694; [5E A5 0A, 05, A0]
 
-043D; [5C 94, 05, 05]
-2DE9; [5C 94, 05, 09]
-041D; [5C 94, 05, 8F]
-1D78; [5C 94, 05, 27]
+0461; [5E A5 12, 05, 05]
+A67B; [5E A5 12, 05, 20]
+0460; [5E A5 12, 05, AE]
 
-04CA; [5C 96, 05, 05]
-04C9; [5C 96, 05, 8F]
+047F; [5E A5 1A, 05, 05]
+047E; [5E A5 1A, 05, A0]
 
-04A3; [5C 98, 05, 05]
-04A2; [5C 98, 05, 8F]
+A64D; [5E A5 22, 05, 05]
+A64C; [5E A5 22, 05, A0]
 
-04C8; [5C 9A, 05, 05]
-04C7; [5C 9A, 05, 8F]
+047D; [5E A5 2A, 05, 05]
+047C; [5E A5 2A, 05, A0]
 
-0523; [5C 9C, 05, 05]
-0522; [5C 9C, 05, 8F]
+047B; [5E A5 32, 05, 05]
+047A; [5E A5 32, 05, A0]
 
-04A5; [5C 9E, 05, 05]
-04A4; [5C 9E, 05, 8F]
+0446; [5E A7, 05, 05]
+2DF0; [5E A7, 05, 20]
+0426; [5E A7, 05, AE]
 
-045A; [5C A0, 05, 05]
-040A; [5C A0, 05, 8F]
+A661; [5E A9 02, 05, 05]
+A660; [5E A9 02, 05, A0]
 
-050B; [5C A2, 05, 05]
-050A; [5C A2, 05, 8F]
+A68F; [5E A9 0A, 05, 05]
+A68E; [5E A9 0A, 05, A0]
 
-043E; [5C A4, 05, 05]
-2DEA; [5C A4, 05, 09]
-A669; [5C A4, 05, 09]
-A66B; [5C A4, 05, 09]
-A66D; [5C A4, 05, 09]
-A66E; [5C A4, 05, 09]
-041E; [5C A4, 05, 8F]
-A668; [5C A4, 05, 93]
-A66A; [5C A4, 05, 93]
-A66C; [5C A4, 05, 93]
+04B5; [5E A9 12, 05, 05]
+04B4; [5E A9 12, 05, A0]
 
-043E 0308; [5C A6, 05, 05]
-04E7; [5C A6, 05, 05]
-041E 0308; [5C A6, 05, 8F]
-04E6; [5C A6, 05, 8F]
+A691; [5E A9 1A, 05, 05]
+A690; [5E A9 1A, 05, A0]
 
-04E9; [5C A8, 05, 05]
-04E8; [5C A8, 05, 8F]
+0447; [5E AB, 05, 05]
+2DF1; [5E AB, 05, 20]
+0427; [5E AB, 05, AE]
 
-04E9 0308; [5C AA, 05, 05]
-04EB; [5C AA, 05, 05]
-04E8 0308; [5C AA, 05, 8F]
-04EA; [5C AA, 05, 8F]
+A693; [5E AD 02, 05, 05]
+A692; [5E AD 02, 05, A0]
 
-043F; [5C AC, 05, 05]
-2DEB; [5C AC, 05, 09]
-041F; [5C AC, 05, 8F]
+0447 0308; [5E AD 0A, 05, 05]
+04F5; [5E AD 0A, 05, 05]
+0427 0308; [5E AD 0A, 05, A0]
+04F4; [5E AD 0A, 05, A0]
 
-0525; [5C AE, 05, 05]
-0524; [5C AE, 05, 8F]
+04B7; [5E AF, 05, 05]
+04B6; [5E AF, 05, A0]
 
-04A7; [5C B0, 05, 05]
-04A6; [5C B0, 05, 8F]
+04CC; [5E B1, 05, 05]
+04CB; [5E B1, 05, A0]
 
-0481; [5C B2, 05, 05]
-0480; [5C B2, 05, 8F]
+04B9; [5E B3, 05, 05]
+04B8; [5E B3, 05, A0]
 
-0440; [5C B4, 05, 05]
-2DEC; [5C B4, 05, 09]
-0420; [5C B4, 05, 8F]
+A687; [5E B5 02, 05, 05]
+A686; [5E B5 02, 05, A0]
 
-048F; [5C B6, 05, 05]
-048E; [5C B6, 05, 8F]
+04BD; [5E B5 0A, 05, 05]
+04BC; [5E B5 0A, 05, A0]
 
-0517; [5C B8, 05, 05]
-0516; [5C B8, 05, 8F]
+04BF; [5E B5 12, 05, 05]
+04BE; [5E B5 12, 05, A0]
 
-0441; [5C BA, 05, 05]
-2DED; [5C BA, 05, 09]
-0421; [5C BA, 05, 8F]
-2DF5; [5C BA, 05, 09][5C C0, 05, 09]
+045F; [5E B7, 05, 05]
+040F; [5E B7, 05, A0]
 
-050D; [5C BC, 05, 05]
-050C; [5C BC, 05, 8F]
+0448; [5E B9, 05, 05]
+2DF2; [5E B9, 05, 20]
+0428; [5E B9, 05, AE]
 
-04AB; [5C BE, 05, 05]
-04AA; [5C BE, 05, 8F]
+A697; [5E BB, 05, 05]
+A696; [5E BB, 05, A0]
 
-0442; [5C C0, 05, 05]
-2DEE; [5C C0, 05, 09]
-0422; [5C C0, 05, 8F]
+0449; [5E BD, 05, 05]
+2DF3; [5E BD, 05, 20]
+0429; [5E BD, 05, AE]
 
-A68D; [5C C2, 05, 05]
-A68C; [5C C2, 05, 8F]
+A64F; [5E BF 02, 05, 05]
+A64E; [5E BF 02, 05, A0]
 
-050F; [5C C4, 05, 05]
-050E; [5C C4, 05, 8F]
+2E2F; [5E BF 0A, 05, 05]
 
-04AD; [5C C6, 05, 05]
-04AC; [5C C6, 05, 8F]
+A67F; [5E BF 12, 05, 05]
 
-A68B; [5C C8, 05, 05]
-A68A; [5C C8, 05, 8F]
+044A; [5E C1, 05, 05]
+A678; [5E C1, 05, 20]
+042A; [5E C1, 05, AE]
 
-045B; [5C CA, 05, 05]
-040B; [5C CA, 05, 8F]
+A651; [5E C3, 05, 05]
+A650; [5E C3, 05, A0]
 
-043A 0301; [5C CC, 05, 05]
-043A 0341; [5C CC, 05, 05]
-045C; [5C CC, 05, 05]
-040C; [5C CC, 05, 8F]
-041A 0301; [5C CC, 05, 8F]
-041A 0341; [5C CC, 05, 8F]
+044B; [5E C5, 05, 05]
+A679; [5E C5, 05, 20]
+042B; [5E C5, 05, AE]
 
-0443; [5C CE, 05, 05]
-A677; [5C CE, 05, 09]
-0423; [5C CE, 05, 8F]
-04EF; [5C CE, 05, 05][, AB, 05]
-04EE; [5C CE, 05, 8F][, AB, 05]
+044B 0308; [5E C7, 05, 05]
+04F9; [5E C7, 05, 05]
+042B 0308; [5E C7, 05, A0]
+04F8; [5E C7, 05, A0]
 
-0443 0306; [5C D0, 05, 05]
-045E; [5C D0, 05, 05]
-040E; [5C D0, 05, 8F]
-0423 0306; [5C D0, 05, 8F]
+044C; [5E C9, 05, 05]
+A67A; [5E C9, 05, 20]
+042C; [5E C9, 05, AE]
 
-0443 0308; [5C D2, 05, 05]
-04F1; [5C D2, 05, 05]
-0423 0308; [5C D2, 05, 8F]
-04F0; [5C D2, 05, 8F]
+048D; [5E CB 02, 05, 05]
+048C; [5E CB 02, 05, A0]
 
-0443 030B; [5C D4, 05, 05]
-04F3; [5C D4, 05, 05]
-0423 030B; [5C D4, 05, 8F]
-04F2; [5C D4, 05, 8F]
+0463; [5E CB 0A, 05, 05]
+2DFA; [5E CB 0A, 05, 20]
+0462; [5E CB 0A, 05, AE]
 
-04AF; [5C D6, 05, 05]
-04AE; [5C D6, 05, 8F]
+A653; [5E CB 12, 05, 05]
+A652; [5E CB 12, 05, A0]
 
-04B1; [5C D8, 05, 05]
-04B0; [5C D8, 05, 8F]
+044D; [5E CD, 05, 05]
+042D; [5E CD, 05, A0]
 
-A64B; [5C DA, 05, 05]
-2DF9; [5C DA, 05, 09]
-A64A; [5C DA, 05, 8F]
+044D 0308; [5E CF, 05, 05]
+04ED; [5E CF, 05, 05]
+042D 0308; [5E CF, 05, A0]
+04EC; [5E CF, 05, A0]
 
-0479; [5C DC, 05, 05]
-0478; [5C DC, 05, 8F]
+044E; [5E D1, 05, 05]
+2DFB; [5E D1, 05, 20]
+042E; [5E D1, 05, AE]
 
-0444; [5C DE, 05, 05]
-0424; [5C DE, 05, 8F]
+A655; [5E D3 02, 05, 05]
+A654; [5E D3 02, 05, A0]
 
-0445; [5C E0, 05, 05]
-2DEF; [5C E0, 05, 09]
-0425; [5C E0, 05, 8F]
+A657; [5E D3 0A, 05, 05]
+2DFC; [5E D3 0A, 05, 20]
+A656; [5E D3 0A, 05, AE]
 
-04FD; [5C E2, 05, 05]
-04FC; [5C E2, 05, 8F]
+044F; [5E D5, 05, 05]
+042F; [5E D5, 05, A0]
 
-04FF; [5C E4, 05, 05]
-04FE; [5C E4, 05, 8F]
+0519; [5E D7 02, 05, 05]
+0518; [5E D7 02, 05, A0]
 
-04B3; [5C E6, 05, 05]
-04B2; [5C E6, 05, 8F]
+0465; [5E D7 0A, 05, 05]
+A69F; [5E D7 0A, 05, 20]
+0464; [5E D7 0A, 05, AE]
 
-04BB; [5C E8, 05, 05]
-04BA; [5C E8, 05, 8F]
+0467; [5E D7 12, 05, 05]
+2DFD; [5E D7 12, 05, 20]
+0466; [5E D7 12, 05, AE]
 
-0527; [5C EA, 05, 05]
-0526; [5C EA, 05, 8F]
+A659; [5E D7 1A, 05, 05]
+A658; [5E D7 1A, 05, A0]
 
-A695; [5C EC, 05, 05]
-A694; [5C EC, 05, 8F]
+046B; [5E D7 22, 05, 05]
+2DFE; [5E D7 22, 05, 20]
+046A; [5E D7 22, 05, AE]
 
-0461; [5C EE, 05, 05]
-A67B; [5C EE, 05, 09]
-0460; [5C EE, 05, 8F]
+A65B; [5E D7 2A, 05, 05]
+A65A; [5E D7 2A, 05, A0]
 
-047F; [5C F0, 05, 05]
-047E; [5C F0, 05, 8F]
+0469; [5E D7 32, 05, 05]
+0468; [5E D7 32, 05, A0]
 
-A64D; [5C F2, 05, 05]
-A64C; [5C F2, 05, 8F]
+A65D; [5E D7 3A, 05, 05]
+A65C; [5E D7 3A, 05, A0]
 
-047D; [5C F4, 05, 05]
-047C; [5C F4, 05, 8F]
+046D; [5E D7 42, 05, 05]
+2DFF; [5E D7 42, 05, 20]
+046C; [5E D7 42, 05, AE]
 
-047B; [5C F6, 05, 05]
-047A; [5C F6, 05, 8F]
+046F; [5E D7 4A, 05, 05]
+046E; [5E D7 4A, 05, A0]
 
-0446; [5C F8, 05, 05]
-2DF0; [5C F8, 05, 09]
-0426; [5C F8, 05, 8F]
+0471; [5E D7 52, 05, 05]
+0470; [5E D7 52, 05, A0]
 
-A661; [5C FA, 05, 05]
-A660; [5C FA, 05, 8F]
+0473; [5E D7 5A, 05, 05]
+2DF4; [5E D7 5A, 05, 20]
+0472; [5E D7 5A, 05, AE]
 
-A68F; [5D 05, 05, 05]
-A68E; [5D 05, 05, 8F]
+0475; [5E D7 62, 05, 05]
+0474; [5E D7 62, 05, A0]
 
-04B5; [5D 07, 05, 05]
-04B4; [5D 07, 05, 8F]
+0475 030F; [5E D7 6A, 05, 05]
+0477; [5E D7 6A, 05, 05]
+0474 030F; [5E D7 6A, 05, A0]
+0476; [5E D7 6A, 05, A0]
 
-A691; [5D 09, 05, 05]
-A690; [5D 09, 05, 8F]
+A65F; [5E D7 72, 05, 05]
+A65E; [5E D7 72, 05, A0]
 
-0447; [5D 0B, 05, 05]
-2DF1; [5D 0B, 05, 09]
-0427; [5D 0B, 05, 8F]
+04A9; [5E D7 7A, 05, 05]
+04A8; [5E D7 7A, 05, A0]
 
-A693; [5D 0D, 05, 05]
-A692; [5D 0D, 05, 8F]
+051D; [5E D7 82, 05, 05]
+051C; [5E D7 82, 05, A0]
 
-0447 0308; [5D 0F, 05, 05]
-04F5; [5D 0F, 05, 05]
-0427 0308; [5D 0F, 05, 8F]
-04F4; [5D 0F, 05, 8F]
+04CF; [5E D7 8A, 05, 05]
+04C0; [5E D7 8A, 05, A0]
 
-04B7; [5D 11, 05, 05]
-04B6; [5D 11, 05, 8F]
+FDD1 2C00;     [5E DC 02, 05, 05]      # GLAGOLITIC first primary
 
-04CC; [5D 13, 05, 05]
-04CB; [5D 13, 05, 8F]
+2C30; [5E DC 2B, 05, 05]
+2C00; [5E DC 2B, 05, A0]
 
-04B9; [5D 15, 05, 05]
-04B8; [5D 15, 05, 8F]
+2C31; [5E DC 33, 05, 05]
+2C01; [5E DC 33, 05, A0]
 
-A687; [5D 17, 05, 05]
-A686; [5D 17, 05, 8F]
+2C32; [5E DC 3B, 05, 05]
+2C02; [5E DC 3B, 05, A0]
 
-04BD; [5D 19, 05, 05]
-04BC; [5D 19, 05, 8F]
+2C33; [5E DC 43, 05, 05]
+2C03; [5E DC 43, 05, A0]
 
-04BF; [5D 1B, 05, 05]
-04BE; [5D 1B, 05, 8F]
+2C34; [5E DC 4B, 05, 05]
+2C04; [5E DC 4B, 05, A0]
 
-045F; [5D 1D, 05, 05]
-040F; [5D 1D, 05, 8F]
+2C35; [5E DC 53, 05, 05]
+2C05; [5E DC 53, 05, A0]
 
-0448; [5D 1F, 05, 05]
-2DF2; [5D 1F, 05, 09]
-0428; [5D 1F, 05, 8F]
+2C36; [5E DC 5B, 05, 05]
+2C06; [5E DC 5B, 05, A0]
 
-A697; [5D 21, 05, 05]
-A696; [5D 21, 05, 8F]
+2C37; [5E DC 63, 05, 05]
+2C07; [5E DC 63, 05, A0]
 
-0449; [5D 23, 05, 05]
-2DF3; [5D 23, 05, 09]
-0429; [5D 23, 05, 8F]
+2C38; [5E DC 6B, 05, 05]
+2C08; [5E DC 6B, 05, A0]
 
-A64F; [5D 25, 05, 05]
-A64E; [5D 25, 05, 8F]
+2C39; [5E DC 73, 05, 05]
+2C09; [5E DC 73, 05, A0]
 
-2E2F; [5D 27, 05, 05]
+2C3A; [5E DC 7B, 05, 05]
+2C0A; [5E DC 7B, 05, A0]
 
-A67F; [5D 29, 05, 05]
+2C3B; [5E DC 83, 05, 05]
+2C0B; [5E DC 83, 05, A0]
 
-044A; [5D 2B, 05, 05]
-A678; [5D 2B, 05, 09]
-042A; [5D 2B, 05, 8F]
+2C3C; [5E DC 8B, 05, 05]
+2C0C; [5E DC 8B, 05, A0]
 
-A651; [5D 2D, 05, 05]
-A650; [5D 2D, 05, 8F]
+2C3D; [5E DC 93, 05, 05]
+2C0D; [5E DC 93, 05, A0]
 
-044B; [5D 2F, 05, 05]
-A679; [5D 2F, 05, 09]
-042B; [5D 2F, 05, 8F]
+2C3E; [5E DC 9B, 05, 05]
+2C0E; [5E DC 9B, 05, A0]
 
-044B 0308; [5D 31, 05, 05]
-04F9; [5D 31, 05, 05]
-042B 0308; [5D 31, 05, 8F]
-04F8; [5D 31, 05, 8F]
+2C3F; [5E DC A3, 05, 05]
+2C0F; [5E DC A3, 05, A0]
 
-044C; [5D 33, 05, 05]
-A67A; [5D 33, 05, 09]
-042C; [5D 33, 05, 8F]
+2C40; [5E DC AB, 05, 05]
+2C10; [5E DC AB, 05, A0]
 
-048D; [5D 35, 05, 05]
-048C; [5D 35, 05, 8F]
+2C41; [5E DC B3, 05, 05]
+2C11; [5E DC B3, 05, A0]
 
-0463; [5D 37, 05, 05]
-2DFA; [5D 37, 05, 09]
-0462; [5D 37, 05, 8F]
+2C42; [5E DC BB, 05, 05]
+2C12; [5E DC BB, 05, A0]
 
-A653; [5D 39, 05, 05]
-A652; [5D 39, 05, 8F]
+2C43; [5E DC C3, 05, 05]
+2C13; [5E DC C3, 05, A0]
 
-044D; [5D 3B, 05, 05]
-042D; [5D 3B, 05, 8F]
+2C44; [5E DC CB, 05, 05]
+2C14; [5E DC CB, 05, A0]
 
-044D 0308; [5D 3D, 05, 05]
-04ED; [5D 3D, 05, 05]
-042D 0308; [5D 3D, 05, 8F]
-04EC; [5D 3D, 05, 8F]
+2C45; [5E DC D3, 05, 05]
+2C15; [5E DC D3, 05, A0]
 
-044E; [5D 3F, 05, 05]
-2DFB; [5D 3F, 05, 09]
-042E; [5D 3F, 05, 8F]
+2C46; [5E DC DB, 05, 05]
+2C16; [5E DC DB, 05, A0]
 
-A655; [5D 41, 05, 05]
-A654; [5D 41, 05, 8F]
+2C47; [5E DC E3, 05, 05]
+2C17; [5E DC E3, 05, A0]
 
-A657; [5D 43, 05, 05]
-2DFC; [5D 43, 05, 09]
-A656; [5D 43, 05, 8F]
+2C48; [5E DC EB, 05, 05]
+2C18; [5E DC EB, 05, A0]
 
-044F; [5D 45, 05, 05]
-042F; [5D 45, 05, 8F]
+2C49; [5E DC F3, 05, 05]
+2C19; [5E DC F3, 05, A0]
 
-0519; [5D 47, 05, 05]
-0518; [5D 47, 05, 8F]
+2C4A; [5E DC FB, 05, 05]
+2C1A; [5E DC FB, 05, A0]
 
-0465; [5D 49, 05, 05]
-A69F; [5D 49, 05, 09]
-0464; [5D 49, 05, 8F]
+2C4B; [5E DD 05, 05, 05]
+2C1B; [5E DD 05, 05, A0]
 
-0467; [5D 4B, 05, 05]
-2DFD; [5D 4B, 05, 09]
-0466; [5D 4B, 05, 8F]
+2C4C; [5E DD 0D, 05, 05]
+2C1C; [5E DD 0D, 05, A0]
 
-A659; [5D 4D, 05, 05]
-A658; [5D 4D, 05, 8F]
+2C4D; [5E DD 15, 05, 05]
+2C1D; [5E DD 15, 05, A0]
 
-046B; [5D 4F, 05, 05]
-2DFE; [5D 4F, 05, 09]
-046A; [5D 4F, 05, 8F]
+2C4E; [5E DD 1D, 05, 05]
+2C1E; [5E DD 1D, 05, A0]
 
-A65B; [5D 51, 05, 05]
-A65A; [5D 51, 05, 8F]
+2C4F; [5E DD 25, 05, 05]
+2C1F; [5E DD 25, 05, A0]
 
-0469; [5D 53, 05, 05]
-0468; [5D 53, 05, 8F]
+2C50; [5E DD 2D, 05, 05]
+2C20; [5E DD 2D, 05, A0]
 
-A65D; [5D 55, 05, 05]
-A65C; [5D 55, 05, 8F]
+2C51; [5E DD 35, 05, 05]
+2C21; [5E DD 35, 05, A0]
 
-046D; [5D 57, 05, 05]
-2DFF; [5D 57, 05, 09]
-046C; [5D 57, 05, 8F]
+2C52; [5E DD 3D, 05, 05]
+2C22; [5E DD 3D, 05, A0]
 
-046F; [5D 59, 05, 05]
-046E; [5D 59, 05, 8F]
+2C53; [5E DD 45, 05, 05]
+2C23; [5E DD 45, 05, A0]
 
-0471; [5D 5B, 05, 05]
-0470; [5D 5B, 05, 8F]
+2C54; [5E DD 4D, 05, 05]
+2C24; [5E DD 4D, 05, A0]
 
-0473; [5D 5D, 05, 05]
-2DF4; [5D 5D, 05, 09]
-0472; [5D 5D, 05, 8F]
+2C55; [5E DD 55, 05, 05]
+2C25; [5E DD 55, 05, A0]
 
-0475; [5D 5F, 05, 05]
-0474; [5D 5F, 05, 8F]
+2C56; [5E DD 5D, 05, 05]
+2C26; [5E DD 5D, 05, A0]
 
-0475 030F; [5D 61, 05, 05]
-0477; [5D 61, 05, 05]
-0474 030F; [5D 61, 05, 8F]
-0476; [5D 61, 05, 8F]
+2C57; [5E DD 65, 05, 05]
+2C27; [5E DD 65, 05, A0]
 
-A65F; [5D 63, 05, 05]
-A65E; [5D 63, 05, 8F]
+2C58; [5E DD 6D, 05, 05]
+2C28; [5E DD 6D, 05, A0]
 
-04A9; [5D 65, 05, 05]
-04A8; [5D 65, 05, 8F]
+2C59; [5E DD 75, 05, 05]
+2C29; [5E DD 75, 05, A0]
 
-051D; [5D 67, 05, 05]
-051C; [5D 67, 05, 8F]
+2C5A; [5E DD 7D, 05, 05]
+2C2A; [5E DD 7D, 05, A0]
 
-04CF; [5D 69, 05, 05]
-04C0; [5D 69, 05, 8F]
+2C5B; [5E DD 85, 05, 05]
+2C2B; [5E DD 85, 05, A0]
 
-2C30; [5D 6B 04, 05, 05]
-2C00; [5D 6B 04, 05, 8F]
+2C5C; [5E DD 8D, 05, 05]
+2C2C; [5E DD 8D, 05, A0]
 
-2C31; [5D 6B 0C, 05, 05]
-2C01; [5D 6B 0C, 05, 8F]
+2C5D; [5E DD 95, 05, 05]
+2C2D; [5E DD 95, 05, A0]
 
-2C32; [5D 6B 14, 05, 05]
-2C02; [5D 6B 14, 05, 8F]
+2C5E; [5E DD 9D, 05, 05]
+2C2E; [5E DD 9D, 05, A0]
 
-2C33; [5D 6B 1C, 05, 05]
-2C03; [5D 6B 1C, 05, 8F]
+FDD1 10D3;     [5F 04 02, 05, 05]      # GEORGIAN first primary starts reordering group (compressible)
 
-2C34; [5D 6B 24, 05, 05]
-2C04; [5D 6B 24, 05, 8F]
+10D0; [5F 09, 05, 05]
 
-2C35; [5D 6B 2C, 05, 05]
-2C05; [5D 6B 2C, 05, 8F]
+2D00; [5F 0B, 05, 05]
+10A0; [5F 0B, 05, A0]
 
-2C36; [5D 6B 34, 05, 05]
-2C06; [5D 6B 34, 05, 8F]
+10D1; [5F 0D, 05, 05]
 
-2C37; [5D 6B 3C, 05, 05]
-2C07; [5D 6B 3C, 05, 8F]
+2D01; [5F 0F, 05, 05]
+10A1; [5F 0F, 05, A0]
 
-2C38; [5D 6B 44, 05, 05]
-2C08; [5D 6B 44, 05, 8F]
+10D2; [5F 11, 05, 05]
 
-2C39; [5D 6B 4C, 05, 05]
-2C09; [5D 6B 4C, 05, 8F]
+2D02; [5F 13, 05, 05]
+10A2; [5F 13, 05, A0]
 
-2C3A; [5D 6B 54, 05, 05]
-2C0A; [5D 6B 54, 05, 8F]
+10D3; [5F 15, 05, 05]
 
-2C3B; [5D 6B 5C, 05, 05]
-2C0B; [5D 6B 5C, 05, 8F]
+2D03; [5F 17, 05, 05]
+10A3; [5F 17, 05, A0]
 
-2C3C; [5D 6B 64, 05, 05]
-2C0C; [5D 6B 64, 05, 8F]
+10D4; [5F 19, 05, 05]
 
-2C3D; [5D 6B 6C, 05, 05]
-2C0D; [5D 6B 6C, 05, 8F]
+2D04; [5F 1B, 05, 05]
+10A4; [5F 1B, 05, A0]
 
-2C3E; [5D 6B 74, 05, 05]
-2C0E; [5D 6B 74, 05, 8F]
+10D5; [5F 1D, 05, 05]
 
-2C3F; [5D 6B 7C, 05, 05]
-2C0F; [5D 6B 7C, 05, 8F]
+2D05; [5F 1F, 05, 05]
+10A5; [5F 1F, 05, A0]
 
-2C40; [5D 6B 84, 05, 05]
-2C10; [5D 6B 84, 05, 8F]
+10D6; [5F 21, 05, 05]
 
-2C41; [5D 6B 8C, 05, 05]
-2C11; [5D 6B 8C, 05, 8F]
+2D06; [5F 23, 05, 05]
+10A6; [5F 23, 05, A0]
 
-2C42; [5D 6B 94, 05, 05]
-2C12; [5D 6B 94, 05, 8F]
+10F1; [5F 25, 05, 05]
 
-2C43; [5D 6B 9C, 05, 05]
-2C13; [5D 6B 9C, 05, 8F]
+2D21; [5F 27, 05, 05]
+10C1; [5F 27, 05, A0]
 
-2C44; [5D 6B A4, 05, 05]
-2C14; [5D 6B A4, 05, 8F]
+10D7; [5F 29, 05, 05]
 
-2C45; [5D 6B AC, 05, 05]
-2C15; [5D 6B AC, 05, 8F]
+2D07; [5F 2B, 05, 05]
+10A7; [5F 2B, 05, A0]
 
-2C46; [5D 6B B4, 05, 05]
-2C16; [5D 6B B4, 05, 8F]
+10D8; [5F 2D, 05, 05]
 
-2C47; [5D 6B BC, 05, 05]
-2C17; [5D 6B BC, 05, 8F]
+2D08; [5F 2F, 05, 05]
+10A8; [5F 2F, 05, A0]
 
-2C48; [5D 6B C4, 05, 05]
-2C18; [5D 6B C4, 05, 8F]
+10D9; [5F 31, 05, 05]
 
-2C49; [5D 6B CC, 05, 05]
-2C19; [5D 6B CC, 05, 8F]
+2D09; [5F 33, 05, 05]
+10A9; [5F 33, 05, A0]
 
-2C4A; [5D 6B D4, 05, 05]
-2C1A; [5D 6B D4, 05, 8F]
+10DA; [5F 35, 05, 05]
 
-2C4B; [5D 6B DC, 05, 05]
-2C1B; [5D 6B DC, 05, 8F]
+2D0A; [5F 37, 05, 05]
+10AA; [5F 37, 05, A0]
 
-2C4C; [5D 6B E4, 05, 05]
-2C1C; [5D 6B E4, 05, 8F]
+10DB; [5F 39, 05, 05]
 
-2C4D; [5D 6B EC, 05, 05]
-2C1D; [5D 6B EC, 05, 8F]
+2D0B; [5F 3B, 05, 05]
+10AB; [5F 3B, 05, A0]
 
-2C4E; [5D 6B F4, 05, 05]
-2C1E; [5D 6B F4, 05, 8F]
+10DC; [5F 3D, 05, 05]
+10FC; [5F 3D, 05, 20]
 
-2C4F; [5D 6B FC, 05, 05]
-2C1F; [5D 6B FC, 05, 8F]
+2D0C; [5F 3F, 05, 05]
+10AC; [5F 3F, 05, A0]
 
-2C50; [5D 6C 0A, 05, 05]
-2C20; [5D 6C 0A, 05, 8F]
+10F2; [5F 41, 05, 05]
 
-2C51; [5D 6C 12, 05, 05]
-2C21; [5D 6C 12, 05, 8F]
+2D22; [5F 43, 05, 05]
+10C2; [5F 43, 05, A0]
 
-2C52; [5D 6C 1A, 05, 05]
-2C22; [5D 6C 1A, 05, 8F]
+10DD; [5F 45, 05, 05]
 
-2C53; [5D 6C 22, 05, 05]
-2C23; [5D 6C 22, 05, 8F]
+2D0D; [5F 47, 05, 05]
+10AD; [5F 47, 05, A0]
 
-2C54; [5D 6C 2A, 05, 05]
-2C24; [5D 6C 2A, 05, 8F]
+10DE; [5F 49, 05, 05]
 
-2C55; [5D 6C 32, 05, 05]
-2C25; [5D 6C 32, 05, 8F]
+2D0E; [5F 4B, 05, 05]
+10AE; [5F 4B, 05, A0]
 
-2C56; [5D 6C 3A, 05, 05]
-2C26; [5D 6C 3A, 05, 8F]
+10DF; [5F 4D, 05, 05]
 
-2C57; [5D 6C 42, 05, 05]
-2C27; [5D 6C 42, 05, 8F]
+2D0F; [5F 4F, 05, 05]
+10AF; [5F 4F, 05, A0]
 
-2C58; [5D 6C 4A, 05, 05]
-2C28; [5D 6C 4A, 05, 8F]
+10E0; [5F 51, 05, 05]
 
-2C59; [5D 6C 52, 05, 05]
-2C29; [5D 6C 52, 05, 8F]
+2D10; [5F 53, 05, 05]
+10B0; [5F 53, 05, A0]
 
-2C5A; [5D 6C 5A, 05, 05]
-2C2A; [5D 6C 5A, 05, 8F]
+10E1; [5F 55, 05, 05]
 
-2C5B; [5D 6C 62, 05, 05]
-2C2B; [5D 6C 62, 05, 8F]
+2D11; [5F 57, 05, 05]
+10B1; [5F 57, 05, A0]
 
-2C5C; [5D 6C 6A, 05, 05]
-2C2C; [5D 6C 6A, 05, 8F]
+10E2; [5F 59, 05, 05]
 
-2C5D; [5D 6C 72, 05, 05]
-2C2D; [5D 6C 72, 05, 8F]
+2D12; [5F 5B, 05, 05]
+10B2; [5F 5B, 05, A0]
 
-2C5E; [5D 6C 7A, 05, 05]
-2C2E; [5D 6C 7A, 05, 8F]
+10F3; [5F 5D, 05, 05]
 
-10D0; [5E 0A, 05, 05]
+2D23; [5F 5F, 05, 05]
+10C3; [5F 5F, 05, A0]
 
-2D00; [5E 0C, 05, 05]
-10A0; [5E 0C, 05, 8F]
+10E3; [5F 61, 05, 05]
 
-10D1; [5E 0E, 05, 05]
+2D13; [5F 63, 05, 05]
+10B3; [5F 63, 05, A0]
 
-2D01; [5E 10, 05, 05]
-10A1; [5E 10, 05, 8F]
+10E4; [5F 65, 05, 05]
 
-10D2; [5E 12, 05, 05]
+2D14; [5F 67, 05, 05]
+10B4; [5F 67, 05, A0]
 
-2D02; [5E 14, 05, 05]
-10A2; [5E 14, 05, 8F]
+10E5; [5F 69, 05, 05]
 
-10D3; [5E 16, 05, 05]
+2D15; [5F 6B, 05, 05]
+10B5; [5F 6B, 05, A0]
 
-2D03; [5E 18, 05, 05]
-10A3; [5E 18, 05, 8F]
+10E6; [5F 6D, 05, 05]
 
-10D4; [5E 1A, 05, 05]
+2D16; [5F 6F, 05, 05]
+10B6; [5F 6F, 05, A0]
 
-2D04; [5E 1C, 05, 05]
-10A4; [5E 1C, 05, 8F]
+10E7; [5F 71, 05, 05]
 
-10D5; [5E 1E, 05, 05]
+2D17; [5F 73, 05, 05]
+10B7; [5F 73, 05, A0]
 
-2D05; [5E 20, 05, 05]
-10A5; [5E 20, 05, 8F]
+10E8; [5F 75, 05, 05]
 
-10D6; [5E 22, 05, 05]
+2D18; [5F 77, 05, 05]
+10B8; [5F 77, 05, A0]
 
-2D06; [5E 24, 05, 05]
-10A6; [5E 24, 05, 8F]
+10E9; [5F 79, 05, 05]
 
-10F1; [5E 26, 05, 05]
+2D19; [5F 7B, 05, 05]
+10B9; [5F 7B, 05, A0]
 
-2D21; [5E 28, 05, 05]
-10C1; [5E 28, 05, 8F]
+10EA; [5F 7D, 05, 05]
 
-10D7; [5E 2A, 05, 05]
+2D1A; [5F 7F, 05, 05]
+10BA; [5F 7F, 05, A0]
 
-2D07; [5E 2C, 05, 05]
-10A7; [5E 2C, 05, 8F]
+10EB; [5F 81, 05, 05]
 
-10D8; [5E 2E, 05, 05]
+2D1B; [5F 83, 05, 05]
+10BB; [5F 83, 05, A0]
 
-2D08; [5E 30, 05, 05]
-10A8; [5E 30, 05, 8F]
+10EC; [5F 85, 05, 05]
 
-10D9; [5E 32, 05, 05]
+2D1C; [5F 87, 05, 05]
+10BC; [5F 87, 05, A0]
 
-2D09; [5E 34, 05, 05]
-10A9; [5E 34, 05, 8F]
+10ED; [5F 89, 05, 05]
 
-10DA; [5E 36, 05, 05]
+2D1D; [5F 8B, 05, 05]
+10BD; [5F 8B, 05, A0]
 
-2D0A; [5E 38, 05, 05]
-10AA; [5E 38, 05, 8F]
+10EE; [5F 8D, 05, 05]
 
-10DB; [5E 3A, 05, 05]
+2D1E; [5F 8F, 05, 05]
+10BE; [5F 8F, 05, A0]
 
-2D0B; [5E 3C, 05, 05]
-10AB; [5E 3C, 05, 8F]
+10F4; [5F 91, 05, 05]
 
-10DC; [5E 3E, 05, 05]
-10FC; [5E 3E, 05, 27]
+2D24; [5F 93, 05, 05]
+10C4; [5F 93, 05, A0]
 
-2D0C; [5E 40, 05, 05]
-10AC; [5E 40, 05, 8F]
+10EF; [5F 95, 05, 05]
 
-10F2; [5E 42, 05, 05]
+2D1F; [5F 97, 05, 05]
+10BF; [5F 97, 05, A0]
 
-2D22; [5E 44, 05, 05]
-10C2; [5E 44, 05, 8F]
+10F0; [5F 99, 05, 05]
 
-10DD; [5E 46, 05, 05]
+2D20; [5F 9B, 05, 05]
+10C0; [5F 9B, 05, A0]
 
-2D0D; [5E 48, 05, 05]
-10AD; [5E 48, 05, 8F]
+10F5; [5F 9D, 05, 05]
 
-10DE; [5E 4A, 05, 05]
+2D25; [5F 9F, 05, 05]
+10C5; [5F 9F, 05, A0]
 
-2D0E; [5E 4C, 05, 05]
-10AE; [5E 4C, 05, 8F]
+10F6; [5F A1, 05, 05]
 
-10DF; [5E 4E, 05, 05]
+10F7; [5F A3, 05, 05]
 
-2D0F; [5E 50, 05, 05]
-10AF; [5E 50, 05, 8F]
+2D27; [5F A5, 05, 05]
+10C7; [5F A5, 05, A0]
 
-10E0; [5E 52, 05, 05]
+10F8; [5F A7, 05, 05]
 
-2D10; [5E 54, 05, 05]
-10B0; [5E 54, 05, 8F]
+10F9; [5F A9, 05, 05]
 
-10E1; [5E 56, 05, 05]
+10FA; [5F AB, 05, 05]
 
-2D11; [5E 58, 05, 05]
-10B1; [5E 58, 05, 8F]
+10FD; [5F AD, 05, 05]
 
-10E2; [5E 5A, 05, 05]
+2D2D; [5F AF, 05, 05]
+10CD; [5F AF, 05, A0]
 
-2D12; [5E 5C, 05, 05]
-10B2; [5E 5C, 05, 8F]
+10FE; [5F B1, 05, 05]
 
-10F3; [5E 5E, 05, 05]
+10FF; [5F B3, 05, 05]
 
-2D23; [5E 60, 05, 05]
-10C3; [5E 60, 05, 8F]
+FDD1 0531;     [60 04 02, 05, 05]      # ARMENIAN first primary starts reordering group (compressible)
 
-10E3; [5E 62, 05, 05]
+0561; [60 09, 05, 05]
+0531; [60 09, 05, A0]
 
-2D13; [5E 64, 05, 05]
-10B3; [5E 64, 05, 8F]
+0562; [60 0B, 05, 05]
+0532; [60 0B, 05, A0]
 
-10E4; [5E 66, 05, 05]
+0563; [60 0D, 05, 05]
+0533; [60 0D, 05, A0]
 
-2D14; [5E 68, 05, 05]
-10B4; [5E 68, 05, 8F]
+0564; [60 0F, 05, 05]
+0534; [60 0F, 05, A0]
 
-10E5; [5E 6A, 05, 05]
+0565; [60 11, 05, 05]
+0535; [60 11, 05, AE]
+0587; [60 11, 05, 20][60 4B, 05, 20]
 
-2D15; [5E 6C, 05, 05]
-10B5; [5E 6C, 05, 8F]
+0566; [60 13, 05, 05]
+0536; [60 13, 05, A0]
 
-10E6; [5E 6E, 05, 05]
+0567; [60 15, 05, 05]
+0537; [60 15, 05, A0]
 
-2D16; [5E 70, 05, 05]
-10B6; [5E 70, 05, 8F]
+0568; [60 17, 05, 05]
+0538; [60 17, 05, A0]
 
-10E7; [5E 72, 05, 05]
+0569; [60 19, 05, 05]
+0539; [60 19, 05, A0]
 
-2D17; [5E 74, 05, 05]
-10B7; [5E 74, 05, 8F]
+056A; [60 1B, 05, 05]
+053A; [60 1B, 05, A0]
 
-10E8; [5E 76, 05, 05]
+056B; [60 1D, 05, 05]
+053B; [60 1D, 05, AE]
 
-2D18; [5E 78, 05, 05]
-10B8; [5E 78, 05, 8F]
+056C; [60 1F, 05, 05]
+053C; [60 1F, 05, A0]
 
-10E9; [5E 7A, 05, 05]
+056D; [60 21, 05, 05]
+053D; [60 21, 05, AE]
 
-2D19; [5E 7C, 05, 05]
-10B9; [5E 7C, 05, 8F]
+056E; [60 23, 05, 05]
+053E; [60 23, 05, A0]
 
-10EA; [5E 7E, 05, 05]
+056F; [60 25, 05, 05]
+053F; [60 25, 05, A0]
 
-2D1A; [5E 80, 05, 05]
-10BA; [5E 80, 05, 8F]
+0570; [60 27, 05, 05]
+0540; [60 27, 05, A0]
 
-10EB; [5E 82, 05, 05]
+0571; [60 29, 05, 05]
+0541; [60 29, 05, A0]
 
-2D1B; [5E 84, 05, 05]
-10BB; [5E 84, 05, 8F]
+0572; [60 2B, 05, 05]
+0542; [60 2B, 05, A0]
 
-10EC; [5E 86, 05, 05]
+0573; [60 2D, 05, 05]
+0543; [60 2D, 05, A0]
 
-2D1C; [5E 88, 05, 05]
-10BC; [5E 88, 05, 8F]
+0574; [60 2F, 05, 05]
+0544; [60 2F, 05, AE]
+FB14; [60 2F, 05, 20][60 11, 05, 20]
+FB15; [60 2F, 05, 20][60 1D, 05, 20]
+FB17; [60 2F, 05, 20][60 21, 05, 20]
+FB13; [60 2F, 05, 20][60 33, 05, 20]
 
-10ED; [5E 8A, 05, 05]
+0575; [60 31, 05, 05]
+0545; [60 31, 05, A0]
 
-2D1D; [5E 8C, 05, 05]
-10BD; [5E 8C, 05, 8F]
+0576; [60 33, 05, 05]
+0546; [60 33, 05, AE]
 
-10EE; [5E 8E, 05, 05]
+0577; [60 35, 05, 05]
+0547; [60 35, 05, A0]
 
-2D1E; [5E 90, 05, 05]
-10BE; [5E 90, 05, 8F]
+0578; [60 37, 05, 05]
+0548; [60 37, 05, A0]
 
-10F4; [5E 92, 05, 05]
+0579; [60 39, 05, 05]
+0549; [60 39, 05, A0]
 
-2D24; [5E 94, 05, 05]
-10C4; [5E 94, 05, 8F]
+057A; [60 3B, 05, 05]
+054A; [60 3B, 05, A0]
 
-10EF; [5E 96, 05, 05]
+057B; [60 3D, 05, 05]
+054B; [60 3D, 05, A0]
 
-2D1F; [5E 98, 05, 05]
-10BF; [5E 98, 05, 8F]
+057C; [60 3F, 05, 05]
+054C; [60 3F, 05, A0]
 
-10F0; [5E 9A, 05, 05]
+057D; [60 41, 05, 05]
+054D; [60 41, 05, A0]
 
-2D20; [5E 9C, 05, 05]
-10C0; [5E 9C, 05, 8F]
+057E; [60 43, 05, 05]
+054E; [60 43, 05, AE]
+FB16; [60 43, 05, 20][60 33, 05, 20]
 
-10F5; [5E 9E, 05, 05]
+057F; [60 45, 05, 05]
+054F; [60 45, 05, A0]
 
-2D25; [5E A0, 05, 05]
-10C5; [5E A0, 05, 8F]
+0580; [60 47, 05, 05]
+0550; [60 47, 05, A0]
 
-10F6; [5E A2, 05, 05]
+0581; [60 49, 05, 05]
+0551; [60 49, 05, A0]
 
-10F7; [5E A4, 05, 05]
+0582; [60 4B, 05, 05]
+0552; [60 4B, 05, AE]
 
-2D27; [5E A6, 05, 05]
-10C7; [5E A6, 05, 8F]
+0583; [60 4D, 05, 05]
+0553; [60 4D, 05, A0]
 
-10F8; [5E A8, 05, 05]
+0584; [60 4F, 05, 05]
+0554; [60 4F, 05, A0]
 
-10F9; [5E AA, 05, 05]
+0585; [60 51, 05, 05]
+0555; [60 51, 05, A0]
 
-10FA; [5E AC, 05, 05]
+0586; [60 53, 05, 05]
+0556; [60 53, 05, A0]
 
-10FD; [5E AE, 05, 05]
+0559; [60 55, 05, 05]
 
-2D2D; [5E B0, 05, 05]
-10CD; [5E B0, 05, 8F]
+FDD1 05D0;     [61 04 02, 05, 05]      # HEBREW first primary starts reordering group (compressible)
 
-10FE; [5E B2, 05, 05]
+05D0; [61 09, 05, 05]
+2135; [61 09, 05, 20]
+FB21; [61 09, 05, 2E]
+FB2E; [61 09, 05, 05][, E6 C2, 05]
+FB2F; [61 09, 05, 05][, E6 E2, 05]
+FB30; [61 09, 05, 05][, E7 84, 05]
+FB4F; [61 09, 05, 20][61 1F, 05, 20]
 
-10FF; [5E B4, 05, 05]
+05D1; [61 0B, 05, 05]
+2136; [61 0B, 05, 20]
+FB31; [61 0B, 05, 05][, E7 84, 05]
+FB4C; [61 0B, 05, 05][, E7 A4, 05]
 
-0561; [5F 0A, 05, 05]
-0531; [5F 0A, 05, 8F]
+05D2; [61 0D, 05, 05]
+2137; [61 0D, 05, 20]
+FB32; [61 0D, 05, 05][, E7 84, 05]
 
-0562; [5F 0C, 05, 05]
-0532; [5F 0C, 05, 8F]
+05D3; [61 0F, 05, 05]
+2138; [61 0F, 05, 20]
+FB22; [61 0F, 05, 2E]
+FB33; [61 0F, 05, 05][, E7 84, 05]
 
-0563; [5F 0E, 05, 05]
-0533; [5F 0E, 05, 8F]
+05D4; [61 11, 05, 05]
+FB23; [61 11, 05, 20]
+FB34; [61 11, 05, 05][, E7 84, 05]
 
-0564; [5F 10, 05, 05]
-0534; [5F 10, 05, 8F]
+05D5; [61 13, 05, 05]
+FB4B; [61 13, 05, 05][, E7 04, 05]
+FB35; [61 13, 05, 05][, E7 84, 05]
+05F0; [61 13, 05, 20][61 13, 05, 20]
+05F1; [61 13, 05, 20][61 1B, 05, 20]
 
-0565; [5F 12, 05, 05]
-0535; [5F 12, 05, 8F]
-0587; [5F 12, 05, 09][5F 4C, 05, 09]
+05D6; [61 15, 05, 05]
+FB36; [61 15, 05, 05][, E7 84, 05]
 
-0566; [5F 14, 05, 05]
-0536; [5F 14, 05, 8F]
+05D7; [61 17, 05, 05]
 
-0567; [5F 16, 05, 05]
-0537; [5F 16, 05, 8F]
+05D8; [61 19, 05, 05]
+FB38; [61 19, 05, 05][, E7 84, 05]
 
-0568; [5F 18, 05, 05]
-0538; [5F 18, 05, 8F]
+05D9; [61 1B, 05, 05]
+FB1D; [61 1B, 05, 05][, E6 62, 05]
+FB39; [61 1B, 05, 05][, E7 84, 05]
+05F2; [61 1B, 05, 20][61 1B, 05, 20]
+FB1F; [61 1B, 05, 20][61 1B, 05, 20][, E6 C2, 05]
 
-0569; [5F 1A, 05, 05]
-0539; [5F 1A, 05, 8F]
+05DB; [61 1D, 05, 05]
+FB24; [61 1D, 05, 20]
+05DA; [61 1D, 05, 2E]
+FB3B; [61 1D, 05, 05][, E7 84, 05]
+FB3A; [61 1D, 05, 2E][, E7 84, 05]
+FB4D; [61 1D, 05, 05][, E7 A4, 05]
 
-056A; [5F 1C, 05, 05]
-053A; [5F 1C, 05, 8F]
+05DC; [61 1F, 05, 05]
+FB25; [61 1F, 05, 2E]
+FB3C; [61 1F, 05, 05][, E7 84, 05]
 
-056B; [5F 1E, 05, 05]
-053B; [5F 1E, 05, 8F]
+05DE; [61 21, 05, 05]
+FB26; [61 21, 05, 20]
+05DD; [61 21, 05, 2E]
+FB3E; [61 21, 05, 05][, E7 84, 05]
 
-056C; [5F 20, 05, 05]
-053C; [5F 20, 05, 8F]
+05E0; [61 23, 05, 05]
+05DF; [61 23, 05, 20]
+FB40; [61 23, 05, 05][, E7 84, 05]
 
-056D; [5F 22, 05, 05]
-053D; [5F 22, 05, 8F]
+05E1; [61 25, 05, 05]
+FB41; [61 25, 05, 05][, E7 84, 05]
 
-056E; [5F 24, 05, 05]
-053E; [5F 24, 05, 8F]
+05E2; [61 27, 05, 05]
+FB20; [61 27, 05, 20]
 
-056F; [5F 26, 05, 05]
-053F; [5F 26, 05, 8F]
+05E4; [61 29, 05, 05]
+05E3; [61 29, 05, 20]
+FB44; [61 29, 05, 05][, E7 84, 05]
+FB43; [61 29, 05, 20][, E7 84, 05]
+FB4E; [61 29, 05, 05][, E7 A4, 05]
 
-0570; [5F 28, 05, 05]
-0540; [5F 28, 05, 8F]
+05E6; [61 2B, 05, 05]
+05E5; [61 2B, 05, 20]
+FB46; [61 2B, 05, 05][, E7 84, 05]
 
-0571; [5F 2A, 05, 05]
-0541; [5F 2A, 05, 8F]
+05E7; [61 2D, 05, 05]
+FB47; [61 2D, 05, 05][, E7 84, 05]
 
-0572; [5F 2C, 05, 05]
-0542; [5F 2C, 05, 8F]
+05E8; [61 2F, 05, 05]
+FB27; [61 2F, 05, 20]
+FB48; [61 2F, 05, 05][, E7 84, 05]
 
-0573; [5F 2E, 05, 05]
-0543; [5F 2E, 05, 8F]
+05E9; [61 31, 05, 05]
+FB2B; [61 31, 05, 05][, E7 44, 05]
+FB2A; [61 31, 05, 05][, E7 64, 05]
+FB49; [61 31, 05, 05][, E7 84, 05]
+FB2D; [61 31, 05, 05][, E7 84, 05][, E7 44, 05]
+FB2C; [61 31, 05, 05][, E7 84, 05][, E7 64, 05]
 
-0574; [5F 30, 05, 05]
-0544; [5F 30, 05, 8F]
-FB14; [5F 30, 05, 09][5F 12, 05, 09]
-FB15; [5F 30, 05, 09][5F 1E, 05, 09]
-FB17; [5F 30, 05, 09][5F 22, 05, 09]
-FB13; [5F 30, 05, 09][5F 34, 05, 09]
+05EA; [61 33, 05, 05]
+FB28; [61 33, 05, 20]
+FB4A; [61 33, 05, 05][, E7 84, 05]
 
-0575; [5F 32, 05, 05]
-0545; [5F 32, 05, 8F]
+FDD1 10900;    [61 38 02, 05, 05]      # Phoenician first primary
 
-0576; [5F 34, 05, 05]
-0546; [5F 34, 05, 8F]
+10900; [61 38 2B, 05, 05]
 
-0577; [5F 36, 05, 05]
-0547; [5F 36, 05, 8F]
+10901; [61 38 33, 05, 05]
 
-0578; [5F 38, 05, 05]
-0548; [5F 38, 05, 8F]
+10902; [61 38 3B, 05, 05]
 
-0579; [5F 3A, 05, 05]
-0549; [5F 3A, 05, 8F]
+10903; [61 38 43, 05, 05]
 
-057A; [5F 3C, 05, 05]
-054A; [5F 3C, 05, 8F]
+10904; [61 38 4B, 05, 05]
 
-057B; [5F 3E, 05, 05]
-054B; [5F 3E, 05, 8F]
+10905; [61 38 53, 05, 05]
 
-057C; [5F 40, 05, 05]
-054C; [5F 40, 05, 8F]
+10906; [61 38 5B, 05, 05]
 
-057D; [5F 42, 05, 05]
-054D; [5F 42, 05, 8F]
+10907; [61 38 63, 05, 05]
 
-057E; [5F 44, 05, 05]
-054E; [5F 44, 05, 8F]
-FB16; [5F 44, 05, 09][5F 34, 05, 09]
+10908; [61 38 6B, 05, 05]
 
-057F; [5F 46, 05, 05]
-054F; [5F 46, 05, 8F]
+10909; [61 38 73, 05, 05]
 
-0580; [5F 48, 05, 05]
-0550; [5F 48, 05, 8F]
+1090A; [61 38 7B, 05, 05]
 
-0581; [5F 4A, 05, 05]
-0551; [5F 4A, 05, 8F]
+1090B; [61 38 83, 05, 05]
 
-0582; [5F 4C, 05, 05]
-0552; [5F 4C, 05, 8F]
+1090C; [61 38 8B, 05, 05]
 
-0583; [5F 4E, 05, 05]
-0553; [5F 4E, 05, 8F]
+1090D; [61 38 93, 05, 05]
 
-0584; [5F 50, 05, 05]
-0554; [5F 50, 05, 8F]
+1090E; [61 38 9B, 05, 05]
 
-0585; [5F 52, 05, 05]
-0555; [5F 52, 05, 8F]
+1090F; [61 38 A3, 05, 05]
 
-0586; [5F 54, 05, 05]
-0556; [5F 54, 05, 8F]
+10910; [61 38 AB, 05, 05]
 
-0559; [5F 56, 05, 05]
+10911; [61 38 B3, 05, 05]
 
-05D0; [60 0A, 05, 05]
-2135; [60 0A, 05, 09]
-FB21; [60 0A, 05, 0B]
-FB2E; [60 0A, 05, 05][, D1 31, 05]
-FB2F; [60 0A, 05, 05][, D1 41, 05]
-FB30; [60 0A, 05, 05][, D1 91, 05]
-FB4F; [60 0A, 05, 09][60 20, 05, 09]
+10912; [61 38 BB, 05, 05]
 
-05D1; [60 0C, 05, 05]
-2136; [60 0C, 05, 09]
-FB31; [60 0C, 05, 05][, D1 91, 05]
-FB4C; [60 0C, 05, 05][, D1 A1, 05]
+10913; [61 38 C3, 05, 05]
 
-05D2; [60 0E, 05, 05]
-2137; [60 0E, 05, 09]
-FB32; [60 0E, 05, 05][, D1 91, 05]
+10914; [61 38 CB, 05, 05]
 
-05D3; [60 10, 05, 05]
-2138; [60 10, 05, 09]
-FB22; [60 10, 05, 0B]
-FB33; [60 10, 05, 05][, D1 91, 05]
+10915; [61 38 D3, 05, 05]
 
-05D4; [60 12, 05, 05]
-FB23; [60 12, 05, 0B]
-FB34; [60 12, 05, 05][, D1 91, 05]
+FDD1 0800;     [61 38 FC, 05, 05]      # Samaritan first primary
 
-05D5; [60 14, 05, 05]
-FB4B; [60 14, 05, 05][, D1 51, 05]
-FB35; [60 14, 05, 05][, D1 91, 05]
-05F0; [60 14, 05, 09][60 14, 05, 09]
-05F1; [60 14, 05, 09][60 1C, 05, 09]
+0800; [61 39 27, 05, 05]
 
-05D6; [60 16, 05, 05]
-FB36; [60 16, 05, 05][, D1 91, 05]
+0801; [61 39 2F, 05, 05]
 
-05D7; [60 18, 05, 05]
+0802; [61 39 37, 05, 05]
 
-05D8; [60 1A, 05, 05]
-FB38; [60 1A, 05, 05][, D1 91, 05]
+0803; [61 39 3F, 05, 05]
 
-05D9; [60 1C, 05, 05]
-FB1D; [60 1C, 05, 05][, D0 FD, 05]
-FB39; [60 1C, 05, 05][, D1 91, 05]
-05F2; [60 1C, 05, 09][60 1C, 05, 09]
-FB1F; [60 1C, 05, 09][60 1C, 05, 09][, D1 31, 05]
+0804; [61 39 47, 05, 05]
 
-05DB; [60 1E, 05, 05]
-FB24; [60 1E, 05, 0B]
-05DA; [60 1E, 05, 31]
-FB3B; [60 1E, 05, 05][, D1 91, 05]
-FB3A; [60 1E, 05, 31][, D1 91, 05]
-FB4D; [60 1E, 05, 05][, D1 A1, 05]
+0805; [61 39 4F, 05, 05]
 
-05DC; [60 20, 05, 05]
-FB25; [60 20, 05, 0B]
-FB3C; [60 20, 05, 05][, D1 91, 05]
+0806; [61 39 57, 05, 05]
 
-05DE; [60 22, 05, 05]
-FB26; [60 22, 05, 0B]
-05DD; [60 22, 05, 31]
-FB3E; [60 22, 05, 05][, D1 91, 05]
+0807; [61 39 5F, 05, 05]
 
-05E0; [60 24, 05, 05]
-05DF; [60 24, 05, 31]
-FB40; [60 24, 05, 05][, D1 91, 05]
+0808; [61 39 67, 05, 05]
 
-05E1; [60 26, 05, 05]
-FB41; [60 26, 05, 05][, D1 91, 05]
+0809; [61 39 6F, 05, 05]
 
-05E2; [60 28, 05, 05]
-FB20; [60 28, 05, 0B]
+080A; [61 39 77, 05, 05]
 
-05E4; [60 2A, 05, 05]
-05E3; [60 2A, 05, 31]
-FB44; [60 2A, 05, 05][, D1 91, 05]
-FB43; [60 2A, 05, 31][, D1 91, 05]
-FB4E; [60 2A, 05, 05][, D1 A1, 05]
+080B; [61 39 7F, 05, 05]
 
-05E6; [60 2C, 05, 05]
-05E5; [60 2C, 05, 31]
-FB46; [60 2C, 05, 05][, D1 91, 05]
+080C; [61 39 87, 05, 05]
 
-05E7; [60 2E, 05, 05]
-FB47; [60 2E, 05, 05][, D1 91, 05]
+080D; [61 39 8F, 05, 05]
 
-05E8; [60 30, 05, 05]
-FB27; [60 30, 05, 0B]
-FB48; [60 30, 05, 05][, D1 91, 05]
+080E; [61 39 97, 05, 05]
 
-05E9; [60 32, 05, 05]
-FB2B; [60 32, 05, 05][, D1 71, 05]
-FB2A; [60 32, 05, 05][, D1 81, 05]
-FB49; [60 32, 05, 05][, D1 91, 05]
-FB2D; [60 32, 05, 05][, D1 91, 05][, D1 71, 05]
-FB2C; [60 32, 05, 05][, D1 91, 05][, D1 81, 05]
+080F; [61 39 9F, 05, 05]
 
-05EA; [60 34, 05, 05]
-FB28; [60 34, 05, 0B]
-FB4A; [60 34, 05, 05][, D1 91, 05]
+0810; [61 39 A7, 05, 05]
 
-10900; [60 36 04, 05, 05]
+0811; [61 39 AF, 05, 05]
 
-10901; [60 36 0C, 05, 05]
+0812; [61 39 B7, 05, 05]
 
-10902; [60 36 14, 05, 05]
+0813; [61 39 BF, 05, 05]
 
-10903; [60 36 1C, 05, 05]
+0814; [61 39 C7, 05, 05]
 
-10904; [60 36 24, 05, 05]
+0815; [61 39 CF, 05, 05]
 
-10905; [60 36 2C, 05, 05]
+0816; [61 39 D7, 05, 05]
 
-10906; [60 36 34, 05, 05]
+0817; [61 39 DF, 05, 05]
 
-10907; [60 36 3C, 05, 05]
+081A; [61 39 E7, 05, 05]
 
-10908; [60 36 44, 05, 05]
+081B; [61 39 EF, 05, 05]
 
-10909; [60 36 4C, 05, 05]
+FDD1 0628;     [62 04 02, 05, 05]      # ARABIC first primary starts reordering group (compressible)
 
-1090A; [60 36 54, 05, 05]
+0621; [62 09, 05, 05]
+0674; [62 09, 05, 20]
+FE80; [62 09, 05, 2E]
+06FD; [62 09, 70, 20]
 
-1090B; [60 36 5C, 05, 05]
+0622; [62 0B, 05, 05]
+0627 0653; [62 0B, 05, 05]
+FE82; [62 0B, 05, 20]
+FE81; [62 0B, 05, 2E]
 
-1090C; [60 36 64, 05, 05]
+0623; [62 0D, 05, 05]
+0627 0654; [62 0D, 05, 05]
+FE84; [62 0D, 05, 20]
+FE83; [62 0D, 05, 2E]
 
-1090D; [60 36 6C, 05, 05]
+0672; [62 0F, 05, 05]
 
-1090E; [60 36 74, 05, 05]
+0671; [62 11, 05, 05]
+FB51; [62 11, 05, 20]
+FB50; [62 11, 05, 2E]
 
-1090F; [60 36 7C, 05, 05]
+0624; [62 13, 05, 05]
+0648 0654; [62 13, 05, 05]
+FE86; [62 13, 05, 20]
+FE85; [62 13, 05, 2E]
 
-10910; [60 36 84, 05, 05]
+0625; [62 15, 05, 05]
+0627 0655; [62 15, 05, 05]
+FE88; [62 15, 05, 20]
+FE87; [62 15, 05, 2E]
 
-10911; [60 36 8C, 05, 05]
+0673; [62 17 02, 05, 05]
 
-10912; [60 36 94, 05, 05]
+0773; [62 17 0A, 05, 05]
 
-10913; [60 36 9C, 05, 05]
+0774; [62 17 12, 05, 05]
+
+0626; [62 19, 05, 05]
+064A 0654; [62 19, 05, 05]
+FE8B; [62 19, 05, 10]
+FE8C; [62 19, 05, 1B]
+FE8A; [62 19, 05, 26]
+FE89; [62 19, 05, 31]
+FBEB; [62 19, 05, 26][62 1D, 05, 26]
+FBEA; [62 19, 05, 31][62 1D, 05, 31]
+FC97; [62 19, 05, 10][62 37, 05, 18]
+FC00; [62 19, 05, 31][62 37, 05, 30]
+FC98; [62 19, 05, 10][62 3F, 05, 18]
+FC01; [62 19, 05, 31][62 3F, 05, 30]
+FC99; [62 19, 05, 10][62 41, 05, 18]
+FC64; [62 19, 05, 26][62 55, 05, 1E]
+FC65; [62 19, 05, 26][62 57, 05, 1E]
+FC9A; [62 19, 05, 10][62 9D, 05, 18]
+FCDF; [62 19, 05, 1B][62 9D, 05, 20]
+FC66; [62 19, 05, 26][62 9D, 05, 28]
+FC02; [62 19, 05, 31][62 9D, 05, 30]
+FC67; [62 19, 05, 26][62 A1, 05, 28]
+FC9B; [62 19, 05, 10][62 AB, 05, 18]
+FCE0; [62 19, 05, 1B][62 AB, 05, 20]
+FBED; [62 19, 05, 26][62 B1 12, 05, 20]
+FBEC; [62 19, 05, 31][62 B1 12, 05, 2E]
+FBEF; [62 19, 05, 26][62 B3, 05, 26]
+FBEE; [62 19, 05, 31][62 B3, 05, 31]
+FBF3; [62 19, 05, 26][62 B7 0A, 05, 20]
+FBF2; [62 19, 05, 31][62 B7 0A, 05, 2E]
+FBF1; [62 19, 05, 26][62 B9, 05, 1E]
+FBF0; [62 19, 05, 31][62 B9, 05, 2C]
+FBF5; [62 19, 05, 26][62 BB, 05, 20]
+FBF4; [62 19, 05, 31][62 BB, 05, 2E]
+FBFB; [62 19, 05, 10][62 C1, 05, 10]
+FBFA; [62 19, 05, 26][62 C1, 05, 26]
+FC68; [62 19, 05, 26][62 C1, 05, 26]
+FBF9; [62 19, 05, 31][62 C1, 05, 31]
+FC03; [62 19, 05, 31][62 C1, 05, 31]
+FC69; [62 19, 05, 26][62 C3, 05, 2C]
+FC04; [62 19, 05, 31][62 C3, 05, 33]
+FBF8; [62 19, 05, 10][62 CB, 05, 10]
+FBF7; [62 19, 05, 26][62 CB, 05, 26]
+FBF6; [62 19, 05, 31][62 CB, 05, 31]
+
+08A8; [62 1B 02, 05, 05]
+
+08A9; [62 1B 0A, 05, 05]
+
+08AC; [62 1B 12, 05, 05]
+
+0627; [62 1D, 05, 05]
+1EE00; [62 1D, 05, 1B]
+1EE80; [62 1D, 05, 1B]
+FE8E; [62 1D, 05, 26]
+FE8D; [62 1D, 05, 31]
+FD3C; [62 1D, 05, 26][, E9 48, 1E]
+FD3D; [62 1D, 05, 31][, E9 48, 2C]
+0675; [62 1D, 05, 10][62 09, 05, 20]
+FDF3; [62 1D, 05, 31][62 8B, 05, 30][62 21, 05, 30][62 55, 05, 2C]
+FDF2; [62 1D, 05, 31][62 99, 05, 30][62 99, 05, 30][62 AB, 05, 30]
+
+066E; [62 1F, 05, 05]
+1EE1C; [62 1F, 05, 20]
+1EE7C; [62 1F, 05, 20]
+
+0628; [62 21, 05, 05]
+1EE01; [62 21, 05, 10]
+1EE21; [62 21, 05, 10]
+1EE61; [62 21, 05, 10]
+1EE81; [62 21, 05, 10]
+1EEA1; [62 21, 05, 10]
+FE91; [62 21, 05, 18]
+FE92; [62 21, 05, 20]
+FE90; [62 21, 05, 28]
+FE8F; [62 21, 05, 30]
+FC9C; [62 21, 05, 18][62 37, 05, 18]
+FC05; [62 21, 05, 30][62 37, 05, 30]
+FC9D; [62 21, 05, 18][62 3F, 05, 18]
+FC06; [62 21, 05, 30][62 3F, 05, 30]
+FDC2; [62 21, 05, 28][62 3F, 05, 28][62 C3, 05, 2C]
+FC9E; [62 21, 05, 18][62 41, 05, 18]
+FC07; [62 21, 05, 30][62 41, 05, 30]
+FD9E; [62 21, 05, 28][62 41, 05, 28][62 C3, 05, 2C]
+FC6A; [62 21, 05, 28][62 55, 05, 1E]
+FC6B; [62 21, 05, 28][62 57, 05, 1E]
+FC9F; [62 21, 05, 18][62 9D, 05, 18]
+FCE1; [62 21, 05, 20][62 9D, 05, 20]
+FC6C; [62 21, 05, 28][62 9D, 05, 28]
+FC08; [62 21, 05, 30][62 9D, 05, 30]
+FC6D; [62 21, 05, 28][62 A1, 05, 28]
+FCA0; [62 21, 05, 18][62 AB, 05, 18]
+FCE2; [62 21, 05, 20][62 AB, 05, 20]
+FC6E; [62 21, 05, 28][62 C1, 05, 26]
+FC09; [62 21, 05, 30][62 C1, 05, 31]
+FC6F; [62 21, 05, 28][62 C3, 05, 2C]
+FC0A; [62 21, 05, 30][62 C3, 05, 33]
+
+067B; [62 23, 05, 05]
+FB54; [62 23, 05, 10]
+FB55; [62 23, 05, 1B]
+FB53; [62 23, 05, 26]
+FB52; [62 23, 05, 31]
+
+067E; [62 25, 05, 05]
+FB58; [62 25, 05, 10]
+FB59; [62 25, 05, 1B]
+FB57; [62 25, 05, 26]
+FB56; [62 25, 05, 31]
+
+0680; [62 27 02, 05, 05]
+FB5C; [62 27 02, 05, 10]
+FB5D; [62 27 02, 05, 1B]
+FB5B; [62 27 02, 05, 26]
+FB5A; [62 27 02, 05, 31]
+
+0750; [62 27 0A, 05, 05]
+
+0751; [62 27 12, 05, 05]
+
+0752; [62 27 1A, 05, 05]
+
+0753; [62 27 22, 05, 05]
+
+0754; [62 27 2A, 05, 05]
+
+0755; [62 27 32, 05, 05]
+
+08A0; [62 27 3A, 05, 05]
+
+0756; [62 27 42, 05, 05]
+
+0629; [62 29, 05, 05]
+FE94; [62 29, 05, 20]
+FE93; [62 29, 05, 2E]
+
+062A; [62 2B, 05, 05]
+1EE15; [62 2B, 05, 10]
+1EE35; [62 2B, 05, 10]
+1EE75; [62 2B, 05, 10]
+1EE95; [62 2B, 05, 10]
+1EEB5; [62 2B, 05, 10]
+FE97; [62 2B, 05, 18]
+FE98; [62 2B, 05, 20]
+FE96; [62 2B, 05, 28]
+FE95; [62 2B, 05, 30]
+FCA1; [62 2B, 05, 18][62 37, 05, 18]
+FC0B; [62 2B, 05, 30][62 37, 05, 30]
+FD50; [62 2B, 05, 18][62 37, 05, 18][62 9D, 05, 18]
+FDA0; [62 2B, 05, 28][62 37, 05, 28][62 C1, 05, 26]
+FD9F; [62 2B, 05, 28][62 37, 05, 28][62 C3, 05, 2C]
+FCA2; [62 2B, 05, 18][62 3F, 05, 18]
+FC0C; [62 2B, 05, 30][62 3F, 05, 30]
+FD52; [62 2B, 05, 18][62 3F, 05, 18][62 37, 05, 18]
+FD51; [62 2B, 05, 28][62 3F, 05, 28][62 37, 05, 28]
+FD53; [62 2B, 05, 18][62 3F, 05, 18][62 9D, 05, 18]
+FCA3; [62 2B, 05, 18][62 41, 05, 18]
+FC0D; [62 2B, 05, 30][62 41, 05, 30]
+FD54; [62 2B, 05, 18][62 41, 05, 18][62 9D, 05, 18]
+FDA2; [62 2B, 05, 28][62 41, 05, 28][62 C1, 05, 26]
+FDA1; [62 2B, 05, 28][62 41, 05, 28][62 C3, 05, 2C]
+FC70; [62 2B, 05, 28][62 55, 05, 1E]
+FC71; [62 2B, 05, 28][62 57, 05, 1E]
+FCA4; [62 2B, 05, 18][62 9D, 05, 18]
+FCE3; [62 2B, 05, 20][62 9D, 05, 20]
+FC72; [62 2B, 05, 28][62 9D, 05, 28]
+FC0E; [62 2B, 05, 30][62 9D, 05, 30]
+FD55; [62 2B, 05, 18][62 9D, 05, 18][62 37, 05, 18]
+FD56; [62 2B, 05, 18][62 9D, 05, 18][62 3F, 05, 18]
+FD57; [62 2B, 05, 18][62 9D, 05, 18][62 41, 05, 18]
+FDA4; [62 2B, 05, 28][62 9D, 05, 28][62 C1, 05, 26]
+FDA3; [62 2B, 05, 28][62 9D, 05, 28][62 C3, 05, 2C]
+FC73; [62 2B, 05, 28][62 A1, 05, 28]
+FCA5; [62 2B, 05, 18][62 AB, 05, 18]
+FCE4; [62 2B, 05, 20][62 AB, 05, 20]
+FC74; [62 2B, 05, 28][62 C1, 05, 26]
+FC0F; [62 2B, 05, 30][62 C1, 05, 31]
+FC75; [62 2B, 05, 28][62 C3, 05, 2C]
+FC10; [62 2B, 05, 30][62 C3, 05, 33]
+
+062B; [62 2D, 05, 05]
+1EE16; [62 2D, 05, 10]
+1EE36; [62 2D, 05, 10]
+1EE76; [62 2D, 05, 10]
+1EE96; [62 2D, 05, 10]
+1EEB6; [62 2D, 05, 10]
+FE9B; [62 2D, 05, 18]
+FE9C; [62 2D, 05, 20]
+FE9A; [62 2D, 05, 28]
+FE99; [62 2D, 05, 30]
+FC11; [62 2D, 05, 30][62 37, 05, 30]
+FC76; [62 2D, 05, 28][62 55, 05, 1E]
+FC77; [62 2D, 05, 28][62 57, 05, 1E]
+FCA6; [62 2D, 05, 18][62 9D, 05, 18]
+FCE5; [62 2D, 05, 20][62 9D, 05, 20]
+FC78; [62 2D, 05, 28][62 9D, 05, 28]
+FC12; [62 2D, 05, 30][62 9D, 05, 30]
+FC79; [62 2D, 05, 28][62 A1, 05, 28]
+FCE6; [62 2D, 05, 20][62 AB, 05, 20]
+FC7A; [62 2D, 05, 28][62 C1, 05, 26]
+FC13; [62 2D, 05, 30][62 C1, 05, 31]
+FC7B; [62 2D, 05, 28][62 C3, 05, 2C]
+FC14; [62 2D, 05, 30][62 C3, 05, 33]
+
+0679; [62 2F, 05, 05]
+FB68; [62 2F, 05, 10]
+FB69; [62 2F, 05, 1B]
+FB67; [62 2F, 05, 26]
+FB66; [62 2F, 05, 31]
+
+067A; [62 31, 05, 05]
+FB60; [62 31, 05, 10]
+FB61; [62 31, 05, 1B]
+FB5F; [62 31, 05, 26]
+FB5E; [62 31, 05, 31]
+
+067C; [62 33, 05, 05]
+
+067D; [62 35 02, 05, 05]
+
+067F; [62 35 0A, 05, 05]
+FB64; [62 35 0A, 05, 10]
+FB65; [62 35 0A, 05, 1B]
+FB63; [62 35 0A, 05, 26]
+FB62; [62 35 0A, 05, 31]
+
+062C; [62 37, 05, 05]
+1EE02; [62 37, 05, 10]
+1EE22; [62 37, 05, 10]
+1EE42; [62 37, 05, 10]
+1EE62; [62 37, 05, 10]
+1EE82; [62 37, 05, 10]
+1EEA2; [62 37, 05, 10]
+FE9F; [62 37, 05, 18]
+FEA0; [62 37, 05, 20]
+FE9E; [62 37, 05, 28]
+FE9D; [62 37, 05, 30]
+FCA7; [62 37, 05, 18][62 3F, 05, 18]
+FC15; [62 37, 05, 30][62 3F, 05, 30]
+FDA6; [62 37, 05, 28][62 3F, 05, 28][62 C1, 05, 26]
+FDBE; [62 37, 05, 28][62 3F, 05, 28][62 C3, 05, 2C]
+FDFB; [62 37, 05, 30][62 99, 05, 30][04, 05, 26][62 37, 05, 30][62 99, 05, 30][62 1D, 05, 31][62 99, 05, 30][62 AB, 05, 30]
+FCA8; [62 37, 05, 18][62 9D, 05, 18]
+FC16; [62 37, 05, 30][62 9D, 05, 30]
+FD59; [62 37, 05, 18][62 9D, 05, 18][62 3F, 05, 18]
+FD58; [62 37, 05, 28][62 9D, 05, 28][62 3F, 05, 28]
+FDA7; [62 37, 05, 28][62 9D, 05, 28][62 C1, 05, 26]
+FDA5; [62 37, 05, 28][62 9D, 05, 28][62 C3, 05, 2C]
+FD1D; [62 37, 05, 28][62 C1, 05, 26]
+FD01; [62 37, 05, 30][62 C1, 05, 31]
+FD1E; [62 37, 05, 28][62 C3, 05, 2C]
+FD02; [62 37, 05, 30][62 C3, 05, 33]
+
+0683; [62 39 02, 05, 05]
+FB78; [62 39 02, 05, 10]
+FB79; [62 39 02, 05, 1B]
+FB77; [62 39 02, 05, 26]
+FB76; [62 39 02, 05, 31]
+
+0684; [62 39 0A, 05, 05]
+FB74; [62 39 0A, 05, 10]
+FB75; [62 39 0A, 05, 1B]
+FB73; [62 39 0A, 05, 26]
+FB72; [62 39 0A, 05, 31]
+
+0686; [62 3B, 05, 05]
+FB7C; [62 3B, 05, 10]
+FB7D; [62 3B, 05, 1B]
+FB7B; [62 3B, 05, 26]
+FB7A; [62 3B, 05, 31]
+
+06BF; [62 3D 02, 05, 05]
+
+0687; [62 3D 0A, 05, 05]
+FB80; [62 3D 0A, 05, 10]
+FB81; [62 3D 0A, 05, 1B]
+FB7F; [62 3D 0A, 05, 26]
+FB7E; [62 3D 0A, 05, 31]
+
+08A2; [62 3D 12, 05, 05]
+
+062D; [62 3F, 05, 05]
+1EE07; [62 3F, 05, 10]
+1EE27; [62 3F, 05, 10]
+1EE47; [62 3F, 05, 10]
+1EE67; [62 3F, 05, 10]
+1EE87; [62 3F, 05, 10]
+1EEA7; [62 3F, 05, 10]
+FEA3; [62 3F, 05, 18]
+FEA4; [62 3F, 05, 20]
+FEA2; [62 3F, 05, 28]
+FEA1; [62 3F, 05, 30]
+FCA9; [62 3F, 05, 18][62 37, 05, 18]
+FC17; [62 3F, 05, 30][62 37, 05, 30]
+FDBF; [62 3F, 05, 28][62 37, 05, 28][62 C3, 05, 2C]
+FCAA; [62 3F, 05, 18][62 9D, 05, 18]
+FC18; [62 3F, 05, 30][62 9D, 05, 30]
+FD5B; [62 3F, 05, 28][62 9D, 05, 28][62 C1, 05, 26]
+FD5A; [62 3F, 05, 28][62 9D, 05, 28][62 C3, 05, 2C]
+FD1B; [62 3F, 05, 28][62 C1, 05, 26]
+FCFF; [62 3F, 05, 30][62 C1, 05, 31]
+FD1C; [62 3F, 05, 28][62 C3, 05, 2C]
+FD00; [62 3F, 05, 30][62 C3, 05, 33]
+
+062E; [62 41, 05, 05]
+1EE17; [62 41, 05, 10]
+1EE37; [62 41, 05, 10]
+1EE57; [62 41, 05, 10]
+1EE77; [62 41, 05, 10]
+1EE97; [62 41, 05, 10]
+1EEB7; [62 41, 05, 10]
+FEA7; [62 41, 05, 18]
+FEA8; [62 41, 05, 20]
+FEA6; [62 41, 05, 28]
+FEA5; [62 41, 05, 30]
+FCAB; [62 41, 05, 18][62 37, 05, 18]
+FC19; [62 41, 05, 30][62 37, 05, 30]
+FC1A; [62 41, 05, 30][62 3F, 05, 30]
+FCAC; [62 41, 05, 18][62 9D, 05, 18]
+FC1B; [62 41, 05, 30][62 9D, 05, 30]
+FD1F; [62 41, 05, 28][62 C1, 05, 26]
+FD03; [62 41, 05, 30][62 C1, 05, 31]
+FD20; [62 41, 05, 28][62 C3, 05, 2C]
+FD04; [62 41, 05, 30][62 C3, 05, 33]
+
+0681; [62 43, 05, 05]
+
+0682; [62 45, 05, 05]
+
+0685; [62 47, 05, 05]
+
+0757; [62 49 02, 05, 05]
+
+0758; [62 49 0A, 05, 05]
+
+076E; [62 49 12, 05, 05]
+
+076F; [62 49 1A, 05, 05]
+
+0772; [62 49 22, 05, 05]
+
+077C; [62 49 2A, 05, 05]
+
+062F; [62 4B, 05, 05]
+1EE03; [62 4B, 05, 10]
+1EE83; [62 4B, 05, 10]
+1EEA3; [62 4B, 05, 10]
+FEAA; [62 4B, 05, 1E]
+FEA9; [62 4B, 05, 2C]
+
+0630; [62 4D, 05, 05]
+1EE18; [62 4D, 05, 10]
+1EE98; [62 4D, 05, 10]
+1EEB8; [62 4D, 05, 10]
+FEAC; [62 4D, 05, 1E]
+FEAB; [62 4D, 05, 2C]
+FC5B; [62 4D, 05, 2C][, EE 72, 2C]
+
+0688; [62 4F, 05, 05]
+FB89; [62 4F, 05, 20]
+FB88; [62 4F, 05, 2E]
+
+0689; [62 51, 05, 05]
+
+068A; [62 53 02, 05, 05]
+
+068B; [62 53 0A, 05, 05]
+
+068C; [62 53 12, 05, 05]
+FB85; [62 53 12, 05, 20]
+FB84; [62 53 12, 05, 2E]
+
+068D; [62 53 1A, 05, 05]
+FB83; [62 53 1A, 05, 20]
+FB82; [62 53 1A, 05, 2E]
+
+068E; [62 53 22, 05, 05]
+FB87; [62 53 22, 05, 20]
+FB86; [62 53 22, 05, 2E]
+
+068F; [62 53 2A, 05, 05]
+
+0690; [62 53 32, 05, 05]
+
+06EE; [62 53 3A, 05, 05]
+
+0759; [62 53 42, 05, 05]
+
+075A; [62 53 4A, 05, 05]
+
+0631; [62 55, 05, 05]
+1EE13; [62 55, 05, 10]
+1EE93; [62 55, 05, 10]
+1EEB3; [62 55, 05, 10]
+FEAE; [62 55, 05, 1E]
+FEAD; [62 55, 05, 2C]
+FC5C; [62 55, 05, 2C][, EE 72, 2C]
+FDF6; [62 55, 05, 2C][62 69, 05, 30][62 B3, 05, 31][62 99, 05, 30]
+
+0632; [62 57, 05, 05]
+1EE06; [62 57, 05, 10]
+1EE86; [62 57, 05, 10]
+1EEA6; [62 57, 05, 10]
+FEB0; [62 57, 05, 1E]
+FEAF; [62 57, 05, 2C]
+
+0691; [62 59, 05, 05]
+FB8D; [62 59, 05, 20]
+FB8C; [62 59, 05, 2E]
+
+0692; [62 5B, 05, 05]
+
+0693; [62 5D, 05, 05]
+
+0694; [62 5F 02, 05, 05]
+
+0695; [62 5F 0A, 05, 05]
+
+0696; [62 61, 05, 05]
+
+0697; [62 63, 05, 05]
+
+0698; [62 65, 05, 05]
+FB8B; [62 65, 05, 20]
+FB8A; [62 65, 05, 2E]
+
+0699; [62 67 02, 05, 05]
+
+06EF; [62 67 0A, 05, 05]
+
+075B; [62 67 12, 05, 05]
+
+076B; [62 67 1A, 05, 05]
+
+076C; [62 67 22, 05, 05]
+
+0771; [62 67 2A, 05, 05]
+
+08AA; [62 67 32, 05, 05]
+
+0633; [62 69, 05, 05]
+1EE0E; [62 69, 05, 10]
+1EE2E; [62 69, 05, 10]
+1EE4E; [62 69, 05, 10]
+1EE6E; [62 69, 05, 10]
+1EE8E; [62 69, 05, 10]
+1EEAE; [62 69, 05, 10]
+FEB3; [62 69, 05, 18]
+FEB4; [62 69, 05, 20]
+FEB2; [62 69, 05, 28]
+FEB1; [62 69, 05, 30]
+FCAD; [62 69, 05, 18][62 37, 05, 18]
+FD34; [62 69, 05, 20][62 37, 05, 20]
+FC1C; [62 69, 05, 30][62 37, 05, 30]
+FD5D; [62 69, 05, 18][62 37, 05, 18][62 3F, 05, 18]
+FD5E; [62 69, 05, 28][62 37, 05, 28][62 C1, 05, 26]
+FCAE; [62 69, 05, 18][62 3F, 05, 18]
+FD35; [62 69, 05, 20][62 3F, 05, 20]
+FC1D; [62 69, 05, 30][62 3F, 05, 30]
+FD5C; [62 69, 05, 18][62 3F, 05, 18][62 37, 05, 18]
+FCAF; [62 69, 05, 18][62 41, 05, 18]
+FD36; [62 69, 05, 20][62 41, 05, 20]
+FC1E; [62 69, 05, 30][62 41, 05, 30]
+FDA8; [62 69, 05, 28][62 41, 05, 28][62 C1, 05, 26]
+FDC6; [62 69, 05, 28][62 41, 05, 28][62 C3, 05, 2C]
+FD2A; [62 69, 05, 28][62 55, 05, 1E]
+FD0E; [62 69, 05, 30][62 55, 05, 2C]
+FCB0; [62 69, 05, 18][62 9D, 05, 18]
+FCE7; [62 69, 05, 20][62 9D, 05, 20]
+FC1F; [62 69, 05, 30][62 9D, 05, 30]
+FD61; [62 69, 05, 18][62 9D, 05, 18][62 37, 05, 18]
+FD60; [62 69, 05, 18][62 9D, 05, 18][62 3F, 05, 18]
+FD5F; [62 69, 05, 28][62 9D, 05, 28][62 3F, 05, 28]
+FD63; [62 69, 05, 18][62 9D, 05, 18][62 9D, 05, 18]
+FD62; [62 69, 05, 28][62 9D, 05, 28][62 9D, 05, 28]
+FD31; [62 69, 05, 18][62 AB, 05, 18]
+FCE8; [62 69, 05, 20][62 AB, 05, 20]
+FD17; [62 69, 05, 28][62 C1, 05, 26]
+FCFB; [62 69, 05, 30][62 C1, 05, 31]
+FD18; [62 69, 05, 28][62 C3, 05, 2C]
+FCFC; [62 69, 05, 30][62 C3, 05, 33]
+
+0634; [62 6B, 05, 05]
+1EE14; [62 6B, 05, 10]
+1EE34; [62 6B, 05, 10]
+1EE54; [62 6B, 05, 10]
+1EE74; [62 6B, 05, 10]
+1EE94; [62 6B, 05, 10]
+1EEB4; [62 6B, 05, 10]
+FEB7; [62 6B, 05, 18]
+FEB8; [62 6B, 05, 20]
+FEB6; [62 6B, 05, 28]
+FEB5; [62 6B, 05, 30]
+FD2D; [62 6B, 05, 18][62 37, 05, 18]
+FD37; [62 6B, 05, 20][62 37, 05, 20]
+FD25; [62 6B, 05, 28][62 37, 05, 28]
+FD09; [62 6B, 05, 30][62 37, 05, 30]
+FD69; [62 6B, 05, 28][62 37, 05, 28][62 C3, 05, 2C]
+FD2E; [62 6B, 05, 18][62 3F, 05, 18]
+FD38; [62 6B, 05, 20][62 3F, 05, 20]
+FD26; [62 6B, 05, 28][62 3F, 05, 28]
+FD0A; [62 6B, 05, 30][62 3F, 05, 30]
+FD68; [62 6B, 05, 18][62 3F, 05, 18][62 9D, 05, 18]
+FD67; [62 6B, 05, 28][62 3F, 05, 28][62 9D, 05, 28]
+FDAA; [62 6B, 05, 28][62 3F, 05, 28][62 C3, 05, 2C]
+FD2F; [62 6B, 05, 18][62 41, 05, 18]
+FD39; [62 6B, 05, 20][62 41, 05, 20]
+FD27; [62 6B, 05, 28][62 41, 05, 28]
+FD0B; [62 6B, 05, 30][62 41, 05, 30]
+FD29; [62 6B, 05, 28][62 55, 05, 1E]
+FD0D; [62 6B, 05, 30][62 55, 05, 2C]
+FD30; [62 6B, 05, 18][62 9D, 05, 18]
+FCE9; [62 6B, 05, 20][62 9D, 05, 20]
+FD28; [62 6B, 05, 28][62 9D, 05, 28]
+FD0C; [62 6B, 05, 30][62 9D, 05, 30]
+FD6B; [62 6B, 05, 18][62 9D, 05, 18][62 41, 05, 18]
+FD6A; [62 6B, 05, 28][62 9D, 05, 28][62 41, 05, 28]
+FD6D; [62 6B, 05, 18][62 9D, 05, 18][62 9D, 05, 18]
+FD6C; [62 6B, 05, 28][62 9D, 05, 28][62 9D, 05, 28]
+FD32; [62 6B, 05, 18][62 AB, 05, 18]
+FCEA; [62 6B, 05, 20][62 AB, 05, 20]
+FD19; [62 6B, 05, 28][62 C1, 05, 26]
+FCFD; [62 6B, 05, 30][62 C1, 05, 31]
+FD1A; [62 6B, 05, 28][62 C3, 05, 2C]
+FCFE; [62 6B, 05, 30][62 C3, 05, 33]
+
+069A; [62 6D, 05, 05]
+
+069B; [62 6F 02, 05, 05]
+
+069C; [62 6F 0A, 05, 05]
+
+06FA; [62 6F 12, 05, 05]
+
+075C; [62 6F 1A, 05, 05]
+
+076D; [62 6F 22, 05, 05]
+
+0770; [62 6F 2A, 05, 05]
+
+077D; [62 6F 32, 05, 05]
+
+077E; [62 6F 3A, 05, 05]
+
+0635; [62 71, 05, 05]
+1EE11; [62 71, 05, 10]
+1EE31; [62 71, 05, 10]
+1EE51; [62 71, 05, 10]
+1EE71; [62 71, 05, 10]
+1EE91; [62 71, 05, 10]
+1EEB1; [62 71, 05, 10]
+FEBB; [62 71, 05, 18]
+FEBC; [62 71, 05, 20]
+FEBA; [62 71, 05, 28]
+FEB9; [62 71, 05, 30]
+FCB1; [62 71, 05, 18][62 3F, 05, 18]
+FC20; [62 71, 05, 30][62 3F, 05, 30]
+FD65; [62 71, 05, 18][62 3F, 05, 18][62 3F, 05, 18]
+FD64; [62 71, 05, 28][62 3F, 05, 28][62 3F, 05, 28]
+FDA9; [62 71, 05, 28][62 3F, 05, 28][62 C3, 05, 2C]
+FCB2; [62 71, 05, 18][62 41, 05, 18]
+FD2B; [62 71, 05, 28][62 55, 05, 1E]
+FD0F; [62 71, 05, 30][62 55, 05, 2C]
+FDF5; [62 71, 05, 30][62 99, 05, 30][62 7D, 05, 30][62 9D, 05, 30]
+FDF9; [62 71, 05, 30][62 99, 05, 30][62 C1, 05, 31]
+FDFA; [62 71, 05, 30][62 99, 05, 30][62 C1, 05, 31][04, 05, 26][62 1D, 05, 31][62 99, 05, 30][62 99, 05, 30][62 AB, 05, 30][04, 05, 26][62 7D, 05, 30][62 99, 05, 30][62 C3, 05, 33][62 AB, 05, 30][04, 05, 26][62 B3, 05, 31][62 69, 05, 30][62 99, 05, 30][62 9D, 05, 30]
+FDF0; [62 71, 05, 30][62 99, 05, 30][62 CF, 05, 2E]
+FCB3; [62 71, 05, 18][62 9D, 05, 18]
+FC21; [62 71, 05, 30][62 9D, 05, 30]
+FDC5; [62 71, 05, 18][62 9D, 05, 18][62 9D, 05, 18]
+FD66; [62 71, 05, 28][62 9D, 05, 28][62 9D, 05, 28]
+FD21; [62 71, 05, 28][62 C1, 05, 26]
+FD05; [62 71, 05, 30][62 C1, 05, 31]
+FD22; [62 71, 05, 28][62 C3, 05, 2C]
+FD06; [62 71, 05, 30][62 C3, 05, 33]
+
+0636; [62 73, 05, 05]
+1EE19; [62 73, 05, 10]
+1EE39; [62 73, 05, 10]
+1EE59; [62 73, 05, 10]
+1EE79; [62 73, 05, 10]
+1EE99; [62 73, 05, 10]
+1EEB9; [62 73, 05, 10]
+FEBF; [62 73, 05, 18]
+FEC0; [62 73, 05, 20]
+FEBE; [62 73, 05, 28]
+FEBD; [62 73, 05, 30]
+FCB4; [62 73, 05, 18][62 37, 05, 18]
+FC22; [62 73, 05, 30][62 37, 05, 30]
+FCB5; [62 73, 05, 18][62 3F, 05, 18]
+FC23; [62 73, 05, 30][62 3F, 05, 30]
+FD6E; [62 73, 05, 28][62 3F, 05, 28][62 C1, 05, 26]
+FDAB; [62 73, 05, 28][62 3F, 05, 28][62 C3, 05, 2C]
+FCB6; [62 73, 05, 18][62 41, 05, 18]
+FC24; [62 73, 05, 30][62 41, 05, 30]
+FD70; [62 73, 05, 18][62 41, 05, 18][62 9D, 05, 18]
+FD6F; [62 73, 05, 28][62 41, 05, 28][62 9D, 05, 28]
+FD2C; [62 73, 05, 28][62 55, 05, 1E]
+FD10; [62 73, 05, 30][62 55, 05, 2C]
+FCB7; [62 73, 05, 18][62 9D, 05, 18]
+FC25; [62 73, 05, 30][62 9D, 05, 30]
+FD23; [62 73, 05, 28][62 C1, 05, 26]
+FD07; [62 73, 05, 30][62 C1, 05, 31]
+FD24; [62 73, 05, 28][62 C3, 05, 2C]
+FD08; [62 73, 05, 30][62 C3, 05, 33]
+
+069D; [62 75 02, 05, 05]
+
+069E; [62 75 0A, 05, 05]
+
+06FB; [62 75 12, 05, 05]
+
+0637; [62 77, 05, 05]
+1EE08; [62 77, 05, 10]
+1EE68; [62 77, 05, 10]
+1EE88; [62 77, 05, 10]
+1EEA8; [62 77, 05, 10]
+FEC3; [62 77, 05, 18]
+FEC4; [62 77, 05, 20]
+FEC2; [62 77, 05, 28]
+FEC1; [62 77, 05, 30]
+FCB8; [62 77, 05, 18][62 3F, 05, 18]
+FC26; [62 77, 05, 30][62 3F, 05, 30]
+FD33; [62 77, 05, 18][62 9D, 05, 18]
+FD3A; [62 77, 05, 20][62 9D, 05, 20]
+FC27; [62 77, 05, 30][62 9D, 05, 30]
+FD72; [62 77, 05, 18][62 9D, 05, 18][62 3F, 05, 18]
+FD71; [62 77, 05, 28][62 9D, 05, 28][62 3F, 05, 28]
+FD73; [62 77, 05, 18][62 9D, 05, 18][62 9D, 05, 18]
+FD74; [62 77, 05, 28][62 9D, 05, 28][62 C3, 05, 2C]
+FD11; [62 77, 05, 28][62 C1, 05, 26]
+FCF5; [62 77, 05, 30][62 C1, 05, 31]
+FD12; [62 77, 05, 28][62 C3, 05, 2C]
+FCF6; [62 77, 05, 30][62 C3, 05, 33]
+
+0638; [62 79, 05, 05]
+1EE1A; [62 79, 05, 10]
+1EE7A; [62 79, 05, 10]
+1EE9A; [62 79, 05, 10]
+1EEBA; [62 79, 05, 10]
+FEC7; [62 79, 05, 18]
+FEC8; [62 79, 05, 20]
+FEC6; [62 79, 05, 28]
+FEC5; [62 79, 05, 30]
+FCB9; [62 79, 05, 18][62 9D, 05, 18]
+FD3B; [62 79, 05, 20][62 9D, 05, 20]
+FC28; [62 79, 05, 30][62 9D, 05, 30]
+
+069F; [62 7B 02, 05, 05]
+
+08A3; [62 7B 0A, 05, 05]
+
+0639; [62 7D, 05, 05]
+1EE0F; [62 7D, 05, 10]
+1EE2F; [62 7D, 05, 10]
+1EE4F; [62 7D, 05, 10]
+1EE6F; [62 7D, 05, 10]
+1EE8F; [62 7D, 05, 10]
+1EEAF; [62 7D, 05, 10]
+FECB; [62 7D, 05, 18]
+FECC; [62 7D, 05, 20]
+FECA; [62 7D, 05, 28]
+FEC9; [62 7D, 05, 30]
+FCBA; [62 7D, 05, 18][62 37, 05, 18]
+FC29; [62 7D, 05, 30][62 37, 05, 30]
+FDC4; [62 7D, 05, 18][62 37, 05, 18][62 9D, 05, 18]
+FD75; [62 7D, 05, 28][62 37, 05, 28][62 9D, 05, 28]
+FDF7; [62 7D, 05, 30][62 99, 05, 30][62 C3, 05, 33][62 AB, 05, 30]
+FCBB; [62 7D, 05, 18][62 9D, 05, 18]
+FC2A; [62 7D, 05, 30][62 9D, 05, 30]
+FD77; [62 7D, 05, 18][62 9D, 05, 18][62 9D, 05, 18]
+FD76; [62 7D, 05, 28][62 9D, 05, 28][62 9D, 05, 28]
+FD78; [62 7D, 05, 28][62 9D, 05, 28][62 C1, 05, 26]
+FDB6; [62 7D, 05, 28][62 9D, 05, 28][62 C3, 05, 2C]
+FD13; [62 7D, 05, 28][62 C1, 05, 26]
+FCF7; [62 7D, 05, 30][62 C1, 05, 31]
+FD14; [62 7D, 05, 28][62 C3, 05, 2C]
+FCF8; [62 7D, 05, 30][62 C3, 05, 33]
+
+063A; [62 7F, 05, 05]
+1EE1B; [62 7F, 05, 10]
+1EE3B; [62 7F, 05, 10]
+1EE5B; [62 7F, 05, 10]
+1EE7B; [62 7F, 05, 10]
+1EE9B; [62 7F, 05, 10]
+1EEBB; [62 7F, 05, 10]
+FECF; [62 7F, 05, 18]
+FED0; [62 7F, 05, 20]
+FECE; [62 7F, 05, 28]
+FECD; [62 7F, 05, 30]
+FCBC; [62 7F, 05, 18][62 37, 05, 18]
+FC2B; [62 7F, 05, 30][62 37, 05, 30]
+FCBD; [62 7F, 05, 18][62 9D, 05, 18]
+FC2C; [62 7F, 05, 30][62 9D, 05, 30]
+FD79; [62 7F, 05, 28][62 9D, 05, 28][62 9D, 05, 28]
+FD7B; [62 7F, 05, 28][62 9D, 05, 28][62 C1, 05, 26]
+FD7A; [62 7F, 05, 28][62 9D, 05, 28][62 C3, 05, 2C]
+FD15; [62 7F, 05, 28][62 C1, 05, 26]
+FCF9; [62 7F, 05, 30][62 C1, 05, 31]
+FD16; [62 7F, 05, 28][62 C3, 05, 2C]
+FCFA; [62 7F, 05, 30][62 C3, 05, 33]
+
+06A0; [62 81 02, 05, 05]
+
+06FC; [62 81 0A, 05, 05]
+
+075D; [62 81 12, 05, 05]
+
+075E; [62 81 1A, 05, 05]
+
+075F; [62 81 22, 05, 05]
+
+0641; [62 83, 05, 05]
+1EE10; [62 83, 05, 10]
+1EE30; [62 83, 05, 10]
+1EE70; [62 83, 05, 10]
+1EE90; [62 83, 05, 10]
+1EEB0; [62 83, 05, 10]
+FED3; [62 83, 05, 18]
+FED4; [62 83, 05, 20]
+FED2; [62 83, 05, 28]
+FED1; [62 83, 05, 30]
+FCBE; [62 83, 05, 18][62 37, 05, 18]
+FC2D; [62 83, 05, 30][62 37, 05, 30]
+FCBF; [62 83, 05, 18][62 3F, 05, 18]
+FC2E; [62 83, 05, 30][62 3F, 05, 30]
+FCC0; [62 83, 05, 18][62 41, 05, 18]
+FC2F; [62 83, 05, 30][62 41, 05, 30]
+FD7D; [62 83, 05, 18][62 41, 05, 18][62 9D, 05, 18]
+FD7C; [62 83, 05, 28][62 41, 05, 28][62 9D, 05, 28]
+FCC1; [62 83, 05, 18][62 9D, 05, 18]
+FC30; [62 83, 05, 30][62 9D, 05, 30]
+FDC1; [62 83, 05, 28][62 9D, 05, 28][62 C3, 05, 2C]
+FC7C; [62 83, 05, 28][62 C1, 05, 26]
+FC31; [62 83, 05, 30][62 C1, 05, 31]
+FC7D; [62 83, 05, 28][62 C3, 05, 2C]
+FC32; [62 83, 05, 30][62 C3, 05, 33]
+
+06A1; [62 85 02, 05, 05]
+1EE1E; [62 85 02, 05, 20]
+1EE7E; [62 85 02, 05, 20]
+
+06A2; [62 85 0A, 05, 05]
+
+06A3; [62 85 12, 05, 05]
+
+06A4; [62 85 1A, 05, 05]
+FB6C; [62 85 1A, 05, 10]
+FB6D; [62 85 1A, 05, 1B]
+FB6B; [62 85 1A, 05, 26]
+FB6A; [62 85 1A, 05, 31]
+
+08A4; [62 85 22, 05, 05]
+
+06A5; [62 85 2A, 05, 05]
+
+06A6; [62 85 32, 05, 05]
+FB70; [62 85 32, 05, 10]
+FB71; [62 85 32, 05, 1B]
+FB6F; [62 85 32, 05, 26]
+FB6E; [62 85 32, 05, 31]
+
+0760; [62 85 3A, 05, 05]
+
+0761; [62 85 42, 05, 05]
+
+066F; [62 85 4A, 05, 05]
+1EE1F; [62 85 4A, 05, 20]
+1EE5F; [62 85 4A, 05, 20]
+
+0642; [62 87, 05, 05]
+1EE12; [62 87, 05, 10]
+1EE32; [62 87, 05, 10]
+1EE52; [62 87, 05, 10]
+1EE72; [62 87, 05, 10]
+1EE92; [62 87, 05, 10]
+1EEB2; [62 87, 05, 10]
+FED7; [62 87, 05, 18]
+FED8; [62 87, 05, 20]
+FED6; [62 87, 05, 28]
+FED5; [62 87, 05, 30]
+FCC2; [62 87, 05, 18][62 3F, 05, 18]
+FC33; [62 87, 05, 30][62 3F, 05, 30]
+FDF1; [62 87, 05, 30][62 99, 05, 30][62 CF, 05, 2E]
+FCC3; [62 87, 05, 18][62 9D, 05, 18]
+FC34; [62 87, 05, 30][62 9D, 05, 30]
+FDB4; [62 87, 05, 18][62 9D, 05, 18][62 3F, 05, 18]
+FD7E; [62 87, 05, 28][62 9D, 05, 28][62 3F, 05, 28]
+FD7F; [62 87, 05, 28][62 9D, 05, 28][62 9D, 05, 28]
+FDB2; [62 87, 05, 28][62 9D, 05, 28][62 C3, 05, 2C]
+FC7E; [62 87, 05, 28][62 C1, 05, 26]
+FC35; [62 87, 05, 30][62 C1, 05, 31]
+FC7F; [62 87, 05, 28][62 C3, 05, 2C]
+FC36; [62 87, 05, 30][62 C3, 05, 33]
+
+06A7; [62 89 02, 05, 05]
+
+06A8; [62 89 0A, 05, 05]
+
+08A5; [62 89 12, 05, 05]
+
+0643; [62 8B, 05, 05]
+1EE0A; [62 8B, 05, 10]
+1EE2A; [62 8B, 05, 10]
+1EE6A; [62 8B, 05, 10]
+FEDB; [62 8B, 05, 18]
+FEDC; [62 8B, 05, 20]
+FEDA; [62 8B, 05, 28]
+FED9; [62 8B, 05, 30]
+FC80; [62 8B, 05, 28][62 1D, 05, 26]
+FC37; [62 8B, 05, 30][62 1D, 05, 31]
+FCC4; [62 8B, 05, 18][62 37, 05, 18]
+FC38; [62 8B, 05, 30][62 37, 05, 30]
+FCC5; [62 8B, 05, 18][62 3F, 05, 18]
+FC39; [62 8B, 05, 30][62 3F, 05, 30]
+FCC6; [62 8B, 05, 18][62 41, 05, 18]
+FC3A; [62 8B, 05, 30][62 41, 05, 30]
+FCC7; [62 8B, 05, 18][62 99, 05, 18]
+FCEB; [62 8B, 05, 20][62 99, 05, 20]
+FC81; [62 8B, 05, 28][62 99, 05, 28]
+FC3B; [62 8B, 05, 30][62 99, 05, 30]
+FCC8; [62 8B, 05, 18][62 9D, 05, 18]
+FCEC; [62 8B, 05, 20][62 9D, 05, 20]
+FC82; [62 8B, 05, 28][62 9D, 05, 28]
+FC3C; [62 8B, 05, 30][62 9D, 05, 30]
+FDC3; [62 8B, 05, 18][62 9D, 05, 18][62 9D, 05, 18]
+FDBB; [62 8B, 05, 28][62 9D, 05, 28][62 9D, 05, 28]
+FDB7; [62 8B, 05, 28][62 9D, 05, 28][62 C3, 05, 2C]
+FC83; [62 8B, 05, 28][62 C1, 05, 26]
+FC3D; [62 8B, 05, 30][62 C1, 05, 31]
+FC84; [62 8B, 05, 28][62 C3, 05, 2C]
+FC3E; [62 8B, 05, 30][62 C3, 05, 33]
+
+06A9; [62 8D, 05, 05]
+FB90; [62 8D, 05, 10]
+FB91; [62 8D, 05, 1B]
+FB8F; [62 8D, 05, 26]
+FB8E; [62 8D, 05, 31]
+
+06AA; [62 8F, 05, 05]
+
+06AB; [62 91, 05, 05]
+
+06AC; [62 93 02, 05, 05]
+
+077F; [62 93 0A, 05, 05]
+
+06AD; [62 93 12, 05, 05]
+FBD5; [62 93 12, 05, 10]
+FBD6; [62 93 12, 05, 1B]
+FBD4; [62 93 12, 05, 26]
+FBD3; [62 93 12, 05, 31]
+
+06AE; [62 93 1A, 05, 05]
+
+06AF; [62 95, 05, 05]
+FB94; [62 95, 05, 10]
+FB95; [62 95, 05, 1B]
+FB93; [62 95, 05, 26]
+FB92; [62 95, 05, 31]
+
+06B0; [62 97 02, 05, 05]
+
+06B1; [62 97 0A, 05, 05]
+FB9C; [62 97 0A, 05, 10]
+FB9D; [62 97 0A, 05, 1B]
+FB9B; [62 97 0A, 05, 26]
+FB9A; [62 97 0A, 05, 31]
+
+06B2; [62 97 12, 05, 05]
+
+06B3; [62 97 1A, 05, 05]
+FB98; [62 97 1A, 05, 10]
+FB99; [62 97 1A, 05, 1B]
+FB97; [62 97 1A, 05, 26]
+FB96; [62 97 1A, 05, 31]
+
+06B4; [62 97 22, 05, 05]
+
+0762; [62 97 2A, 05, 05]
+
+063B; [62 97 32, 05, 05]
+
+063C; [62 97 3A, 05, 05]
+
+0763; [62 97 42, 05, 05]
+
+0764; [62 97 4A, 05, 05]
+
+0644; [62 99, 05, 05]
+1EE0B; [62 99, 05, 10]
+1EE2B; [62 99, 05, 10]
+1EE4B; [62 99, 05, 10]
+1EE8B; [62 99, 05, 10]
+1EEAB; [62 99, 05, 10]
+FEDF; [62 99, 05, 18]
+FEE0; [62 99, 05, 20]
+FEDE; [62 99, 05, 28]
+FEDD; [62 99, 05, 30]
+FEF6; [62 99, 05, 28][62 0B, 05, 20]
+FEF5; [62 99, 05, 30][62 0B, 05, 2E]
+FEF8; [62 99, 05, 28][62 0D, 05, 20]
+FEF7; [62 99, 05, 30][62 0D, 05, 2E]
+FEFA; [62 99, 05, 28][62 15, 05, 20]
+FEF9; [62 99, 05, 30][62 15, 05, 2E]
+FEFC; [62 99, 05, 28][62 1D, 05, 26]
+FEFB; [62 99, 05, 30][62 1D, 05, 31]
+FCC9; [62 99, 05, 18][62 37, 05, 18]
+FC3F; [62 99, 05, 30][62 37, 05, 30]
+FD83; [62 99, 05, 18][62 37, 05, 18][62 37, 05, 18]
+FD84; [62 99, 05, 28][62 37, 05, 28][62 37, 05, 28]
+FDBA; [62 99, 05, 18][62 37, 05, 18][62 9D, 05, 18]
+FDBC; [62 99, 05, 28][62 37, 05, 28][62 9D, 05, 28]
+FDAC; [62 99, 05, 28][62 37, 05, 28][62 C3, 05, 2C]
+FCCA; [62 99, 05, 18][62 3F, 05, 18]
+FC40; [62 99, 05, 30][62 3F, 05, 30]
+FDB5; [62 99, 05, 18][62 3F, 05, 18][62 9D, 05, 18]
+FD80; [62 99, 05, 28][62 3F, 05, 28][62 9D, 05, 28]
+FD82; [62 99, 05, 28][62 3F, 05, 28][62 C1, 05, 26]
+FD81; [62 99, 05, 28][62 3F, 05, 28][62 C3, 05, 2C]
+FCCB; [62 99, 05, 18][62 41, 05, 18]
+FC41; [62 99, 05, 30][62 41, 05, 30]
+FD86; [62 99, 05, 18][62 41, 05, 18][62 9D, 05, 18]
+FD85; [62 99, 05, 28][62 41, 05, 28][62 9D, 05, 28]
+FCCC; [62 99, 05, 18][62 9D, 05, 18]
+FCED; [62 99, 05, 20][62 9D, 05, 20]
+FC85; [62 99, 05, 28][62 9D, 05, 28]
+FC42; [62 99, 05, 30][62 9D, 05, 30]
+FD88; [62 99, 05, 18][62 9D, 05, 18][62 3F, 05, 18]
+FD87; [62 99, 05, 28][62 9D, 05, 28][62 3F, 05, 28]
+FDAD; [62 99, 05, 28][62 9D, 05, 28][62 C3, 05, 2C]
+FCCD; [62 99, 05, 18][62 AB, 05, 18]
+FC86; [62 99, 05, 28][62 C1, 05, 26]
+FC43; [62 99, 05, 30][62 C1, 05, 31]
+FC87; [62 99, 05, 28][62 C3, 05, 2C]
+FC44; [62 99, 05, 30][62 C3, 05, 33]
+
+06B5; [62 9B 02, 05, 05]
+
+06B6; [62 9B 0A, 05, 05]
+
+06B7; [62 9B 12, 05, 05]
+
+06B8; [62 9B 1A, 05, 05]
+
+076A; [62 9B 22, 05, 05]
+
+08A6; [62 9B 2A, 05, 05]
+
+0645; [62 9D, 05, 05]
+1EE0C; [62 9D, 05, 10]
+1EE2C; [62 9D, 05, 10]
+1EE6C; [62 9D, 05, 10]
+1EE8C; [62 9D, 05, 10]
+1EEAC; [62 9D, 05, 10]
+FEE3; [62 9D, 05, 18]
+FEE4; [62 9D, 05, 20]
+FEE2; [62 9D, 05, 28]
+FEE1; [62 9D, 05, 30]
+06FE; [62 9D, 70, 20]
+FC88; [62 9D, 05, 28][62 1D, 05, 26]
+FCCE; [62 9D, 05, 18][62 37, 05, 18]
+FC45; [62 9D, 05, 30][62 37, 05, 30]
+FD8C; [62 9D, 05, 18][62 37, 05, 18][62 3F, 05, 18]
+FD92; [62 9D, 05, 18][62 37, 05, 18][62 41, 05, 18]
+FD8D; [62 9D, 05, 18][62 37, 05, 18][62 9D, 05, 18]
+FDC0; [62 9D, 05, 28][62 37, 05, 28][62 C3, 05, 2C]
+FCCF; [62 9D, 05, 18][62 3F, 05, 18]
+FC46; [62 9D, 05, 30][62 3F, 05, 30]
+FD89; [62 9D, 05, 18][62 3F, 05, 18][62 37, 05, 18]
+FD8A; [62 9D, 05, 18][62 3F, 05, 18][62 9D, 05, 18]
+FDF4; [62 9D, 05, 30][62 3F, 05, 30][62 9D, 05, 30][62 4B, 05, 2C]
+FD8B; [62 9D, 05, 28][62 3F, 05, 28][62 C3, 05, 2C]
+FCD0; [62 9D, 05, 18][62 41, 05, 18]
+FC47; [62 9D, 05, 30][62 41, 05, 30]
+FD8E; [62 9D, 05, 18][62 41, 05, 18][62 37, 05, 18]
+FD8F; [62 9D, 05, 18][62 41, 05, 18][62 9D, 05, 18]
+FDB9; [62 9D, 05, 28][62 41, 05, 28][62 C3, 05, 2C]
+FCD1; [62 9D, 05, 18][62 9D, 05, 18]
+FC89; [62 9D, 05, 28][62 9D, 05, 28]
+FC48; [62 9D, 05, 30][62 9D, 05, 30]
+FDB1; [62 9D, 05, 28][62 9D, 05, 28][62 C3, 05, 2C]
+FC49; [62 9D, 05, 30][62 C1, 05, 31]
+FC4A; [62 9D, 05, 30][62 C3, 05, 33]
+
+0765; [62 9F 02, 05, 05]
+
+0766; [62 9F 0A, 05, 05]
+
+08A7; [62 9F 12, 05, 05]
+
+0646; [62 A1, 05, 05]
+1EE0D; [62 A1, 05, 10]
+1EE2D; [62 A1, 05, 10]
+1EE4D; [62 A1, 05, 10]
+1EE6D; [62 A1, 05, 10]
+1EE8D; [62 A1, 05, 10]
+1EEAD; [62 A1, 05, 10]
+FEE7; [62 A1, 05, 18]
+FEE8; [62 A1, 05, 20]
+FEE6; [62 A1, 05, 28]
+FEE5; [62 A1, 05, 30]
+FCD2; [62 A1, 05, 18][62 37, 05, 18]
+FC4B; [62 A1, 05, 30][62 37, 05, 30]
+FDB8; [62 A1, 05, 18][62 37, 05, 18][62 3F, 05, 18]
+FDBD; [62 A1, 05, 28][62 37, 05, 28][62 3F, 05, 28]
+FD98; [62 A1, 05, 18][62 37, 05, 18][62 9D, 05, 18]
+FD97; [62 A1, 05, 28][62 37, 05, 28][62 9D, 05, 28]
+FD99; [62 A1, 05, 28][62 37, 05, 28][62 C1, 05, 26]
+FDC7; [62 A1, 05, 28][62 37, 05, 28][62 C3, 05, 2C]
+FCD3; [62 A1, 05, 18][62 3F, 05, 18]
+FC4C; [62 A1, 05, 30][62 3F, 05, 30]
+FD95; [62 A1, 05, 18][62 3F, 05, 18][62 9D, 05, 18]
+FD96; [62 A1, 05, 28][62 3F, 05, 28][62 C1, 05, 26]
+FDB3; [62 A1, 05, 28][62 3F, 05, 28][62 C3, 05, 2C]
+FCD4; [62 A1, 05, 18][62 41, 05, 18]
+FC4D; [62 A1, 05, 30][62 41, 05, 30]
+FC8A; [62 A1, 05, 28][62 55, 05, 1E]
+FC8B; [62 A1, 05, 28][62 57, 05, 1E]
+FCD5; [62 A1, 05, 18][62 9D, 05, 18]
+FCEE; [62 A1, 05, 20][62 9D, 05, 20]
+FC8C; [62 A1, 05, 28][62 9D, 05, 28]
+FC4E; [62 A1, 05, 30][62 9D, 05, 30]
+FD9B; [62 A1, 05, 28][62 9D, 05, 28][62 C1, 05, 26]
+FD9A; [62 A1, 05, 28][62 9D, 05, 28][62 C3, 05, 2C]
+FC8D; [62 A1, 05, 28][62 A1, 05, 28]
+FCD6; [62 A1, 05, 18][62 AB, 05, 18]
+FCEF; [62 A1, 05, 20][62 AB, 05, 20]
+FC8E; [62 A1, 05, 28][62 C1, 05, 26]
+FC4F; [62 A1, 05, 30][62 C1, 05, 31]
+FC8F; [62 A1, 05, 28][62 C3, 05, 2C]
+FC50; [62 A1, 05, 30][62 C3, 05, 33]
+
+06BA; [62 A3, 05, 05]
+1EE1D; [62 A3, 05, 10]
+1EE5D; [62 A3, 05, 10]
+FB9F; [62 A3, 05, 1E]
+FB9E; [62 A3, 05, 2C]
+
+06BB; [62 A5, 05, 05]
+FBA2; [62 A5, 05, 10]
+FBA3; [62 A5, 05, 1B]
+FBA1; [62 A5, 05, 26]
+FBA0; [62 A5, 05, 31]
+
+06BC; [62 A7, 05, 05]
+
+06BD; [62 A9 02, 05, 05]
+
+06B9; [62 A9 0A, 05, 05]
+
+0767; [62 A9 12, 05, 05]
+
+0768; [62 A9 1A, 05, 05]
+
+0769; [62 A9 22, 05, 05]
+
+0647; [62 AB, 05, 05]
+1EE24; [62 AB, 05, 10]
+1EE64; [62 AB, 05, 10]
+1EE84; [62 AB, 05, 10]
+FEEB; [62 AB, 05, 18]
+FEEC; [62 AB, 05, 20]
+FEEA; [62 AB, 05, 28]
+FEE9; [62 AB, 05, 30]
+FCD9; [62 AB, 05, 18][, EE 72, 10]
+FCD7; [62 AB, 05, 18][62 37, 05, 18]
+FC51; [62 AB, 05, 30][62 37, 05, 30]
+FCD8; [62 AB, 05, 18][62 9D, 05, 18]
+FC52; [62 AB, 05, 30][62 9D, 05, 30]
+FD93; [62 AB, 05, 18][62 9D, 05, 18][62 37, 05, 18]
+FD94; [62 AB, 05, 18][62 9D, 05, 18][62 9D, 05, 18]
+FC53; [62 AB, 05, 30][62 C1, 05, 31]
+FC54; [62 AB, 05, 30][62 C3, 05, 33]
+
+06BE; [62 AD, 05, 05]
+FBAC; [62 AD, 05, 10]
+FBAD; [62 AD, 05, 1B]
+FBAB; [62 AD, 05, 26]
+FBAA; [62 AD, 05, 31]
+
+06C1; [62 AF, 05, 05]
+FBA8; [62 AF, 05, 10]
+FBA9; [62 AF, 05, 1B]
+FBA7; [62 AF, 05, 26]
+FBA6; [62 AF, 05, 31]
+06C2; [62 AF, 05, 05][, EC 0E, 05]
+
+06C3; [62 B1 02, 05, 05]
+
+06FF; [62 B1 0A, 05, 05]
+
+06D5; [62 B1 12, 05, 05]
+06C0; [62 B1 12, 05, 05][, EC 0E, 05]
+FBA5; [62 B1 12, 05, 20][, EC 0E, 20]
+FBA4; [62 B1 12, 05, 2E][, EC 0E, 2E]
+
+0648; [62 B3, 05, 05]
+06E5; [62 B3, 05, 10]
+1EE05; [62 B3, 05, 1B]
+1EE85; [62 B3, 05, 1B]
+1EEA5; [62 B3, 05, 1B]
+FEEE; [62 B3, 05, 26]
+FEED; [62 B3, 05, 31]
+0676; [62 B3, 05, 10][62 09, 05, 20]
+FDF8; [62 B3, 05, 31][62 69, 05, 30][62 99, 05, 30][62 9D, 05, 30]
+
+06C4; [62 B5, 05, 05]
+
+06C5; [62 B7 02, 05, 05]
+FBE1; [62 B7 02, 05, 20]
+FBE0; [62 B7 02, 05, 2E]
+
+06C6; [62 B7 0A, 05, 05]
+FBDA; [62 B7 0A, 05, 20]
+FBD9; [62 B7 0A, 05, 2E]
+
+06C7; [62 B9, 05, 05]
+FBD8; [62 B9, 05, 1E]
+FBD7; [62 B9, 05, 2C]
+0677; [62 B9, 05, 10][62 09, 05, 20]
+FBDD; [62 B9, 05, 2C][62 09, 05, 2E]
+
+06C8; [62 BB, 05, 05]
+FBDC; [62 BB, 05, 20]
+FBDB; [62 BB, 05, 2E]
+
+06C9; [62 BD, 05, 05]
+FBE3; [62 BD, 05, 20]
+FBE2; [62 BD, 05, 2E]
+
+06CA; [62 BF 02, 05, 05]
+
+06CB; [62 BF 0A, 05, 05]
+FBDF; [62 BF 0A, 05, 20]
+FBDE; [62 BF 0A, 05, 2E]
+
+06CF; [62 BF 12, 05, 05]
+
+0778; [62 BF 1A, 05, 05]
+
+0779; [62 BF 22, 05, 05]
+
+08AB; [62 BF 2A, 05, 05]
+
+0649; [62 C1, 05, 05]
+FBE8; [62 C1, 05, 10]
+FBE9; [62 C1, 05, 1B]
+FEF0; [62 C1, 05, 26]
+FEEF; [62 C1, 05, 31]
+FC90; [62 C1, 05, 26][, EE 72, 1E]
+FC5D; [62 C1, 05, 31][, EE 72, 2C]
+
+064A; [62 C3, 05, 05]
+06E6; [62 C3, 05, 10]
+1EE09; [62 C3, 05, 17]
+1EE29; [62 C3, 05, 17]
+1EE49; [62 C3, 05, 17]
+1EE69; [62 C3, 05, 17]
+1EE89; [62 C3, 05, 17]
+1EEA9; [62 C3, 05, 17]
+FEF3; [62 C3, 05, 1E]
+FEF4; [62 C3, 05, 25]
+FEF2; [62 C3, 05, 2C]
+FEF1; [62 C3, 05, 33]
+0678; [62 C3, 05, 10][62 09, 05, 20]
+FCDA; [62 C3, 05, 1E][62 37, 05, 18]
+FC55; [62 C3, 05, 33][62 37, 05, 30]
+FDAF; [62 C3, 05, 2C][62 37, 05, 28][62 C3, 05, 2C]
+FCDB; [62 C3, 05, 1E][62 3F, 05, 18]
+FC56; [62 C3, 05, 33][62 3F, 05, 30]
+FDAE; [62 C3, 05, 2C][62 3F, 05, 28][62 C3, 05, 2C]
+FCDC; [62 C3, 05, 1E][62 41, 05, 18]
+FC57; [62 C3, 05, 33][62 41, 05, 30]
+FC91; [62 C3, 05, 2C][62 55, 05, 1E]
+FC92; [62 C3, 05, 2C][62 57, 05, 1E]
+FCDD; [62 C3, 05, 1E][62 9D, 05, 18]
+FCF0; [62 C3, 05, 25][62 9D, 05, 20]
+FC93; [62 C3, 05, 2C][62 9D, 05, 28]
+FC58; [62 C3, 05, 33][62 9D, 05, 30]
+FD9D; [62 C3, 05, 1E][62 9D, 05, 18][62 9D, 05, 18]
+FD9C; [62 C3, 05, 2C][62 9D, 05, 28][62 9D, 05, 28]
+FDB0; [62 C3, 05, 2C][62 9D, 05, 28][62 C3, 05, 2C]
+FC94; [62 C3, 05, 2C][62 A1, 05, 28]
+FCDE; [62 C3, 05, 1E][62 AB, 05, 18]
+FCF1; [62 C3, 05, 25][62 AB, 05, 20]
+FC95; [62 C3, 05, 2C][62 C1, 05, 26]
+FC59; [62 C3, 05, 33][62 C1, 05, 31]
+FC96; [62 C3, 05, 2C][62 C3, 05, 2C]
+FC5A; [62 C3, 05, 33][62 C3, 05, 33]
 
-10914; [60 36 A4, 05, 05]
+06CC; [62 C5, 05, 05]
+FBFE; [62 C5, 05, 10]
+FBFF; [62 C5, 05, 1B]
+FBFD; [62 C5, 05, 26]
+FBFC; [62 C5, 05, 31]
 
-10915; [60 36 AC, 05, 05]
+06CD; [62 C7, 05, 05]
 
-0800; [60 36 B4, 05, 05]
+06CE; [62 C9, 05, 05]
 
-0801; [60 36 BC, 05, 05]
+06D0; [62 CB, 05, 05]
+FBE6; [62 CB, 05, 10]
+FBE7; [62 CB, 05, 1B]
+FBE5; [62 CB, 05, 26]
+FBE4; [62 CB, 05, 31]
 
-0802; [60 36 C4, 05, 05]
+06D1; [62 CD 02, 05, 05]
 
-0803; [60 36 CC, 05, 05]
+063D; [62 CD 0A, 05, 05]
 
-0804; [60 36 D4, 05, 05]
+063E; [62 CD 12, 05, 05]
 
-0805; [60 36 DC, 05, 05]
+063F; [62 CD 1A, 05, 05]
 
-0806; [60 36 E4, 05, 05]
+0620; [62 CD 22, 05, 05]
 
-0807; [60 36 EC, 05, 05]
+0775; [62 CD 2A, 05, 05]
 
-0808; [60 36 F4, 05, 05]
+0776; [62 CD 32, 05, 05]
 
-0809; [60 36 FC, 05, 05]
+0777; [62 CD 3A, 05, 05]
 
-080A; [60 37 0A, 05, 05]
+06D2; [62 CF, 05, 05]
+FBAF; [62 CF, 05, 20]
+FBAE; [62 CF, 05, 2E]
+06D3; [62 CF, 05, 05][, EC 0E, 05]
+FBB1; [62 CF, 05, 20][, EC 0E, 20]
+FBB0; [62 CF, 05, 2E][, EC 0E, 2E]
 
-080B; [60 37 12, 05, 05]
+077A; [62 D1 02, 05, 05]
 
-080C; [60 37 1A, 05, 05]
+077B; [62 D1 0A, 05, 05]
 
-080D; [60 37 22, 05, 05]
+FDD1 0710;     [62 D6 02, 05, 05]      # SYRIAC first primary
 
-080E; [60 37 2A, 05, 05]
+0710; [62 D6 2B, 05, 05]
 
-080F; [60 37 32, 05, 05]
+0712; [62 D6 33, 05, 05]
+072D; [62 D6 33, 70, 20]
 
-0810; [60 37 3A, 05, 05]
+0713; [62 D6 3B, 05, 05]
+0714; [62 D6 3B, 70, 20]
+072E; [62 D6 3B, 78, 20]
 
-0811; [60 37 42, 05, 05]
+0716; [62 D6 43, 05, 05]
 
-0812; [60 37 4A, 05, 05]
+0715; [62 D6 4B, 05, 05]
+072F; [62 D6 4B, 70, 20]
 
-0813; [60 37 52, 05, 05]
+0717; [62 D6 53, 05, 05]
 
-0814; [60 37 5A, 05, 05]
+0718; [62 D6 5B, 05, 05]
 
-0815; [60 37 62, 05, 05]
+0719; [62 D6 63, 05, 05]
 
-0816; [60 37 6A, 05, 05]
+074D; [62 D6 6B, 05, 05]
 
-0817; [60 37 72, 05, 05]
+071A; [62 D6 73, 05, 05]
 
-081A; [60 37 7A, 05, 05]
+071B; [62 D6 7B, 05, 05]
+071C; [62 D6 7B, 70, 20]
 
-081B; [60 37 82, 05, 05]
+071D; [62 D6 83, 05, 05]
 
-0621; [61 0A, 05, 05]
-0674; [61 0A, 05, 09]
-FE80; [61 0A, 05, 33]
-06FD; [61 0A, 05, 09][, DB B9, 09]
+071E; [62 D6 8B, 05, 05]
 
-0622; [61 0C, 05, 05]
-0627 0653; [61 0C, 05, 05]
-FE82; [61 0C, 05, 31]
-FE81; [61 0C, 05, 33]
+071F; [62 D6 93, 05, 05]
 
-0623; [61 0E, 05, 05]
-0627 0654; [61 0E, 05, 05]
-FE84; [61 0E, 05, 31]
-FE83; [61 0E, 05, 33]
+074E; [62 D6 9B, 05, 05]
 
-0672; [61 10, 05, 05]
+0720; [62 D6 A3, 05, 05]
 
-0671; [61 12, 05, 05]
-FB51; [61 12, 05, 31]
-FB50; [61 12, 05, 33]
+0721; [62 D6 AB, 05, 05]
 
-0624; [61 14, 05, 05]
-0648 0654; [61 14, 05, 05]
-FE86; [61 14, 05, 31]
-FE85; [61 14, 05, 33]
+0722; [62 D6 B3, 05, 05]
 
-0625; [61 16, 05, 05]
-0627 0655; [61 16, 05, 05]
-FE88; [61 16, 05, 31]
-FE87; [61 16, 05, 33]
+0723; [62 D6 BB, 05, 05]
+0724; [62 D6 BB, 05, 20]
 
-0673; [61 18, 05, 05]
+0725; [62 D6 C3, 05, 05]
 
-0773; [61 1A, 05, 05]
+0726; [62 D6 CB, 05, 05]
+0727; [62 D6 CB, 70, 20]
 
-0774; [61 1C, 05, 05]
-
-0626; [61 1E, 05, 05]
-064A 0654; [61 1E, 05, 05]
-FE8B; [61 1E, 05, 2D]
-FE8C; [61 1E, 05, 2F]
-FE8A; [61 1E, 05, 31]
-FE89; [61 1E, 05, 33]
-FBEB; [61 1E, 05, 31][61 26, 05, 31]
-FBEA; [61 1E, 05, 33][61 26, 05, 33]
-FC97; [61 1E, 05, 2D][61 52, 05, 2D]
-FC00; [61 1E, 05, 33][61 52, 05, 33]
-FC98; [61 1E, 05, 2D][61 60, 05, 2D]
-FC01; [61 1E, 05, 33][61 60, 05, 33]
-FC99; [61 1E, 05, 2D][61 62, 05, 2D]
-FC64; [61 1E, 05, 31][61 92, 05, 31]
-FC65; [61 1E, 05, 31][61 94, 05, 31]
-FC9A; [61 1E, 05, 2D][62 45, 05, 2D]
-FCDF; [61 1E, 05, 2F][62 45, 05, 2F]
-FC66; [61 1E, 05, 31][62 45, 05, 31]
-FC02; [61 1E, 05, 33][62 45, 05, 33]
-FC67; [61 1E, 05, 31][62 4D, 05, 31]
-FC9B; [61 1E, 05, 2D][62 5F, 05, 2D]
-FCE0; [61 1E, 05, 2F][62 5F, 05, 2F]
-FBED; [61 1E, 05, 31][62 69, 05, 31]
-FBEC; [61 1E, 05, 33][62 69, 05, 33]
-FBEF; [61 1E, 05, 31][62 6B, 05, 31]
-FBEE; [61 1E, 05, 33][62 6B, 05, 33]
-FBF3; [61 1E, 05, 31][62 71, 05, 31]
-FBF2; [61 1E, 05, 33][62 71, 05, 33]
-FBF1; [61 1E, 05, 31][62 73, 05, 31]
-FBF0; [61 1E, 05, 33][62 73, 05, 33]
-FBF5; [61 1E, 05, 31][62 75, 05, 31]
-FBF4; [61 1E, 05, 33][62 75, 05, 33]
-FBFB; [61 1E, 05, 2D][62 85, 05, 2D]
-FBFA; [61 1E, 05, 31][62 85, 05, 31]
-FC68; [61 1E, 05, 31][62 85, 05, 31]
-FBF9; [61 1E, 05, 33][62 85, 05, 33]
-FC03; [61 1E, 05, 33][62 85, 05, 33]
-FC69; [61 1E, 05, 31][62 87, 05, 31]
-FC04; [61 1E, 05, 33][62 87, 05, 33]
-FBF8; [61 1E, 05, 2D][62 8F, 05, 2D]
-FBF7; [61 1E, 05, 31][62 8F, 05, 31]
-FBF6; [61 1E, 05, 33][62 8F, 05, 33]
-
-08A8; [61 20, 05, 05]
-
-08A9; [61 22, 05, 05]
-
-08AC; [61 24, 05, 05]
-
-0627; [61 26, 05, 05]
-1EE00; [61 26, 05, 0B]
-1EE80; [61 26, 05, 0B]
-FE8E; [61 26, 05, 31]
-FE8D; [61 26, 05, 33]
-FD3C; [61 26, 05, 31][, D2 75, 31]
-FD3D; [61 26, 05, 33][, D2 75, 33]
-0675; [61 26, 05, 09][61 0A, 05, 09]
-FDF3; [61 26, 05, 33][62 11, 05, 33][61 2A, 05, 33][61 92, 05, 33]
-FDF2; [61 26, 05, 33][62 37, 05, 33][62 37, 05, 33][62 5F, 05, 33]
-
-066E; [61 28, 05, 05]
-1EE1C; [61 28, 05, 0B]
-1EE7C; [61 28, 05, 0B]
-
-0628; [61 2A, 05, 05]
-1EE01; [61 2A, 05, 0B]
-1EE21; [61 2A, 05, 0B]
-1EE61; [61 2A, 05, 0B]
-1EE81; [61 2A, 05, 0B]
-1EEA1; [61 2A, 05, 0B]
-FE91; [61 2A, 05, 2D]
-FE92; [61 2A, 05, 2F]
-FE90; [61 2A, 05, 31]
-FE8F; [61 2A, 05, 33]
-FC9C; [61 2A, 05, 2D][61 52, 05, 2D]
-FC05; [61 2A, 05, 33][61 52, 05, 33]
-FC9D; [61 2A, 05, 2D][61 60, 05, 2D]
-FC06; [61 2A, 05, 33][61 60, 05, 33]
-FDC2; [61 2A, 05, 31][61 60, 05, 31][62 87, 05, 31]
-FC9E; [61 2A, 05, 2D][61 62, 05, 2D]
-FC07; [61 2A, 05, 33][61 62, 05, 33]
-FD9E; [61 2A, 05, 31][61 62, 05, 31][62 87, 05, 31]
-FC6A; [61 2A, 05, 31][61 92, 05, 31]
-FC6B; [61 2A, 05, 31][61 94, 05, 31]
-FC9F; [61 2A, 05, 2D][62 45, 05, 2D]
-FCE1; [61 2A, 05, 2F][62 45, 05, 2F]
-FC6C; [61 2A, 05, 31][62 45, 05, 31]
-FC08; [61 2A, 05, 33][62 45, 05, 33]
-FC6D; [61 2A, 05, 31][62 4D, 05, 31]
-FCA0; [61 2A, 05, 2D][62 5F, 05, 2D]
-FCE2; [61 2A, 05, 2F][62 5F, 05, 2F]
-FC6E; [61 2A, 05, 31][62 85, 05, 31]
-FC09; [61 2A, 05, 33][62 85, 05, 33]
-FC6F; [61 2A, 05, 31][62 87, 05, 31]
-FC0A; [61 2A, 05, 33][62 87, 05, 33]
-
-067B; [61 2C, 05, 05]
-FB54; [61 2C, 05, 2D]
-FB55; [61 2C, 05, 2F]
-FB53; [61 2C, 05, 31]
-FB52; [61 2C, 05, 33]
-
-067E; [61 2E, 05, 05]
-FB58; [61 2E, 05, 2D]
-FB59; [61 2E, 05, 2F]
-FB57; [61 2E, 05, 31]
-FB56; [61 2E, 05, 33]
-
-0680; [61 30, 05, 05]
-FB5C; [61 30, 05, 2D]
-FB5D; [61 30, 05, 2F]
-FB5B; [61 30, 05, 31]
-FB5A; [61 30, 05, 33]
-
-0750; [61 32, 05, 05]
-
-0751; [61 34, 05, 05]
-
-0752; [61 36, 05, 05]
-
-0753; [61 38, 05, 05]
-
-0754; [61 3A, 05, 05]
-
-0755; [61 3C, 05, 05]
-
-08A0; [61 3E, 05, 05]
-
-0756; [61 40, 05, 05]
-
-0629; [61 42, 05, 05]
-FE94; [61 42, 05, 31]
-FE93; [61 42, 05, 33]
-
-062A; [61 44, 05, 05]
-1EE15; [61 44, 05, 0B]
-1EE35; [61 44, 05, 0B]
-1EE75; [61 44, 05, 0B]
-1EE95; [61 44, 05, 0B]
-1EEB5; [61 44, 05, 0B]
-FE97; [61 44, 05, 2D]
-FE98; [61 44, 05, 2F]
-FE96; [61 44, 05, 31]
-FE95; [61 44, 05, 33]
-FCA1; [61 44, 05, 2D][61 52, 05, 2D]
-FC0B; [61 44, 05, 33][61 52, 05, 33]
-FD50; [61 44, 05, 2D][61 52, 05, 2D][62 45, 05, 2D]
-FDA0; [61 44, 05, 31][61 52, 05, 31][62 85, 05, 31]
-FD9F; [61 44, 05, 31][61 52, 05, 31][62 87, 05, 31]
-FCA2; [61 44, 05, 2D][61 60, 05, 2D]
-FC0C; [61 44, 05, 33][61 60, 05, 33]
-FD52; [61 44, 05, 2D][61 60, 05, 2D][61 52, 05, 2D]
-FD51; [61 44, 05, 31][61 60, 05, 31][61 52, 05, 31]
-FD53; [61 44, 05, 2D][61 60, 05, 2D][62 45, 05, 2D]
-FCA3; [61 44, 05, 2D][61 62, 05, 2D]
-FC0D; [61 44, 05, 33][61 62, 05, 33]
-FD54; [61 44, 05, 2D][61 62, 05, 2D][62 45, 05, 2D]
-FDA2; [61 44, 05, 31][61 62, 05, 31][62 85, 05, 31]
-FDA1; [61 44, 05, 31][61 62, 05, 31][62 87, 05, 31]
-FC70; [61 44, 05, 31][61 92, 05, 31]
-FC71; [61 44, 05, 31][61 94, 05, 31]
-FCA4; [61 44, 05, 2D][62 45, 05, 2D]
-FCE3; [61 44, 05, 2F][62 45, 05, 2F]
-FC72; [61 44, 05, 31][62 45, 05, 31]
-FC0E; [61 44, 05, 33][62 45, 05, 33]
-FD55; [61 44, 05, 2D][62 45, 05, 2D][61 52, 05, 2D]
-FD56; [61 44, 05, 2D][62 45, 05, 2D][61 60, 05, 2D]
-FD57; [61 44, 05, 2D][62 45, 05, 2D][61 62, 05, 2D]
-FDA4; [61 44, 05, 31][62 45, 05, 31][62 85, 05, 31]
-FDA3; [61 44, 05, 31][62 45, 05, 31][62 87, 05, 31]
-FC73; [61 44, 05, 31][62 4D, 05, 31]
-FCA5; [61 44, 05, 2D][62 5F, 05, 2D]
-FCE4; [61 44, 05, 2F][62 5F, 05, 2F]
-FC74; [61 44, 05, 31][62 85, 05, 31]
-FC0F; [61 44, 05, 33][62 85, 05, 33]
-FC75; [61 44, 05, 31][62 87, 05, 31]
-FC10; [61 44, 05, 33][62 87, 05, 33]
-
-062B; [61 46, 05, 05]
-1EE16; [61 46, 05, 0B]
-1EE36; [61 46, 05, 0B]
-1EE76; [61 46, 05, 0B]
-1EE96; [61 46, 05, 0B]
-1EEB6; [61 46, 05, 0B]
-FE9B; [61 46, 05, 2D]
-FE9C; [61 46, 05, 2F]
-FE9A; [61 46, 05, 31]
-FE99; [61 46, 05, 33]
-FC11; [61 46, 05, 33][61 52, 05, 33]
-FC76; [61 46, 05, 31][61 92, 05, 31]
-FC77; [61 46, 05, 31][61 94, 05, 31]
-FCA6; [61 46, 05, 2D][62 45, 05, 2D]
-FCE5; [61 46, 05, 2F][62 45, 05, 2F]
-FC78; [61 46, 05, 31][62 45, 05, 31]
-FC12; [61 46, 05, 33][62 45, 05, 33]
-FC79; [61 46, 05, 31][62 4D, 05, 31]
-FCE6; [61 46, 05, 2F][62 5F, 05, 2F]
-FC7A; [61 46, 05, 31][62 85, 05, 31]
-FC13; [61 46, 05, 33][62 85, 05, 33]
-FC7B; [61 46, 05, 31][62 87, 05, 31]
-FC14; [61 46, 05, 33][62 87, 05, 33]
-
-0679; [61 48, 05, 05]
-FB68; [61 48, 05, 2D]
-FB69; [61 48, 05, 2F]
-FB67; [61 48, 05, 31]
-FB66; [61 48, 05, 33]
-
-067A; [61 4A, 05, 05]
-FB60; [61 4A, 05, 2D]
-FB61; [61 4A, 05, 2F]
-FB5F; [61 4A, 05, 31]
-FB5E; [61 4A, 05, 33]
-
-067C; [61 4C, 05, 05]
-
-067D; [61 4E, 05, 05]
-
-067F; [61 50, 05, 05]
-FB64; [61 50, 05, 2D]
-FB65; [61 50, 05, 2F]
-FB63; [61 50, 05, 31]
-FB62; [61 50, 05, 33]
-
-062C; [61 52, 05, 05]
-1EE02; [61 52, 05, 0B]
-1EE22; [61 52, 05, 0B]
-1EE42; [61 52, 05, 0B]
-1EE62; [61 52, 05, 0B]
-1EE82; [61 52, 05, 0B]
-1EEA2; [61 52, 05, 0B]
-FE9F; [61 52, 05, 2D]
-FEA0; [61 52, 05, 2F]
-FE9E; [61 52, 05, 31]
-FE9D; [61 52, 05, 33]
-FCA7; [61 52, 05, 2D][61 60, 05, 2D]
-FC15; [61 52, 05, 33][61 60, 05, 33]
-FDA6; [61 52, 05, 31][61 60, 05, 31][62 85, 05, 31]
-FDBE; [61 52, 05, 31][61 60, 05, 31][62 87, 05, 31]
-FDFB; [61 52, 05, 33][62 37, 05, 33][04, 05, 33][61 52, 05, 33][62 37, 05, 33][61 26, 05, 33][62 37, 05, 33][62 5F, 05, 33]
-FCA8; [61 52, 05, 2D][62 45, 05, 2D]
-FC16; [61 52, 05, 33][62 45, 05, 33]
-FD59; [61 52, 05, 2D][62 45, 05, 2D][61 60, 05, 2D]
-FD58; [61 52, 05, 31][62 45, 05, 31][61 60, 05, 31]
-FDA7; [61 52, 05, 31][62 45, 05, 31][62 85, 05, 31]
-FDA5; [61 52, 05, 31][62 45, 05, 31][62 87, 05, 31]
-FD1D; [61 52, 05, 31][62 85, 05, 31]
-FD01; [61 52, 05, 33][62 85, 05, 33]
-FD1E; [61 52, 05, 31][62 87, 05, 31]
-FD02; [61 52, 05, 33][62 87, 05, 33]
-
-0683; [61 54, 05, 05]
-FB78; [61 54, 05, 2D]
-FB79; [61 54, 05, 2F]
-FB77; [61 54, 05, 31]
-FB76; [61 54, 05, 33]
-
-0684; [61 56, 05, 05]
-FB74; [61 56, 05, 2D]
-FB75; [61 56, 05, 2F]
-FB73; [61 56, 05, 31]
-FB72; [61 56, 05, 33]
-
-0686; [61 58, 05, 05]
-FB7C; [61 58, 05, 2D]
-FB7D; [61 58, 05, 2F]
-FB7B; [61 58, 05, 31]
-FB7A; [61 58, 05, 33]
-
-06BF; [61 5A, 05, 05]
-
-0687; [61 5C, 05, 05]
-FB80; [61 5C, 05, 2D]
-FB81; [61 5C, 05, 2F]
-FB7F; [61 5C, 05, 31]
-FB7E; [61 5C, 05, 33]
-
-08A2; [61 5E, 05, 05]
-
-062D; [61 60, 05, 05]
-1EE07; [61 60, 05, 0B]
-1EE27; [61 60, 05, 0B]
-1EE47; [61 60, 05, 0B]
-1EE67; [61 60, 05, 0B]
-1EE87; [61 60, 05, 0B]
-1EEA7; [61 60, 05, 0B]
-FEA3; [61 60, 05, 2D]
-FEA4; [61 60, 05, 2F]
-FEA2; [61 60, 05, 31]
-FEA1; [61 60, 05, 33]
-FCA9; [61 60, 05, 2D][61 52, 05, 2D]
-FC17; [61 60, 05, 33][61 52, 05, 33]
-FDBF; [61 60, 05, 31][61 52, 05, 31][62 87, 05, 31]
-FCAA; [61 60, 05, 2D][62 45, 05, 2D]
-FC18; [61 60, 05, 33][62 45, 05, 33]
-FD5B; [61 60, 05, 31][62 45, 05, 31][62 85, 05, 31]
-FD5A; [61 60, 05, 31][62 45, 05, 31][62 87, 05, 31]
-FD1B; [61 60, 05, 31][62 85, 05, 31]
-FCFF; [61 60, 05, 33][62 85, 05, 33]
-FD1C; [61 60, 05, 31][62 87, 05, 31]
-FD00; [61 60, 05, 33][62 87, 05, 33]
-
-062E; [61 62, 05, 05]
-1EE17; [61 62, 05, 0B]
-1EE37; [61 62, 05, 0B]
-1EE57; [61 62, 05, 0B]
-1EE77; [61 62, 05, 0B]
-1EE97; [61 62, 05, 0B]
-1EEB7; [61 62, 05, 0B]
-FEA7; [61 62, 05, 2D]
-FEA8; [61 62, 05, 2F]
-FEA6; [61 62, 05, 31]
-FEA5; [61 62, 05, 33]
-FCAB; [61 62, 05, 2D][61 52, 05, 2D]
-FC19; [61 62, 05, 33][61 52, 05, 33]
-FC1A; [61 62, 05, 33][61 60, 05, 33]
-FCAC; [61 62, 05, 2D][62 45, 05, 2D]
-FC1B; [61 62, 05, 33][62 45, 05, 33]
-FD1F; [61 62, 05, 31][62 85, 05, 31]
-FD03; [61 62, 05, 33][62 85, 05, 33]
-FD20; [61 62, 05, 31][62 87, 05, 31]
-FD04; [61 62, 05, 33][62 87, 05, 33]
-
-0681; [61 64, 05, 05]
-
-0682; [61 66, 05, 05]
-
-0685; [61 68, 05, 05]
-
-0757; [61 6A, 05, 05]
-
-0758; [61 6C, 05, 05]
-
-076E; [61 6E, 05, 05]
-
-076F; [61 70, 05, 05]
-
-0772; [61 72, 05, 05]
-
-077C; [61 74, 05, 05]
-
-062F; [61 76, 05, 05]
-1EE03; [61 76, 05, 0B]
-1EE83; [61 76, 05, 0B]
-1EEA3; [61 76, 05, 0B]
-FEAA; [61 76, 05, 31]
-FEA9; [61 76, 05, 33]
-
-0630; [61 78, 05, 05]
-1EE18; [61 78, 05, 0B]
-1EE98; [61 78, 05, 0B]
-1EEB8; [61 78, 05, 0B]
-FEAC; [61 78, 05, 31]
-FEAB; [61 78, 05, 33]
-FC5B; [61 78, 05, 33][, D5 11, 33]
-
-0688; [61 7A, 05, 05]
-FB89; [61 7A, 05, 31]
-FB88; [61 7A, 05, 33]
-
-0689; [61 7C, 05, 05]
-
-068A; [61 7E, 05, 05]
-
-068B; [61 80, 05, 05]
-
-068C; [61 82, 05, 05]
-FB85; [61 82, 05, 31]
-FB84; [61 82, 05, 33]
-
-068D; [61 84, 05, 05]
-FB83; [61 84, 05, 31]
-FB82; [61 84, 05, 33]
-
-068E; [61 86, 05, 05]
-FB87; [61 86, 05, 31]
-FB86; [61 86, 05, 33]
-
-068F; [61 88, 05, 05]
-
-0690; [61 8A, 05, 05]
-
-06EE; [61 8C, 05, 05]
-
-0759; [61 8E, 05, 05]
-
-075A; [61 90, 05, 05]
-
-0631; [61 92, 05, 05]
-1EE13; [61 92, 05, 0B]
-1EE93; [61 92, 05, 0B]
-1EEB3; [61 92, 05, 0B]
-FEAE; [61 92, 05, 31]
-FEAD; [61 92, 05, 33]
-FC5C; [61 92, 05, 33][, D5 11, 33]
-FDF6; [61 92, 05, 33][61 B4, 05, 33][62 6B, 05, 33][62 37, 05, 33]
-
-0632; [61 94, 05, 05]
-1EE06; [61 94, 05, 0B]
-1EE86; [61 94, 05, 0B]
-1EEA6; [61 94, 05, 0B]
-FEB0; [61 94, 05, 31]
-FEAF; [61 94, 05, 33]
-
-0691; [61 96, 05, 05]
-FB8D; [61 96, 05, 31]
-FB8C; [61 96, 05, 33]
-
-0692; [61 98, 05, 05]
-
-0693; [61 9A, 05, 05]
-
-0694; [61 9C, 05, 05]
-
-0695; [61 9E, 05, 05]
-
-0696; [61 A0, 05, 05]
-
-0697; [61 A2, 05, 05]
-
-0698; [61 A4, 05, 05]
-FB8B; [61 A4, 05, 31]
-FB8A; [61 A4, 05, 33]
-
-0699; [61 A6, 05, 05]
-
-06EF; [61 A8, 05, 05]
-
-075B; [61 AA, 05, 05]
-
-076B; [61 AC, 05, 05]
-
-076C; [61 AE, 05, 05]
-
-0771; [61 B0, 05, 05]
-
-08AA; [61 B2, 05, 05]
-
-0633; [61 B4, 05, 05]
-1EE0E; [61 B4, 05, 0B]
-1EE2E; [61 B4, 05, 0B]
-1EE4E; [61 B4, 05, 0B]
-1EE6E; [61 B4, 05, 0B]
-1EE8E; [61 B4, 05, 0B]
-1EEAE; [61 B4, 05, 0B]
-FEB3; [61 B4, 05, 2D]
-FEB4; [61 B4, 05, 2F]
-FEB2; [61 B4, 05, 31]
-FEB1; [61 B4, 05, 33]
-FCAD; [61 B4, 05, 2D][61 52, 05, 2D]
-FD34; [61 B4, 05, 2F][61 52, 05, 2F]
-FC1C; [61 B4, 05, 33][61 52, 05, 33]
-FD5D; [61 B4, 05, 2D][61 52, 05, 2D][61 60, 05, 2D]
-FD5E; [61 B4, 05, 31][61 52, 05, 31][62 85, 05, 31]
-FCAE; [61 B4, 05, 2D][61 60, 05, 2D]
-FD35; [61 B4, 05, 2F][61 60, 05, 2F]
-FC1D; [61 B4, 05, 33][61 60, 05, 33]
-FD5C; [61 B4, 05, 2D][61 60, 05, 2D][61 52, 05, 2D]
-FCAF; [61 B4, 05, 2D][61 62, 05, 2D]
-FD36; [61 B4, 05, 2F][61 62, 05, 2F]
-FC1E; [61 B4, 05, 33][61 62, 05, 33]
-FDA8; [61 B4, 05, 31][61 62, 05, 31][62 85, 05, 31]
-FDC6; [61 B4, 05, 31][61 62, 05, 31][62 87, 05, 31]
-FD2A; [61 B4, 05, 31][61 92, 05, 31]
-FD0E; [61 B4, 05, 33][61 92, 05, 33]
-FCB0; [61 B4, 05, 2D][62 45, 05, 2D]
-FCE7; [61 B4, 05, 2F][62 45, 05, 2F]
-FC1F; [61 B4, 05, 33][62 45, 05, 33]
-FD61; [61 B4, 05, 2D][62 45, 05, 2D][61 52, 05, 2D]
-FD60; [61 B4, 05, 2D][62 45, 05, 2D][61 60, 05, 2D]
-FD5F; [61 B4, 05, 31][62 45, 05, 31][61 60, 05, 31]
-FD63; [61 B4, 05, 2D][62 45, 05, 2D][62 45, 05, 2D]
-FD62; [61 B4, 05, 31][62 45, 05, 31][62 45, 05, 31]
-FD31; [61 B4, 05, 2D][62 5F, 05, 2D]
-FCE8; [61 B4, 05, 2F][62 5F, 05, 2F]
-FD17; [61 B4, 05, 31][62 85, 05, 31]
-FCFB; [61 B4, 05, 33][62 85, 05, 33]
-FD18; [61 B4, 05, 31][62 87, 05, 31]
-FCFC; [61 B4, 05, 33][62 87, 05, 33]
-
-0634; [61 B6, 05, 05]
-1EE14; [61 B6, 05, 0B]
-1EE34; [61 B6, 05, 0B]
-1EE54; [61 B6, 05, 0B]
-1EE74; [61 B6, 05, 0B]
-1EE94; [61 B6, 05, 0B]
-1EEB4; [61 B6, 05, 0B]
-FEB7; [61 B6, 05, 2D]
-FEB8; [61 B6, 05, 2F]
-FEB6; [61 B6, 05, 31]
-FEB5; [61 B6, 05, 33]
-FD2D; [61 B6, 05, 2D][61 52, 05, 2D]
-FD37; [61 B6, 05, 2F][61 52, 05, 2F]
-FD25; [61 B6, 05, 31][61 52, 05, 31]
-FD09; [61 B6, 05, 33][61 52, 05, 33]
-FD69; [61 B6, 05, 31][61 52, 05, 31][62 87, 05, 31]
-FD2E; [61 B6, 05, 2D][61 60, 05, 2D]
-FD38; [61 B6, 05, 2F][61 60, 05, 2F]
-FD26; [61 B6, 05, 31][61 60, 05, 31]
-FD0A; [61 B6, 05, 33][61 60, 05, 33]
-FD68; [61 B6, 05, 2D][61 60, 05, 2D][62 45, 05, 2D]
-FD67; [61 B6, 05, 31][61 60, 05, 31][62 45, 05, 31]
-FDAA; [61 B6, 05, 31][61 60, 05, 31][62 87, 05, 31]
-FD2F; [61 B6, 05, 2D][61 62, 05, 2D]
-FD39; [61 B6, 05, 2F][61 62, 05, 2F]
-FD27; [61 B6, 05, 31][61 62, 05, 31]
-FD0B; [61 B6, 05, 33][61 62, 05, 33]
-FD29; [61 B6, 05, 31][61 92, 05, 31]
-FD0D; [61 B6, 05, 33][61 92, 05, 33]
-FD30; [61 B6, 05, 2D][62 45, 05, 2D]
-FCE9; [61 B6, 05, 2F][62 45, 05, 2F]
-FD28; [61 B6, 05, 31][62 45, 05, 31]
-FD0C; [61 B6, 05, 33][62 45, 05, 33]
-FD6B; [61 B6, 05, 2D][62 45, 05, 2D][61 62, 05, 2D]
-FD6A; [61 B6, 05, 31][62 45, 05, 31][61 62, 05, 31]
-FD6D; [61 B6, 05, 2D][62 45, 05, 2D][62 45, 05, 2D]
-FD6C; [61 B6, 05, 31][62 45, 05, 31][62 45, 05, 31]
-FD32; [61 B6, 05, 2D][62 5F, 05, 2D]
-FCEA; [61 B6, 05, 2F][62 5F, 05, 2F]
-FD19; [61 B6, 05, 31][62 85, 05, 31]
-FCFD; [61 B6, 05, 33][62 85, 05, 33]
-FD1A; [61 B6, 05, 31][62 87, 05, 31]
-FCFE; [61 B6, 05, 33][62 87, 05, 33]
-
-069A; [61 B8, 05, 05]
-
-069B; [61 BA, 05, 05]
-
-069C; [61 BC, 05, 05]
-
-06FA; [61 BE, 05, 05]
-
-075C; [61 C0, 05, 05]
-
-076D; [61 C2, 05, 05]
-
-0770; [61 C4, 05, 05]
-
-077D; [61 C6, 05, 05]
-
-077E; [61 C8, 05, 05]
-
-0635; [61 CA, 05, 05]
-1EE11; [61 CA, 05, 0B]
-1EE31; [61 CA, 05, 0B]
-1EE51; [61 CA, 05, 0B]
-1EE71; [61 CA, 05, 0B]
-1EE91; [61 CA, 05, 0B]
-1EEB1; [61 CA, 05, 0B]
-FEBB; [61 CA, 05, 2D]
-FEBC; [61 CA, 05, 2F]
-FEBA; [61 CA, 05, 31]
-FEB9; [61 CA, 05, 33]
-FCB1; [61 CA, 05, 2D][61 60, 05, 2D]
-FC20; [61 CA, 05, 33][61 60, 05, 33]
-FD65; [61 CA, 05, 2D][61 60, 05, 2D][61 60, 05, 2D]
-FD64; [61 CA, 05, 31][61 60, 05, 31][61 60, 05, 31]
-FDA9; [61 CA, 05, 31][61 60, 05, 31][62 87, 05, 31]
-FCB2; [61 CA, 05, 2D][61 62, 05, 2D]
-FD2B; [61 CA, 05, 31][61 92, 05, 31]
-FD0F; [61 CA, 05, 33][61 92, 05, 33]
-FDF5; [61 CA, 05, 33][62 37, 05, 33][61 DC, 05, 33][62 45, 05, 33]
-FDF9; [61 CA, 05, 33][62 37, 05, 33][62 85, 05, 33]
-FDFA; [61 CA, 05, 33][62 37, 05, 33][62 85, 05, 33][04, 05, 33][61 26, 05, 33][62 37, 05, 33][62 37, 05, 33][62 5F, 05, 33][04, 05, 33][61 DC, 05, 33][62 37, 05, 33][62 87, 05, 33][62 5F, 05, 33][04, 05, 33][62 6B, 05, 33][61 B4, 05, 33][62 37, 05, 33][62 45, 05, 33]
-FDF0; [61 CA, 05, 33][62 37, 05, 33][62 A1, 05, 33]
-FCB3; [61 CA, 05, 2D][62 45, 05, 2D]
-FC21; [61 CA, 05, 33][62 45, 05, 33]
-FDC5; [61 CA, 05, 2D][62 45, 05, 2D][62 45, 05, 2D]
-FD66; [61 CA, 05, 31][62 45, 05, 31][62 45, 05, 31]
-FD21; [61 CA, 05, 31][62 85, 05, 31]
-FD05; [61 CA, 05, 33][62 85, 05, 33]
-FD22; [61 CA, 05, 31][62 87, 05, 31]
-FD06; [61 CA, 05, 33][62 87, 05, 33]
-
-0636; [61 CC, 05, 05]
-1EE19; [61 CC, 05, 0B]
-1EE39; [61 CC, 05, 0B]
-1EE59; [61 CC, 05, 0B]
-1EE79; [61 CC, 05, 0B]
-1EE99; [61 CC, 05, 0B]
-1EEB9; [61 CC, 05, 0B]
-FEBF; [61 CC, 05, 2D]
-FEC0; [61 CC, 05, 2F]
-FEBE; [61 CC, 05, 31]
-FEBD; [61 CC, 05, 33]
-FCB4; [61 CC, 05, 2D][61 52, 05, 2D]
-FC22; [61 CC, 05, 33][61 52, 05, 33]
-FCB5; [61 CC, 05, 2D][61 60, 05, 2D]
-FC23; [61 CC, 05, 33][61 60, 05, 33]
-FD6E; [61 CC, 05, 31][61 60, 05, 31][62 85, 05, 31]
-FDAB; [61 CC, 05, 31][61 60, 05, 31][62 87, 05, 31]
-FCB6; [61 CC, 05, 2D][61 62, 05, 2D]
-FC24; [61 CC, 05, 33][61 62, 05, 33]
-FD70; [61 CC, 05, 2D][61 62, 05, 2D][62 45, 05, 2D]
-FD6F; [61 CC, 05, 31][61 62, 05, 31][62 45, 05, 31]
-FD2C; [61 CC, 05, 31][61 92, 05, 31]
-FD10; [61 CC, 05, 33][61 92, 05, 33]
-FCB7; [61 CC, 05, 2D][62 45, 05, 2D]
-FC25; [61 CC, 05, 33][62 45, 05, 33]
-FD23; [61 CC, 05, 31][62 85, 05, 31]
-FD07; [61 CC, 05, 33][62 85, 05, 33]
-FD24; [61 CC, 05, 31][62 87, 05, 31]
-FD08; [61 CC, 05, 33][62 87, 05, 33]
-
-069D; [61 CE, 05, 05]
-
-069E; [61 D0, 05, 05]
-
-06FB; [61 D2, 05, 05]
-
-0637; [61 D4, 05, 05]
-1EE08; [61 D4, 05, 0B]
-1EE68; [61 D4, 05, 0B]
-1EE88; [61 D4, 05, 0B]
-1EEA8; [61 D4, 05, 0B]
-FEC3; [61 D4, 05, 2D]
-FEC4; [61 D4, 05, 2F]
-FEC2; [61 D4, 05, 31]
-FEC1; [61 D4, 05, 33]
-FCB8; [61 D4, 05, 2D][61 60, 05, 2D]
-FC26; [61 D4, 05, 33][61 60, 05, 33]
-FD33; [61 D4, 05, 2D][62 45, 05, 2D]
-FD3A; [61 D4, 05, 2F][62 45, 05, 2F]
-FC27; [61 D4, 05, 33][62 45, 05, 33]
-FD72; [61 D4, 05, 2D][62 45, 05, 2D][61 60, 05, 2D]
-FD71; [61 D4, 05, 31][62 45, 05, 31][61 60, 05, 31]
-FD73; [61 D4, 05, 2D][62 45, 05, 2D][62 45, 05, 2D]
-FD74; [61 D4, 05, 31][62 45, 05, 31][62 87, 05, 31]
-FD11; [61 D4, 05, 31][62 85, 05, 31]
-FCF5; [61 D4, 05, 33][62 85, 05, 33]
-FD12; [61 D4, 05, 31][62 87, 05, 31]
-FCF6; [61 D4, 05, 33][62 87, 05, 33]
-
-0638; [61 D6, 05, 05]
-1EE1A; [61 D6, 05, 0B]
-1EE7A; [61 D6, 05, 0B]
-1EE9A; [61 D6, 05, 0B]
-1EEBA; [61 D6, 05, 0B]
-FEC7; [61 D6, 05, 2D]
-FEC8; [61 D6, 05, 2F]
-FEC6; [61 D6, 05, 31]
-FEC5; [61 D6, 05, 33]
-FCB9; [61 D6, 05, 2D][62 45, 05, 2D]
-FD3B; [61 D6, 05, 2F][62 45, 05, 2F]
-FC28; [61 D6, 05, 33][62 45, 05, 33]
-
-069F; [61 D8, 05, 05]
-
-08A3; [61 DA, 05, 05]
-
-0639; [61 DC, 05, 05]
-1EE0F; [61 DC, 05, 0B]
-1EE2F; [61 DC, 05, 0B]
-1EE4F; [61 DC, 05, 0B]
-1EE6F; [61 DC, 05, 0B]
-1EE8F; [61 DC, 05, 0B]
-1EEAF; [61 DC, 05, 0B]
-FECB; [61 DC, 05, 2D]
-FECC; [61 DC, 05, 2F]
-FECA; [61 DC, 05, 31]
-FEC9; [61 DC, 05, 33]
-FCBA; [61 DC, 05, 2D][61 52, 05, 2D]
-FC29; [61 DC, 05, 33][61 52, 05, 33]
-FDC4; [61 DC, 05, 2D][61 52, 05, 2D][62 45, 05, 2D]
-FD75; [61 DC, 05, 31][61 52, 05, 31][62 45, 05, 31]
-FDF7; [61 DC, 05, 33][62 37, 05, 33][62 87, 05, 33][62 5F, 05, 33]
-FCBB; [61 DC, 05, 2D][62 45, 05, 2D]
-FC2A; [61 DC, 05, 33][62 45, 05, 33]
-FD77; [61 DC, 05, 2D][62 45, 05, 2D][62 45, 05, 2D]
-FD76; [61 DC, 05, 31][62 45, 05, 31][62 45, 05, 31]
-FD78; [61 DC, 05, 31][62 45, 05, 31][62 85, 05, 31]
-FDB6; [61 DC, 05, 31][62 45, 05, 31][62 87, 05, 31]
-FD13; [61 DC, 05, 31][62 85, 05, 31]
-FCF7; [61 DC, 05, 33][62 85, 05, 33]
-FD14; [61 DC, 05, 31][62 87, 05, 31]
-FCF8; [61 DC, 05, 33][62 87, 05, 33]
-
-063A; [61 DE, 05, 05]
-1EE1B; [61 DE, 05, 0B]
-1EE3B; [61 DE, 05, 0B]
-1EE5B; [61 DE, 05, 0B]
-1EE7B; [61 DE, 05, 0B]
-1EE9B; [61 DE, 05, 0B]
-1EEBB; [61 DE, 05, 0B]
-FECF; [61 DE, 05, 2D]
-FED0; [61 DE, 05, 2F]
-FECE; [61 DE, 05, 31]
-FECD; [61 DE, 05, 33]
-FCBC; [61 DE, 05, 2D][61 52, 05, 2D]
-FC2B; [61 DE, 05, 33][61 52, 05, 33]
-FCBD; [61 DE, 05, 2D][62 45, 05, 2D]
-FC2C; [61 DE, 05, 33][62 45, 05, 33]
-FD79; [61 DE, 05, 31][62 45, 05, 31][62 45, 05, 31]
-FD7B; [61 DE, 05, 31][62 45, 05, 31][62 85, 05, 31]
-FD7A; [61 DE, 05, 31][62 45, 05, 31][62 87, 05, 31]
-FD15; [61 DE, 05, 31][62 85, 05, 31]
-FCF9; [61 DE, 05, 33][62 85, 05, 33]
-FD16; [61 DE, 05, 31][62 87, 05, 31]
-FCFA; [61 DE, 05, 33][62 87, 05, 33]
-
-06A0; [61 E0, 05, 05]
-
-06FC; [61 E2, 05, 05]
-
-075D; [61 E4, 05, 05]
-
-075E; [61 E6, 05, 05]
-
-075F; [61 E8, 05, 05]
-
-0641; [61 EA, 05, 05]
-1EE10; [61 EA, 05, 0B]
-1EE30; [61 EA, 05, 0B]
-1EE70; [61 EA, 05, 0B]
-1EE90; [61 EA, 05, 0B]
-1EEB0; [61 EA, 05, 0B]
-FED3; [61 EA, 05, 2D]
-FED4; [61 EA, 05, 2F]
-FED2; [61 EA, 05, 31]
-FED1; [61 EA, 05, 33]
-FCBE; [61 EA, 05, 2D][61 52, 05, 2D]
-FC2D; [61 EA, 05, 33][61 52, 05, 33]
-FCBF; [61 EA, 05, 2D][61 60, 05, 2D]
-FC2E; [61 EA, 05, 33][61 60, 05, 33]
-FCC0; [61 EA, 05, 2D][61 62, 05, 2D]
-FC2F; [61 EA, 05, 33][61 62, 05, 33]
-FD7D; [61 EA, 05, 2D][61 62, 05, 2D][62 45, 05, 2D]
-FD7C; [61 EA, 05, 31][61 62, 05, 31][62 45, 05, 31]
-FCC1; [61 EA, 05, 2D][62 45, 05, 2D]
-FC30; [61 EA, 05, 33][62 45, 05, 33]
-FDC1; [61 EA, 05, 31][62 45, 05, 31][62 87, 05, 31]
-FC7C; [61 EA, 05, 31][62 85, 05, 31]
-FC31; [61 EA, 05, 33][62 85, 05, 33]
-FC7D; [61 EA, 05, 31][62 87, 05, 31]
-FC32; [61 EA, 05, 33][62 87, 05, 33]
-
-06A1; [61 EC, 05, 05]
-1EE1E; [61 EC, 05, 0B]
-1EE7E; [61 EC, 05, 0B]
-
-06A2; [61 EE, 05, 05]
-
-06A3; [61 F0, 05, 05]
-
-06A4; [61 F2, 05, 05]
-FB6C; [61 F2, 05, 2D]
-FB6D; [61 F2, 05, 2F]
-FB6B; [61 F2, 05, 31]
-FB6A; [61 F2, 05, 33]
-
-08A4; [61 F4, 05, 05]
-
-06A5; [61 F6, 05, 05]
-
-06A6; [61 F8, 05, 05]
-FB70; [61 F8, 05, 2D]
-FB71; [61 F8, 05, 2F]
-FB6F; [61 F8, 05, 31]
-FB6E; [61 F8, 05, 33]
-
-0760; [61 FA, 05, 05]
-
-0761; [62 05, 05, 05]
-
-066F; [62 07, 05, 05]
-1EE1F; [62 07, 05, 0B]
-1EE5F; [62 07, 05, 0B]
-
-0642; [62 09, 05, 05]
-1EE12; [62 09, 05, 0B]
-1EE32; [62 09, 05, 0B]
-1EE52; [62 09, 05, 0B]
-1EE72; [62 09, 05, 0B]
-1EE92; [62 09, 05, 0B]
-1EEB2; [62 09, 05, 0B]
-FED7; [62 09, 05, 2D]
-FED8; [62 09, 05, 2F]
-FED6; [62 09, 05, 31]
-FED5; [62 09, 05, 33]
-FCC2; [62 09, 05, 2D][61 60, 05, 2D]
-FC33; [62 09, 05, 33][61 60, 05, 33]
-FDF1; [62 09, 05, 33][62 37, 05, 33][62 A1, 05, 33]
-FCC3; [62 09, 05, 2D][62 45, 05, 2D]
-FC34; [62 09, 05, 33][62 45, 05, 33]
-FDB4; [62 09, 05, 2D][62 45, 05, 2D][61 60, 05, 2D]
-FD7E; [62 09, 05, 31][62 45, 05, 31][61 60, 05, 31]
-FD7F; [62 09, 05, 31][62 45, 05, 31][62 45, 05, 31]
-FDB2; [62 09, 05, 31][62 45, 05, 31][62 87, 05, 31]
-FC7E; [62 09, 05, 31][62 85, 05, 31]
-FC35; [62 09, 05, 33][62 85, 05, 33]
-FC7F; [62 09, 05, 31][62 87, 05, 31]
-FC36; [62 09, 05, 33][62 87, 05, 33]
-
-06A7; [62 0B, 05, 05]
-
-06A8; [62 0D, 05, 05]
-
-08A5; [62 0F, 05, 05]
-
-0643; [62 11, 05, 05]
-1EE0A; [62 11, 05, 0B]
-1EE2A; [62 11, 05, 0B]
-1EE6A; [62 11, 05, 0B]
-FEDB; [62 11, 05, 2D]
-FEDC; [62 11, 05, 2F]
-FEDA; [62 11, 05, 31]
-FED9; [62 11, 05, 33]
-FC80; [62 11, 05, 31][61 26, 05, 31]
-FC37; [62 11, 05, 33][61 26, 05, 33]
-FCC4; [62 11, 05, 2D][61 52, 05, 2D]
-FC38; [62 11, 05, 33][61 52, 05, 33]
-FCC5; [62 11, 05, 2D][61 60, 05, 2D]
-FC39; [62 11, 05, 33][61 60, 05, 33]
-FCC6; [62 11, 05, 2D][61 62, 05, 2D]
-FC3A; [62 11, 05, 33][61 62, 05, 33]
-FCC7; [62 11, 05, 2D][62 37, 05, 2D]
-FCEB; [62 11, 05, 2F][62 37, 05, 2F]
-FC81; [62 11, 05, 31][62 37, 05, 31]
-FC3B; [62 11, 05, 33][62 37, 05, 33]
-FCC8; [62 11, 05, 2D][62 45, 05, 2D]
-FCEC; [62 11, 05, 2F][62 45, 05, 2F]
-FC82; [62 11, 05, 31][62 45, 05, 31]
-FC3C; [62 11, 05, 33][62 45, 05, 33]
-FDC3; [62 11, 05, 2D][62 45, 05, 2D][62 45, 05, 2D]
-FDBB; [62 11, 05, 31][62 45, 05, 31][62 45, 05, 31]
-FDB7; [62 11, 05, 31][62 45, 05, 31][62 87, 05, 31]
-FC83; [62 11, 05, 31][62 85, 05, 31]
-FC3D; [62 11, 05, 33][62 85, 05, 33]
-FC84; [62 11, 05, 31][62 87, 05, 31]
-FC3E; [62 11, 05, 33][62 87, 05, 33]
-
-06A9; [62 13, 05, 05]
-FB90; [62 13, 05, 2D]
-FB91; [62 13, 05, 2F]
-FB8F; [62 13, 05, 31]
-FB8E; [62 13, 05, 33]
-
-06AA; [62 15, 05, 05]
-
-06AB; [62 17, 05, 05]
-
-06AC; [62 19, 05, 05]
-
-077F; [62 1B, 05, 05]
-
-06AD; [62 1D, 05, 05]
-FBD5; [62 1D, 05, 2D]
-FBD6; [62 1D, 05, 2F]
-FBD4; [62 1D, 05, 31]
-FBD3; [62 1D, 05, 33]
-
-06AE; [62 1F, 05, 05]
-
-06AF; [62 21, 05, 05]
-FB94; [62 21, 05, 2D]
-FB95; [62 21, 05, 2F]
-FB93; [62 21, 05, 31]
-FB92; [62 21, 05, 33]
-
-06B0; [62 23, 05, 05]
-
-06B1; [62 25, 05, 05]
-FB9C; [62 25, 05, 2D]
-FB9D; [62 25, 05, 2F]
-FB9B; [62 25, 05, 31]
-FB9A; [62 25, 05, 33]
-
-06B2; [62 27, 05, 05]
-
-06B3; [62 29, 05, 05]
-FB98; [62 29, 05, 2D]
-FB99; [62 29, 05, 2F]
-FB97; [62 29, 05, 31]
-FB96; [62 29, 05, 33]
-
-06B4; [62 2B, 05, 05]
-
-0762; [62 2D, 05, 05]
-
-063B; [62 2F, 05, 05]
-
-063C; [62 31, 05, 05]
-
-0763; [62 33, 05, 05]
-
-0764; [62 35, 05, 05]
-
-0644; [62 37, 05, 05]
-1EE0B; [62 37, 05, 0B]
-1EE2B; [62 37, 05, 0B]
-1EE4B; [62 37, 05, 0B]
-1EE8B; [62 37, 05, 0B]
-1EEAB; [62 37, 05, 0B]
-FEDF; [62 37, 05, 2D]
-FEE0; [62 37, 05, 2F]
-FEDE; [62 37, 05, 31]
-FEDD; [62 37, 05, 33]
-FEF6; [62 37, 05, 31][61 0C, 05, 31]
-FEF5; [62 37, 05, 33][61 0C, 05, 33]
-FEF8; [62 37, 05, 31][61 0E, 05, 31]
-FEF7; [62 37, 05, 33][61 0E, 05, 33]
-FEFA; [62 37, 05, 31][61 16, 05, 31]
-FEF9; [62 37, 05, 33][61 16, 05, 33]
-FEFC; [62 37, 05, 31][61 26, 05, 31]
-FEFB; [62 37, 05, 33][61 26, 05, 33]
-FCC9; [62 37, 05, 2D][61 52, 05, 2D]
-FC3F; [62 37, 05, 33][61 52, 05, 33]
-FD83; [62 37, 05, 2D][61 52, 05, 2D][61 52, 05, 2D]
-FD84; [62 37, 05, 31][61 52, 05, 31][61 52, 05, 31]
-FDBA; [62 37, 05, 2D][61 52, 05, 2D][62 45, 05, 2D]
-FDBC; [62 37, 05, 31][61 52, 05, 31][62 45, 05, 31]
-FDAC; [62 37, 05, 31][61 52, 05, 31][62 87, 05, 31]
-FCCA; [62 37, 05, 2D][61 60, 05, 2D]
-FC40; [62 37, 05, 33][61 60, 05, 33]
-FDB5; [62 37, 05, 2D][61 60, 05, 2D][62 45, 05, 2D]
-FD80; [62 37, 05, 31][61 60, 05, 31][62 45, 05, 31]
-FD82; [62 37, 05, 31][61 60, 05, 31][62 85, 05, 31]
-FD81; [62 37, 05, 31][61 60, 05, 31][62 87, 05, 31]
-FCCB; [62 37, 05, 2D][61 62, 05, 2D]
-FC41; [62 37, 05, 33][61 62, 05, 33]
-FD86; [62 37, 05, 2D][61 62, 05, 2D][62 45, 05, 2D]
-FD85; [62 37, 05, 31][61 62, 05, 31][62 45, 05, 31]
-FCCC; [62 37, 05, 2D][62 45, 05, 2D]
-FCED; [62 37, 05, 2F][62 45, 05, 2F]
-FC85; [62 37, 05, 31][62 45, 05, 31]
-FC42; [62 37, 05, 33][62 45, 05, 33]
-FD88; [62 37, 05, 2D][62 45, 05, 2D][61 60, 05, 2D]
-FD87; [62 37, 05, 31][62 45, 05, 31][61 60, 05, 31]
-FDAD; [62 37, 05, 31][62 45, 05, 31][62 87, 05, 31]
-FCCD; [62 37, 05, 2D][62 5F, 05, 2D]
-FC86; [62 37, 05, 31][62 85, 05, 31]
-FC43; [62 37, 05, 33][62 85, 05, 33]
-FC87; [62 37, 05, 31][62 87, 05, 31]
-FC44; [62 37, 05, 33][62 87, 05, 33]
-
-06B5; [62 39, 05, 05]
-
-06B6; [62 3B, 05, 05]
-
-06B7; [62 3D, 05, 05]
-
-06B8; [62 3F, 05, 05]
-
-076A; [62 41, 05, 05]
-
-08A6; [62 43, 05, 05]
-
-0645; [62 45, 05, 05]
-1EE0C; [62 45, 05, 0B]
-1EE2C; [62 45, 05, 0B]
-1EE6C; [62 45, 05, 0B]
-1EE8C; [62 45, 05, 0B]
-1EEAC; [62 45, 05, 0B]
-FEE3; [62 45, 05, 2D]
-FEE4; [62 45, 05, 2F]
-FEE2; [62 45, 05, 31]
-FEE1; [62 45, 05, 33]
-06FE; [62 45, 05, 09][, DB B9, 09]
-FC88; [62 45, 05, 31][61 26, 05, 31]
-FCCE; [62 45, 05, 2D][61 52, 05, 2D]
-FC45; [62 45, 05, 33][61 52, 05, 33]
-FD8C; [62 45, 05, 2D][61 52, 05, 2D][61 60, 05, 2D]
-FD92; [62 45, 05, 2D][61 52, 05, 2D][61 62, 05, 2D]
-FD8D; [62 45, 05, 2D][61 52, 05, 2D][62 45, 05, 2D]
-FDC0; [62 45, 05, 31][61 52, 05, 31][62 87, 05, 31]
-FCCF; [62 45, 05, 2D][61 60, 05, 2D]
-FC46; [62 45, 05, 33][61 60, 05, 33]
-FD89; [62 45, 05, 2D][61 60, 05, 2D][61 52, 05, 2D]
-FD8A; [62 45, 05, 2D][61 60, 05, 2D][62 45, 05, 2D]
-FDF4; [62 45, 05, 33][61 60, 05, 33][62 45, 05, 33][61 76, 05, 33]
-FD8B; [62 45, 05, 31][61 60, 05, 31][62 87, 05, 31]
-FCD0; [62 45, 05, 2D][61 62, 05, 2D]
-FC47; [62 45, 05, 33][61 62, 05, 33]
-FD8E; [62 45, 05, 2D][61 62, 05, 2D][61 52, 05, 2D]
-FD8F; [62 45, 05, 2D][61 62, 05, 2D][62 45, 05, 2D]
-FDB9; [62 45, 05, 31][61 62, 05, 31][62 87, 05, 31]
-FCD1; [62 45, 05, 2D][62 45, 05, 2D]
-FC89; [62 45, 05, 31][62 45, 05, 31]
-FC48; [62 45, 05, 33][62 45, 05, 33]
-FDB1; [62 45, 05, 31][62 45, 05, 31][62 87, 05, 31]
-FC49; [62 45, 05, 33][62 85, 05, 33]
-FC4A; [62 45, 05, 33][62 87, 05, 33]
-
-0765; [62 47, 05, 05]
-
-0766; [62 49, 05, 05]
-
-08A7; [62 4B, 05, 05]
-
-0646; [62 4D, 05, 05]
-1EE0D; [62 4D, 05, 0B]
-1EE2D; [62 4D, 05, 0B]
-1EE4D; [62 4D, 05, 0B]
-1EE6D; [62 4D, 05, 0B]
-1EE8D; [62 4D, 05, 0B]
-1EEAD; [62 4D, 05, 0B]
-FEE7; [62 4D, 05, 2D]
-FEE8; [62 4D, 05, 2F]
-FEE6; [62 4D, 05, 31]
-FEE5; [62 4D, 05, 33]
-FCD2; [62 4D, 05, 2D][61 52, 05, 2D]
-FC4B; [62 4D, 05, 33][61 52, 05, 33]
-FDB8; [62 4D, 05, 2D][61 52, 05, 2D][61 60, 05, 2D]
-FDBD; [62 4D, 05, 31][61 52, 05, 31][61 60, 05, 31]
-FD98; [62 4D, 05, 2D][61 52, 05, 2D][62 45, 05, 2D]
-FD97; [62 4D, 05, 31][61 52, 05, 31][62 45, 05, 31]
-FD99; [62 4D, 05, 31][61 52, 05, 31][62 85, 05, 31]
-FDC7; [62 4D, 05, 31][61 52, 05, 31][62 87, 05, 31]
-FCD3; [62 4D, 05, 2D][61 60, 05, 2D]
-FC4C; [62 4D, 05, 33][61 60, 05, 33]
-FD95; [62 4D, 05, 2D][61 60, 05, 2D][62 45, 05, 2D]
-FD96; [62 4D, 05, 31][61 60, 05, 31][62 85, 05, 31]
-FDB3; [62 4D, 05, 31][61 60, 05, 31][62 87, 05, 31]
-FCD4; [62 4D, 05, 2D][61 62, 05, 2D]
-FC4D; [62 4D, 05, 33][61 62, 05, 33]
-FC8A; [62 4D, 05, 31][61 92, 05, 31]
-FC8B; [62 4D, 05, 31][61 94, 05, 31]
-FCD5; [62 4D, 05, 2D][62 45, 05, 2D]
-FCEE; [62 4D, 05, 2F][62 45, 05, 2F]
-FC8C; [62 4D, 05, 31][62 45, 05, 31]
-FC4E; [62 4D, 05, 33][62 45, 05, 33]
-FD9B; [62 4D, 05, 31][62 45, 05, 31][62 85, 05, 31]
-FD9A; [62 4D, 05, 31][62 45, 05, 31][62 87, 05, 31]
-FC8D; [62 4D, 05, 31][62 4D, 05, 31]
-FCD6; [62 4D, 05, 2D][62 5F, 05, 2D]
-FCEF; [62 4D, 05, 2F][62 5F, 05, 2F]
-FC8E; [62 4D, 05, 31][62 85, 05, 31]
-FC4F; [62 4D, 05, 33][62 85, 05, 33]
-FC8F; [62 4D, 05, 31][62 87, 05, 31]
-FC50; [62 4D, 05, 33][62 87, 05, 33]
-
-06BA; [62 4F, 05, 05]
-1EE1D; [62 4F, 05, 0B]
-1EE5D; [62 4F, 05, 0B]
-FB9F; [62 4F, 05, 31]
-FB9E; [62 4F, 05, 33]
-
-06BB; [62 51, 05, 05]
-FBA2; [62 51, 05, 2D]
-FBA3; [62 51, 05, 2F]
-FBA1; [62 51, 05, 31]
-FBA0; [62 51, 05, 33]
-
-06BC; [62 53, 05, 05]
-
-06BD; [62 55, 05, 05]
-
-06B9; [62 57, 05, 05]
-
-0767; [62 59, 05, 05]
-
-0768; [62 5B, 05, 05]
-
-0769; [62 5D, 05, 05]
-
-0647; [62 5F, 05, 05]
-1EE24; [62 5F, 05, 0B]
-1EE64; [62 5F, 05, 0B]
-1EE84; [62 5F, 05, 0B]
-FEEB; [62 5F, 05, 2D]
-FEEC; [62 5F, 05, 2F]
-FEEA; [62 5F, 05, 31]
-FEE9; [62 5F, 05, 33]
-FCD9; [62 5F, 05, 2D][, D5 11, 2D]
-FCD7; [62 5F, 05, 2D][61 52, 05, 2D]
-FC51; [62 5F, 05, 33][61 52, 05, 33]
-FCD8; [62 5F, 05, 2D][62 45, 05, 2D]
-FC52; [62 5F, 05, 33][62 45, 05, 33]
-FD93; [62 5F, 05, 2D][62 45, 05, 2D][61 52, 05, 2D]
-FD94; [62 5F, 05, 2D][62 45, 05, 2D][62 45, 05, 2D]
-FC53; [62 5F, 05, 33][62 85, 05, 33]
-FC54; [62 5F, 05, 33][62 87, 05, 33]
-
-06BE; [62 61, 05, 05]
-FBAC; [62 61, 05, 2D]
-FBAD; [62 61, 05, 2F]
-FBAB; [62 61, 05, 31]
-FBAA; [62 61, 05, 33]
-
-06C1; [62 63, 05, 05]
-FBA8; [62 63, 05, 2D]
-FBA9; [62 63, 05, 2F]
-FBA7; [62 63, 05, 31]
-FBA6; [62 63, 05, 33]
-06C2; [62 63, 05, 05][, D3 D9, 05]
-
-06C3; [62 65, 05, 05]
-
-06FF; [62 67, 05, 05]
-
-06D5; [62 69, 05, 05]
-06C0; [62 69, 05, 05][, D3 D9, 05]
-FBA5; [62 69, 05, 31][, D3 D9, 31]
-FBA4; [62 69, 05, 33][, D3 D9, 33]
-
-0648; [62 6B, 05, 05]
-06E5; [62 6B, 05, 09]
-1EE05; [62 6B, 05, 0B]
-1EE85; [62 6B, 05, 0B]
-1EEA5; [62 6B, 05, 0B]
-FEEE; [62 6B, 05, 31]
-FEED; [62 6B, 05, 33]
-0676; [62 6B, 05, 09][61 0A, 05, 09]
-FDF8; [62 6B, 05, 33][61 B4, 05, 33][62 37, 05, 33][62 45, 05, 33]
-
-06C4; [62 6D, 05, 05]
-
-06C5; [62 6F, 05, 05]
-FBE1; [62 6F, 05, 31]
-FBE0; [62 6F, 05, 33]
-
-06C6; [62 71, 05, 05]
-FBDA; [62 71, 05, 31]
-FBD9; [62 71, 05, 33]
-
-06C7; [62 73, 05, 05]
-FBD8; [62 73, 05, 31]
-FBD7; [62 73, 05, 33]
-0677; [62 73, 05, 09][61 0A, 05, 09]
-FBDD; [62 73, 05, 33][61 0A, 05, 33]
-
-06C8; [62 75, 05, 05]
-FBDC; [62 75, 05, 31]
-FBDB; [62 75, 05, 33]
-
-06C9; [62 77, 05, 05]
-FBE3; [62 77, 05, 31]
-FBE2; [62 77, 05, 33]
-
-06CA; [62 79, 05, 05]
-
-06CB; [62 7B, 05, 05]
-FBDF; [62 7B, 05, 31]
-FBDE; [62 7B, 05, 33]
-
-06CF; [62 7D, 05, 05]
-
-0778; [62 7F, 05, 05]
-
-0779; [62 81, 05, 05]
-
-08AB; [62 83, 05, 05]
-
-0649; [62 85, 05, 05]
-FBE8; [62 85, 05, 2D]
-FBE9; [62 85, 05, 2F]
-FEF0; [62 85, 05, 31]
-FEEF; [62 85, 05, 33]
-FC90; [62 85, 05, 31][, D5 11, 31]
-FC5D; [62 85, 05, 33][, D5 11, 33]
-
-064A; [62 87, 05, 05]
-06E6; [62 87, 05, 09]
-1EE09; [62 87, 05, 0B]
-1EE29; [62 87, 05, 0B]
-1EE49; [62 87, 05, 0B]
-1EE69; [62 87, 05, 0B]
-1EE89; [62 87, 05, 0B]
-1EEA9; [62 87, 05, 0B]
-FEF3; [62 87, 05, 2D]
-FEF4; [62 87, 05, 2F]
-FEF2; [62 87, 05, 31]
-FEF1; [62 87, 05, 33]
-0678; [62 87, 05, 09][61 0A, 05, 09]
-FCDA; [62 87, 05, 2D][61 52, 05, 2D]
-FC55; [62 87, 05, 33][61 52, 05, 33]
-FDAF; [62 87, 05, 31][61 52, 05, 31][62 87, 05, 31]
-FCDB; [62 87, 05, 2D][61 60, 05, 2D]
-FC56; [62 87, 05, 33][61 60, 05, 33]
-FDAE; [62 87, 05, 31][61 60, 05, 31][62 87, 05, 31]
-FCDC; [62 87, 05, 2D][61 62, 05, 2D]
-FC57; [62 87, 05, 33][61 62, 05, 33]
-FC91; [62 87, 05, 31][61 92, 05, 31]
-FC92; [62 87, 05, 31][61 94, 05, 31]
-FCDD; [62 87, 05, 2D][62 45, 05, 2D]
-FCF0; [62 87, 05, 2F][62 45, 05, 2F]
-FC93; [62 87, 05, 31][62 45, 05, 31]
-FC58; [62 87, 05, 33][62 45, 05, 33]
-FD9D; [62 87, 05, 2D][62 45, 05, 2D][62 45, 05, 2D]
-FD9C; [62 87, 05, 31][62 45, 05, 31][62 45, 05, 31]
-FDB0; [62 87, 05, 31][62 45, 05, 31][62 87, 05, 31]
-FC94; [62 87, 05, 31][62 4D, 05, 31]
-FCDE; [62 87, 05, 2D][62 5F, 05, 2D]
-FCF1; [62 87, 05, 2F][62 5F, 05, 2F]
-FC95; [62 87, 05, 31][62 85, 05, 31]
-FC59; [62 87, 05, 33][62 85, 05, 33]
-FC96; [62 87, 05, 31][62 87, 05, 31]
-FC5A; [62 87, 05, 33][62 87, 05, 33]
+074F; [62 D6 D3, 05, 05]
 
-06CC; [62 89, 05, 05]
-FBFE; [62 89, 05, 2D]
-FBFF; [62 89, 05, 2F]
-FBFD; [62 89, 05, 31]
-FBFC; [62 89, 05, 33]
+0728; [62 D6 DB, 05, 05]
 
-06CD; [62 8B, 05, 05]
+0729; [62 D6 E3, 05, 05]
 
-06CE; [62 8D, 05, 05]
+072A; [62 D6 EB, 05, 05]
 
-06D0; [62 8F, 05, 05]
-FBE6; [62 8F, 05, 2D]
-FBE7; [62 8F, 05, 2F]
-FBE5; [62 8F, 05, 31]
-FBE4; [62 8F, 05, 33]
+072B; [62 D6 F3, 05, 05]
 
-06D1; [62 91, 05, 05]
+072C; [62 D6 FB, 05, 05]
 
-063D; [62 93, 05, 05]
+FDD1 0840;     [62 D7 26, 05, 05]      # Mandaic first primary
 
-063E; [62 95, 05, 05]
+0840; [62 D7 4F, 05, 05]
 
-063F; [62 97, 05, 05]
+0841; [62 D7 57, 05, 05]
 
-0620; [62 99, 05, 05]
+0842; [62 D7 5F, 05, 05]
 
-0775; [62 9B, 05, 05]
+0843; [62 D7 67, 05, 05]
 
-0776; [62 9D, 05, 05]
+0844; [62 D7 6F, 05, 05]
 
-0777; [62 9F, 05, 05]
+0845; [62 D7 77, 05, 05]
 
-06D2; [62 A1, 05, 05]
-FBAF; [62 A1, 05, 31]
-FBAE; [62 A1, 05, 33]
-06D3; [62 A1, 05, 05][, D3 D9, 05]
-FBB1; [62 A1, 05, 31][, D3 D9, 31]
-FBB0; [62 A1, 05, 33][, D3 D9, 33]
+0846; [62 D7 7F, 05, 05]
 
-077A; [62 A3, 05, 05]
+0847; [62 D7 87, 05, 05]
 
-077B; [62 A5, 05, 05]
+0848; [62 D7 8F, 05, 05]
 
-0710; [62 A7 04, 05, 05]
+0849; [62 D7 97, 05, 05]
 
-0712; [62 A7 0C, 05, 05]
-072D; [62 A7 0C, 05, 09][, DB C9, 09]
+084A; [62 D7 9F, 05, 05]
 
-0713; [62 A7 14, 05, 05]
-0714; [62 A7 14, 05, 09][, DB B9, 09]
-072E; [62 A7 14, 05, 09][, DB C9, 09]
+084B; [62 D7 A7, 05, 05]
 
-0716; [62 A7 1C, 05, 05]
+084C; [62 D7 AF, 05, 05]
 
-0715; [62 A7 24, 05, 05]
-072F; [62 A7 24, 05, 09][, DB C9, 09]
+084D; [62 D7 B7, 05, 05]
 
-0717; [62 A7 2C, 05, 05]
+084E; [62 D7 BF, 05, 05]
 
-0718; [62 A7 34, 05, 05]
+084F; [62 D7 C7, 05, 05]
 
-0719; [62 A7 3C, 05, 05]
+0850; [62 D7 CF, 05, 05]
 
-074D; [62 A7 44, 05, 05]
+0851; [62 D7 D7, 05, 05]
 
-071A; [62 A7 4C, 05, 05]
+0852; [62 D7 DF, 05, 05]
 
-071B; [62 A7 54, 05, 05]
-071C; [62 A7 54, 05, 09][, DB B9, 09]
+0853; [62 D7 E7, 05, 05]
 
-071D; [62 A7 5C, 05, 05]
+0854; [62 D7 EF, 05, 05]
 
-071E; [62 A7 64, 05, 05]
+0855; [62 D7 F7, 05, 05]
 
-071F; [62 A7 6C, 05, 05]
+0856; [62 D7 FF, 05, 05]
 
-074E; [62 A7 74, 05, 05]
+0857; [62 D8 09, 05, 05]
 
-0720; [62 A7 7C, 05, 05]
+0858; [62 D8 11, 05, 05]
 
-0721; [62 A7 84, 05, 05]
+FDD1 078C;     [63 04 02, 05, 05]      # THAANA first primary starts reordering group (compressible)
 
-0722; [62 A7 8C, 05, 05]
+0780; [63 09, 05, 05]
 
-0723; [62 A7 94, 05, 05]
-0724; [62 A7 94, 05, 31]
+0799; [63 0B, 05, 05]
 
-0725; [62 A7 9C, 05, 05]
+079A; [63 0D, 05, 05]
 
-0726; [62 A7 A4, 05, 05]
-0727; [62 A7 A4, 05, 09][, DB B9, 09]
+0781; [63 0F, 05, 05]
 
-074F; [62 A7 AC, 05, 05]
+0782; [63 11, 05, 05]
 
-0728; [62 A7 B4, 05, 05]
+0783; [63 13, 05, 05]
 
-0729; [62 A7 BC, 05, 05]
+079C; [63 15, 05, 05]
 
-072A; [62 A7 C4, 05, 05]
+0784; [63 17, 05, 05]
 
-072B; [62 A7 CC, 05, 05]
+0785; [63 19, 05, 05]
 
-072C; [62 A7 D4, 05, 05]
+0786; [63 1B, 05, 05]
 
-0840; [62 A7 DC, 05, 05]
+0787; [63 1D, 05, 05]
 
-0841; [62 A7 E4, 05, 05]
+07A2; [63 1F, 05, 05]
 
-0842; [62 A7 EC, 05, 05]
+07A3; [63 21, 05, 05]
 
-0843; [62 A7 F4, 05, 05]
+0788; [63 23, 05, 05]
 
-0844; [62 A7 FC, 05, 05]
+07A5; [63 25, 05, 05]
 
-0845; [62 A8 0A, 05, 05]
+0789; [63 27, 05, 05]
 
-0846; [62 A8 12, 05, 05]
+078A; [63 29, 05, 05]
 
-0847; [62 A8 1A, 05, 05]
+078B; [63 2B, 05, 05]
 
-0848; [62 A8 22, 05, 05]
+079B; [63 2D, 05, 05]
 
-0849; [62 A8 2A, 05, 05]
+078C; [63 2F, 05, 05]
 
-084A; [62 A8 32, 05, 05]
+0798; [63 31, 05, 05]
 
-084B; [62 A8 3A, 05, 05]
+07A0; [63 33, 05, 05]
 
-084C; [62 A8 42, 05, 05]
+07A1; [63 35, 05, 05]
 
-084D; [62 A8 4A, 05, 05]
+078D; [63 37, 05, 05]
 
-084E; [62 A8 52, 05, 05]
+078E; [63 39, 05, 05]
 
-084F; [62 A8 5A, 05, 05]
+07A4; [63 3B, 05, 05]
 
-0850; [62 A8 62, 05, 05]
+078F; [63 3D, 05, 05]
 
-0851; [62 A8 6A, 05, 05]
+0790; [63 3F, 05, 05]
 
-0852; [62 A8 72, 05, 05]
+079D; [63 41, 05, 05]
 
-0853; [62 A8 7A, 05, 05]
+079E; [63 43, 05, 05]
 
-0854; [62 A8 82, 05, 05]
+079F; [63 45, 05, 05]
 
-0855; [62 A8 8A, 05, 05]
+0791; [63 47, 05, 05]
 
-0856; [62 A8 92, 05, 05]
+0792; [63 49, 05, 05]
 
-0857; [62 A8 9A, 05, 05]
+0793; [63 4B, 05, 05]
 
-0858; [62 A8 A2, 05, 05]
+0794; [63 4D, 05, 05]
 
-0780; [63 0A, 05, 05]
+0795; [63 4F, 05, 05]
 
-0799; [63 0C, 05, 05]
+0796; [63 51, 05, 05]
 
-079A; [63 0E, 05, 05]
+0797; [63 53, 05, 05]
 
-0781; [63 10, 05, 05]
+07B1; [63 55, 05, 05]
 
-0782; [63 12, 05, 05]
+07A6; [63 57, 05, 05]
 
-0783; [63 14, 05, 05]
+07A7; [63 59, 05, 05]
 
-079C; [63 16, 05, 05]
+07A8; [63 5B, 05, 05]
 
-0784; [63 18, 05, 05]
+07A9; [63 5D, 05, 05]
 
-0785; [63 1A, 05, 05]
+07AA; [63 5F, 05, 05]
 
-0786; [63 1C, 05, 05]
+07AB; [63 61, 05, 05]
 
-0787; [63 1E, 05, 05]
+07AC; [63 63, 05, 05]
 
-07A2; [63 20, 05, 05]
+07AD; [63 65, 05, 05]
 
-07A3; [63 22, 05, 05]
+07AE; [63 67, 05, 05]
 
-0788; [63 24, 05, 05]
+07AF; [63 69, 05, 05]
 
-07A5; [63 26, 05, 05]
+07B0; [63 6B, 05, 05]
 
-0789; [63 28, 05, 05]
+FDD1 07CA;     [63 70 02, 05, 05]      # Nko first primary
 
-078A; [63 2A, 05, 05]
+07CA; [63 70 2B, 05, 05]
 
-078B; [63 2C, 05, 05]
+07CB; [63 70 33, 05, 05]
 
-079B; [63 2E, 05, 05]
+07CC; [63 70 3B, 05, 05]
 
-078C; [63 30, 05, 05]
+07CD; [63 70 43, 05, 05]
 
-0798; [63 32, 05, 05]
+07CE; [63 70 4B, 05, 05]
 
-07A0; [63 34, 05, 05]
+07CF; [63 70 53, 05, 05]
 
-07A1; [63 36, 05, 05]
+07D0; [63 70 5B, 05, 05]
 
-078D; [63 38, 05, 05]
+07D1; [63 70 63, 05, 05]
 
-078E; [63 3A, 05, 05]
+07D2; [63 70 6B, 05, 05]
 
-07A4; [63 3C, 05, 05]
+07D3; [63 70 73, 05, 05]
 
-078F; [63 3E, 05, 05]
+07D4; [63 70 7B, 05, 05]
 
-0790; [63 40, 05, 05]
+07D5; [63 70 83, 05, 05]
 
-079D; [63 42, 05, 05]
+07D6; [63 70 8B, 05, 05]
+07E8; [63 70 8B, 70, 20]
 
-079E; [63 44, 05, 05]
+07D7; [63 70 93, 05, 05]
+07E9; [63 70 93, 70, 20]
 
-079F; [63 46, 05, 05]
+07D8; [63 70 9B, 05, 05]
 
-0791; [63 48, 05, 05]
+07D9; [63 70 A3, 05, 05]
+07EA; [63 70 A3, 70, 20]
 
-0792; [63 4A, 05, 05]
+07DA; [63 70 AB, 05, 05]
 
-0793; [63 4C, 05, 05]
+07DB; [63 70 B3, 05, 05]
 
-0794; [63 4E, 05, 05]
+07DC; [63 70 BB, 05, 05]
 
-0795; [63 50, 05, 05]
+07DD; [63 70 C3, 05, 05]
 
-0796; [63 52, 05, 05]
+07DE; [63 70 CB, 05, 05]
 
-0797; [63 54, 05, 05]
+07DF; [63 70 D3, 05, 05]
 
-07B1; [63 56, 05, 05]
+07E0; [63 70 DB, 05, 05]
 
-07A6; [63 58, 05, 05]
+07E1; [63 70 E3, 05, 05]
 
-07A7; [63 5A, 05, 05]
+07E2; [63 70 EB, 05, 05]
 
-07A8; [63 5C, 05, 05]
+07E3; [63 70 F3, 05, 05]
 
-07A9; [63 5E, 05, 05]
+07E4; [63 70 FB, 05, 05]
 
-07AA; [63 60, 05, 05]
+07E5; [63 71 05, 05, 05]
 
-07AB; [63 62, 05, 05]
+07E6; [63 71 0D, 05, 05]
 
-07AC; [63 64, 05, 05]
+07E7; [63 71 15, 05, 05]
 
-07AD; [63 66, 05, 05]
+07F4; [63 71 1D, 05, 05]
 
-07AE; [63 68, 05, 05]
+07F5; [63 71 25, 05, 05]
 
-07AF; [63 6A, 05, 05]
+FDD1 2D30;     [63 71 4E, 05, 05]      # TIFINAGH first primary
 
-07B0; [63 6C, 05, 05]
+2D30; [63 71 77, 05, 05]
 
-07CA; [63 6E 04, 05, 05]
+2D31; [63 71 7F, 05, 05]
 
-07CB; [63 6E 0C, 05, 05]
+2D32; [63 71 87, 05, 05]
 
-07CC; [63 6E 14, 05, 05]
+2D33; [63 71 8F, 05, 05]
 
-07CD; [63 6E 1C, 05, 05]
+2D34; [63 71 97, 05, 05]
 
-07CE; [63 6E 24, 05, 05]
+2D35; [63 71 9F, 05, 05]
 
-07CF; [63 6E 2C, 05, 05]
+2D36; [63 71 A7, 05, 05]
 
-07D0; [63 6E 34, 05, 05]
+2D37; [63 71 AF, 05, 05]
 
-07D1; [63 6E 3C, 05, 05]
+2D38; [63 71 B7, 05, 05]
 
-07D2; [63 6E 44, 05, 05]
+2D39; [63 71 BF, 05, 05]
 
-07D3; [63 6E 4C, 05, 05]
+2D3A; [63 71 C7, 05, 05]
 
-07D4; [63 6E 54, 05, 05]
+2D3B; [63 71 CF, 05, 05]
 
-07D5; [63 6E 5C, 05, 05]
+2D66; [63 71 D7, 05, 05]
 
-07D6; [63 6E 64, 05, 05]
-07E8; [63 6E 64, 05, 09][, DB A9, 09]
+2D3C; [63 71 DF, 05, 05]
 
-07D7; [63 6E 6C, 05, 05]
-07E9; [63 6E 6C, 05, 09][, DB A9, 09]
+2D3D; [63 71 E7, 05, 05]
 
-07D8; [63 6E 74, 05, 05]
+2D3E; [63 71 EF, 05, 05]
 
-07D9; [63 6E 7C, 05, 05]
-07EA; [63 6E 7C, 05, 09][, DB A9, 09]
+2D3F; [63 71 F7, 05, 05]
 
-07DA; [63 6E 84, 05, 05]
+2D40; [63 71 FF, 05, 05]
 
-07DB; [63 6E 8C, 05, 05]
+2D41; [63 72 09, 05, 05]
 
-07DC; [63 6E 94, 05, 05]
+2D42; [63 72 11, 05, 05]
 
-07DD; [63 6E 9C, 05, 05]
+2D43; [63 72 19, 05, 05]
 
-07DE; [63 6E A4, 05, 05]
+2D44; [63 72 21, 05, 05]
 
-07DF; [63 6E AC, 05, 05]
+2D45; [63 72 29, 05, 05]
 
-07E0; [63 6E B4, 05, 05]
+2D46; [63 72 31, 05, 05]
 
-07E1; [63 6E BC, 05, 05]
+2D47; [63 72 39, 05, 05]
 
-07E2; [63 6E C4, 05, 05]
+2D48; [63 72 41, 05, 05]
 
-07E3; [63 6E CC, 05, 05]
+2D49; [63 72 49, 05, 05]
 
-07E4; [63 6E D4, 05, 05]
+2D4A; [63 72 51, 05, 05]
 
-07E5; [63 6E DC, 05, 05]
+2D4B; [63 72 59, 05, 05]
 
-07E6; [63 6E E4, 05, 05]
+2D4C; [63 72 61, 05, 05]
 
-07E7; [63 6E EC, 05, 05]
+2D4D; [63 72 69, 05, 05]
 
-07F4; [63 6E F4, 05, 05]
+2D4E; [63 72 71, 05, 05]
 
-07F5; [63 6E FC, 05, 05]
+2D4F; [63 72 79, 05, 05]
 
-2D30; [63 6F 0A, 05, 05]
+2D50; [63 72 81, 05, 05]
 
-2D31; [63 6F 12, 05, 05]
+2D51; [63 72 89, 05, 05]
 
-2D32; [63 6F 1A, 05, 05]
+2D52; [63 72 91, 05, 05]
 
-2D33; [63 6F 22, 05, 05]
+2D53; [63 72 99, 05, 05]
 
-2D34; [63 6F 2A, 05, 05]
+2D67; [63 72 A1, 05, 05]
 
-2D35; [63 6F 32, 05, 05]
+2D54; [63 72 A9, 05, 05]
 
-2D36; [63 6F 3A, 05, 05]
+2D55; [63 72 B1, 05, 05]
 
-2D37; [63 6F 42, 05, 05]
+2D56; [63 72 B9, 05, 05]
 
-2D38; [63 6F 4A, 05, 05]
+2D57; [63 72 C1, 05, 05]
 
-2D39; [63 6F 52, 05, 05]
+2D58; [63 72 C9, 05, 05]
 
-2D3A; [63 6F 5A, 05, 05]
+2D59; [63 72 D1, 05, 05]
 
-2D3B; [63 6F 62, 05, 05]
+2D5A; [63 72 D9, 05, 05]
 
-2D66; [63 6F 6A, 05, 05]
+2D5B; [63 72 E1, 05, 05]
 
-2D3C; [63 6F 72, 05, 05]
+2D5C; [63 72 E9, 05, 05]
 
-2D3D; [63 6F 7A, 05, 05]
+2D5D; [63 72 F1, 05, 05]
 
-2D3E; [63 6F 82, 05, 05]
+2D5E; [63 72 F9, 05, 05]
 
-2D3F; [63 6F 8A, 05, 05]
+2D5F; [63 73 03, 05, 05]
 
-2D40; [63 6F 92, 05, 05]
+2D60; [63 73 0B, 05, 05]
 
-2D41; [63 6F 9A, 05, 05]
+2D61; [63 73 13, 05, 05]
 
-2D42; [63 6F A2, 05, 05]
+2D62; [63 73 1B, 05, 05]
 
-2D43; [63 6F AA, 05, 05]
+2D63; [63 73 23, 05, 05]
 
-2D44; [63 6F B2, 05, 05]
+2D64; [63 73 2B, 05, 05]
 
-2D45; [63 6F BA, 05, 05]
+2D65; [63 73 33, 05, 05]
 
-2D46; [63 6F C2, 05, 05]
+2D6F; [63 73 3B, 05, 05]
 
-2D47; [63 6F CA, 05, 05]
+FDD1 12A0;     [64 04 02, 05, 05]      # ETHIOPIC first primary starts reordering group (compressible)
 
-2D48; [63 6F D2, 05, 05]
+1200; [64 08 02, 05, 05]
 
-2D49; [63 6F DA, 05, 05]
+1201; [64 08 0A, 05, 05]
 
-2D4A; [63 6F E2, 05, 05]
+1202; [64 08 12, 05, 05]
 
-2D4B; [63 6F EA, 05, 05]
+1203; [64 08 1A, 05, 05]
 
-2D4C; [63 6F F2, 05, 05]
+1204; [64 08 22, 05, 05]
 
-2D4D; [63 6F FA, 05, 05]
+1205; [64 08 2A, 05, 05]
 
-2D4E; [63 70 08, 05, 05]
+1206; [64 08 32, 05, 05]
 
-2D4F; [63 70 10, 05, 05]
+1207; [64 08 3A, 05, 05]
 
-2D50; [63 70 18, 05, 05]
+1208; [64 08 42, 05, 05]
 
-2D51; [63 70 20, 05, 05]
+1209; [64 08 4A, 05, 05]
 
-2D52; [63 70 28, 05, 05]
+120A; [64 08 52, 05, 05]
 
-2D53; [63 70 30, 05, 05]
+120B; [64 08 5A, 05, 05]
 
-2D67; [63 70 38, 05, 05]
+120C; [64 08 62, 05, 05]
 
-2D54; [63 70 40, 05, 05]
+120D; [64 08 6A, 05, 05]
 
-2D55; [63 70 48, 05, 05]
+120E; [64 08 72, 05, 05]
 
-2D56; [63 70 50, 05, 05]
+120F; [64 08 7A, 05, 05]
 
-2D57; [63 70 58, 05, 05]
+2D80; [64 08 82, 05, 05]
 
-2D58; [63 70 60, 05, 05]
+1210; [64 08 8A, 05, 05]
 
-2D59; [63 70 68, 05, 05]
+1211; [64 08 92, 05, 05]
 
-2D5A; [63 70 70, 05, 05]
+1212; [64 08 9A, 05, 05]
 
-2D5B; [63 70 78, 05, 05]
+1213; [64 08 A2, 05, 05]
 
-2D5C; [63 70 80, 05, 05]
+1214; [64 08 AA, 05, 05]
 
-2D5D; [63 70 88, 05, 05]
+1215; [64 08 B2, 05, 05]
 
-2D5E; [63 70 90, 05, 05]
+1216; [64 08 BA, 05, 05]
 
-2D5F; [63 70 98, 05, 05]
+1217; [64 08 C2, 05, 05]
 
-2D60; [63 70 A0, 05, 05]
+1218; [64 08 CA, 05, 05]
 
-2D61; [63 70 A8, 05, 05]
+1219; [64 08 D2, 05, 05]
 
-2D62; [63 70 B0, 05, 05]
+121A; [64 08 DA, 05, 05]
 
-2D63; [63 70 B8, 05, 05]
+121B; [64 08 E2, 05, 05]
 
-2D64; [63 70 C0, 05, 05]
+121C; [64 08 EA, 05, 05]
 
-2D65; [63 70 C8, 05, 05]
+121D; [64 08 F2, 05, 05]
 
-2D6F; [63 70 D0, 05, 05]
+121E; [64 08 FA, 05, 05]
 
-1200; [64 0A, 05, 05]
+121F; [64 09 04, 05, 05]
 
-1201; [64 0C, 05, 05]
+1380; [64 09 0C, 05, 05]
 
-1202; [64 0E, 05, 05]
+1381; [64 09 14, 05, 05]
 
-1203; [64 10, 05, 05]
+1382; [64 09 1C, 05, 05]
 
-1204; [64 12, 05, 05]
+1383; [64 09 24, 05, 05]
 
-1205; [64 14, 05, 05]
+2D81; [64 09 2C, 05, 05]
 
-1206; [64 16, 05, 05]
+1220; [64 09 34, 05, 05]
 
-1207; [64 18, 05, 05]
+1221; [64 09 3C, 05, 05]
 
-1208; [64 1A, 05, 05]
+1222; [64 09 44, 05, 05]
 
-1209; [64 1C, 05, 05]
+1223; [64 09 4C, 05, 05]
 
-120A; [64 1E, 05, 05]
+1224; [64 09 54, 05, 05]
 
-120B; [64 20, 05, 05]
+1225; [64 09 5C, 05, 05]
 
-120C; [64 22, 05, 05]
+1226; [64 09 64, 05, 05]
 
-120D; [64 24, 05, 05]
+1227; [64 09 6C, 05, 05]
 
-120E; [64 26, 05, 05]
+1228; [64 09 74, 05, 05]
 
-120F; [64 28, 05, 05]
+1229; [64 09 7C, 05, 05]
 
-2D80; [64 2A, 05, 05]
+122A; [64 09 84, 05, 05]
 
-1210; [64 2C, 05, 05]
+122B; [64 09 8C, 05, 05]
 
-1211; [64 2E, 05, 05]
+122C; [64 09 94, 05, 05]
 
-1212; [64 30, 05, 05]
+122D; [64 09 9C, 05, 05]
 
-1213; [64 32, 05, 05]
+122E; [64 09 A4, 05, 05]
 
-1214; [64 34, 05, 05]
+122F; [64 09 AC, 05, 05]
 
-1215; [64 36, 05, 05]
+2D82; [64 09 B4, 05, 05]
 
-1216; [64 38, 05, 05]
+1230; [64 09 BC, 05, 05]
 
-1217; [64 3A, 05, 05]
+1231; [64 09 C4, 05, 05]
 
-1218; [64 3C, 05, 05]
+1232; [64 09 CC, 05, 05]
 
-1219; [64 3E, 05, 05]
+1233; [64 09 D4, 05, 05]
 
-121A; [64 40, 05, 05]
+1234; [64 09 DC, 05, 05]
 
-121B; [64 42, 05, 05]
+1235; [64 09 E4, 05, 05]
 
-121C; [64 44, 05, 05]
+1236; [64 09 EC, 05, 05]
 
-121D; [64 46, 05, 05]
+1237; [64 09 F4, 05, 05]
 
-121E; [64 48, 05, 05]
+2D83; [64 09 FC, 05, 05]
 
-121F; [64 4A, 05, 05]
+AB01; [64 0A 06, 05, 05]
 
-1380; [64 4C, 05, 05]
+AB02; [64 0A 0E, 05, 05]
 
-1381; [64 4E, 05, 05]
+AB03; [64 0A 16, 05, 05]
 
-1382; [64 50, 05, 05]
+AB04; [64 0A 1E, 05, 05]
 
-1383; [64 52, 05, 05]
+AB05; [64 0A 26, 05, 05]
 
-2D81; [64 54, 05, 05]
+AB06; [64 0A 2E, 05, 05]
 
-1220; [64 56, 05, 05]
+1238; [64 0A 36, 05, 05]
 
-1221; [64 58, 05, 05]
+1239; [64 0A 3E, 05, 05]
 
-1222; [64 5A, 05, 05]
+123A; [64 0A 46, 05, 05]
 
-1223; [64 5C, 05, 05]
+123B; [64 0A 4E, 05, 05]
 
-1224; [64 5E, 05, 05]
+123C; [64 0A 56, 05, 05]
 
-1225; [64 60, 05, 05]
+123D; [64 0A 5E, 05, 05]
 
-1226; [64 62, 05, 05]
+123E; [64 0A 66, 05, 05]
 
-1227; [64 64, 05, 05]
+123F; [64 0A 6E, 05, 05]
 
-1228; [64 66, 05, 05]
+2D84; [64 0A 76, 05, 05]
 
-1229; [64 68, 05, 05]
+1240; [64 0A 7E, 05, 05]
 
-122A; [64 6A, 05, 05]
+1241; [64 0A 86, 05, 05]
 
-122B; [64 6C, 05, 05]
+1242; [64 0A 8E, 05, 05]
 
-122C; [64 6E, 05, 05]
+1243; [64 0A 96, 05, 05]
 
-122D; [64 70, 05, 05]
+1244; [64 0A 9E, 05, 05]
 
-122E; [64 72, 05, 05]
+1245; [64 0A A6, 05, 05]
 
-122F; [64 74, 05, 05]
+1246; [64 0A AE, 05, 05]
 
-2D82; [64 76, 05, 05]
+1247; [64 0A B6, 05, 05]
 
-1230; [64 78, 05, 05]
+1248; [64 0A BE, 05, 05]
 
-1231; [64 7A, 05, 05]
+124A; [64 0A C6, 05, 05]
 
-1232; [64 7C, 05, 05]
+124B; [64 0A CE, 05, 05]
 
-1233; [64 7E, 05, 05]
+124C; [64 0A D6, 05, 05]
 
-1234; [64 80, 05, 05]
+124D; [64 0A DE, 05, 05]
 
-1235; [64 82, 05, 05]
+1250; [64 0A E6, 05, 05]
 
-1236; [64 84, 05, 05]
+1251; [64 0A EE, 05, 05]
 
-1237; [64 86, 05, 05]
+1252; [64 0A F6, 05, 05]
 
-2D83; [64 88, 05, 05]
+1253; [64 0A FE, 05, 05]
 
-AB01; [64 8A, 05, 05]
+1254; [64 0B 08, 05, 05]
 
-AB02; [64 8C, 05, 05]
+1255; [64 0B 10, 05, 05]
 
-AB03; [64 8E, 05, 05]
+1256; [64 0B 18, 05, 05]
 
-AB04; [64 90, 05, 05]
+1258; [64 0B 20, 05, 05]
 
-AB05; [64 92, 05, 05]
+125A; [64 0B 28, 05, 05]
 
-AB06; [64 94, 05, 05]
+125B; [64 0B 30, 05, 05]
 
-1238; [64 96, 05, 05]
+125C; [64 0B 38, 05, 05]
 
-1239; [64 98, 05, 05]
+125D; [64 0B 40, 05, 05]
 
-123A; [64 9A, 05, 05]
+1260; [64 0B 48, 05, 05]
 
-123B; [64 9C, 05, 05]
+1261; [64 0B 50, 05, 05]
 
-123C; [64 9E, 05, 05]
+1262; [64 0B 58, 05, 05]
 
-123D; [64 A0, 05, 05]
+1263; [64 0B 60, 05, 05]
 
-123E; [64 A2, 05, 05]
+1264; [64 0B 68, 05, 05]
 
-123F; [64 A4, 05, 05]
+1265; [64 0B 70, 05, 05]
 
-2D84; [64 A6, 05, 05]
+1266; [64 0B 78, 05, 05]
 
-1240; [64 A8, 05, 05]
+1267; [64 0B 80, 05, 05]
 
-1241; [64 AA, 05, 05]
+1384; [64 0B 88, 05, 05]
 
-1242; [64 AC, 05, 05]
+1385; [64 0B 90, 05, 05]
 
-1243; [64 AE, 05, 05]
+1386; [64 0B 98, 05, 05]
 
-1244; [64 B0, 05, 05]
+1387; [64 0B A0, 05, 05]
 
-1245; [64 B2, 05, 05]
+2D85; [64 0B A8, 05, 05]
 
-1246; [64 B4, 05, 05]
+1268; [64 0B B0, 05, 05]
 
-1247; [64 B6, 05, 05]
+1269; [64 0B B8, 05, 05]
 
-1248; [64 B8, 05, 05]
+126A; [64 0B C0, 05, 05]
 
-124A; [64 BA, 05, 05]
+126B; [64 0B C8, 05, 05]
 
-124B; [64 BC, 05, 05]
+126C; [64 0B D0, 05, 05]
 
-124C; [64 BE, 05, 05]
+126D; [64 0B D8, 05, 05]
 
-124D; [64 C0, 05, 05]
+126E; [64 0B E0, 05, 05]
 
-1250; [64 C2, 05, 05]
+126F; [64 0B E8, 05, 05]
 
-1251; [64 C4, 05, 05]
+1270; [64 0B F0, 05, 05]
 
-1252; [64 C6, 05, 05]
+1271; [64 0B F8, 05, 05]
 
-1253; [64 C8, 05, 05]
+1272; [64 0C 02, 05, 05]
 
-1254; [64 CA, 05, 05]
+1273; [64 0C 0A, 05, 05]
 
-1255; [64 CC, 05, 05]
+1274; [64 0C 12, 05, 05]
 
-1256; [64 CE, 05, 05]
+1275; [64 0C 1A, 05, 05]
 
-1258; [64 D0, 05, 05]
+1276; [64 0C 22, 05, 05]
 
-125A; [64 D2, 05, 05]
+1277; [64 0C 2A, 05, 05]
 
-125B; [64 D4, 05, 05]
+2D86; [64 0C 32, 05, 05]
 
-125C; [64 D6, 05, 05]
+1278; [64 0C 3A, 05, 05]
 
-125D; [64 D8, 05, 05]
+1279; [64 0C 42, 05, 05]
 
-1260; [64 DA, 05, 05]
+127A; [64 0C 4A, 05, 05]
 
-1261; [64 DC, 05, 05]
+127B; [64 0C 52, 05, 05]
 
-1262; [64 DE, 05, 05]
+127C; [64 0C 5A, 05, 05]
 
-1263; [64 E0, 05, 05]
+127D; [64 0C 62, 05, 05]
 
-1264; [64 E2, 05, 05]
+127E; [64 0C 6A, 05, 05]
 
-1265; [64 E4, 05, 05]
+127F; [64 0C 72, 05, 05]
 
-1266; [64 E6, 05, 05]
+2D87; [64 0C 7A, 05, 05]
 
-1267; [64 E8, 05, 05]
+1280; [64 0C 82, 05, 05]
 
-1384; [64 EA, 05, 05]
+1281; [64 0C 8A, 05, 05]
 
-1385; [64 EC, 05, 05]
+1282; [64 0C 92, 05, 05]
 
-1386; [64 EE, 05, 05]
+1283; [64 0C 9A, 05, 05]
 
-1387; [64 F0, 05, 05]
+1284; [64 0C A2, 05, 05]
 
-2D85; [64 F2, 05, 05]
+1285; [64 0C AA, 05, 05]
 
-1268; [64 F4, 05, 05]
+1286; [64 0C B2, 05, 05]
 
-1269; [64 F6, 05, 05]
+1287; [64 0C BA, 05, 05]
 
-126A; [64 F8, 05, 05]
+1288; [64 0C C2, 05, 05]
 
-126B; [64 FA, 05, 05]
+128A; [64 0C CA, 05, 05]
 
-126C; [65 05, 05, 05]
+128B; [64 0C D2, 05, 05]
 
-126D; [65 07, 05, 05]
+128C; [64 0C DA, 05, 05]
 
-126E; [65 09, 05, 05]
+128D; [64 0C E2, 05, 05]
 
-126F; [65 0B, 05, 05]
+1290; [64 0C EA, 05, 05]
 
-1270; [65 0D, 05, 05]
+1291; [64 0C F2, 05, 05]
 
-1271; [65 0F, 05, 05]
+1292; [64 0C FA, 05, 05]
 
-1272; [65 11, 05, 05]
+1293; [64 0D 04, 05, 05]
 
-1273; [65 13, 05, 05]
+1294; [64 0D 0C, 05, 05]
 
-1274; [65 15, 05, 05]
+1295; [64 0D 14, 05, 05]
 
-1275; [65 17, 05, 05]
+1296; [64 0D 1C, 05, 05]
 
-1276; [65 19, 05, 05]
+1297; [64 0D 24, 05, 05]
 
-1277; [65 1B, 05, 05]
+2D88; [64 0D 2C, 05, 05]
 
-2D86; [65 1D, 05, 05]
+1298; [64 0D 34, 05, 05]
 
-1278; [65 1F, 05, 05]
+1299; [64 0D 3C, 05, 05]
 
-1279; [65 21, 05, 05]
+129A; [64 0D 44, 05, 05]
 
-127A; [65 23, 05, 05]
+129B; [64 0D 4C, 05, 05]
 
-127B; [65 25, 05, 05]
+129C; [64 0D 54, 05, 05]
 
-127C; [65 27, 05, 05]
+129D; [64 0D 5C, 05, 05]
 
-127D; [65 29, 05, 05]
+129E; [64 0D 64, 05, 05]
 
-127E; [65 2B, 05, 05]
+129F; [64 0D 6C, 05, 05]
 
-127F; [65 2D, 05, 05]
+2D89; [64 0D 74, 05, 05]
 
-2D87; [65 2F, 05, 05]
+12A0; [64 0D 7C, 05, 05]
 
-1280; [65 31, 05, 05]
+12A1; [64 0D 84, 05, 05]
 
-1281; [65 33, 05, 05]
+12A2; [64 0D 8C, 05, 05]
 
-1282; [65 35, 05, 05]
+12A3; [64 0D 94, 05, 05]
 
-1283; [65 37, 05, 05]
+12A4; [64 0D 9C, 05, 05]
 
-1284; [65 39, 05, 05]
+12A5; [64 0D A4, 05, 05]
 
-1285; [65 3B, 05, 05]
+12A6; [64 0D AC, 05, 05]
 
-1286; [65 3D, 05, 05]
+12A7; [64 0D B4, 05, 05]
 
-1287; [65 3F, 05, 05]
+2D8A; [64 0D BC, 05, 05]
 
-1288; [65 41, 05, 05]
+12A8; [64 0D C4, 05, 05]
 
-128A; [65 43, 05, 05]
+12A9; [64 0D CC, 05, 05]
 
-128B; [65 45, 05, 05]
+12AA; [64 0D D4, 05, 05]
 
-128C; [65 47, 05, 05]
+12AB; [64 0D DC, 05, 05]
 
-128D; [65 49, 05, 05]
+12AC; [64 0D E4, 05, 05]
 
-1290; [65 4B, 05, 05]
+12AD; [64 0D EC, 05, 05]
 
-1291; [65 4D, 05, 05]
+12AE; [64 0D F4, 05, 05]
 
-1292; [65 4F, 05, 05]
+12AF; [64 0D FC, 05, 05]
 
-1293; [65 51, 05, 05]
+12B0; [64 0E 06, 05, 05]
 
-1294; [65 53, 05, 05]
+12B2; [64 0E 0E, 05, 05]
 
-1295; [65 55, 05, 05]
+12B3; [64 0E 16, 05, 05]
 
-1296; [65 57, 05, 05]
+12B4; [64 0E 1E, 05, 05]
 
-1297; [65 59, 05, 05]
+12B5; [64 0E 26, 05, 05]
 
-2D88; [65 5B, 05, 05]
+12B8; [64 0E 2E, 05, 05]
 
-1298; [65 5D, 05, 05]
+12B9; [64 0E 36, 05, 05]
 
-1299; [65 5F, 05, 05]
+12BA; [64 0E 3E, 05, 05]
 
-129A; [65 61, 05, 05]
+12BB; [64 0E 46, 05, 05]
 
-129B; [65 63, 05, 05]
+12BC; [64 0E 4E, 05, 05]
 
-129C; [65 65, 05, 05]
+12BD; [64 0E 56, 05, 05]
 
-129D; [65 67, 05, 05]
+12BE; [64 0E 5E, 05, 05]
 
-129E; [65 69, 05, 05]
+12C0; [64 0E 66, 05, 05]
 
-129F; [65 6B, 05, 05]
+12C2; [64 0E 6E, 05, 05]
 
-2D89; [65 6D, 05, 05]
+12C3; [64 0E 76, 05, 05]
 
-12A0; [65 6F, 05, 05]
+12C4; [64 0E 7E, 05, 05]
 
-12A1; [65 71, 05, 05]
+12C5; [64 0E 86, 05, 05]
 
-12A2; [65 73, 05, 05]
+12C8; [64 0E 8E, 05, 05]
 
-12A3; [65 75, 05, 05]
+12C9; [64 0E 96, 05, 05]
 
-12A4; [65 77, 05, 05]
+12CA; [64 0E 9E, 05, 05]
 
-12A5; [65 79, 05, 05]
+12CB; [64 0E A6, 05, 05]
 
-12A6; [65 7B, 05, 05]
+12CC; [64 0E AE, 05, 05]
 
-12A7; [65 7D, 05, 05]
+12CD; [64 0E B6, 05, 05]
 
-2D8A; [65 7F, 05, 05]
+12CE; [64 0E BE, 05, 05]
 
-12A8; [65 81, 05, 05]
+12CF; [64 0E C6, 05, 05]
 
-12A9; [65 83, 05, 05]
+12D0; [64 0E CE, 05, 05]
 
-12AA; [65 85, 05, 05]
+12D1; [64 0E D6, 05, 05]
 
-12AB; [65 87, 05, 05]
+12D2; [64 0E DE, 05, 05]
 
-12AC; [65 89, 05, 05]
+12D3; [64 0E E6, 05, 05]
 
-12AD; [65 8B, 05, 05]
+12D4; [64 0E EE, 05, 05]
 
-12AE; [65 8D, 05, 05]
+12D5; [64 0E F6, 05, 05]
 
-12AF; [65 8F, 05, 05]
+12D6; [64 0E FE, 05, 05]
 
-12B0; [65 91, 05, 05]
+12D8; [64 0F 08, 05, 05]
 
-12B2; [65 93, 05, 05]
+12D9; [64 0F 10, 05, 05]
 
-12B3; [65 95, 05, 05]
+12DA; [64 0F 18, 05, 05]
 
-12B4; [65 97, 05, 05]
+12DB; [64 0F 20, 05, 05]
 
-12B5; [65 99, 05, 05]
+12DC; [64 0F 28, 05, 05]
 
-12B8; [65 9B, 05, 05]
+12DD; [64 0F 30, 05, 05]
 
-12B9; [65 9D, 05, 05]
+12DE; [64 0F 38, 05, 05]
 
-12BA; [65 9F, 05, 05]
+12DF; [64 0F 40, 05, 05]
 
-12BB; [65 A1, 05, 05]
+2D8B; [64 0F 48, 05, 05]
 
-12BC; [65 A3, 05, 05]
+AB11; [64 0F 50, 05, 05]
 
-12BD; [65 A5, 05, 05]
+AB12; [64 0F 58, 05, 05]
 
-12BE; [65 A7, 05, 05]
+AB13; [64 0F 60, 05, 05]
 
-12C0; [65 A9, 05, 05]
+AB14; [64 0F 68, 05, 05]
 
-12C2; [65 AB, 05, 05]
+AB15; [64 0F 70, 05, 05]
 
-12C3; [65 AD, 05, 05]
+AB16; [64 0F 78, 05, 05]
 
-12C4; [65 AF, 05, 05]
+12E0; [64 0F 80, 05, 05]
 
-12C5; [65 B1, 05, 05]
+12E1; [64 0F 88, 05, 05]
 
-12C8; [65 B3, 05, 05]
+12E2; [64 0F 90, 05, 05]
 
-12C9; [65 B5, 05, 05]
+12E3; [64 0F 98, 05, 05]
 
-12CA; [65 B7, 05, 05]
+12E4; [64 0F A0, 05, 05]
 
-12CB; [65 B9, 05, 05]
+12E5; [64 0F A8, 05, 05]
 
-12CC; [65 BB, 05, 05]
+12E6; [64 0F B0, 05, 05]
 
-12CD; [65 BD, 05, 05]
+12E7; [64 0F B8, 05, 05]
 
-12CE; [65 BF, 05, 05]
+12E8; [64 0F C0, 05, 05]
 
-12CF; [65 C1, 05, 05]
+12E9; [64 0F C8, 05, 05]
 
-12D0; [65 C3, 05, 05]
+12EA; [64 0F D0, 05, 05]
 
-12D1; [65 C5, 05, 05]
+12EB; [64 0F D8, 05, 05]
 
-12D2; [65 C7, 05, 05]
+12EC; [64 0F E0, 05, 05]
 
-12D3; [65 C9, 05, 05]
+12ED; [64 0F E8, 05, 05]
 
-12D4; [65 CB, 05, 05]
+12EE; [64 0F F0, 05, 05]
 
-12D5; [65 CD, 05, 05]
+12EF; [64 0F F8, 05, 05]
 
-12D6; [65 CF, 05, 05]
+12F0; [64 10 02, 05, 05]
 
-12D8; [65 D1, 05, 05]
+12F1; [64 10 0A, 05, 05]
 
-12D9; [65 D3, 05, 05]
+12F2; [64 10 12, 05, 05]
 
-12DA; [65 D5, 05, 05]
+12F3; [64 10 1A, 05, 05]
 
-12DB; [65 D7, 05, 05]
+12F4; [64 10 22, 05, 05]
 
-12DC; [65 D9, 05, 05]
+12F5; [64 10 2A, 05, 05]
 
-12DD; [65 DB, 05, 05]
+12F6; [64 10 32, 05, 05]
 
-12DE; [65 DD, 05, 05]
+12F7; [64 10 3A, 05, 05]
 
-12DF; [65 DF, 05, 05]
+2D8C; [64 10 42, 05, 05]
 
-2D8B; [65 E1, 05, 05]
+AB09; [64 10 4A, 05, 05]
 
-AB11; [65 E3, 05, 05]
+AB0A; [64 10 52, 05, 05]
 
-AB12; [65 E5, 05, 05]
+AB0B; [64 10 5A, 05, 05]
 
-AB13; [65 E7, 05, 05]
+AB0C; [64 10 62, 05, 05]
 
-AB14; [65 E9, 05, 05]
+AB0D; [64 10 6A, 05, 05]
 
-AB15; [65 EB, 05, 05]
+AB0E; [64 10 72, 05, 05]
 
-AB16; [65 ED, 05, 05]
+12F8; [64 10 7A, 05, 05]
 
-12E0; [65 EF, 05, 05]
+12F9; [64 10 82, 05, 05]
 
-12E1; [65 F1, 05, 05]
+12FA; [64 10 8A, 05, 05]
 
-12E2; [65 F3, 05, 05]
+12FB; [64 10 92, 05, 05]
 
-12E3; [65 F5, 05, 05]
+12FC; [64 10 9A, 05, 05]
 
-12E4; [65 F7, 05, 05]
+12FD; [64 10 A2, 05, 05]
 
-12E5; [65 F9, 05, 05]
+12FE; [64 10 AA, 05, 05]
 
-12E6; [65 FB, 05, 05]
+12FF; [64 10 B2, 05, 05]
 
-12E7; [66 06, 05, 05]
+2D8D; [64 10 BA, 05, 05]
 
-12E8; [66 08, 05, 05]
+1300; [64 10 C2, 05, 05]
 
-12E9; [66 0A, 05, 05]
+1301; [64 10 CA, 05, 05]
 
-12EA; [66 0C, 05, 05]
+1302; [64 10 D2, 05, 05]
 
-12EB; [66 0E, 05, 05]
+1303; [64 10 DA, 05, 05]
 
-12EC; [66 10, 05, 05]
+1304; [64 10 E2, 05, 05]
 
-12ED; [66 12, 05, 05]
+1305; [64 10 EA, 05, 05]
 
-12EE; [66 14, 05, 05]
+1306; [64 10 F2, 05, 05]
 
-12EF; [66 16, 05, 05]
+1307; [64 10 FA, 05, 05]
 
-12F0; [66 18, 05, 05]
+2D8E; [64 11 04, 05, 05]
 
-12F1; [66 1A, 05, 05]
+1308; [64 11 0C, 05, 05]
 
-12F2; [66 1C, 05, 05]
+1309; [64 11 14, 05, 05]
 
-12F3; [66 1E, 05, 05]
+130A; [64 11 1C, 05, 05]
 
-12F4; [66 20, 05, 05]
+130B; [64 11 24, 05, 05]
 
-12F5; [66 22, 05, 05]
+130C; [64 11 2C, 05, 05]
 
-12F6; [66 24, 05, 05]
+130D; [64 11 34, 05, 05]
 
-12F7; [66 26, 05, 05]
+130E; [64 11 3C, 05, 05]
 
-2D8C; [66 28, 05, 05]
+130F; [64 11 44, 05, 05]
 
-AB09; [66 2A, 05, 05]
+1310; [64 11 4C, 05, 05]
 
-AB0A; [66 2C, 05, 05]
+1312; [64 11 54, 05, 05]
 
-AB0B; [66 2E, 05, 05]
+1313; [64 11 5C, 05, 05]
 
-AB0C; [66 30, 05, 05]
+1314; [64 11 64, 05, 05]
 
-AB0D; [66 32, 05, 05]
+1315; [64 11 6C, 05, 05]
 
-AB0E; [66 34, 05, 05]
+1318; [64 11 74, 05, 05]
 
-12F8; [66 36, 05, 05]
+1319; [64 11 7C, 05, 05]
 
-12F9; [66 38, 05, 05]
+131A; [64 11 84, 05, 05]
 
-12FA; [66 3A, 05, 05]
+131B; [64 11 8C, 05, 05]
 
-12FB; [66 3C, 05, 05]
+131C; [64 11 94, 05, 05]
 
-12FC; [66 3E, 05, 05]
+131D; [64 11 9C, 05, 05]
 
-12FD; [66 40, 05, 05]
+131E; [64 11 A4, 05, 05]
 
-12FE; [66 42, 05, 05]
+131F; [64 11 AC, 05, 05]
 
-12FF; [66 44, 05, 05]
+2D93; [64 11 B4, 05, 05]
 
-2D8D; [66 46, 05, 05]
+2D94; [64 11 BC, 05, 05]
 
-1300; [66 48, 05, 05]
+2D95; [64 11 C4, 05, 05]
 
-1301; [66 4A, 05, 05]
+2D96; [64 11 CC, 05, 05]
 
-1302; [66 4C, 05, 05]
+1320; [64 11 D4, 05, 05]
 
-1303; [66 4E, 05, 05]
+1321; [64 11 DC, 05, 05]
 
-1304; [66 50, 05, 05]
+1322; [64 11 E4, 05, 05]
 
-1305; [66 52, 05, 05]
+1323; [64 11 EC, 05, 05]
 
-1306; [66 54, 05, 05]
+1324; [64 11 F4, 05, 05]
 
-1307; [66 56, 05, 05]
+1325; [64 11 FC, 05, 05]
 
-2D8E; [66 58, 05, 05]
+1326; [64 12 06, 05, 05]
 
-1308; [66 5A, 05, 05]
+1327; [64 12 0E, 05, 05]
 
-1309; [66 5C, 05, 05]
+2D8F; [64 12 16, 05, 05]
 
-130A; [66 5E, 05, 05]
+1328; [64 12 1E, 05, 05]
 
-130B; [66 60, 05, 05]
+1329; [64 12 26, 05, 05]
 
-130C; [66 62, 05, 05]
+132A; [64 12 2E, 05, 05]
 
-130D; [66 64, 05, 05]
+132B; [64 12 36, 05, 05]
 
-130E; [66 66, 05, 05]
+132C; [64 12 3E, 05, 05]
 
-130F; [66 68, 05, 05]
+132D; [64 12 46, 05, 05]
 
-1310; [66 6A, 05, 05]
+132E; [64 12 4E, 05, 05]
 
-1312; [66 6C, 05, 05]
+132F; [64 12 56, 05, 05]
 
-1313; [66 6E, 05, 05]
+2D90; [64 12 5E, 05, 05]
 
-1314; [66 70, 05, 05]
+AB20; [64 12 66, 05, 05]
 
-1315; [66 72, 05, 05]
+AB21; [64 12 6E, 05, 05]
 
-1318; [66 74, 05, 05]
+AB22; [64 12 76, 05, 05]
 
-1319; [66 76, 05, 05]
+AB23; [64 12 7E, 05, 05]
 
-131A; [66 78, 05, 05]
+AB24; [64 12 86, 05, 05]
 
-131B; [66 7A, 05, 05]
+AB25; [64 12 8E, 05, 05]
 
-131C; [66 7C, 05, 05]
+AB26; [64 12 96, 05, 05]
 
-131D; [66 7E, 05, 05]
+1330; [64 12 9E, 05, 05]
 
-131E; [66 80, 05, 05]
+1331; [64 12 A6, 05, 05]
 
-131F; [66 82, 05, 05]
+1332; [64 12 AE, 05, 05]
 
-2D93; [66 84, 05, 05]
+1333; [64 12 B6, 05, 05]
 
-2D94; [66 86, 05, 05]
+1334; [64 12 BE, 05, 05]
 
-2D95; [66 88, 05, 05]
+1335; [64 12 C6, 05, 05]
 
-2D96; [66 8A, 05, 05]
+1336; [64 12 CE, 05, 05]
 
-1320; [66 8C, 05, 05]
+1337; [64 12 D6, 05, 05]
 
-1321; [66 8E, 05, 05]
+2D91; [64 12 DE, 05, 05]
 
-1322; [66 90, 05, 05]
+1338; [64 12 E6, 05, 05]
 
-1323; [66 92, 05, 05]
+1339; [64 12 EE, 05, 05]
 
-1324; [66 94, 05, 05]
+133A; [64 12 F6, 05, 05]
 
-1325; [66 96, 05, 05]
+133B; [64 12 FE, 05, 05]
 
-1326; [66 98, 05, 05]
+133C; [64 13 08, 05, 05]
 
-1327; [66 9A, 05, 05]
+133D; [64 13 10, 05, 05]
 
-2D8F; [66 9C, 05, 05]
+133E; [64 13 18, 05, 05]
 
-1328; [66 9E, 05, 05]
+133F; [64 13 20, 05, 05]
 
-1329; [66 A0, 05, 05]
+AB28; [64 13 28, 05, 05]
 
-132A; [66 A2, 05, 05]
+AB29; [64 13 30, 05, 05]
 
-132B; [66 A4, 05, 05]
+AB2A; [64 13 38, 05, 05]
 
-132C; [66 A6, 05, 05]
+AB2B; [64 13 40, 05, 05]
 
-132D; [66 A8, 05, 05]
+AB2C; [64 13 48, 05, 05]
 
-132E; [66 AA, 05, 05]
+AB2D; [64 13 50, 05, 05]
 
-132F; [66 AC, 05, 05]
+AB2E; [64 13 58, 05, 05]
 
-2D90; [66 AE, 05, 05]
+1340; [64 13 60, 05, 05]
 
-AB20; [66 B0, 05, 05]
+1341; [64 13 68, 05, 05]
 
-AB21; [66 B2, 05, 05]
+1342; [64 13 70, 05, 05]
 
-AB22; [66 B4, 05, 05]
+1343; [64 13 78, 05, 05]
 
-AB23; [66 B6, 05, 05]
+1344; [64 13 80, 05, 05]
 
-AB24; [66 B8, 05, 05]
+1345; [64 13 88, 05, 05]
 
-AB25; [66 BA, 05, 05]
+1346; [64 13 90, 05, 05]
 
-AB26; [66 BC, 05, 05]
+1347; [64 13 98, 05, 05]
 
-1330; [66 BE, 05, 05]
+1348; [64 13 A0, 05, 05]
 
-1331; [66 C0, 05, 05]
+1349; [64 13 A8, 05, 05]
 
-1332; [66 C2, 05, 05]
+134A; [64 13 B0, 05, 05]
 
-1333; [66 C4, 05, 05]
+134B; [64 13 B8, 05, 05]
 
-1334; [66 C6, 05, 05]
+134C; [64 13 C0, 05, 05]
 
-1335; [66 C8, 05, 05]
+134D; [64 13 C8, 05, 05]
 
-1336; [66 CA, 05, 05]
+134E; [64 13 D0, 05, 05]
 
-1337; [66 CC, 05, 05]
+134F; [64 13 D8, 05, 05]
 
-2D91; [66 CE, 05, 05]
+1388; [64 13 E0, 05, 05]
 
-1338; [66 D0, 05, 05]
+1389; [64 13 E8, 05, 05]
 
-1339; [66 D2, 05, 05]
+138A; [64 13 F0, 05, 05]
 
-133A; [66 D4, 05, 05]
+138B; [64 13 F8, 05, 05]
 
-133B; [66 D6, 05, 05]
+1350; [64 14 02, 05, 05]
 
-133C; [66 D8, 05, 05]
+1351; [64 14 0A, 05, 05]
 
-133D; [66 DA, 05, 05]
+1352; [64 14 12, 05, 05]
 
-133E; [66 DC, 05, 05]
+1353; [64 14 1A, 05, 05]
 
-133F; [66 DE, 05, 05]
+1354; [64 14 22, 05, 05]
 
-AB28; [66 E0, 05, 05]
+1355; [64 14 2A, 05, 05]
 
-AB29; [66 E2, 05, 05]
+1356; [64 14 32, 05, 05]
 
-AB2A; [66 E4, 05, 05]
+1357; [64 14 3A, 05, 05]
 
-AB2B; [66 E6, 05, 05]
+138C; [64 14 42, 05, 05]
 
-AB2C; [66 E8, 05, 05]
+138D; [64 14 4A, 05, 05]
 
-AB2D; [66 EA, 05, 05]
+138E; [64 14 52, 05, 05]
 
-AB2E; [66 EC, 05, 05]
+138F; [64 14 5A, 05, 05]
 
-1340; [66 EE, 05, 05]
+2D92; [64 14 62, 05, 05]
 
-1341; [66 F0, 05, 05]
+1358; [64 14 6A, 05, 05]
 
-1342; [66 F2, 05, 05]
+1359; [64 14 72, 05, 05]
 
-1343; [66 F4, 05, 05]
+135A; [64 14 7A, 05, 05]
 
-1344; [66 F6, 05, 05]
+2DA0; [64 14 82, 05, 05]
 
-1345; [66 F8, 05, 05]
+2DA1; [64 14 8A, 05, 05]
 
-1346; [66 FA, 05, 05]
+2DA2; [64 14 92, 05, 05]
 
-1347; [67 05, 05, 05]
+2DA3; [64 14 9A, 05, 05]
 
-1348; [67 07, 05, 05]
+2DA4; [64 14 A2, 05, 05]
 
-1349; [67 09, 05, 05]
+2DA5; [64 14 AA, 05, 05]
 
-134A; [67 0B, 05, 05]
+2DA6; [64 14 B2, 05, 05]
 
-134B; [67 0D, 05, 05]
+2DA8; [64 14 BA, 05, 05]
 
-134C; [67 0F, 05, 05]
+2DA9; [64 14 C2, 05, 05]
 
-134D; [67 11, 05, 05]
+2DAA; [64 14 CA, 05, 05]
 
-134E; [67 13, 05, 05]
+2DAB; [64 14 D2, 05, 05]
 
-134F; [67 15, 05, 05]
+2DAC; [64 14 DA, 05, 05]
 
-1388; [67 17, 05, 05]
+2DAD; [64 14 E2, 05, 05]
 
-1389; [67 19, 05, 05]
+2DAE; [64 14 EA, 05, 05]
 
-138A; [67 1B, 05, 05]
+2DB0; [64 14 F2, 05, 05]
 
-138B; [67 1D, 05, 05]
+2DB1; [64 14 FA, 05, 05]
 
-1350; [67 1F, 05, 05]
+2DB2; [64 15 04, 05, 05]
 
-1351; [67 21, 05, 05]
+2DB3; [64 15 0C, 05, 05]
 
-1352; [67 23, 05, 05]
+2DB4; [64 15 14, 05, 05]
 
-1353; [67 25, 05, 05]
+2DB5; [64 15 1C, 05, 05]
 
-1354; [67 27, 05, 05]
+2DB6; [64 15 24, 05, 05]
 
-1355; [67 29, 05, 05]
+2DB8; [64 15 2C, 05, 05]
 
-1356; [67 2B, 05, 05]
+2DB9; [64 15 34, 05, 05]
 
-1357; [67 2D, 05, 05]
+2DBA; [64 15 3C, 05, 05]
 
-138C; [67 2F, 05, 05]
+2DBB; [64 15 44, 05, 05]
 
-138D; [67 31, 05, 05]
+2DBC; [64 15 4C, 05, 05]
 
-138E; [67 33, 05, 05]
+2DBD; [64 15 54, 05, 05]
 
-138F; [67 35, 05, 05]
+2DBE; [64 15 5C, 05, 05]
 
-2D92; [67 37, 05, 05]
+2DC0; [64 15 64, 05, 05]
 
-1358; [67 39, 05, 05]
+2DC1; [64 15 6C, 05, 05]
 
-1359; [67 3B, 05, 05]
+2DC2; [64 15 74, 05, 05]
 
-135A; [67 3D, 05, 05]
+2DC3; [64 15 7C, 05, 05]
 
-2DA0; [67 3F, 05, 05]
+2DC4; [64 15 84, 05, 05]
 
-2DA1; [67 41, 05, 05]
+2DC5; [64 15 8C, 05, 05]
 
-2DA2; [67 43, 05, 05]
+2DC6; [64 15 94, 05, 05]
 
-2DA3; [67 45, 05, 05]
+2DC8; [64 15 9C, 05, 05]
 
-2DA4; [67 47, 05, 05]
+2DC9; [64 15 A4, 05, 05]
 
-2DA5; [67 49, 05, 05]
+2DCA; [64 15 AC, 05, 05]
 
-2DA6; [67 4B, 05, 05]
+2DCB; [64 15 B4, 05, 05]
 
-2DA8; [67 4D, 05, 05]
+2DCC; [64 15 BC, 05, 05]
 
-2DA9; [67 4F, 05, 05]
+2DCD; [64 15 C4, 05, 05]
 
-2DAA; [67 51, 05, 05]
+2DCE; [64 15 CC, 05, 05]
 
-2DAB; [67 53, 05, 05]
+2DD0; [64 15 D4, 05, 05]
 
-2DAC; [67 55, 05, 05]
+2DD1; [64 15 DC, 05, 05]
 
-2DAD; [67 57, 05, 05]
+2DD2; [64 15 E4, 05, 05]
 
-2DAE; [67 59, 05, 05]
+2DD3; [64 15 EC, 05, 05]
 
-2DB0; [67 5B, 05, 05]
+2DD4; [64 15 F4, 05, 05]
 
-2DB1; [67 5D, 05, 05]
+2DD5; [64 15 FC, 05, 05]
 
-2DB2; [67 5F, 05, 05]
+2DD6; [64 16 06, 05, 05]
 
-2DB3; [67 61, 05, 05]
+2DD8; [64 16 0E, 05, 05]
 
-2DB4; [67 63, 05, 05]
+2DD9; [64 16 16, 05, 05]
 
-2DB5; [67 65, 05, 05]
+2DDA; [64 16 1E, 05, 05]
 
-2DB6; [67 67, 05, 05]
+2DDB; [64 16 26, 05, 05]
 
-2DB8; [67 69, 05, 05]
+2DDC; [64 16 2E, 05, 05]
 
-2DB9; [67 6B, 05, 05]
+2DDD; [64 16 36, 05, 05]
 
-2DBA; [67 6D, 05, 05]
+2DDE; [64 16 3E, 05, 05]
 
-2DBB; [67 6F, 05, 05]
+FDD1 0905;     [65 04 02, 05, 05]      # DEVANAGARI first primary starts reordering group (compressible)
 
-2DBC; [67 71, 05, 05]
+0950; [65 09, 05, 05]
 
-2DBD; [67 73, 05, 05]
+0972; [65 0B, 05, 05]
 
-2DBE; [67 75, 05, 05]
+0904; [65 0D, 05, 05]
 
-2DC0; [67 77, 05, 05]
+0905; [65 0F, 05, 05]
 
-2DC1; [67 79, 05, 05]
+0906; [65 11, 05, 05]
 
-2DC2; [67 7B, 05, 05]
+0973; [65 13, 05, 05]
 
-2DC3; [67 7D, 05, 05]
+0974; [65 15, 05, 05]
 
-2DC4; [67 7F, 05, 05]
+0975; [65 17, 05, 05]
 
-2DC5; [67 81, 05, 05]
+0976; [65 19, 05, 05]
 
-2DC6; [67 83, 05, 05]
+0977; [65 1B, 05, 05]
 
-2DC8; [67 85, 05, 05]
+0907; [65 1D, 05, 05]
 
-2DC9; [67 87, 05, 05]
+0908; [65 1F, 05, 05]
 
-2DCA; [67 89, 05, 05]
+0909; [65 21, 05, 05]
 
-2DCB; [67 8B, 05, 05]
+090A; [65 23, 05, 05]
 
-2DCC; [67 8D, 05, 05]
+090B; [65 25, 05, 05]
 
-2DCD; [67 8F, 05, 05]
+0960; [65 27, 05, 05]
 
-2DCE; [67 91, 05, 05]
+090C; [65 29, 05, 05]
 
-2DD0; [67 93, 05, 05]
+0961; [65 2B, 05, 05]
 
-2DD1; [67 95, 05, 05]
+090D; [65 2D, 05, 05]
 
-2DD2; [67 97, 05, 05]
+090E; [65 2F, 05, 05]
 
-2DD3; [67 99, 05, 05]
+090F; [65 31, 05, 05]
 
-2DD4; [67 9B, 05, 05]
+0910; [65 33, 05, 05]
 
-2DD5; [67 9D, 05, 05]
+0911; [65 35, 05, 05]
 
-2DD6; [67 9F, 05, 05]
+0912; [65 37, 05, 05]
 
-2DD8; [67 A1, 05, 05]
+0913; [65 39, 05, 05]
 
-2DD9; [67 A3, 05, 05]
+0914; [65 3B, 05, 05]
 
-2DDA; [67 A5, 05, 05]
+0915; [65 3D, 05, 05]
+0958; [65 3D, 05, 05][, F2 7A, 05]
 
-2DDB; [67 A7, 05, 05]
+0916; [65 3F, 05, 05]
+0959; [65 3F, 05, 05][, F2 7A, 05]
 
-2DDC; [67 A9, 05, 05]
+0917; [65 41, 05, 05]
+095A; [65 41, 05, 05][, F2 7A, 05]
 
-2DDD; [67 AB, 05, 05]
+097B; [65 43, 05, 05]
 
-2DDE; [67 AD, 05, 05]
+0918; [65 45, 05, 05]
 
-0950; [68 0A, 05, 05]
+0919; [65 47, 05, 05]
 
-0972; [68 0C, 05, 05]
+091A; [65 49, 05, 05]
 
-0904; [68 0E, 05, 05]
+091B; [65 4B, 05, 05]
 
-0905; [68 10, 05, 05]
+091C; [65 4D, 05, 05]
+095B; [65 4D, 05, 05][, F2 7A, 05]
 
-0906; [68 12, 05, 05]
+0979; [65 4F, 05, 05]
 
-0973; [68 14, 05, 05]
+097C; [65 51, 05, 05]
 
-0974; [68 16, 05, 05]
+091D; [65 53, 05, 05]
 
-0975; [68 18, 05, 05]
+091E; [65 55, 05, 05]
 
-0976; [68 1A, 05, 05]
+091F; [65 57, 05, 05]
 
-0977; [68 1C, 05, 05]
+0920; [65 59, 05, 05]
 
-0907; [68 1E, 05, 05]
+0921; [65 5B, 05, 05]
+095C; [65 5B, 05, 05][, F2 7A, 05]
 
-0908; [68 20, 05, 05]
+097E; [65 5D, 05, 05]
 
-0909; [68 22, 05, 05]
+0922; [65 5F, 05, 05]
+095D; [65 5F, 05, 05][, F2 7A, 05]
 
-090A; [68 24, 05, 05]
+0923; [65 61, 05, 05]
 
-090B; [68 26, 05, 05]
+0924; [65 63, 05, 05]
 
-0960; [68 28, 05, 05]
+0925; [65 65, 05, 05]
 
-090C; [68 2A, 05, 05]
+0926; [65 67, 05, 05]
 
-0961; [68 2C, 05, 05]
+0927; [65 69, 05, 05]
 
-090D; [68 2E, 05, 05]
+0928; [65 6B, 05, 05]
+0929; [65 6B, 05, 05][, F2 7A, 05]
 
-090E; [68 30, 05, 05]
+092A; [65 6D, 05, 05]
 
-090F; [68 32, 05, 05]
+092B; [65 6F, 05, 05]
+095E; [65 6F, 05, 05][, F2 7A, 05]
 
-0910; [68 34, 05, 05]
+092C; [65 71, 05, 05]
 
-0911; [68 36, 05, 05]
+097F; [65 73, 05, 05]
 
-0912; [68 38, 05, 05]
+092D; [65 75, 05, 05]
 
-0913; [68 3A, 05, 05]
+092E; [65 77, 05, 05]
 
-0914; [68 3C, 05, 05]
+092F; [65 79, 05, 05]
+095F; [65 79, 05, 05][, F2 7A, 05]
 
-0915; [68 3E, 05, 05]
-0958; [68 3E, 05, 05][, D7 19, 05]
+097A; [65 7B, 05, 05]
 
-0916; [68 40, 05, 05]
-0959; [68 40, 05, 05][, D7 19, 05]
+0930; [65 7D, 05, 05]
+0931; [65 7D, 05, 05][, F2 7A, 05]
 
-0917; [68 42, 05, 05]
-095A; [68 42, 05, 05][, D7 19, 05]
+0932; [65 7F, 05, 05]
 
-097B; [68 44, 05, 05]
+0933; [65 81, 05, 05]
+0934; [65 81, 05, 05][, F2 7A, 05]
 
-0918; [68 46, 05, 05]
+0935; [65 83, 05, 05]
 
-0919; [68 48, 05, 05]
+0936; [65 85, 05, 05]
 
-091A; [68 4A, 05, 05]
+0937; [65 87, 05, 05]
 
-091B; [68 4C, 05, 05]
+0938; [65 89, 05, 05]
 
-091C; [68 4E, 05, 05]
-095B; [68 4E, 05, 05][, D7 19, 05]
+0939; [65 8B, 05, 05]
 
-0979; [68 50, 05, 05]
+093D; [65 8D, 05, 05]
 
-097C; [68 52, 05, 05]
+097D; [65 8F, 05, 05]
 
-091D; [68 54, 05, 05]
+1CE9; [65 91, 05, 05]
+1CEA; [65 91, 05, 20]
+1CEB; [65 91, 05, 20]
+1CEC; [65 91, 05, 20]
+1CEE; [65 91, 05, 20]
+1CEF; [65 91, 05, 20]
+1CF0; [65 91, 05, 20]
+1CF1; [65 91, 05, 20]
 
-091E; [68 56, 05, 05]
+1CF5; [65 93, 05, 05]
 
-091F; [68 58, 05, 05]
+1CF6; [65 95, 05, 05]
 
-0920; [68 5A, 05, 05]
+A8F2; [65 97, 05, 05]
+A8F3; [65 97, 05, 20]
+A8F4; [65 97, 05, 20]
+A8F5; [65 97, 05, 20]
+A8F6; [65 97, 05, 20]
+A8F7; [65 97, 05, 20]
 
-0921; [68 5C, 05, 05]
-095C; [68 5C, 05, 05][, D7 19, 05]
+A8FB; [65 99, 05, 05]
 
-097E; [68 5E, 05, 05]
+093E; [65 9B, 05, 05]
 
-0922; [68 60, 05, 05]
-095D; [68 60, 05, 05][, D7 19, 05]
+093A; [65 9D, 05, 05]
 
-0923; [68 62, 05, 05]
+093B; [65 9F, 05, 05]
 
-0924; [68 64, 05, 05]
+094F; [65 A1, 05, 05]
 
-0925; [68 66, 05, 05]
+0956; [65 A3, 05, 05]
 
-0926; [68 68, 05, 05]
+0957; [65 A5, 05, 05]
 
-0927; [68 6A, 05, 05]
+093F; [65 A7, 05, 05]
 
-0928; [68 6C, 05, 05]
-0929; [68 6C, 05, 05][, D7 19, 05]
+0940; [65 A9, 05, 05]
 
-092A; [68 6E, 05, 05]
+0941; [65 AB, 05, 05]
 
-092B; [68 70, 05, 05]
-095E; [68 70, 05, 05][, D7 19, 05]
+0942; [65 AD, 05, 05]
 
-092C; [68 72, 05, 05]
+0943; [65 AF, 05, 05]
 
-097F; [68 74, 05, 05]
+0944; [65 B1, 05, 05]
 
-092D; [68 76, 05, 05]
+0962; [65 B3, 05, 05]
 
-092E; [68 78, 05, 05]
+0963; [65 B5, 05, 05]
 
-092F; [68 7A, 05, 05]
-095F; [68 7A, 05, 05][, D7 19, 05]
+0945; [65 B7, 05, 05]
 
-097A; [68 7C, 05, 05]
+0955; [65 B9, 05, 05]
 
-0930; [68 7E, 05, 05]
-0931; [68 7E, 05, 05][, D7 19, 05]
+0946; [65 BB, 05, 05]
 
-0932; [68 80, 05, 05]
+0947; [65 BD, 05, 05]
 
-0933; [68 82, 05, 05]
-0934; [68 82, 05, 05][, D7 19, 05]
+094E; [65 BF, 05, 05]
 
-0935; [68 84, 05, 05]
+0948; [65 C1, 05, 05]
 
-0936; [68 86, 05, 05]
+0949; [65 C3, 05, 05]
 
-0937; [68 88, 05, 05]
+094A; [65 C5, 05, 05]
 
-0938; [68 8A, 05, 05]
+094B; [65 C7, 05, 05]
 
-0939; [68 8C, 05, 05]
+094C; [65 C9, 05, 05]
 
-093D; [68 8E, 05, 05]
+094D; [65 CB, 05, 05]
 
-097D; [68 90, 05, 05]
+FDD1 0995;     [66 04 02, 05, 05]      # BENGALI first primary starts reordering group (compressible)
 
-1CE9; [68 92, 05, 05]
-1CEA; [68 92, 05, 09]
-1CEB; [68 92, 05, 09]
-1CEC; [68 92, 05, 09]
-1CEE; [68 92, 05, 09]
-1CEF; [68 92, 05, 09]
-1CF0; [68 92, 05, 09]
-1CF1; [68 92, 05, 09]
+0985; [66 09, 05, 05]
 
-1CF5; [68 94, 05, 05]
+0986; [66 0B, 05, 05]
 
-1CF6; [68 96, 05, 05]
+0987; [66 0D, 05, 05]
 
-A8F2; [68 98, 05, 05]
-A8F3; [68 98, 05, 09]
-A8F4; [68 98, 05, 09]
-A8F5; [68 98, 05, 09]
-A8F6; [68 98, 05, 09]
-A8F7; [68 98, 05, 09]
+0988; [66 0F, 05, 05]
 
-A8FB; [68 9A, 05, 05]
+0989; [66 11, 05, 05]
 
-093E; [68 9C, 05, 05]
+098A; [66 13, 05, 05]
 
-093A; [68 9E, 05, 05]
+098B; [66 15, 05, 05]
 
-093B; [68 A0, 05, 05]
+09E0; [66 17, 05, 05]
 
-094F; [68 A2, 05, 05]
+098C; [66 19, 05, 05]
 
-0956; [68 A4, 05, 05]
+09E1; [66 1B, 05, 05]
 
-0957; [68 A6, 05, 05]
+098F; [66 1D, 05, 05]
 
-093F; [68 A8, 05, 05]
+0990; [66 1F, 05, 05]
 
-0940; [68 AA, 05, 05]
+0993; [66 21, 05, 05]
 
-0941; [68 AC, 05, 05]
+0994; [66 23, 05, 05]
 
-0942; [68 AE, 05, 05]
+0995; [66 25, 05, 05]
 
-0943; [68 B0, 05, 05]
+0996; [66 27, 05, 05]
 
-0944; [68 B2, 05, 05]
+0997; [66 29, 05, 05]
 
-0962; [68 B4, 05, 05]
+0998; [66 2B, 05, 05]
 
-0963; [68 B6, 05, 05]
+0999; [66 2D, 05, 05]
 
-0945; [68 B8, 05, 05]
+099A; [66 2F, 05, 05]
 
-0955; [68 BA, 05, 05]
+099B; [66 31, 05, 05]
 
-0946; [68 BC, 05, 05]
+099C; [66 33, 05, 05]
 
-0947; [68 BE, 05, 05]
+099D; [66 35, 05, 05]
 
-094E; [68 C0, 05, 05]
+099E; [66 37, 05, 05]
 
-0948; [68 C2, 05, 05]
+099F; [66 39, 05, 05]
 
-0949; [68 C4, 05, 05]
+09A0; [66 3B, 05, 05]
 
-094A; [68 C6, 05, 05]
+09A1; [66 3D, 05, 05]
+09DC; [66 3D, 05, 05][, F2 7A, 05]
 
-094B; [68 C8, 05, 05]
+09A2; [66 3F, 05, 05]
+09DD; [66 3F, 05, 05][, F2 7A, 05]
 
-094C; [68 CA, 05, 05]
+09A3; [66 41, 05, 05]
 
-094D; [68 CC, 05, 05]
+09A4; [66 43, 05, 05]
+09CE; [66 43, 05, 20][66 85, 05, 20]
 
-0985; [69 0A, 05, 05]
+09A5; [66 45, 05, 05]
 
-0986; [69 0C, 05, 05]
+09A6; [66 47, 05, 05]
 
-0987; [69 0E, 05, 05]
+09A7; [66 49, 05, 05]
 
-0988; [69 10, 05, 05]
+09A8; [66 4B, 05, 05]
 
-0989; [69 12, 05, 05]
+09AA; [66 4D, 05, 05]
 
-098A; [69 14, 05, 05]
+09AB; [66 4F, 05, 05]
 
-098B; [69 16, 05, 05]
+09AC; [66 51, 05, 05]
 
-09E0; [69 18, 05, 05]
+09AD; [66 53, 05, 05]
 
-098C; [69 1A, 05, 05]
+09AE; [66 55, 05, 05]
 
-09E1; [69 1C, 05, 05]
+09AF; [66 57, 05, 05]
+09DF; [66 57, 05, 05][, F2 7A, 05]
 
-098F; [69 1E, 05, 05]
+09B0; [66 59, 05, 05]
 
-0990; [69 20, 05, 05]
+09F0; [66 5B, 05, 05]
 
-0993; [69 22, 05, 05]
+09B2; [66 5D, 05, 05]
 
-0994; [69 24, 05, 05]
+09F1; [66 5F, 05, 05]
 
-0995; [69 26, 05, 05]
+09B6; [66 61, 05, 05]
 
-0996; [69 28, 05, 05]
+09B7; [66 63, 05, 05]
 
-0997; [69 2A, 05, 05]
+09B8; [66 65, 05, 05]
 
-0998; [69 2C, 05, 05]
+09B9; [66 67, 05, 05]
 
-0999; [69 2E, 05, 05]
+09BD; [66 69, 05, 05]
 
-099A; [69 30, 05, 05]
+09BE; [66 6B, 05, 05]
 
-099B; [69 32, 05, 05]
+09BF; [66 6D, 05, 05]
 
-099C; [69 34, 05, 05]
+09C0; [66 6F, 05, 05]
 
-099D; [69 36, 05, 05]
+09C1; [66 71, 05, 05]
 
-099E; [69 38, 05, 05]
+09C2; [66 73, 05, 05]
 
-099F; [69 3A, 05, 05]
+09C3; [66 75, 05, 05]
 
-09A0; [69 3C, 05, 05]
+09C4; [66 77, 05, 05]
 
-09A1; [69 3E, 05, 05]
-09DC; [69 3E, 05, 05][, D7 19, 05]
+09E2; [66 79, 05, 05]
 
-09A2; [69 40, 05, 05]
-09DD; [69 40, 05, 05][, D7 19, 05]
+09E3; [66 7B, 05, 05]
 
-09A3; [69 42, 05, 05]
+09C7; [66 7D, 05, 05]
 
-09A4; [69 44, 05, 05]
-09CE; [69 44, 05, 09][69 86, 05, 09]
+09C8; [66 7F, 05, 05]
 
-09A5; [69 46, 05, 05]
+09C7 09BE; [66 81, 05, 05]
+09CB; [66 81, 05, 05]
 
-09A6; [69 48, 05, 05]
+09C7 09D7; [66 83, 05, 05]
+09CC; [66 83, 05, 05]
 
-09A7; [69 4A, 05, 05]
+09CD; [66 85, 05, 05]
 
-09A8; [69 4C, 05, 05]
+09D7; [66 87, 05, 05]
 
-09AA; [69 4E, 05, 05]
+FDD1 0A15;     [67 04 02, 05, 05]      # GURMUKHI first primary starts reordering group (compressible)
 
-09AB; [69 50, 05, 05]
+0A74; [67 09, 05, 05]
 
-09AC; [69 52, 05, 05]
+0A73; [67 0B, 05, 05]
 
-09AD; [69 54, 05, 05]
+0A09; [67 0D, 05, 05]
 
-09AE; [69 56, 05, 05]
+0A0A; [67 0F, 05, 05]
 
-09AF; [69 58, 05, 05]
-09DF; [69 58, 05, 05][, D7 19, 05]
+0A13; [67 11, 05, 05]
 
-09B0; [69 5A, 05, 05]
+0A05; [67 13, 05, 05]
 
-09F0; [69 5C, 05, 05]
+0A06; [67 15, 05, 05]
 
-09B2; [69 5E, 05, 05]
+0A10; [67 17, 05, 05]
 
-09F1; [69 60, 05, 05]
+0A14; [67 19, 05, 05]
 
-09B6; [69 62, 05, 05]
+0A72; [67 1B, 05, 05]
 
-09B7; [69 64, 05, 05]
+0A07; [67 1D, 05, 05]
 
-09B8; [69 66, 05, 05]
+0A08; [67 1F, 05, 05]
 
-09B9; [69 68, 05, 05]
+0A0F; [67 21, 05, 05]
 
-09BD; [69 6A, 05, 05]
+0A38; [67 23, 05, 05]
+0A36; [67 23, 05, 05][, F2 7A, 05]
 
-09BE; [69 6C, 05, 05]
+0A39; [67 25, 05, 05]
 
-09BF; [69 6E, 05, 05]
+0A51; [67 27, 05, 05]
 
-09C0; [69 70, 05, 05]
+0A15; [67 29, 05, 05]
 
-09C1; [69 72, 05, 05]
+0A16; [67 2B, 05, 05]
+0A59; [67 2B, 05, 05][, F2 7A, 05]
 
-09C2; [69 74, 05, 05]
+0A17; [67 2D, 05, 05]
+0A5A; [67 2D, 05, 05][, F2 7A, 05]
 
-09C3; [69 76, 05, 05]
+0A18; [67 2F, 05, 05]
 
-09C4; [69 78, 05, 05]
+0A19; [67 31, 05, 05]
 
-09E2; [69 7A, 05, 05]
+0A1A; [67 33, 05, 05]
 
-09E3; [69 7C, 05, 05]
+0A1B; [67 35, 05, 05]
 
-09C7; [69 7E, 05, 05]
+0A1C; [67 37, 05, 05]
+0A5B; [67 37, 05, 05][, F2 7A, 05]
 
-09C8; [69 80, 05, 05]
+0A1D; [67 39, 05, 05]
 
-09C7 09BE; [69 82, 05, 05]
-09CB; [69 82, 05, 05]
+0A1E; [67 3B, 05, 05]
 
-09C7 09D7; [69 84, 05, 05]
-09CC; [69 84, 05, 05]
+0A1F; [67 3D, 05, 05]
 
-09CD; [69 86, 05, 05]
+0A20; [67 3F, 05, 05]
 
-09D7; [69 88, 05, 05]
+0A21; [67 41, 05, 05]
 
-0A74; [6A 0A, 05, 05]
+0A22; [67 43, 05, 05]
 
-0A73; [6A 0C, 05, 05]
+0A23; [67 45, 05, 05]
 
-0A09; [6A 0E, 05, 05]
+0A24; [67 47, 05, 05]
 
-0A0A; [6A 10, 05, 05]
+0A25; [67 49, 05, 05]
 
-0A13; [6A 12, 05, 05]
+0A26; [67 4B, 05, 05]
 
-0A05; [6A 14, 05, 05]
+0A27; [67 4D, 05, 05]
 
-0A06; [6A 16, 05, 05]
+0A28; [67 4F, 05, 05]
 
-0A10; [6A 18, 05, 05]
+0A2A; [67 51, 05, 05]
 
-0A14; [6A 1A, 05, 05]
+0A2B; [67 53, 05, 05]
+0A5E; [67 53, 05, 05][, F2 7A, 05]
 
-0A72; [6A 1C, 05, 05]
+0A2C; [67 55, 05, 05]
 
-0A07; [6A 1E, 05, 05]
+0A2D; [67 57, 05, 05]
 
-0A08; [6A 20, 05, 05]
+0A2E; [67 59, 05, 05]
 
-0A0F; [6A 22, 05, 05]
+0A2F; [67 5B, 05, 05]
 
-0A38; [6A 24, 05, 05]
-0A36; [6A 24, 05, 05][, D7 19, 05]
+0A75; [67 5D, 05, 05]
 
-0A39; [6A 26, 05, 05]
+0A30; [67 5F, 05, 05]
 
-0A51; [6A 28, 05, 05]
+0A32; [67 61, 05, 05]
+0A33; [67 61, 05, 05][, F2 7A, 05]
 
-0A15; [6A 2A, 05, 05]
+0A35; [67 63, 05, 05]
 
-0A16; [6A 2C, 05, 05]
-0A59; [6A 2C, 05, 05][, D7 19, 05]
+0A5C; [67 65, 05, 05]
 
-0A17; [6A 2E, 05, 05]
-0A5A; [6A 2E, 05, 05][, D7 19, 05]
+0A3E; [67 67, 05, 05]
 
-0A18; [6A 30, 05, 05]
+0A3F; [67 69, 05, 05]
 
-0A19; [6A 32, 05, 05]
+0A40; [67 6B, 05, 05]
 
-0A1A; [6A 34, 05, 05]
+0A41; [67 6D, 05, 05]
 
-0A1B; [6A 36, 05, 05]
+0A42; [67 6F, 05, 05]
 
-0A1C; [6A 38, 05, 05]
-0A5B; [6A 38, 05, 05][, D7 19, 05]
+0A47; [67 71, 05, 05]
 
-0A1D; [6A 3A, 05, 05]
+0A48; [67 73, 05, 05]
 
-0A1E; [6A 3C, 05, 05]
+0A4B; [67 75, 05, 05]
 
-0A1F; [6A 3E, 05, 05]
+0A4C; [67 77, 05, 05]
 
-0A20; [6A 40, 05, 05]
+0A4D; [67 79, 05, 05]
 
-0A21; [6A 42, 05, 05]
+FDD1 0A95;     [68 04 02, 05, 05]      # GUJARATI first primary starts reordering group (compressible)
 
-0A22; [6A 44, 05, 05]
+0AD0; [68 09, 05, 05]
 
-0A23; [6A 46, 05, 05]
+0A85; [68 0B, 05, 05]
 
-0A24; [6A 48, 05, 05]
+0A86; [68 0D, 05, 05]
 
-0A25; [6A 4A, 05, 05]
+0A87; [68 0F, 05, 05]
 
-0A26; [6A 4C, 05, 05]
+0A88; [68 11, 05, 05]
 
-0A27; [6A 4E, 05, 05]
+0A89; [68 13, 05, 05]
 
-0A28; [6A 50, 05, 05]
+0A8A; [68 15, 05, 05]
 
-0A2A; [6A 52, 05, 05]
+0A8B; [68 17, 05, 05]
 
-0A2B; [6A 54, 05, 05]
-0A5E; [6A 54, 05, 05][, D7 19, 05]
+0AE0; [68 19, 05, 05]
 
-0A2C; [6A 56, 05, 05]
+0A8C; [68 1B, 05, 05]
 
-0A2D; [6A 58, 05, 05]
+0AE1; [68 1D, 05, 05]
 
-0A2E; [6A 5A, 05, 05]
+0A8D; [68 1F, 05, 05]
 
-0A2F; [6A 5C, 05, 05]
+0A8F; [68 21, 05, 05]
 
-0A75; [6A 5E, 05, 05]
+0A90; [68 23, 05, 05]
 
-0A30; [6A 60, 05, 05]
+0A91; [68 25, 05, 05]
 
-0A32; [6A 62, 05, 05]
-0A33; [6A 62, 05, 05][, D7 19, 05]
+0A93; [68 27, 05, 05]
 
-0A35; [6A 64, 05, 05]
+0A94; [68 29, 05, 05]
 
-0A5C; [6A 66, 05, 05]
+0A95; [68 2B, 05, 05]
 
-0A3E; [6A 68, 05, 05]
+0A96; [68 2D, 05, 05]
 
-0A3F; [6A 6A, 05, 05]
+0A97; [68 2F, 05, 05]
 
-0A40; [6A 6C, 05, 05]
+0A98; [68 31, 05, 05]
 
-0A41; [6A 6E, 05, 05]
+0A99; [68 33, 05, 05]
 
-0A42; [6A 70, 05, 05]
+0A9A; [68 35, 05, 05]
 
-0A47; [6A 72, 05, 05]
+0A9B; [68 37, 05, 05]
 
-0A48; [6A 74, 05, 05]
+0A9C; [68 39, 05, 05]
 
-0A4B; [6A 76, 05, 05]
+0A9D; [68 3B, 05, 05]
 
-0A4C; [6A 78, 05, 05]
+0A9E; [68 3D, 05, 05]
 
-0A4D; [6A 7A, 05, 05]
+0A9F; [68 3F, 05, 05]
 
-0AD0; [6B 0A, 05, 05]
+0AA0; [68 41, 05, 05]
 
-0A85; [6B 0C, 05, 05]
+0AA1; [68 43, 05, 05]
 
-0A86; [6B 0E, 05, 05]
+0AA2; [68 45, 05, 05]
 
-0A87; [6B 10, 05, 05]
+0AA3; [68 47, 05, 05]
 
-0A88; [6B 12, 05, 05]
+0AA4; [68 49, 05, 05]
 
-0A89; [6B 14, 05, 05]
+0AA5; [68 4B, 05, 05]
 
-0A8A; [6B 16, 05, 05]
+0AA6; [68 4D, 05, 05]
 
-0A8B; [6B 18, 05, 05]
+0AA7; [68 4F, 05, 05]
 
-0AE0; [6B 1A, 05, 05]
+0AA8; [68 51, 05, 05]
 
-0A8C; [6B 1C, 05, 05]
+0AAA; [68 53, 05, 05]
 
-0AE1; [6B 1E, 05, 05]
+0AAB; [68 55, 05, 05]
 
-0A8D; [6B 20, 05, 05]
+0AAC; [68 57, 05, 05]
 
-0A8F; [6B 22, 05, 05]
+0AAD; [68 59, 05, 05]
 
-0A90; [6B 24, 05, 05]
+0AAE; [68 5B, 05, 05]
 
-0A91; [6B 26, 05, 05]
+0AAF; [68 5D, 05, 05]
 
-0A93; [6B 28, 05, 05]
+0AB0; [68 5F, 05, 05]
 
-0A94; [6B 2A, 05, 05]
+0AB2; [68 61, 05, 05]
 
-0A95; [6B 2C, 05, 05]
+0AB5; [68 63, 05, 05]
 
-0A96; [6B 2E, 05, 05]
+0AB6; [68 65, 05, 05]
 
-0A97; [6B 30, 05, 05]
+0AB7; [68 67, 05, 05]
 
-0A98; [6B 32, 05, 05]
+0AB8; [68 69, 05, 05]
 
-0A99; [6B 34, 05, 05]
+0AB9; [68 6B, 05, 05]
 
-0A9A; [6B 36, 05, 05]
+0AB3; [68 6D, 05, 05]
 
-0A9B; [6B 38, 05, 05]
+0ABD; [68 6F, 05, 05]
 
-0A9C; [6B 3A, 05, 05]
+0ABE; [68 71, 05, 05]
 
-0A9D; [6B 3C, 05, 05]
+0ABF; [68 73, 05, 05]
 
-0A9E; [6B 3E, 05, 05]
+0AC0; [68 75, 05, 05]
 
-0A9F; [6B 40, 05, 05]
+0AC1; [68 77, 05, 05]
 
-0AA0; [6B 42, 05, 05]
+0AC2; [68 79, 05, 05]
 
-0AA1; [6B 44, 05, 05]
+0AC3; [68 7B, 05, 05]
 
-0AA2; [6B 46, 05, 05]
+0AC4; [68 7D, 05, 05]
 
-0AA3; [6B 48, 05, 05]
+0AE2; [68 7F, 05, 05]
 
-0AA4; [6B 4A, 05, 05]
+0AE3; [68 81, 05, 05]
 
-0AA5; [6B 4C, 05, 05]
+0AC5; [68 83, 05, 05]
 
-0AA6; [6B 4E, 05, 05]
+0AC7; [68 85, 05, 05]
 
-0AA7; [6B 50, 05, 05]
+0AC8; [68 87, 05, 05]
 
-0AA8; [6B 52, 05, 05]
+0AC9; [68 89, 05, 05]
 
-0AAA; [6B 54, 05, 05]
+0ACB; [68 8B, 05, 05]
 
-0AAB; [6B 56, 05, 05]
+0ACC; [68 8D, 05, 05]
 
-0AAC; [6B 58, 05, 05]
+0ACD; [68 8F, 05, 05]
 
-0AAD; [6B 5A, 05, 05]
+FDD1 0B15;     [69 04 02, 05, 05]      # ORIYA first primary starts reordering group (compressible)
 
-0AAE; [6B 5C, 05, 05]
+0B05; [69 09, 05, 05]
 
-0AAF; [6B 5E, 05, 05]
+0B06; [69 0B, 05, 05]
 
-0AB0; [6B 60, 05, 05]
+0B07; [69 0D, 05, 05]
 
-0AB2; [6B 62, 05, 05]
+0B08; [69 0F, 05, 05]
 
-0AB5; [6B 64, 05, 05]
+0B09; [69 11, 05, 05]
 
-0AB6; [6B 66, 05, 05]
+0B0A; [69 13, 05, 05]
 
-0AB7; [6B 68, 05, 05]
+0B0B; [69 15, 05, 05]
 
-0AB8; [6B 6A, 05, 05]
+0B60; [69 17, 05, 05]
 
-0AB9; [6B 6C, 05, 05]
+0B0C; [69 19, 05, 05]
 
-0AB3; [6B 6E, 05, 05]
+0B61; [69 1B, 05, 05]
 
-0ABD; [6B 70, 05, 05]
+0B0F; [69 1D, 05, 05]
 
-0ABE; [6B 72, 05, 05]
+0B10; [69 1F, 05, 05]
 
-0ABF; [6B 74, 05, 05]
+0B13; [69 21, 05, 05]
 
-0AC0; [6B 76, 05, 05]
+0B14; [69 23, 05, 05]
 
-0AC1; [6B 78, 05, 05]
+0B15; [69 25, 05, 05]
 
-0AC2; [6B 7A, 05, 05]
+0B16; [69 27, 05, 05]
 
-0AC3; [6B 7C, 05, 05]
+0B17; [69 29, 05, 05]
 
-0AC4; [6B 7E, 05, 05]
+0B18; [69 2B, 05, 05]
 
-0AE2; [6B 80, 05, 05]
+0B19; [69 2D, 05, 05]
 
-0AE3; [6B 82, 05, 05]
+0B1A; [69 2F, 05, 05]
 
-0AC5; [6B 84, 05, 05]
+0B1B; [69 31, 05, 05]
 
-0AC7; [6B 86, 05, 05]
+0B1C; [69 33, 05, 05]
 
-0AC8; [6B 88, 05, 05]
+0B1D; [69 35, 05, 05]
 
-0AC9; [6B 8A, 05, 05]
+0B1E; [69 37, 05, 05]
 
-0ACB; [6B 8C, 05, 05]
+0B1F; [69 39, 05, 05]
 
-0ACC; [6B 8E, 05, 05]
+0B20; [69 3B, 05, 05]
 
-0ACD; [6B 90, 05, 05]
+0B21; [69 3D, 05, 05]
+0B5C; [69 3D, 05, 05][, F2 7A, 05]
 
-0B05; [6C 0A, 05, 05]
+0B22; [69 3F, 05, 05]
+0B5D; [69 3F, 05, 05][, F2 7A, 05]
 
-0B06; [6C 0C, 05, 05]
+0B23; [69 41, 05, 05]
 
-0B07; [6C 0E, 05, 05]
+0B24; [69 43, 05, 05]
 
-0B08; [6C 10, 05, 05]
+0B25; [69 45, 05, 05]
 
-0B09; [6C 12, 05, 05]
+0B26; [69 47, 05, 05]
 
-0B0A; [6C 14, 05, 05]
+0B27; [69 49, 05, 05]
 
-0B0B; [6C 16, 05, 05]
+0B28; [69 4B, 05, 05]
 
-0B60; [6C 18, 05, 05]
+0B2A; [69 4D, 05, 05]
 
-0B0C; [6C 1A, 05, 05]
+0B2B; [69 4F, 05, 05]
 
-0B61; [6C 1C, 05, 05]
+0B2C; [69 51, 05, 05]
 
-0B0F; [6C 1E, 05, 05]
+0B2D; [69 53, 05, 05]
 
-0B10; [6C 20, 05, 05]
+0B2E; [69 55, 05, 05]
 
-0B13; [6C 22, 05, 05]
+0B2F; [69 57, 05, 05]
 
-0B14; [6C 24, 05, 05]
+0B5F; [69 59, 05, 05]
 
-0B15; [6C 26, 05, 05]
+0B30; [69 5B, 05, 05]
 
-0B16; [6C 28, 05, 05]
+0B32; [69 5D, 05, 05]
 
-0B17; [6C 2A, 05, 05]
+0B33; [69 5F, 05, 05]
 
-0B18; [6C 2C, 05, 05]
+0B35; [69 61, 05, 05]
 
-0B19; [6C 2E, 05, 05]
+0B71; [69 63, 05, 05]
 
-0B1A; [6C 30, 05, 05]
+0B36; [69 65, 05, 05]
 
-0B1B; [6C 32, 05, 05]
+0B37; [69 67, 05, 05]
 
-0B1C; [6C 34, 05, 05]
+0B38; [69 69, 05, 05]
 
-0B1D; [6C 36, 05, 05]
+0B39; [69 6B, 05, 05]
 
-0B1E; [6C 38, 05, 05]
+0B3D; [69 6D, 05, 05]
 
-0B1F; [6C 3A, 05, 05]
+0B3E; [69 6F, 05, 05]
 
-0B20; [6C 3C, 05, 05]
+0B3F; [69 71, 05, 05]
 
-0B21; [6C 3E, 05, 05]
-0B5C; [6C 3E, 05, 05][, D7 19, 05]
+0B40; [69 73, 05, 05]
 
-0B22; [6C 40, 05, 05]
-0B5D; [6C 40, 05, 05][, D7 19, 05]
+0B41; [69 75, 05, 05]
 
-0B23; [6C 42, 05, 05]
+0B42; [69 77, 05, 05]
 
-0B24; [6C 44, 05, 05]
+0B43; [69 79, 05, 05]
 
-0B25; [6C 46, 05, 05]
+0B44; [69 7B, 05, 05]
 
-0B26; [6C 48, 05, 05]
+0B62; [69 7D, 05, 05]
 
-0B27; [6C 4A, 05, 05]
+0B63; [69 7F, 05, 05]
 
-0B28; [6C 4C, 05, 05]
+0B47; [69 81, 05, 05]
 
-0B2A; [6C 4E, 05, 05]
+0B47 0B56; [69 83, 05, 05]
+0B48; [69 83, 05, 05]
 
-0B2B; [6C 50, 05, 05]
+0B47 0B3E; [69 85, 05, 05]
+0B4B; [69 85, 05, 05]
 
-0B2C; [6C 52, 05, 05]
+0B47 0B57; [69 87, 05, 05]
+0B4C; [69 87, 05, 05]
 
-0B2D; [6C 54, 05, 05]
+0B4D; [69 89, 05, 05]
 
-0B2E; [6C 56, 05, 05]
+0B56; [69 8B, 05, 05]
 
-0B2F; [6C 58, 05, 05]
+0B57; [69 8D, 05, 05]
 
-0B5F; [6C 5A, 05, 05]
+FDD1 0B95;     [6A 04 02, 05, 05]      # TAMIL first primary starts reordering group (compressible)
 
-0B30; [6C 5C, 05, 05]
+0BD0; [6A 09, 05, 05]
 
-0B32; [6C 5E, 05, 05]
+0B85; [6A 0B, 05, 05]
 
-0B33; [6C 60, 05, 05]
+0B86; [6A 0D, 05, 05]
 
-0B35; [6C 62, 05, 05]
+0B87; [6A 0F, 05, 05]
 
-0B71; [6C 64, 05, 05]
+0B88; [6A 11, 05, 05]
 
-0B36; [6C 66, 05, 05]
+0B89; [6A 13, 05, 05]
 
-0B37; [6C 68, 05, 05]
+0B8A; [6A 15, 05, 05]
 
-0B38; [6C 6A, 05, 05]
+0B8E; [6A 17, 05, 05]
 
-0B39; [6C 6C, 05, 05]
+0B8F; [6A 19, 05, 05]
 
-0B3D; [6C 6E, 05, 05]
+0B90; [6A 1B, 05, 05]
 
-0B3E; [6C 70, 05, 05]
+0B92; [6A 1D, 05, 05]
 
-0B3F; [6C 72, 05, 05]
+0B93; [6A 1F, 05, 05]
 
-0B40; [6C 74, 05, 05]
+0B92 0BD7; [6A 21, 05, 05]
+0B94; [6A 21, 05, 05]
 
-0B41; [6C 76, 05, 05]
+0B83; [6A 23, 05, 05]
 
-0B42; [6C 78, 05, 05]
+0B95; [6A 25, 05, 05]
 
-0B43; [6C 7A, 05, 05]
+0B99; [6A 27, 05, 05]
 
-0B44; [6C 7C, 05, 05]
+0B9A; [6A 29, 05, 05]
 
-0B62; [6C 7E, 05, 05]
+0B9E; [6A 2B, 05, 05]
 
-0B63; [6C 80, 05, 05]
+0B9F; [6A 2D, 05, 05]
 
-0B47; [6C 82, 05, 05]
+0BA3; [6A 2F, 05, 05]
 
-0B47 0B56; [6C 84, 05, 05]
-0B48; [6C 84, 05, 05]
+0BA4; [6A 31, 05, 05]
 
-0B47 0B3E; [6C 86, 05, 05]
-0B4B; [6C 86, 05, 05]
+0BA8; [6A 33, 05, 05]
 
-0B47 0B57; [6C 88, 05, 05]
-0B4C; [6C 88, 05, 05]
+0BAA; [6A 35, 05, 05]
 
-0B4D; [6C 8A, 05, 05]
+0BAE; [6A 37, 05, 05]
 
-0B56; [6C 8C, 05, 05]
+0BAF; [6A 39, 05, 05]
 
-0B57; [6C 8E, 05, 05]
+0BB0; [6A 3B, 05, 05]
 
-0BD0; [6D 0A, 05, 05]
+0BB2; [6A 3D, 05, 05]
 
-0B85; [6D 0C, 05, 05]
+0BB5; [6A 3F, 05, 05]
 
-0B86; [6D 0E, 05, 05]
+0BB4; [6A 41, 05, 05]
 
-0B87; [6D 10, 05, 05]
+0BB3; [6A 43, 05, 05]
 
-0B88; [6D 12, 05, 05]
+0BB1; [6A 45, 05, 05]
 
-0B89; [6D 14, 05, 05]
+0BA9; [6A 47, 05, 05]
 
-0B8A; [6D 16, 05, 05]
+0B9C; [6A 49, 05, 05]
 
-0B8E; [6D 18, 05, 05]
+0BB6; [6A 4B, 05, 05]
 
-0B8F; [6D 1A, 05, 05]
+0BB7; [6A 4D, 05, 05]
 
-0B90; [6D 1C, 05, 05]
+0BB8; [6A 4F, 05, 05]
 
-0B92; [6D 1E, 05, 05]
+0BB9; [6A 51, 05, 05]
 
-0B93; [6D 20, 05, 05]
+0BBE; [6A 53, 05, 05]
 
-0B92 0BD7; [6D 22, 05, 05]
-0B94; [6D 22, 05, 05]
+0BBF; [6A 55, 05, 05]
 
-0B83; [6D 24, 05, 05]
+0BC0; [6A 57, 05, 05]
 
-0B95; [6D 26, 05, 05]
+0BC1; [6A 59, 05, 05]
 
-0B99; [6D 28, 05, 05]
+0BC2; [6A 5B, 05, 05]
 
-0B9A; [6D 2A, 05, 05]
+0BC6; [6A 5D, 05, 05]
 
-0B9E; [6D 2C, 05, 05]
+0BC7; [6A 5F, 05, 05]
 
-0B9F; [6D 2E, 05, 05]
+0BC8; [6A 61, 05, 05]
 
-0BA3; [6D 30, 05, 05]
+0BC6 0BBE; [6A 63, 05, 05]
+0BCA; [6A 63, 05, 05]
 
-0BA4; [6D 32, 05, 05]
+0BC7 0BBE; [6A 65, 05, 05]
+0BCB; [6A 65, 05, 05]
 
-0BA8; [6D 34, 05, 05]
+0BC6 0BD7; [6A 67, 05, 05]
+0BCC; [6A 67, 05, 05]
 
-0BAA; [6D 36, 05, 05]
+0BCD; [6A 69, 05, 05]
 
-0BAE; [6D 38, 05, 05]
+0BD7; [6A 6B, 05, 05]
 
-0BAF; [6D 3A, 05, 05]
+FDD1 0C15;     [6B 04 02, 05, 05]      # TELUGU first primary starts reordering group (compressible)
 
-0BB0; [6D 3C, 05, 05]
+0C05; [6B 09, 05, 05]
 
-0BB2; [6D 3E, 05, 05]
+0C06; [6B 0B, 05, 05]
 
-0BB5; [6D 40, 05, 05]
+0C07; [6B 0D, 05, 05]
 
-0BB4; [6D 42, 05, 05]
+0C08; [6B 0F, 05, 05]
 
-0BB3; [6D 44, 05, 05]
+0C09; [6B 11, 05, 05]
 
-0BB1; [6D 46, 05, 05]
+0C0A; [6B 13, 05, 05]
 
-0BA9; [6D 48, 05, 05]
+0C0B; [6B 15, 05, 05]
 
-0B9C; [6D 4A, 05, 05]
+0C60; [6B 17, 05, 05]
 
-0BB6; [6D 4C, 05, 05]
+0C0C; [6B 19, 05, 05]
 
-0BB7; [6D 4E, 05, 05]
+0C61; [6B 1B, 05, 05]
 
-0BB8; [6D 50, 05, 05]
+0C0E; [6B 1D, 05, 05]
 
-0BB9; [6D 52, 05, 05]
+0C0F; [6B 1F, 05, 05]
 
-0BBE; [6D 54, 05, 05]
+0C10; [6B 21, 05, 05]
 
-0BBF; [6D 56, 05, 05]
+0C12; [6B 23, 05, 05]
 
-0BC0; [6D 58, 05, 05]
+0C13; [6B 25, 05, 05]
 
-0BC1; [6D 5A, 05, 05]
+0C14; [6B 27, 05, 05]
 
-0BC2; [6D 5C, 05, 05]
+0C15; [6B 29, 05, 05]
 
-0BC6; [6D 5E, 05, 05]
+0C16; [6B 2B, 05, 05]
 
-0BC7; [6D 60, 05, 05]
+0C17; [6B 2D, 05, 05]
 
-0BC8; [6D 62, 05, 05]
+0C18; [6B 2F, 05, 05]
 
-0BC6 0BBE; [6D 64, 05, 05]
-0BCA; [6D 64, 05, 05]
+0C19; [6B 31, 05, 05]
 
-0BC7 0BBE; [6D 66, 05, 05]
-0BCB; [6D 66, 05, 05]
+0C1A; [6B 33, 05, 05]
 
-0BC6 0BD7; [6D 68, 05, 05]
-0BCC; [6D 68, 05, 05]
+0C58; [6B 35, 05, 05]
 
-0BCD; [6D 6A, 05, 05]
+0C1B; [6B 37, 05, 05]
 
-0BD7; [6D 6C, 05, 05]
+0C1C; [6B 39, 05, 05]
 
-0C05; [6E 0A, 05, 05]
+0C59; [6B 3B, 05, 05]
 
-0C06; [6E 0C, 05, 05]
+0C1D; [6B 3D, 05, 05]
 
-0C07; [6E 0E, 05, 05]
+0C1E; [6B 3F, 05, 05]
 
-0C08; [6E 10, 05, 05]
+0C1F; [6B 41, 05, 05]
 
-0C09; [6E 12, 05, 05]
+0C20; [6B 43, 05, 05]
 
-0C0A; [6E 14, 05, 05]
+0C21; [6B 45, 05, 05]
 
-0C0B; [6E 16, 05, 05]
+0C22; [6B 47, 05, 05]
 
-0C60; [6E 18, 05, 05]
+0C23; [6B 49, 05, 05]
 
-0C0C; [6E 1A, 05, 05]
+0C24; [6B 4B, 05, 05]
 
-0C61; [6E 1C, 05, 05]
+0C25; [6B 4D, 05, 05]
 
-0C0E; [6E 1E, 05, 05]
+0C26; [6B 4F, 05, 05]
 
-0C0F; [6E 20, 05, 05]
+0C27; [6B 51, 05, 05]
 
-0C10; [6E 22, 05, 05]
+0C28; [6B 53, 05, 05]
 
-0C12; [6E 24, 05, 05]
+0C2A; [6B 55, 05, 05]
 
-0C13; [6E 26, 05, 05]
+0C2B; [6B 57, 05, 05]
 
-0C14; [6E 28, 05, 05]
+0C2C; [6B 59, 05, 05]
 
-0C15; [6E 2A, 05, 05]
+0C2D; [6B 5B, 05, 05]
 
-0C16; [6E 2C, 05, 05]
+0C2E; [6B 5D, 05, 05]
 
-0C17; [6E 2E, 05, 05]
+0C2F; [6B 5F, 05, 05]
 
-0C18; [6E 30, 05, 05]
+0C30; [6B 61, 05, 05]
 
-0C19; [6E 32, 05, 05]
+0C31; [6B 63, 05, 05]
 
-0C1A; [6E 34, 05, 05]
+0C32; [6B 65, 05, 05]
 
-0C58; [6E 36, 05, 05]
+0C35; [6B 67, 05, 05]
 
-0C1B; [6E 38, 05, 05]
+0C36; [6B 69, 05, 05]
 
-0C1C; [6E 3A, 05, 05]
+0C37; [6B 6B, 05, 05]
 
-0C59; [6E 3C, 05, 05]
+0C38; [6B 6D, 05, 05]
 
-0C1D; [6E 3E, 05, 05]
+0C39; [6B 6F, 05, 05]
 
-0C1E; [6E 40, 05, 05]
+0C33; [6B 71, 05, 05]
 
-0C1F; [6E 42, 05, 05]
+0C3D; [6B 73, 05, 05]
 
-0C20; [6E 44, 05, 05]
+0C3E; [6B 75, 05, 05]
 
-0C21; [6E 46, 05, 05]
+0C3F; [6B 77, 05, 05]
 
-0C22; [6E 48, 05, 05]
+0C40; [6B 79, 05, 05]
 
-0C23; [6E 4A, 05, 05]
+0C41; [6B 7B, 05, 05]
 
-0C24; [6E 4C, 05, 05]
+0C42; [6B 7D, 05, 05]
 
-0C25; [6E 4E, 05, 05]
+0C43; [6B 7F, 05, 05]
 
-0C26; [6E 50, 05, 05]
+0C44; [6B 81, 05, 05]
 
-0C27; [6E 52, 05, 05]
+0C62; [6B 83, 05, 05]
 
-0C28; [6E 54, 05, 05]
+0C63; [6B 85, 05, 05]
 
-0C2A; [6E 56, 05, 05]
+0C46; [6B 87, 05, 05]
 
-0C2B; [6E 58, 05, 05]
+0C47; [6B 89, 05, 05]
 
-0C2C; [6E 5A, 05, 05]
+0C46 0C56; [6B 8B, 05, 05]
+0C48; [6B 8B, 05, 05]
 
-0C2D; [6E 5C, 05, 05]
+0C4A; [6B 8D, 05, 05]
 
-0C2E; [6E 5E, 05, 05]
+0C4B; [6B 8F, 05, 05]
 
-0C2F; [6E 60, 05, 05]
+0C4C; [6B 91, 05, 05]
 
-0C30; [6E 62, 05, 05]
+0C4D; [6B 93, 05, 05]
 
-0C31; [6E 64, 05, 05]
+0C55; [6B 95, 05, 05]
 
-0C32; [6E 66, 05, 05]
+0C56; [6B 97, 05, 05]
 
-0C35; [6E 68, 05, 05]
+FDD1 0C95;     [6C 04 02, 05, 05]      # KANNADA first primary starts reordering group (compressible)
 
-0C36; [6E 6A, 05, 05]
+0C85; [6C 09, 05, 05]
 
-0C37; [6E 6C, 05, 05]
+0C86; [6C 0B, 05, 05]
 
-0C38; [6E 6E, 05, 05]
+0C87; [6C 0D, 05, 05]
 
-0C39; [6E 70, 05, 05]
+0C88; [6C 0F, 05, 05]
 
-0C33; [6E 72, 05, 05]
+0C89; [6C 11, 05, 05]
 
-0C3D; [6E 74, 05, 05]
+0C8A; [6C 13, 05, 05]
 
-0C3E; [6E 76, 05, 05]
+0C8B; [6C 15, 05, 05]
 
-0C3F; [6E 78, 05, 05]
+0CE0; [6C 17, 05, 05]
 
-0C40; [6E 7A, 05, 05]
+0C8C; [6C 19, 05, 05]
 
-0C41; [6E 7C, 05, 05]
+0CE1; [6C 1B, 05, 05]
 
-0C42; [6E 7E, 05, 05]
+0C8E; [6C 1D, 05, 05]
 
-0C43; [6E 80, 05, 05]
+0C8F; [6C 1F, 05, 05]
 
-0C44; [6E 82, 05, 05]
+0C90; [6C 21, 05, 05]
 
-0C62; [6E 84, 05, 05]
+0C92; [6C 23, 05, 05]
 
-0C63; [6E 86, 05, 05]
+0C93; [6C 25, 05, 05]
 
-0C46; [6E 88, 05, 05]
+0C94; [6C 27, 05, 05]
 
-0C47; [6E 8A, 05, 05]
+0C95; [6C 29, 05, 05]
 
-0C46 0C56; [6E 8C, 05, 05]
-0C48; [6E 8C, 05, 05]
+0C96; [6C 2B, 05, 05]
 
-0C4A; [6E 8E, 05, 05]
+0C97; [6C 2D, 05, 05]
 
-0C4B; [6E 90, 05, 05]
+0C98; [6C 2F, 05, 05]
 
-0C4C; [6E 92, 05, 05]
+0C99; [6C 31, 05, 05]
 
-0C4D; [6E 94, 05, 05]
+0C9A; [6C 33, 05, 05]
 
-0C55; [6E 96, 05, 05]
+0C9B; [6C 35, 05, 05]
 
-0C56; [6E 98, 05, 05]
+0C9C; [6C 37, 05, 05]
 
-0C85; [6F 0A, 05, 05]
+0C9D; [6C 39, 05, 05]
 
-0C86; [6F 0C, 05, 05]
+0C9E; [6C 3B, 05, 05]
 
-0C87; [6F 0E, 05, 05]
+0C9F; [6C 3D, 05, 05]
 
-0C88; [6F 10, 05, 05]
+0CA0; [6C 3F, 05, 05]
 
-0C89; [6F 12, 05, 05]
+0CA1; [6C 41, 05, 05]
 
-0C8A; [6F 14, 05, 05]
+0CA2; [6C 43, 05, 05]
 
-0C8B; [6F 16, 05, 05]
+0CA3; [6C 45, 05, 05]
 
-0CE0; [6F 18, 05, 05]
+0CA4; [6C 47, 05, 05]
 
-0C8C; [6F 1A, 05, 05]
+0CA5; [6C 49, 05, 05]
 
-0CE1; [6F 1C, 05, 05]
+0CA6; [6C 4B, 05, 05]
 
-0C8E; [6F 1E, 05, 05]
+0CA7; [6C 4D, 05, 05]
 
-0C8F; [6F 20, 05, 05]
+0CA8; [6C 4F, 05, 05]
 
-0C90; [6F 22, 05, 05]
+0CAA; [6C 51, 05, 05]
 
-0C92; [6F 24, 05, 05]
+0CAB; [6C 53, 05, 05]
 
-0C93; [6F 26, 05, 05]
+0CAC; [6C 55, 05, 05]
 
-0C94; [6F 28, 05, 05]
+0CAD; [6C 57, 05, 05]
 
-0C95; [6F 2A, 05, 05]
+0CAE; [6C 59, 05, 05]
 
-0C96; [6F 2C, 05, 05]
+0CAF; [6C 5B, 05, 05]
 
-0C97; [6F 2E, 05, 05]
+0CB0; [6C 5D, 05, 05]
 
-0C98; [6F 30, 05, 05]
+0CB1; [6C 5F, 05, 05]
 
-0C99; [6F 32, 05, 05]
+0CB2; [6C 61, 05, 05]
 
-0C9A; [6F 34, 05, 05]
+0CB5; [6C 63, 05, 05]
 
-0C9B; [6F 36, 05, 05]
+0CB6; [6C 65, 05, 05]
 
-0C9C; [6F 38, 05, 05]
+0CB7; [6C 67, 05, 05]
 
-0C9D; [6F 3A, 05, 05]
+0CB8; [6C 69, 05, 05]
 
-0C9E; [6F 3C, 05, 05]
+0CB9; [6C 6B, 05, 05]
 
-0C9F; [6F 3E, 05, 05]
+0CB3; [6C 6D, 05, 05]
 
-0CA0; [6F 40, 05, 05]
+0CDE; [6C 6F, 05, 05]
 
-0CA1; [6F 42, 05, 05]
+0CBD; [6C 71, 05, 05]
 
-0CA2; [6F 44, 05, 05]
+0CF1; [6C 73, 05, 05]
 
-0CA3; [6F 46, 05, 05]
+0CF2; [6C 75, 05, 05]
 
-0CA4; [6F 48, 05, 05]
+0CBE; [6C 77, 05, 05]
 
-0CA5; [6F 4A, 05, 05]
+0CBF; [6C 79, 05, 05]
 
-0CA6; [6F 4C, 05, 05]
+0CBF 0CD5; [6C 7B, 05, 05]
+0CC0; [6C 7B, 05, 05]
 
-0CA7; [6F 4E, 05, 05]
+0CC1; [6C 7D, 05, 05]
 
-0CA8; [6F 50, 05, 05]
+0CC2; [6C 7F, 05, 05]
 
-0CAA; [6F 52, 05, 05]
+0CC3; [6C 81, 05, 05]
 
-0CAB; [6F 54, 05, 05]
+0CC4; [6C 83, 05, 05]
 
-0CAC; [6F 56, 05, 05]
+0CE2; [6C 85, 05, 05]
 
-0CAD; [6F 58, 05, 05]
+0CE3; [6C 87, 05, 05]
 
-0CAE; [6F 5A, 05, 05]
+0CC6; [6C 89, 05, 05]
 
-0CAF; [6F 5C, 05, 05]
+0CC6 0CD5; [6C 8B, 05, 05]
+0CC7; [6C 8B, 05, 05]
 
-0CB0; [6F 5E, 05, 05]
+0CC6 0CD6; [6C 8D, 05, 05]
+0CC8; [6C 8D, 05, 05]
 
-0CB1; [6F 60, 05, 05]
+0CC6 0CC2; [6C 8F, 05, 05]
+0CCA; [6C 8F, 05, 05]
 
-0CB2; [6F 62, 05, 05]
+0CC6 0CC2 0CD5; [6C 91, 05, 05]
+0CCA 0CD5; [6C 91, 05, 05]
+0CCB; [6C 91, 05, 05]
 
-0CB5; [6F 64, 05, 05]
+0CCC; [6C 93, 05, 05]
 
-0CB6; [6F 66, 05, 05]
+0CCD; [6C 95, 05, 05]
 
-0CB7; [6F 68, 05, 05]
+0CD5; [6C 97, 05, 05]
 
-0CB8; [6F 6A, 05, 05]
+0CD6; [6C 99, 05, 05]
 
-0CB9; [6F 6C, 05, 05]
+FDD1 0D15;     [6D 04 02, 05, 05]      # MALAYALAM first primary starts reordering group (compressible)
 
-0CB3; [6F 6E, 05, 05]
+0D05; [6D 09, 05, 05]
 
-0CDE; [6F 70, 05, 05]
+0D06; [6D 0B, 05, 05]
 
-0CBD; [6F 72, 05, 05]
+0D07; [6D 0D, 05, 05]
 
-0CF1; [6F 74, 05, 05]
+0D08; [6D 0F, 05, 05]
 
-0CF2; [6F 76, 05, 05]
+0D09; [6D 11, 05, 05]
 
-0CBE; [6F 78, 05, 05]
+0D0A; [6D 13, 05, 05]
 
-0CBF; [6F 7A, 05, 05]
+0D0B; [6D 15, 05, 05]
 
-0CBF 0CD5; [6F 7C, 05, 05]
-0CC0; [6F 7C, 05, 05]
+0D60; [6D 17, 05, 05]
 
-0CC1; [6F 7E, 05, 05]
+0D0C; [6D 19, 05, 05]
 
-0CC2; [6F 80, 05, 05]
+0D61; [6D 1B, 05, 05]
 
-0CC3; [6F 82, 05, 05]
+0D0E; [6D 1D, 05, 05]
 
-0CC4; [6F 84, 05, 05]
+0D0F; [6D 1F, 05, 05]
 
-0CE2; [6F 86, 05, 05]
+0D10; [6D 21, 05, 05]
 
-0CE3; [6F 88, 05, 05]
+0D12; [6D 23, 05, 05]
 
-0CC6; [6F 8A, 05, 05]
+0D13; [6D 25, 05, 05]
 
-0CC6 0CD5; [6F 8C, 05, 05]
-0CC7; [6F 8C, 05, 05]
+0D14; [6D 27, 05, 05]
 
-0CC6 0CD6; [6F 8E, 05, 05]
-0CC8; [6F 8E, 05, 05]
+0D15; [6D 29, 05, 05]
+0D7F; [6D 29, 05, 20][6D 97, 05, 20]
 
-0CC6 0CC2; [6F 90, 05, 05]
-0CCA; [6F 90, 05, 05]
+0D16; [6D 2B, 05, 05]
 
-0CC6 0CC2 0CD5; [6F 92, 05, 05]
-0CCA 0CD5; [6F 92, 05, 05]
-0CCB; [6F 92, 05, 05]
+0D17; [6D 2D, 05, 05]
 
-0CCC; [6F 94, 05, 05]
+0D18; [6D 2F, 05, 05]
 
-0CCD; [6F 96, 05, 05]
+0D19; [6D 31, 05, 05]
 
-0CD5; [6F 98, 05, 05]
+0D1A; [6D 33, 05, 05]
 
-0CD6; [6F 9A, 05, 05]
+0D1B; [6D 35, 05, 05]
 
-0D05; [70 0A, 05, 05]
+0D1C; [6D 37, 05, 05]
 
-0D06; [70 0C, 05, 05]
+0D1D; [6D 39, 05, 05]
 
-0D07; [70 0E, 05, 05]
+0D1E; [6D 3B, 05, 05]
 
-0D08; [70 10, 05, 05]
+0D1F; [6D 3D, 05, 05]
 
-0D09; [70 12, 05, 05]
+0D20; [6D 3F, 05, 05]
 
-0D0A; [70 14, 05, 05]
+0D21; [6D 41, 05, 05]
 
-0D0B; [70 16, 05, 05]
+0D22; [6D 43, 05, 05]
 
-0D60; [70 18, 05, 05]
+0D23; [6D 45, 05, 05]
+0D7A; [6D 45, 05, 20][6D 97, 05, 20]
 
-0D0C; [70 1A, 05, 05]
+0D24; [6D 47, 05, 05]
 
-0D61; [70 1C, 05, 05]
+0D25; [6D 49, 05, 05]
 
-0D0E; [70 1E, 05, 05]
+0D26; [6D 4B, 05, 05]
 
-0D0F; [70 20, 05, 05]
+0D27; [6D 4D, 05, 05]
 
-0D10; [70 22, 05, 05]
+0D28; [6D 4F, 05, 05]
+0D7B; [6D 4F, 05, 20][6D 97, 05, 20]
 
-0D12; [70 24, 05, 05]
+0D29; [6D 51, 05, 05]
 
-0D13; [70 26, 05, 05]
+0D2A; [6D 53, 05, 05]
 
-0D14; [70 28, 05, 05]
+0D2B; [6D 55, 05, 05]
 
-0D15; [70 2A, 05, 05]
-0D7F; [70 2A, 05, 09][70 98, 05, 09]
+0D2C; [6D 57, 05, 05]
 
-0D16; [70 2C, 05, 05]
+0D2D; [6D 59, 05, 05]
 
-0D17; [70 2E, 05, 05]
+0D2E; [6D 5B, 05, 05]
 
-0D18; [70 30, 05, 05]
+0D2F; [6D 5D, 05, 05]
 
-0D19; [70 32, 05, 05]
+0D30; [6D 5F, 05, 05]
+0D4E; [6D 5F, 05, 20][6D 97, 05, 20]
+0D7C; [6D 5F, 05, 20][6D 97, 05, 20]
 
-0D1A; [70 34, 05, 05]
+0D32; [6D 61, 05, 05]
+0D7D; [6D 61, 05, 20][6D 97, 05, 20]
 
-0D1B; [70 36, 05, 05]
+0D35; [6D 63, 05, 05]
 
-0D1C; [70 38, 05, 05]
+0D36; [6D 65, 05, 05]
 
-0D1D; [70 3A, 05, 05]
+0D37; [6D 67, 05, 05]
 
-0D1E; [70 3C, 05, 05]
+0D38; [6D 69, 05, 05]
 
-0D1F; [70 3E, 05, 05]
+0D39; [6D 6B, 05, 05]
 
-0D20; [70 40, 05, 05]
+0D33; [6D 6D, 05, 05]
+0D7E; [6D 6D, 05, 20][6D 97, 05, 20]
 
-0D21; [70 42, 05, 05]
+0D34; [6D 6F, 05, 05]
 
-0D22; [70 44, 05, 05]
+0D31; [6D 71, 05, 05]
 
-0D23; [70 46, 05, 05]
-0D7A; [70 46, 05, 09][70 98, 05, 09]
+0D3A; [6D 73, 05, 05]
 
-0D24; [70 48, 05, 05]
+0D3D; [6D 75, 05, 05]
 
-0D25; [70 4A, 05, 05]
+0D3E; [6D 77, 05, 05]
 
-0D26; [70 4C, 05, 05]
+0D3F; [6D 79, 05, 05]
 
-0D27; [70 4E, 05, 05]
+0D40; [6D 7B, 05, 05]
 
-0D28; [70 50, 05, 05]
-0D7B; [70 50, 05, 09][70 98, 05, 09]
+0D41; [6D 7D, 05, 05]
 
-0D29; [70 52, 05, 05]
+0D42; [6D 7F, 05, 05]
 
-0D2A; [70 54, 05, 05]
+0D43; [6D 81, 05, 05]
 
-0D2B; [70 56, 05, 05]
+0D44; [6D 83, 05, 05]
 
-0D2C; [70 58, 05, 05]
+0D62; [6D 85, 05, 05]
 
-0D2D; [70 5A, 05, 05]
+0D63; [6D 87, 05, 05]
 
-0D2E; [70 5C, 05, 05]
+0D46; [6D 89, 05, 05]
 
-0D2F; [70 5E, 05, 05]
+0D47; [6D 8B, 05, 05]
 
-0D30; [70 60, 05, 05]
-0D4E; [70 60, 05, 09][70 98, 05, 09]
-0D7C; [70 60, 05, 09][70 98, 05, 09]
+0D48; [6D 8D, 05, 05]
 
-0D32; [70 62, 05, 05]
-0D7D; [70 62, 05, 09][70 98, 05, 09]
+0D46 0D3E; [6D 8F, 05, 05]
+0D4A; [6D 8F, 05, 05]
 
-0D35; [70 64, 05, 05]
+0D47 0D3E; [6D 91, 05, 05]
+0D4B; [6D 91, 05, 05]
 
-0D36; [70 66, 05, 05]
+0D46 0D57; [6D 93, 05, 05]
+0D4C; [6D 93, 05, 05]
 
-0D37; [70 68, 05, 05]
+0D57; [6D 95, 05, 05]
 
-0D38; [70 6A, 05, 05]
+0D4D; [6D 97, 05, 05]
 
-0D39; [70 6C, 05, 05]
+FDD1 0D85;     [6E 04 02, 05, 05]      # SINHALA first primary starts reordering group (compressible)
 
-0D33; [70 6E, 05, 05]
-0D7E; [70 6E, 05, 09][70 98, 05, 09]
+0D85; [6E 09, 05, 05]
 
-0D34; [70 70, 05, 05]
+0D86; [6E 0B, 05, 05]
 
-0D31; [70 72, 05, 05]
+0D87; [6E 0D, 05, 05]
 
-0D3A; [70 74, 05, 05]
+0D88; [6E 0F, 05, 05]
 
-0D3D; [70 76, 05, 05]
+0D89; [6E 11, 05, 05]
 
-0D3E; [70 78, 05, 05]
+0D8A; [6E 13, 05, 05]
 
-0D3F; [70 7A, 05, 05]
+0D8B; [6E 15, 05, 05]
 
-0D40; [70 7C, 05, 05]
+0D8C; [6E 17, 05, 05]
 
-0D41; [70 7E, 05, 05]
+0D8D; [6E 19, 05, 05]
 
-0D42; [70 80, 05, 05]
+0D8E; [6E 1B, 05, 05]
 
-0D43; [70 82, 05, 05]
+0D8F; [6E 1D, 05, 05]
 
-0D44; [70 84, 05, 05]
+0D90; [6E 1F, 05, 05]
 
-0D62; [70 86, 05, 05]
+0D91; [6E 21, 05, 05]
 
-0D63; [70 88, 05, 05]
+0D92; [6E 23, 05, 05]
 
-0D46; [70 8A, 05, 05]
+0D93; [6E 25, 05, 05]
 
-0D47; [70 8C, 05, 05]
+0D94; [6E 27, 05, 05]
 
-0D48; [70 8E, 05, 05]
+0D95; [6E 29, 05, 05]
 
-0D46 0D3E; [70 90, 05, 05]
-0D4A; [70 90, 05, 05]
+0D96; [6E 2B, 05, 05]
 
-0D47 0D3E; [70 92, 05, 05]
-0D4B; [70 92, 05, 05]
+0D9A; [6E 2D, 05, 05]
 
-0D46 0D57; [70 94, 05, 05]
-0D4C; [70 94, 05, 05]
+0D9B; [6E 2F, 05, 05]
 
-0D57; [70 96, 05, 05]
+0D9C; [6E 31, 05, 05]
 
-0D4D; [70 98, 05, 05]
+0D9D; [6E 33, 05, 05]
 
-0D85; [71 0A, 05, 05]
+0D9E; [6E 35, 05, 05]
 
-0D86; [71 0C, 05, 05]
+0D9F; [6E 37, 05, 05]
 
-0D87; [71 0E, 05, 05]
+0DA0; [6E 39, 05, 05]
 
-0D88; [71 10, 05, 05]
+0DA1; [6E 3B, 05, 05]
 
-0D89; [71 12, 05, 05]
+0DA2; [6E 3D, 05, 05]
 
-0D8A; [71 14, 05, 05]
+0DA3; [6E 3F, 05, 05]
 
-0D8B; [71 16, 05, 05]
+0DA4; [6E 41, 05, 05]
 
-0D8C; [71 18, 05, 05]
+0DA5; [6E 43, 05, 05]
 
-0D8D; [71 1A, 05, 05]
+0DA6; [6E 45, 05, 05]
 
-0D8E; [71 1C, 05, 05]
+0DA7; [6E 47, 05, 05]
 
-0D8F; [71 1E, 05, 05]
+0DA8; [6E 49, 05, 05]
 
-0D90; [71 20, 05, 05]
+0DA9; [6E 4B, 05, 05]
 
-0D91; [71 22, 05, 05]
+0DAA; [6E 4D, 05, 05]
 
-0D92; [71 24, 05, 05]
+0DAB; [6E 4F, 05, 05]
 
-0D93; [71 26, 05, 05]
+0DAC; [6E 51, 05, 05]
 
-0D94; [71 28, 05, 05]
+0DAD; [6E 53, 05, 05]
 
-0D95; [71 2A, 05, 05]
+0DAE; [6E 55, 05, 05]
 
-0D96; [71 2C, 05, 05]
+0DAF; [6E 57, 05, 05]
 
-0D9A; [71 2E, 05, 05]
+0DB0; [6E 59, 05, 05]
 
-0D9B; [71 30, 05, 05]
+0DB1; [6E 5B, 05, 05]
 
-0D9C; [71 32, 05, 05]
+0DB3; [6E 5D, 05, 05]
 
-0D9D; [71 34, 05, 05]
+0DB4; [6E 5F, 05, 05]
 
-0D9E; [71 36, 05, 05]
+0DB5; [6E 61, 05, 05]
 
-0D9F; [71 38, 05, 05]
+0DB6; [6E 63, 05, 05]
 
-0DA0; [71 3A, 05, 05]
+0DB7; [6E 65, 05, 05]
 
-0DA1; [71 3C, 05, 05]
+0DB8; [6E 67, 05, 05]
 
-0DA2; [71 3E, 05, 05]
+0DB9; [6E 69, 05, 05]
 
-0DA3; [71 40, 05, 05]
+0DBA; [6E 6B, 05, 05]
 
-0DA4; [71 42, 05, 05]
+0DBB; [6E 6D, 05, 05]
 
-0DA5; [71 44, 05, 05]
+0DBD; [6E 6F, 05, 05]
 
-0DA6; [71 46, 05, 05]
+0DC0; [6E 71, 05, 05]
 
-0DA7; [71 48, 05, 05]
+0DC1; [6E 73, 05, 05]
 
-0DA8; [71 4A, 05, 05]
+0DC2; [6E 75, 05, 05]
 
-0DA9; [71 4C, 05, 05]
+0DC3; [6E 77, 05, 05]
 
-0DAA; [71 4E, 05, 05]
+0DC4; [6E 79, 05, 05]
 
-0DAB; [71 50, 05, 05]
+0DC5; [6E 7B, 05, 05]
 
-0DAC; [71 52, 05, 05]
+0DC6; [6E 7D, 05, 05]
 
-0DAD; [71 54, 05, 05]
+0DCF; [6E 7F, 05, 05]
 
-0DAE; [71 56, 05, 05]
+0DD0; [6E 81, 05, 05]
 
-0DAF; [71 58, 05, 05]
+0DD1; [6E 83, 05, 05]
 
-0DB0; [71 5A, 05, 05]
+0DD2; [6E 85, 05, 05]
 
-0DB1; [71 5C, 05, 05]
+0DD3; [6E 87, 05, 05]
 
-0DB3; [71 5E, 05, 05]
+0DD4; [6E 89, 05, 05]
 
-0DB4; [71 60, 05, 05]
+0DD6; [6E 8B, 05, 05]
 
-0DB5; [71 62, 05, 05]
+0DD8; [6E 8D, 05, 05]
 
-0DB6; [71 64, 05, 05]
+0DF2; [6E 8F, 05, 05]
 
-0DB7; [71 66, 05, 05]
+0DDF; [6E 91, 05, 05]
 
-0DB8; [71 68, 05, 05]
+0DF3; [6E 93, 05, 05]
 
-0DB9; [71 6A, 05, 05]
+0DD9; [6E 95, 05, 05]
 
-0DBA; [71 6C, 05, 05]
+0DD9 0DCA; [6E 97, 05, 05]
+0DDA; [6E 97, 05, 05]
 
-0DBB; [71 6E, 05, 05]
+0DDB; [6E 99, 05, 05]
 
-0DBD; [71 70, 05, 05]
+0DD9 0DCF; [6E 9B, 05, 05]
+0DDC; [6E 9B, 05, 05]
 
-0DC0; [71 72, 05, 05]
+0DD9 0DCF 0DCA; [6E 9D, 05, 05]
+0DDC 0DCA; [6E 9D, 05, 05]
+0DDD; [6E 9D, 05, 05]
 
-0DC1; [71 74, 05, 05]
+0DD9 0DDF; [6E 9F, 05, 05]
+0DDE; [6E 9F, 05, 05]
 
-0DC2; [71 76, 05, 05]
+0DCA; [6E A1, 05, 05]
 
-0DC3; [71 78, 05, 05]
+FDD1 ABC0;     [6E A6 02, 05, 05]      # Meetei Mayek first primary
 
-0DC4; [71 7A, 05, 05]
+AAF2; [6E A6 2B, 05, 05]
 
-0DC5; [71 7C, 05, 05]
+ABC0; [6E A6 33, 05, 05]
 
-0DC6; [71 7E, 05, 05]
+ABC1; [6E A6 3B, 05, 05]
 
-0DCF; [71 80, 05, 05]
+ABC2; [6E A6 43, 05, 05]
 
-0DD0; [71 82, 05, 05]
+ABC3; [6E A6 4B, 05, 05]
 
-0DD1; [71 84, 05, 05]
+ABC4; [6E A6 53, 05, 05]
 
-0DD2; [71 86, 05, 05]
+ABC5; [6E A6 5B, 05, 05]
 
-0DD3; [71 88, 05, 05]
+ABC6; [6E A6 63, 05, 05]
 
-0DD4; [71 8A, 05, 05]
+ABC7; [6E A6 6B, 05, 05]
 
-0DD6; [71 8C, 05, 05]
+ABC8; [6E A6 73, 05, 05]
 
-0DD8; [71 8E, 05, 05]
+ABC9; [6E A6 7B, 05, 05]
 
-0DF2; [71 90, 05, 05]
+ABCA; [6E A6 83, 05, 05]
 
-0DDF; [71 92, 05, 05]
+ABCB; [6E A6 8B, 05, 05]
 
-0DF3; [71 94, 05, 05]
+ABCC; [6E A6 93, 05, 05]
 
-0DD9; [71 96, 05, 05]
+ABCD; [6E A6 9B, 05, 05]
 
-0DD9 0DCA; [71 98, 05, 05]
-0DDA; [71 98, 05, 05]
+ABCE; [6E A6 A3, 05, 05]
 
-0DDB; [71 9A, 05, 05]
+ABCF; [6E A6 AB, 05, 05]
 
-0DD9 0DCF; [71 9C, 05, 05]
-0DDC; [71 9C, 05, 05]
+ABD0; [6E A6 B3, 05, 05]
 
-0DD9 0DCF 0DCA; [71 9E, 05, 05]
-0DDC 0DCA; [71 9E, 05, 05]
-0DDD; [71 9E, 05, 05]
+ABD1; [6E A6 BB, 05, 05]
 
-0DD9 0DDF; [71 A0, 05, 05]
-0DDE; [71 A0, 05, 05]
+ABD2; [6E A6 C3, 05, 05]
 
-0DCA; [71 A2, 05, 05]
+ABD3; [6E A6 CB, 05, 05]
 
-AAF2; [71 A4 04, 05, 05]
+ABD4; [6E A6 D3, 05, 05]
 
-ABC0; [71 A4 0C, 05, 05]
+ABD5; [6E A6 DB, 05, 05]
 
-ABC1; [71 A4 14, 05, 05]
+ABD6; [6E A6 E3, 05, 05]
 
-ABC2; [71 A4 1C, 05, 05]
+ABD7; [6E A6 EB, 05, 05]
 
-ABC3; [71 A4 24, 05, 05]
+ABD8; [6E A6 F3, 05, 05]
 
-ABC4; [71 A4 2C, 05, 05]
+ABD9; [6E A6 FB, 05, 05]
 
-ABC5; [71 A4 34, 05, 05]
+ABDA; [6E A7 05, 05, 05]
 
-ABC6; [71 A4 3C, 05, 05]
+AAE0; [6E A7 0D, 05, 05]
 
-ABC7; [71 A4 44, 05, 05]
+AAE1; [6E A7 15, 05, 05]
 
-ABC8; [71 A4 4C, 05, 05]
+AAE2; [6E A7 1D, 05, 05]
 
-ABC9; [71 A4 54, 05, 05]
+AAE3; [6E A7 25, 05, 05]
 
-ABCA; [71 A4 5C, 05, 05]
+AAE4; [6E A7 2D, 05, 05]
 
-ABCB; [71 A4 64, 05, 05]
+AAE5; [6E A7 35, 05, 05]
 
-ABCC; [71 A4 6C, 05, 05]
+AAE6; [6E A7 3D, 05, 05]
 
-ABCD; [71 A4 74, 05, 05]
+AAE7; [6E A7 45, 05, 05]
 
-ABCE; [71 A4 7C, 05, 05]
+AAE8; [6E A7 4D, 05, 05]
 
-ABCF; [71 A4 84, 05, 05]
+AAE9; [6E A7 55, 05, 05]
 
-ABD0; [71 A4 8C, 05, 05]
+AAEA; [6E A7 5D, 05, 05]
 
-ABD1; [71 A4 94, 05, 05]
+ABE3; [6E A7 65, 05, 05]
 
-ABD2; [71 A4 9C, 05, 05]
+ABE4; [6E A7 6D, 05, 05]
 
-ABD3; [71 A4 A4, 05, 05]
+ABE5; [6E A7 75, 05, 05]
 
-ABD4; [71 A4 AC, 05, 05]
+ABE6; [6E A7 7D, 05, 05]
 
-ABD5; [71 A4 B4, 05, 05]
+ABE7; [6E A7 85, 05, 05]
 
-ABD6; [71 A4 BC, 05, 05]
+ABE8; [6E A7 8D, 05, 05]
 
-ABD7; [71 A4 C4, 05, 05]
+ABE9; [6E A7 95, 05, 05]
 
-ABD8; [71 A4 CC, 05, 05]
+ABEA; [6E A7 9D, 05, 05]
 
-ABD9; [71 A4 D4, 05, 05]
+AAEB; [6E A7 A5, 05, 05]
 
-ABDA; [71 A4 DC, 05, 05]
+AAEC; [6E A7 AD, 05, 05]
 
-AAE0; [71 A4 E4, 05, 05]
+AAED; [6E A7 B5, 05, 05]
 
-AAE1; [71 A4 EC, 05, 05]
+AAEE; [6E A7 BD, 05, 05]
 
-AAE2; [71 A4 F4, 05, 05]
+AAEF; [6E A7 C5, 05, 05]
 
-AAE3; [71 A4 FC, 05, 05]
+AAF5; [6E A7 CD, 05, 05]
 
-AAE4; [71 A5 0A, 05, 05]
+ABDB; [6E A7 D5, 05, 05]
 
-AAE5; [71 A5 12, 05, 05]
+ABDC; [6E A7 DD, 05, 05]
 
-AAE6; [71 A5 1A, 05, 05]
+ABDD; [6E A7 E5, 05, 05]
 
-AAE7; [71 A5 22, 05, 05]
+ABDE; [6E A7 ED, 05, 05]
 
-AAE8; [71 A5 2A, 05, 05]
+ABDF; [6E A7 F5, 05, 05]
 
-AAE9; [71 A5 32, 05, 05]
+ABE0; [6E A7 FD, 05, 05]
 
-AAEA; [71 A5 3A, 05, 05]
+ABE1; [6E A8 07, 05, 05]
 
-ABE3; [71 A5 42, 05, 05]
+ABE2; [6E A8 0F, 05, 05]
 
-ABE4; [71 A5 4A, 05, 05]
+ABED; [6E A8 17, 05, 05]
 
-ABE5; [71 A5 52, 05, 05]
+AAF6; [6E A8 1F, 05, 05]
 
-ABE6; [71 A5 5A, 05, 05]
+FDD1 A800;     [6E A8 48, 05, 05]      # SYLOTI_NAGRI first primary
 
-ABE7; [71 A5 62, 05, 05]
+A800; [6E A8 71, 05, 05]
 
-ABE8; [71 A5 6A, 05, 05]
+A801; [6E A8 79, 05, 05]
 
-ABE9; [71 A5 72, 05, 05]
+A802; [6E A8 81, 05, 05]
 
-ABEA; [71 A5 7A, 05, 05]
+A803; [6E A8 89, 05, 05]
 
-AAEB; [71 A5 82, 05, 05]
+A804; [6E A8 91, 05, 05]
 
-AAEC; [71 A5 8A, 05, 05]
+A805; [6E A8 99, 05, 05]
 
-AAED; [71 A5 92, 05, 05]
+A806; [6E A8 A1, 05, 05]
 
-AAEE; [71 A5 9A, 05, 05]
+A807; [6E A8 A9, 05, 05]
 
-AAEF; [71 A5 A2, 05, 05]
+A808; [6E A8 B1, 05, 05]
 
-AAF5; [71 A5 AA, 05, 05]
+A809; [6E A8 B9, 05, 05]
 
-ABDB; [71 A5 B2, 05, 05]
+A80A; [6E A8 C1, 05, 05]
 
-ABDC; [71 A5 BA, 05, 05]
+A80C; [6E A8 C9, 05, 05]
 
-ABDD; [71 A5 C2, 05, 05]
+A80D; [6E A8 D1, 05, 05]
 
-ABDE; [71 A5 CA, 05, 05]
+A80E; [6E A8 D9, 05, 05]
 
-ABDF; [71 A5 D2, 05, 05]
+A80F; [6E A8 E1, 05, 05]
 
-ABE0; [71 A5 DA, 05, 05]
+A810; [6E A8 E9, 05, 05]
 
-ABE1; [71 A5 E2, 05, 05]
+A811; [6E A8 F1, 05, 05]
 
-ABE2; [71 A5 EA, 05, 05]
+A812; [6E A8 F9, 05, 05]
 
-ABED; [71 A5 F2, 05, 05]
+A813; [6E A9 03, 05, 05]
 
-AAF6; [71 A5 FA, 05, 05]
+A814; [6E A9 0B, 05, 05]
 
-A800; [71 A6 08, 05, 05]
+A815; [6E A9 13, 05, 05]
 
-A801; [71 A6 10, 05, 05]
+A816; [6E A9 1B, 05, 05]
 
-A802; [71 A6 18, 05, 05]
+A817; [6E A9 23, 05, 05]
 
-A803; [71 A6 20, 05, 05]
+A818; [6E A9 2B, 05, 05]
 
-A804; [71 A6 28, 05, 05]
+A819; [6E A9 33, 05, 05]
 
-A805; [71 A6 30, 05, 05]
+A81A; [6E A9 3B, 05, 05]
 
-A806; [71 A6 38, 05, 05]
+A81B; [6E A9 43, 05, 05]
 
-A807; [71 A6 40, 05, 05]
+A81C; [6E A9 4B, 05, 05]
 
-A808; [71 A6 48, 05, 05]
+A81D; [6E A9 53, 05, 05]
 
-A809; [71 A6 50, 05, 05]
+A81E; [6E A9 5B, 05, 05]
 
-A80A; [71 A6 58, 05, 05]
+A81F; [6E A9 63, 05, 05]
 
-A80C; [71 A6 60, 05, 05]
+A820; [6E A9 6B, 05, 05]
 
-A80D; [71 A6 68, 05, 05]
+A821; [6E A9 73, 05, 05]
 
-A80E; [71 A6 70, 05, 05]
+A822; [6E A9 7B, 05, 05]
 
-A80F; [71 A6 78, 05, 05]
+A823; [6E A9 83, 05, 05]
 
-A810; [71 A6 80, 05, 05]
+A824; [6E A9 8B, 05, 05]
 
-A811; [71 A6 88, 05, 05]
+A825; [6E A9 93, 05, 05]
 
-A812; [71 A6 90, 05, 05]
+A826; [6E A9 9B, 05, 05]
 
-A813; [71 A6 98, 05, 05]
+A827; [6E A9 A3, 05, 05]
 
-A814; [71 A6 A0, 05, 05]
+FDD1 A882;     [6E A9 CC, 05, 05]      # Saurashtra first primary
 
-A815; [71 A6 A8, 05, 05]
+A882; [6E A9 F5, 05, 05]
 
-A816; [71 A6 B0, 05, 05]
+A883; [6E A9 FD, 05, 05]
 
-A817; [71 A6 B8, 05, 05]
+A884; [6E AA 07, 05, 05]
 
-A818; [71 A6 C0, 05, 05]
+A885; [6E AA 0F, 05, 05]
 
-A819; [71 A6 C8, 05, 05]
+A886; [6E AA 17, 05, 05]
 
-A81A; [71 A6 D0, 05, 05]
+A887; [6E AA 1F, 05, 05]
 
-A81B; [71 A6 D8, 05, 05]
+A888; [6E AA 27, 05, 05]
 
-A81C; [71 A6 E0, 05, 05]
+A889; [6E AA 2F, 05, 05]
 
-A81D; [71 A6 E8, 05, 05]
+A88A; [6E AA 37, 05, 05]
 
-A81E; [71 A6 F0, 05, 05]
+A88B; [6E AA 3F, 05, 05]
 
-A81F; [71 A6 F8, 05, 05]
+A88C; [6E AA 47, 05, 05]
 
-A820; [71 A7 06, 05, 05]
+A88D; [6E AA 4F, 05, 05]
 
-A821; [71 A7 0E, 05, 05]
+A88E; [6E AA 57, 05, 05]
 
-A822; [71 A7 16, 05, 05]
+A88F; [6E AA 5F, 05, 05]
 
-A823; [71 A7 1E, 05, 05]
+A890; [6E AA 67, 05, 05]
 
-A824; [71 A7 26, 05, 05]
+A891; [6E AA 6F, 05, 05]
 
-A825; [71 A7 2E, 05, 05]
+A892; [6E AA 77, 05, 05]
 
-A826; [71 A7 36, 05, 05]
+A893; [6E AA 7F, 05, 05]
 
-A827; [71 A7 3E, 05, 05]
+A894; [6E AA 87, 05, 05]
 
-A882; [71 A7 46, 05, 05]
+A895; [6E AA 8F, 05, 05]
 
-A883; [71 A7 4E, 05, 05]
+A896; [6E AA 97, 05, 05]
 
-A884; [71 A7 56, 05, 05]
+A897; [6E AA 9F, 05, 05]
 
-A885; [71 A7 5E, 05, 05]
+A898; [6E AA A7, 05, 05]
 
-A886; [71 A7 66, 05, 05]
+A899; [6E AA AF, 05, 05]
 
-A887; [71 A7 6E, 05, 05]
+A89A; [6E AA B7, 05, 05]
 
-A888; [71 A7 76, 05, 05]
+A89B; [6E AA BF, 05, 05]
 
-A889; [71 A7 7E, 05, 05]
+A89C; [6E AA C7, 05, 05]
 
-A88A; [71 A7 86, 05, 05]
+A89D; [6E AA CF, 05, 05]
 
-A88B; [71 A7 8E, 05, 05]
+A89E; [6E AA D7, 05, 05]
 
-A88C; [71 A7 96, 05, 05]
+A89F; [6E AA DF, 05, 05]
 
-A88D; [71 A7 9E, 05, 05]
+A8A0; [6E AA E7, 05, 05]
 
-A88E; [71 A7 A6, 05, 05]
+A8A1; [6E AA EF, 05, 05]
 
-A88F; [71 A7 AE, 05, 05]
+A8A2; [6E AA F7, 05, 05]
 
-A890; [71 A7 B6, 05, 05]
+A8A3; [6E AA FF, 05, 05]
 
-A891; [71 A7 BE, 05, 05]
+A8A4; [6E AB 09, 05, 05]
 
-A892; [71 A7 C6, 05, 05]
+A8A5; [6E AB 11, 05, 05]
 
-A893; [71 A7 CE, 05, 05]
+A8A6; [6E AB 19, 05, 05]
 
-A894; [71 A7 D6, 05, 05]
+A8A7; [6E AB 21, 05, 05]
 
-A895; [71 A7 DE, 05, 05]
+A8A8; [6E AB 29, 05, 05]
 
-A896; [71 A7 E6, 05, 05]
+A8A9; [6E AB 31, 05, 05]
 
-A897; [71 A7 EE, 05, 05]
+A8AA; [6E AB 39, 05, 05]
 
-A898; [71 A7 F6, 05, 05]
+A8AB; [6E AB 41, 05, 05]
 
-A899; [71 A8 04, 05, 05]
+A8AC; [6E AB 49, 05, 05]
 
-A89A; [71 A8 0C, 05, 05]
+A8AD; [6E AB 51, 05, 05]
 
-A89B; [71 A8 14, 05, 05]
+A8AE; [6E AB 59, 05, 05]
 
-A89C; [71 A8 1C, 05, 05]
+A8AF; [6E AB 61, 05, 05]
 
-A89D; [71 A8 24, 05, 05]
+A8B0; [6E AB 69, 05, 05]
 
-A89E; [71 A8 2C, 05, 05]
+A8B1; [6E AB 71, 05, 05]
 
-A89F; [71 A8 34, 05, 05]
+A8B2; [6E AB 79, 05, 05]
 
-A8A0; [71 A8 3C, 05, 05]
+A8B3; [6E AB 81, 05, 05]
 
-A8A1; [71 A8 44, 05, 05]
+A8B4; [6E AB 89, 05, 05]
 
-A8A2; [71 A8 4C, 05, 05]
+A8B5; [6E AB 91, 05, 05]
 
-A8A3; [71 A8 54, 05, 05]
+A8B6; [6E AB 99, 05, 05]
 
-A8A4; [71 A8 5C, 05, 05]
+A8B7; [6E AB A1, 05, 05]
 
-A8A5; [71 A8 64, 05, 05]
+A8B8; [6E AB A9, 05, 05]
 
-A8A6; [71 A8 6C, 05, 05]
+A8B9; [6E AB B1, 05, 05]
 
-A8A7; [71 A8 74, 05, 05]
+A8BA; [6E AB B9, 05, 05]
 
-A8A8; [71 A8 7C, 05, 05]
+A8BB; [6E AB C1, 05, 05]
 
-A8A9; [71 A8 84, 05, 05]
+A8BC; [6E AB C9, 05, 05]
 
-A8AA; [71 A8 8C, 05, 05]
+A8BD; [6E AB D1, 05, 05]
 
-A8AB; [71 A8 94, 05, 05]
+A8BE; [6E AB D9, 05, 05]
 
-A8AC; [71 A8 9C, 05, 05]
+A8BF; [6E AB E1, 05, 05]
 
-A8AD; [71 A8 A4, 05, 05]
+A8C0; [6E AB E9, 05, 05]
 
-A8AE; [71 A8 AC, 05, 05]
+A8C1; [6E AB F1, 05, 05]
 
-A8AF; [71 A8 B4, 05, 05]
+A8C2; [6E AB F9, 05, 05]
 
-A8B0; [71 A8 BC, 05, 05]
+A8C3; [6E AC 03, 05, 05]
 
-A8B1; [71 A8 C4, 05, 05]
+A8C4; [6E AC 0B, 05, 05]
 
-A8B2; [71 A8 CC, 05, 05]
+FDD1 11083;    [6E AC 34, 05, 05]      # Kaithi first primary
 
-A8B3; [71 A8 D4, 05, 05]
+11083; [6E AC 5D, 05, 05]
 
-A8B4; [71 A8 DC, 05, 05]
+11084; [6E AC 65, 05, 05]
 
-A8B5; [71 A8 E4, 05, 05]
+11085; [6E AC 6D, 05, 05]
 
-A8B6; [71 A8 EC, 05, 05]
+11086; [6E AC 75, 05, 05]
 
-A8B7; [71 A8 F4, 05, 05]
+11087; [6E AC 7D, 05, 05]
 
-A8B8; [71 A8 FC, 05, 05]
+11088; [6E AC 85, 05, 05]
 
-A8B9; [71 A9 0A, 05, 05]
+11089; [6E AC 8D, 05, 05]
 
-A8BA; [71 A9 12, 05, 05]
+1108A; [6E AC 95, 05, 05]
 
-A8BB; [71 A9 1A, 05, 05]
+1108B; [6E AC 9D, 05, 05]
 
-A8BC; [71 A9 22, 05, 05]
+1108C; [6E AC A5, 05, 05]
 
-A8BD; [71 A9 2A, 05, 05]
+1108D; [6E AC AD, 05, 05]
 
-A8BE; [71 A9 32, 05, 05]
+1108E; [6E AC B5, 05, 05]
 
-A8BF; [71 A9 3A, 05, 05]
+1108F; [6E AC BD, 05, 05]
 
-A8C0; [71 A9 42, 05, 05]
+11090; [6E AC C5, 05, 05]
 
-A8C1; [71 A9 4A, 05, 05]
+11091; [6E AC CD, 05, 05]
 
-A8C2; [71 A9 52, 05, 05]
+11092; [6E AC D5, 05, 05]
 
-A8C3; [71 A9 5A, 05, 05]
+11093; [6E AC DD, 05, 05]
 
-A8C4; [71 A9 62, 05, 05]
+11094; [6E AC E5, 05, 05]
 
-11083; [71 A9 6A, 05, 05]
+11095; [6E AC ED, 05, 05]
 
-11084; [71 A9 72, 05, 05]
+11096; [6E AC F5, 05, 05]
 
-11085; [71 A9 7A, 05, 05]
+11097; [6E AC FD, 05, 05]
 
-11086; [71 A9 82, 05, 05]
+11098; [6E AD 07, 05, 05]
 
-11087; [71 A9 8A, 05, 05]
+11099; [6E AD 0F, 05, 05]
+1109A; [6E AD 0F, 05, 05][, F2 7A, 05]
 
-11088; [71 A9 92, 05, 05]
+1109B; [6E AD 17, 05, 05]
+1109C; [6E AD 17, 05, 05][, F2 7A, 05]
 
-11089; [71 A9 9A, 05, 05]
+1109D; [6E AD 1F, 05, 05]
 
-1108A; [71 A9 A2, 05, 05]
+1109E; [6E AD 27, 05, 05]
 
-1108B; [71 A9 AA, 05, 05]
+1109F; [6E AD 2F, 05, 05]
 
-1108C; [71 A9 B2, 05, 05]
+110A0; [6E AD 37, 05, 05]
 
-1108D; [71 A9 BA, 05, 05]
+110A1; [6E AD 3F, 05, 05]
 
-1108E; [71 A9 C2, 05, 05]
+110A2; [6E AD 47, 05, 05]
 
-1108F; [71 A9 CA, 05, 05]
+110A3; [6E AD 4F, 05, 05]
 
-11090; [71 A9 D2, 05, 05]
+110A4; [6E AD 57, 05, 05]
 
-11091; [71 A9 DA, 05, 05]
+110A5; [6E AD 5F, 05, 05]
+110AB; [6E AD 5F, 05, 05][, F2 7A, 05]
 
-11092; [71 A9 E2, 05, 05]
+110A6; [6E AD 67, 05, 05]
 
-11093; [71 A9 EA, 05, 05]
+110A7; [6E AD 6F, 05, 05]
 
-11094; [71 A9 F2, 05, 05]
+110A8; [6E AD 77, 05, 05]
 
-11095; [71 A9 FA, 05, 05]
+110A9; [6E AD 7F, 05, 05]
 
-11096; [71 AA 08, 05, 05]
+110AA; [6E AD 87, 05, 05]
 
-11097; [71 AA 10, 05, 05]
+110AC; [6E AD 8F, 05, 05]
 
-11098; [71 AA 18, 05, 05]
+110AD; [6E AD 97, 05, 05]
 
-11099; [71 AA 20, 05, 05]
-1109A; [71 AA 20, 05, 05][, D7 19, 05]
+110AE; [6E AD 9F, 05, 05]
 
-1109B; [71 AA 28, 05, 05]
-1109C; [71 AA 28, 05, 05][, D7 19, 05]
+110AF; [6E AD A7, 05, 05]
 
-1109D; [71 AA 30, 05, 05]
+110B0; [6E AD AF, 05, 05]
 
-1109E; [71 AA 38, 05, 05]
+110B1; [6E AD B7, 05, 05]
 
-1109F; [71 AA 40, 05, 05]
+110B2; [6E AD BF, 05, 05]
 
-110A0; [71 AA 48, 05, 05]
+110B3; [6E AD C7, 05, 05]
 
-110A1; [71 AA 50, 05, 05]
+110B4; [6E AD CF, 05, 05]
 
-110A2; [71 AA 58, 05, 05]
+110B5; [6E AD D7, 05, 05]
 
-110A3; [71 AA 60, 05, 05]
+110B6; [6E AD DF, 05, 05]
 
-110A4; [71 AA 68, 05, 05]
+110B7; [6E AD E7, 05, 05]
 
-110A5; [71 AA 70, 05, 05]
-110AB; [71 AA 70, 05, 05][, D7 19, 05]
+110B8; [6E AD EF, 05, 05]
 
-110A6; [71 AA 78, 05, 05]
+110B9; [6E AD F7, 05, 05]
 
-110A7; [71 AA 80, 05, 05]
+FDD1 11183;    [6E AE 22, 05, 05]      # Sharada first primary
 
-110A8; [71 AA 88, 05, 05]
+111C4; [6E AE 4B, 05, 05]
 
-110A9; [71 AA 90, 05, 05]
+11183; [6E AE 53, 05, 05]
 
-110AA; [71 AA 98, 05, 05]
+11184; [6E AE 5B, 05, 05]
 
-110AC; [71 AA A0, 05, 05]
+11185; [6E AE 63, 05, 05]
 
-110AD; [71 AA A8, 05, 05]
+11186; [6E AE 6B, 05, 05]
 
-110AE; [71 AA B0, 05, 05]
+11187; [6E AE 73, 05, 05]
 
-110AF; [71 AA B8, 05, 05]
+11188; [6E AE 7B, 05, 05]
 
-110B0; [71 AA C0, 05, 05]
+11189; [6E AE 83, 05, 05]
 
-110B1; [71 AA C8, 05, 05]
+1118A; [6E AE 8B, 05, 05]
 
-110B2; [71 AA D0, 05, 05]
+1118B; [6E AE 93, 05, 05]
 
-110B3; [71 AA D8, 05, 05]
+1118C; [6E AE 9B, 05, 05]
 
-110B4; [71 AA E0, 05, 05]
+1118D; [6E AE A3, 05, 05]
 
-110B5; [71 AA E8, 05, 05]
+1118E; [6E AE AB, 05, 05]
 
-110B6; [71 AA F0, 05, 05]
+1118F; [6E AE B3, 05, 05]
 
-110B7; [71 AA F8, 05, 05]
+11190; [6E AE BB, 05, 05]
 
-110B8; [71 AB 06, 05, 05]
+11191; [6E AE C3, 05, 05]
 
-110B9; [71 AB 0E, 05, 05]
+11192; [6E AE CB, 05, 05]
 
-111C4; [71 AB 16, 05, 05]
+11193; [6E AE D3, 05, 05]
 
-11183; [71 AB 1E, 05, 05]
+11194; [6E AE DB, 05, 05]
 
-11184; [71 AB 26, 05, 05]
+11195; [6E AE E3, 05, 05]
 
-11185; [71 AB 2E, 05, 05]
+11196; [6E AE EB, 05, 05]
 
-11186; [71 AB 36, 05, 05]
+11197; [6E AE F3, 05, 05]
 
-11187; [71 AB 3E, 05, 05]
+11198; [6E AE FB, 05, 05]
 
-11188; [71 AB 46, 05, 05]
+11199; [6E AF 05, 05, 05]
 
-11189; [71 AB 4E, 05, 05]
+1119A; [6E AF 0D, 05, 05]
 
-1118A; [71 AB 56, 05, 05]
+1119B; [6E AF 15, 05, 05]
 
-1118B; [71 AB 5E, 05, 05]
+1119C; [6E AF 1D, 05, 05]
 
-1118C; [71 AB 66, 05, 05]
+1119D; [6E AF 25, 05, 05]
 
-1118D; [71 AB 6E, 05, 05]
+1119E; [6E AF 2D, 05, 05]
 
-1118E; [71 AB 76, 05, 05]
+1119F; [6E AF 35, 05, 05]
 
-1118F; [71 AB 7E, 05, 05]
+111A0; [6E AF 3D, 05, 05]
 
-11190; [71 AB 86, 05, 05]
+111A1; [6E AF 45, 05, 05]
 
-11191; [71 AB 8E, 05, 05]
+111A2; [6E AF 4D, 05, 05]
 
-11192; [71 AB 96, 05, 05]
+111A3; [6E AF 55, 05, 05]
 
-11193; [71 AB 9E, 05, 05]
+111A4; [6E AF 5D, 05, 05]
 
-11194; [71 AB A6, 05, 05]
+111A5; [6E AF 65, 05, 05]
 
-11195; [71 AB AE, 05, 05]
+111A6; [6E AF 6D, 05, 05]
 
-11196; [71 AB B6, 05, 05]
+111A7; [6E AF 75, 05, 05]
 
-11197; [71 AB BE, 05, 05]
+111A8; [6E AF 7D, 05, 05]
 
-11198; [71 AB C6, 05, 05]
+111A9; [6E AF 85, 05, 05]
 
-11199; [71 AB CE, 05, 05]
+111AA; [6E AF 8D, 05, 05]
 
-1119A; [71 AB D6, 05, 05]
+111AB; [6E AF 95, 05, 05]
 
-1119B; [71 AB DE, 05, 05]
+111AC; [6E AF 9D, 05, 05]
 
-1119C; [71 AB E6, 05, 05]
+111AD; [6E AF A5, 05, 05]
 
-1119D; [71 AB EE, 05, 05]
+111AE; [6E AF AD, 05, 05]
 
-1119E; [71 AB F6, 05, 05]
+111AF; [6E AF B5, 05, 05]
 
-1119F; [71 AC 04, 05, 05]
+111B0; [6E AF BD, 05, 05]
 
-111A0; [71 AC 0C, 05, 05]
+111B1; [6E AF C5, 05, 05]
 
-111A1; [71 AC 14, 05, 05]
+111B2; [6E AF CD, 05, 05]
 
-111A2; [71 AC 1C, 05, 05]
+111B3; [6E AF D5, 05, 05]
 
-111A3; [71 AC 24, 05, 05]
+111B4; [6E AF DD, 05, 05]
 
-111A4; [71 AC 2C, 05, 05]
+111B5; [6E AF E5, 05, 05]
 
-111A5; [71 AC 34, 05, 05]
+111B6; [6E AF ED, 05, 05]
 
-111A6; [71 AC 3C, 05, 05]
+111B7; [6E AF F5, 05, 05]
 
-111A7; [71 AC 44, 05, 05]
+111B8; [6E AF FD, 05, 05]
 
-111A8; [71 AC 4C, 05, 05]
+111B9; [6E B0 07, 05, 05]
 
-111A9; [71 AC 54, 05, 05]
+111BA; [6E B0 0F, 05, 05]
 
-111AA; [71 AC 5C, 05, 05]
+111BB; [6E B0 17, 05, 05]
 
-111AB; [71 AC 64, 05, 05]
+111BC; [6E B0 1F, 05, 05]
 
-111AC; [71 AC 6C, 05, 05]
+111BD; [6E B0 27, 05, 05]
 
-111AD; [71 AC 74, 05, 05]
+111BE; [6E B0 2F, 05, 05]
 
-111AE; [71 AC 7C, 05, 05]
+111BF; [6E B0 37, 05, 05]
 
-111AF; [71 AC 84, 05, 05]
+111C0; [6E B0 3F, 05, 05]
 
-111B0; [71 AC 8C, 05, 05]
+111C1; [6E B0 47, 05, 05]
 
-111B1; [71 AC 94, 05, 05]
+111C2; [6E B0 4F, 05, 05]
 
-111B2; [71 AC 9C, 05, 05]
+111C3; [6E B0 57, 05, 05]
 
-111B3; [71 AC A4, 05, 05]
+FDD1 11680;    [6E B0 80, 05, 05]      # Takri first primary
 
-111B4; [71 AC AC, 05, 05]
+11680; [6E B0 A9, 05, 05]
 
-111B5; [71 AC B4, 05, 05]
+11681; [6E B0 B1, 05, 05]
 
-111B6; [71 AC BC, 05, 05]
+11682; [6E B0 B9, 05, 05]
 
-111B7; [71 AC C4, 05, 05]
+11683; [6E B0 C1, 05, 05]
 
-111B8; [71 AC CC, 05, 05]
+11684; [6E B0 C9, 05, 05]
 
-111B9; [71 AC D4, 05, 05]
+11685; [6E B0 D1, 05, 05]
 
-111BA; [71 AC DC, 05, 05]
+11686; [6E B0 D9, 05, 05]
 
-111BB; [71 AC E4, 05, 05]
+11687; [6E B0 E1, 05, 05]
 
-111BC; [71 AC EC, 05, 05]
+11688; [6E B0 E9, 05, 05]
 
-111BD; [71 AC F4, 05, 05]
+11689; [6E B0 F1, 05, 05]
 
-111BE; [71 AC FC, 05, 05]
+116A8; [6E B0 F9, 05, 05]
 
-111BF; [71 AD 0A, 05, 05]
+116A7; [6E B1 03, 05, 05]
 
-111C0; [71 AD 12, 05, 05]
+116A9; [6E B1 0B, 05, 05]
 
-111C1; [71 AD 1A, 05, 05]
+1168A; [6E B1 13, 05, 05]
 
-111C2; [71 AD 22, 05, 05]
+1168B; [6E B1 1B, 05, 05]
 
-111C3; [71 AD 2A, 05, 05]
+1168C; [6E B1 23, 05, 05]
 
-11680; [71 AD 32, 05, 05]
+1168D; [6E B1 2B, 05, 05]
 
-11681; [71 AD 3A, 05, 05]
+1168E; [6E B1 33, 05, 05]
 
-11682; [71 AD 42, 05, 05]
+1168F; [6E B1 3B, 05, 05]
 
-11683; [71 AD 4A, 05, 05]
+11690; [6E B1 43, 05, 05]
 
-11684; [71 AD 52, 05, 05]
+11691; [6E B1 4B, 05, 05]
 
-11685; [71 AD 5A, 05, 05]
+11692; [6E B1 53, 05, 05]
 
-11686; [71 AD 62, 05, 05]
+11693; [6E B1 5B, 05, 05]
 
-11687; [71 AD 6A, 05, 05]
+11694; [6E B1 63, 05, 05]
 
-11688; [71 AD 72, 05, 05]
+11695; [6E B1 6B, 05, 05]
 
-11689; [71 AD 7A, 05, 05]
+11696; [6E B1 73, 05, 05]
 
-116A8; [71 AD 82, 05, 05]
+11697; [6E B1 7B, 05, 05]
 
-116A7; [71 AD 8A, 05, 05]
+11698; [6E B1 83, 05, 05]
 
-116A9; [71 AD 92, 05, 05]
+11699; [6E B1 8B, 05, 05]
 
-1168A; [71 AD 9A, 05, 05]
+1169A; [6E B1 93, 05, 05]
 
-1168B; [71 AD A2, 05, 05]
+1169B; [6E B1 9B, 05, 05]
 
-1168C; [71 AD AA, 05, 05]
+1169C; [6E B1 A3, 05, 05]
 
-1168D; [71 AD B2, 05, 05]
+1169D; [6E B1 AB, 05, 05]
 
-1168E; [71 AD BA, 05, 05]
+1169E; [6E B1 B3, 05, 05]
 
-1168F; [71 AD C2, 05, 05]
+1169F; [6E B1 BB, 05, 05]
 
-11690; [71 AD CA, 05, 05]
+116A0; [6E B1 C3, 05, 05]
 
-11691; [71 AD D2, 05, 05]
+116A1; [6E B1 CB, 05, 05]
 
-11692; [71 AD DA, 05, 05]
+116A2; [6E B1 D3, 05, 05]
 
-11693; [71 AD E2, 05, 05]
+116A3; [6E B1 DB, 05, 05]
 
-11694; [71 AD EA, 05, 05]
+116A4; [6E B1 E3, 05, 05]
 
-11695; [71 AD F2, 05, 05]
+116A5; [6E B1 EB, 05, 05]
 
-11696; [71 AD FA, 05, 05]
+116A6; [6E B1 F3, 05, 05]
 
-11697; [71 AE 08, 05, 05]
+116AA; [6E B1 FB, 05, 05]
 
-11698; [71 AE 10, 05, 05]
+116AD; [6E B2 05, 05, 05]
 
-11699; [71 AE 18, 05, 05]
+116AE; [6E B2 0D, 05, 05]
 
-1169A; [71 AE 20, 05, 05]
+116AF; [6E B2 15, 05, 05]
 
-1169B; [71 AE 28, 05, 05]
+116B0; [6E B2 1D, 05, 05]
 
-1169C; [71 AE 30, 05, 05]
+116B1; [6E B2 25, 05, 05]
 
-1169D; [71 AE 38, 05, 05]
+116B2; [6E B2 2D, 05, 05]
 
-1169E; [71 AE 40, 05, 05]
+116B3; [6E B2 35, 05, 05]
 
-1169F; [71 AE 48, 05, 05]
+116B4; [6E B2 3D, 05, 05]
 
-116A0; [71 AE 50, 05, 05]
+116B5; [6E B2 45, 05, 05]
 
-116A1; [71 AE 58, 05, 05]
+116B6; [6E B2 4D, 05, 05]
 
-116A2; [71 AE 60, 05, 05]
+FDD1 1B83;     [6E B2 76, 05, 05]      # Sundanese first primary
 
-116A3; [71 AE 68, 05, 05]
+1B83; [6E B2 9F, 05, 05]
+1BBA; [6E B2 9F, 05, 20]
 
-116A4; [71 AE 70, 05, 05]
+1B84; [6E B2 A7, 05, 05]
 
-116A5; [71 AE 78, 05, 05]
+1B85; [6E B2 AF, 05, 05]
 
-116A6; [71 AE 80, 05, 05]
+1B86; [6E B2 B7, 05, 05]
 
-116AA; [71 AE 88, 05, 05]
+1B87; [6E B2 BF, 05, 05]
 
-116AD; [71 AE 90, 05, 05]
+1B88; [6E B2 C7, 05, 05]
 
-116AE; [71 AE 98, 05, 05]
+1B89; [6E B2 CF, 05, 05]
 
-116AF; [71 AE A0, 05, 05]
+1B8A; [6E B2 D7, 05, 05]
+1BBE; [6E B2 D7, 05, 20]
 
-116B0; [71 AE A8, 05, 05]
+1BAE; [6E B2 DF, 05, 05]
 
-116B1; [71 AE B0, 05, 05]
+1B8B; [6E B2 E7, 05, 05]
 
-116B2; [71 AE B8, 05, 05]
+1B8C; [6E B2 EF, 05, 05]
 
-116B3; [71 AE C0, 05, 05]
+1B8D; [6E B2 F7, 05, 05]
 
-116B4; [71 AE C8, 05, 05]
+1B8E; [6E B2 FF, 05, 05]
 
-116B5; [71 AE D0, 05, 05]
+1B8F; [6E B3 09, 05, 05]
 
-116B6; [71 AE D8, 05, 05]
+1B90; [6E B3 11, 05, 05]
 
-1B83; [71 AE E0, 05, 05]
-1BBA; [71 AE E0, 05, 09]
+1B91; [6E B3 19, 05, 05]
 
-1B84; [71 AE E8, 05, 05]
+1B92; [6E B3 21, 05, 05]
 
-1B85; [71 AE F0, 05, 05]
+1B93; [6E B3 29, 05, 05]
 
-1B86; [71 AE F8, 05, 05]
+1B94; [6E B3 31, 05, 05]
 
-1B87; [71 AF 06, 05, 05]
+1B95; [6E B3 39, 05, 05]
 
-1B88; [71 AF 0E, 05, 05]
+1B96; [6E B3 41, 05, 05]
 
-1B89; [71 AF 16, 05, 05]
+1B97; [6E B3 49, 05, 05]
 
-1B8A; [71 AF 1E, 05, 05]
-1BBE; [71 AF 1E, 05, 31]
+1B98; [6E B3 51, 05, 05]
 
-1BAE; [71 AF 26, 05, 05]
+1BBD; [6E B3 59, 05, 05]
 
-1B8B; [71 AF 2E, 05, 05]
+1B99; [6E B3 61, 05, 05]
+1BBF; [6E B3 61, 05, 20]
 
-1B8C; [71 AF 36, 05, 05]
+1BAC; [6E B3 69, 05, 05]
 
-1B8D; [71 AF 3E, 05, 05]
+1B9A; [6E B3 71, 05, 05]
 
-1B8E; [71 AF 46, 05, 05]
+1BA1; [6E B3 79, 05, 05]
 
-1B8F; [71 AF 4E, 05, 05]
+1B9B; [6E B3 81, 05, 05]
 
-1B90; [71 AF 56, 05, 05]
+1BA2; [6E B3 89, 05, 05]
 
-1B91; [71 AF 5E, 05, 05]
+1BBB; [6E B3 91, 05, 05]
 
-1B92; [71 AF 66, 05, 05]
+1B9C; [6E B3 99, 05, 05]
 
-1B93; [71 AF 6E, 05, 05]
+1BA3; [6E B3 A1, 05, 05]
 
-1B94; [71 AF 76, 05, 05]
+1BBC; [6E B3 A9, 05, 05]
 
-1B95; [71 AF 7E, 05, 05]
+1B9D; [6E B3 B1, 05, 05]
 
-1B96; [71 AF 86, 05, 05]
+1BAD; [6E B3 B9, 05, 05]
 
-1B97; [71 AF 8E, 05, 05]
+1B9E; [6E B3 C1, 05, 05]
 
-1B98; [71 AF 96, 05, 05]
+1B9F; [6E B3 C9, 05, 05]
 
-1BBD; [71 AF 9E, 05, 05]
+1BAF; [6E B3 D1, 05, 05]
 
-1B99; [71 AF A6, 05, 05]
-1BBF; [71 AF A6, 05, 31]
+1BA0; [6E B3 D9, 05, 05]
 
-1BAC; [71 AF AE, 05, 05]
+1BA4; [6E B3 E1, 05, 05]
 
-1B9A; [71 AF B6, 05, 05]
+1BA5; [6E B3 E9, 05, 05]
 
-1BA1; [71 AF BE, 05, 05]
+1BA6; [6E B3 F1, 05, 05]
 
-1B9B; [71 AF C6, 05, 05]
+1BA7; [6E B3 F9, 05, 05]
 
-1BA2; [71 AF CE, 05, 05]
+1BA8; [6E B4 03, 05, 05]
 
-1BBB; [71 AF D6, 05, 05]
+1BA9; [6E B4 0B, 05, 05]
 
-1B9C; [71 AF DE, 05, 05]
+1BAA; [6E B4 13, 05, 05]
 
-1BA3; [71 AF E6, 05, 05]
+1BAB; [6E B4 1B, 05, 05]
 
-1BBC; [71 AF EE, 05, 05]
+FDD1 11005;    [6E B4 44, 05, 05]      # Brahmi first primary
 
-1B9D; [71 AF F6, 05, 05]
+11005; [6E B4 6D, 05, 05]
 
-1BAD; [71 B0 04, 05, 05]
+11006; [6E B4 75, 05, 05]
 
-1B9E; [71 B0 0C, 05, 05]
+11007; [6E B4 7D, 05, 05]
 
-1B9F; [71 B0 14, 05, 05]
+11008; [6E B4 85, 05, 05]
 
-1BAF; [71 B0 1C, 05, 05]
+11009; [6E B4 8D, 05, 05]
 
-1BA0; [71 B0 24, 05, 05]
+1100A; [6E B4 95, 05, 05]
 
-1BA4; [71 B0 2C, 05, 05]
+1100B; [6E B4 9D, 05, 05]
 
-1BA5; [71 B0 34, 05, 05]
+1100C; [6E B4 A5, 05, 05]
 
-1BA6; [71 B0 3C, 05, 05]
+1100D; [6E B4 AD, 05, 05]
 
-1BA7; [71 B0 44, 05, 05]
+1100E; [6E B4 B5, 05, 05]
 
-1BA8; [71 B0 4C, 05, 05]
+1100F; [6E B4 BD, 05, 05]
 
-1BA9; [71 B0 54, 05, 05]
+11010; [6E B4 C5, 05, 05]
 
-1BAA; [71 B0 5C, 05, 05]
+11011; [6E B4 CD, 05, 05]
 
-1BAB; [71 B0 64, 05, 05]
+11012; [6E B4 D5, 05, 05]
 
-11005; [71 B0 6C, 05, 05]
+11013; [6E B4 DD, 05, 05]
 
-11006; [71 B0 74, 05, 05]
+11014; [6E B4 E5, 05, 05]
 
-11007; [71 B0 7C, 05, 05]
+11015; [6E B4 ED, 05, 05]
 
-11008; [71 B0 84, 05, 05]
+11016; [6E B4 F5, 05, 05]
 
-11009; [71 B0 8C, 05, 05]
+11017; [6E B4 FD, 05, 05]
 
-1100A; [71 B0 94, 05, 05]
+11018; [6E B5 07, 05, 05]
 
-1100B; [71 B0 9C, 05, 05]
+11019; [6E B5 0F, 05, 05]
 
-1100C; [71 B0 A4, 05, 05]
+1101A; [6E B5 17, 05, 05]
 
-1100D; [71 B0 AC, 05, 05]
+1101B; [6E B5 1F, 05, 05]
 
-1100E; [71 B0 B4, 05, 05]
+1101C; [6E B5 27, 05, 05]
 
-1100F; [71 B0 BC, 05, 05]
+1101D; [6E B5 2F, 05, 05]
 
-11010; [71 B0 C4, 05, 05]
+1101E; [6E B5 37, 05, 05]
 
-11011; [71 B0 CC, 05, 05]
+1101F; [6E B5 3F, 05, 05]
 
-11012; [71 B0 D4, 05, 05]
+11020; [6E B5 47, 05, 05]
 
-11013; [71 B0 DC, 05, 05]
+11021; [6E B5 4F, 05, 05]
 
-11014; [71 B0 E4, 05, 05]
+11022; [6E B5 57, 05, 05]
 
-11015; [71 B0 EC, 05, 05]
+11023; [6E B5 5F, 05, 05]
 
-11016; [71 B0 F4, 05, 05]
+11024; [6E B5 67, 05, 05]
 
-11017; [71 B0 FC, 05, 05]
+11025; [6E B5 6F, 05, 05]
 
-11018; [71 B1 0A, 05, 05]
+11026; [6E B5 77, 05, 05]
 
-11019; [71 B1 12, 05, 05]
+11027; [6E B5 7F, 05, 05]
 
-1101A; [71 B1 1A, 05, 05]
+11028; [6E B5 87, 05, 05]
 
-1101B; [71 B1 22, 05, 05]
+11029; [6E B5 8F, 05, 05]
 
-1101C; [71 B1 2A, 05, 05]
+1102A; [6E B5 97, 05, 05]
 
-1101D; [71 B1 32, 05, 05]
+1102B; [6E B5 9F, 05, 05]
 
-1101E; [71 B1 3A, 05, 05]
+1102C; [6E B5 A7, 05, 05]
 
-1101F; [71 B1 42, 05, 05]
+1102D; [6E B5 AF, 05, 05]
 
-11020; [71 B1 4A, 05, 05]
+1102E; [6E B5 B7, 05, 05]
 
-11021; [71 B1 52, 05, 05]
+1102F; [6E B5 BF, 05, 05]
 
-11022; [71 B1 5A, 05, 05]
+11030; [6E B5 C7, 05, 05]
 
-11023; [71 B1 62, 05, 05]
+11031; [6E B5 CF, 05, 05]
 
-11024; [71 B1 6A, 05, 05]
+11032; [6E B5 D7, 05, 05]
 
-11025; [71 B1 72, 05, 05]
+11033; [6E B5 DF, 05, 05]
 
-11026; [71 B1 7A, 05, 05]
+11003; [6E B5 E7, 05, 05]
 
-11027; [71 B1 82, 05, 05]
+11004; [6E B5 EF, 05, 05]
 
-11028; [71 B1 8A, 05, 05]
+11034; [6E B5 F7, 05, 05]
 
-11029; [71 B1 92, 05, 05]
+11035; [6E B5 FF, 05, 05]
 
-1102A; [71 B1 9A, 05, 05]
+11036; [6E B6 09, 05, 05]
 
-1102B; [71 B1 A2, 05, 05]
+11037; [6E B6 11, 05, 05]
 
-1102C; [71 B1 AA, 05, 05]
+11038; [6E B6 19, 05, 05]
 
-1102D; [71 B1 B2, 05, 05]
+11039; [6E B6 21, 05, 05]
 
-1102E; [71 B1 BA, 05, 05]
+1103A; [6E B6 29, 05, 05]
 
-1102F; [71 B1 C2, 05, 05]
+1103B; [6E B6 31, 05, 05]
 
-11030; [71 B1 CA, 05, 05]
+1103C; [6E B6 39, 05, 05]
 
-11031; [71 B1 D2, 05, 05]
+1103D; [6E B6 41, 05, 05]
 
-11032; [71 B1 DA, 05, 05]
+1103E; [6E B6 49, 05, 05]
 
-11033; [71 B1 E2, 05, 05]
+1103F; [6E B6 51, 05, 05]
 
-11003; [71 B1 EA, 05, 05]
+11040; [6E B6 59, 05, 05]
 
-11004; [71 B1 F2, 05, 05]
+11041; [6E B6 61, 05, 05]
 
-11034; [71 B1 FA, 05, 05]
+11042; [6E B6 69, 05, 05]
 
-11035; [71 B2 08, 05, 05]
+11043; [6E B6 71, 05, 05]
 
-11036; [71 B2 10, 05, 05]
+11044; [6E B6 79, 05, 05]
 
-11037; [71 B2 18, 05, 05]
+11045; [6E B6 81, 05, 05]
 
-11038; [71 B2 20, 05, 05]
+11046; [6E B6 89, 05, 05]
 
-11039; [71 B2 28, 05, 05]
+FDD1 10A00;    [6E B6 B2, 05, 05]      # KHAROSHTHI first primary
 
-1103A; [71 B2 30, 05, 05]
+10A00; [6E B6 DB, 05, 05]
 
-1103B; [71 B2 38, 05, 05]
+10A01; [6E B6 E3, 05, 05]
 
-1103C; [71 B2 40, 05, 05]
+10A02; [6E B6 EB, 05, 05]
 
-1103D; [71 B2 48, 05, 05]
+10A03; [6E B6 F3, 05, 05]
 
-1103E; [71 B2 50, 05, 05]
+10A05; [6E B6 FB, 05, 05]
 
-1103F; [71 B2 58, 05, 05]
+10A06; [6E B7 05, 05, 05]
 
-11040; [71 B2 60, 05, 05]
+10A0C; [6E B7 0D, 05, 05]
 
-11041; [71 B2 68, 05, 05]
+10A10; [6E B7 15, 05, 05]
 
-11042; [71 B2 70, 05, 05]
+10A11; [6E B7 1D, 05, 05]
 
-11043; [71 B2 78, 05, 05]
+10A12; [6E B7 25, 05, 05]
 
-11044; [71 B2 80, 05, 05]
+10A13; [6E B7 2D, 05, 05]
 
-11045; [71 B2 88, 05, 05]
+10A15; [6E B7 35, 05, 05]
 
-11046; [71 B2 90, 05, 05]
+10A16; [6E B7 3D, 05, 05]
 
-10A00; [71 B2 98, 05, 05]
+10A17; [6E B7 45, 05, 05]
 
-10A01; [71 B2 A0, 05, 05]
+10A19; [6E B7 4D, 05, 05]
 
-10A02; [71 B2 A8, 05, 05]
+10A1A; [6E B7 55, 05, 05]
 
-10A03; [71 B2 B0, 05, 05]
+10A1B; [6E B7 5D, 05, 05]
 
-10A05; [71 B2 B8, 05, 05]
+10A1C; [6E B7 65, 05, 05]
 
-10A06; [71 B2 C0, 05, 05]
+10A1D; [6E B7 6D, 05, 05]
 
-10A0C; [71 B2 C8, 05, 05]
+10A1E; [6E B7 75, 05, 05]
 
-10A10; [71 B2 D0, 05, 05]
+10A1F; [6E B7 7D, 05, 05]
 
-10A11; [71 B2 D8, 05, 05]
+10A20; [6E B7 85, 05, 05]
 
-10A12; [71 B2 E0, 05, 05]
+10A21; [6E B7 8D, 05, 05]
 
-10A13; [71 B2 E8, 05, 05]
+10A22; [6E B7 95, 05, 05]
 
-10A15; [71 B2 F0, 05, 05]
+10A23; [6E B7 9D, 05, 05]
 
-10A16; [71 B2 F8, 05, 05]
+10A24; [6E B7 A5, 05, 05]
 
-10A17; [71 B3 06, 05, 05]
+10A25; [6E B7 AD, 05, 05]
 
-10A19; [71 B3 0E, 05, 05]
+10A26; [6E B7 B5, 05, 05]
 
-10A1A; [71 B3 16, 05, 05]
+10A27; [6E B7 BD, 05, 05]
 
-10A1B; [71 B3 1E, 05, 05]
+10A28; [6E B7 C5, 05, 05]
 
-10A1C; [71 B3 26, 05, 05]
+10A29; [6E B7 CD, 05, 05]
 
-10A1D; [71 B3 2E, 05, 05]
+10A2A; [6E B7 D5, 05, 05]
 
-10A1E; [71 B3 36, 05, 05]
+10A2B; [6E B7 DD, 05, 05]
 
-10A1F; [71 B3 3E, 05, 05]
+10A2C; [6E B7 E5, 05, 05]
 
-10A20; [71 B3 46, 05, 05]
+10A2D; [6E B7 ED, 05, 05]
 
-10A21; [71 B3 4E, 05, 05]
+10A2E; [6E B7 F5, 05, 05]
 
-10A22; [71 B3 56, 05, 05]
+10A2F; [6E B7 FD, 05, 05]
 
-10A23; [71 B3 5E, 05, 05]
+10A30; [6E B8 07, 05, 05]
 
-10A24; [71 B3 66, 05, 05]
+10A31; [6E B8 0F, 05, 05]
 
-10A25; [71 B3 6E, 05, 05]
+10A32; [6E B8 17, 05, 05]
 
-10A26; [71 B3 76, 05, 05]
+10A33; [6E B8 1F, 05, 05]
 
-10A27; [71 B3 7E, 05, 05]
+10A3F; [6E B8 27, 05, 05]
 
-10A28; [71 B3 86, 05, 05]
+FDD1 0E17;     [6F 04 02, 05, 05]      # THAI first primary starts reordering group (compressible)
 
-10A29; [71 B3 8E, 05, 05]
+0E01; [6F 09, 05, 05]
+0E40 0E01; [6F 09, 05, 05][6F 7D, 05, 05]
+0E41 0E01; [6F 09, 05, 05][6F 7F, 05, 05]
+0E42 0E01; [6F 09, 05, 05][6F 81, 05, 05]
+0E43 0E01; [6F 09, 05, 05][6F 83, 05, 05]
+0E44 0E01; [6F 09, 05, 05][6F 85, 05, 05]
 
-10A2A; [71 B3 96, 05, 05]
+0E02; [6F 0B, 05, 05]
+0E40 0E02; [6F 0B, 05, 05][6F 7D, 05, 05]
+0E41 0E02; [6F 0B, 05, 05][6F 7F, 05, 05]
+0E42 0E02; [6F 0B, 05, 05][6F 81, 05, 05]
+0E43 0E02; [6F 0B, 05, 05][6F 83, 05, 05]
+0E44 0E02; [6F 0B, 05, 05][6F 85, 05, 05]
 
-10A2B; [71 B3 9E, 05, 05]
+0E03; [6F 0D, 05, 05]
+0E40 0E03; [6F 0D, 05, 05][6F 7D, 05, 05]
+0E41 0E03; [6F 0D, 05, 05][6F 7F, 05, 05]
+0E42 0E03; [6F 0D, 05, 05][6F 81, 05, 05]
+0E43 0E03; [6F 0D, 05, 05][6F 83, 05, 05]
+0E44 0E03; [6F 0D, 05, 05][6F 85, 05, 05]
 
-10A2C; [71 B3 A6, 05, 05]
+0E04; [6F 0F, 05, 05]
+0E40 0E04; [6F 0F, 05, 05][6F 7D, 05, 05]
+0E41 0E04; [6F 0F, 05, 05][6F 7F, 05, 05]
+0E42 0E04; [6F 0F, 05, 05][6F 81, 05, 05]
+0E43 0E04; [6F 0F, 05, 05][6F 83, 05, 05]
+0E44 0E04; [6F 0F, 05, 05][6F 85, 05, 05]
 
-10A2D; [71 B3 AE, 05, 05]
+0E05; [6F 11, 05, 05]
+0E40 0E05; [6F 11, 05, 05][6F 7D, 05, 05]
+0E41 0E05; [6F 11, 05, 05][6F 7F, 05, 05]
+0E42 0E05; [6F 11, 05, 05][6F 81, 05, 05]
+0E43 0E05; [6F 11, 05, 05][6F 83, 05, 05]
+0E44 0E05; [6F 11, 05, 05][6F 85, 05, 05]
 
-10A2E; [71 B3 B6, 05, 05]
+0E06; [6F 13, 05, 05]
+0E40 0E06; [6F 13, 05, 05][6F 7D, 05, 05]
+0E41 0E06; [6F 13, 05, 05][6F 7F, 05, 05]
+0E42 0E06; [6F 13, 05, 05][6F 81, 05, 05]
+0E43 0E06; [6F 13, 05, 05][6F 83, 05, 05]
+0E44 0E06; [6F 13, 05, 05][6F 85, 05, 05]
 
-10A2F; [71 B3 BE, 05, 05]
+0E07; [6F 15, 05, 05]
+0E40 0E07; [6F 15, 05, 05][6F 7D, 05, 05]
+0E41 0E07; [6F 15, 05, 05][6F 7F, 05, 05]
+0E42 0E07; [6F 15, 05, 05][6F 81, 05, 05]
+0E43 0E07; [6F 15, 05, 05][6F 83, 05, 05]
+0E44 0E07; [6F 15, 05, 05][6F 85, 05, 05]
+
+0E08; [6F 17, 05, 05]
+0E40 0E08; [6F 17, 05, 05][6F 7D, 05, 05]
+0E41 0E08; [6F 17, 05, 05][6F 7F, 05, 05]
+0E42 0E08; [6F 17, 05, 05][6F 81, 05, 05]
+0E43 0E08; [6F 17, 05, 05][6F 83, 05, 05]
+0E44 0E08; [6F 17, 05, 05][6F 85, 05, 05]
+
+0E09; [6F 19, 05, 05]
+0E40 0E09; [6F 19, 05, 05][6F 7D, 05, 05]
+0E41 0E09; [6F 19, 05, 05][6F 7F, 05, 05]
+0E42 0E09; [6F 19, 05, 05][6F 81, 05, 05]
+0E43 0E09; [6F 19, 05, 05][6F 83, 05, 05]
+0E44 0E09; [6F 19, 05, 05][6F 85, 05, 05]
+
+0E0A; [6F 1B, 05, 05]
+0E40 0E0A; [6F 1B, 05, 05][6F 7D, 05, 05]
+0E41 0E0A; [6F 1B, 05, 05][6F 7F, 05, 05]
+0E42 0E0A; [6F 1B, 05, 05][6F 81, 05, 05]
+0E43 0E0A; [6F 1B, 05, 05][6F 83, 05, 05]
+0E44 0E0A; [6F 1B, 05, 05][6F 85, 05, 05]
+
+0E0B; [6F 1D, 05, 05]
+0E40 0E0B; [6F 1D, 05, 05][6F 7D, 05, 05]
+0E41 0E0B; [6F 1D, 05, 05][6F 7F, 05, 05]
+0E42 0E0B; [6F 1D, 05, 05][6F 81, 05, 05]
+0E43 0E0B; [6F 1D, 05, 05][6F 83, 05, 05]
+0E44 0E0B; [6F 1D, 05, 05][6F 85, 05, 05]
+
+0E0C; [6F 1F, 05, 05]
+0E40 0E0C; [6F 1F, 05, 05][6F 7D, 05, 05]
+0E41 0E0C; [6F 1F, 05, 05][6F 7F, 05, 05]
+0E42 0E0C; [6F 1F, 05, 05][6F 81, 05, 05]
+0E43 0E0C; [6F 1F, 05, 05][6F 83, 05, 05]
+0E44 0E0C; [6F 1F, 05, 05][6F 85, 05, 05]
+
+0E0D; [6F 21, 05, 05]
+0E40 0E0D; [6F 21, 05, 05][6F 7D, 05, 05]
+0E41 0E0D; [6F 21, 05, 05][6F 7F, 05, 05]
+0E42 0E0D; [6F 21, 05, 05][6F 81, 05, 05]
+0E43 0E0D; [6F 21, 05, 05][6F 83, 05, 05]
+0E44 0E0D; [6F 21, 05, 05][6F 85, 05, 05]
+
+0E0E; [6F 23, 05, 05]
+0E40 0E0E; [6F 23, 05, 05][6F 7D, 05, 05]
+0E41 0E0E; [6F 23, 05, 05][6F 7F, 05, 05]
+0E42 0E0E; [6F 23, 05, 05][6F 81, 05, 05]
+0E43 0E0E; [6F 23, 05, 05][6F 83, 05, 05]
+0E44 0E0E; [6F 23, 05, 05][6F 85, 05, 05]
+
+0E0F; [6F 25, 05, 05]
+0E40 0E0F; [6F 25, 05, 05][6F 7D, 05, 05]
+0E41 0E0F; [6F 25, 05, 05][6F 7F, 05, 05]
+0E42 0E0F; [6F 25, 05, 05][6F 81, 05, 05]
+0E43 0E0F; [6F 25, 05, 05][6F 83, 05, 05]
+0E44 0E0F; [6F 25, 05, 05][6F 85, 05, 05]
+
+0E10; [6F 27, 05, 05]
+0E40 0E10; [6F 27, 05, 05][6F 7D, 05, 05]
+0E41 0E10; [6F 27, 05, 05][6F 7F, 05, 05]
+0E42 0E10; [6F 27, 05, 05][6F 81, 05, 05]
+0E43 0E10; [6F 27, 05, 05][6F 83, 05, 05]
+0E44 0E10; [6F 27, 05, 05][6F 85, 05, 05]
+
+0E11; [6F 29, 05, 05]
+0E40 0E11; [6F 29, 05, 05][6F 7D, 05, 05]
+0E41 0E11; [6F 29, 05, 05][6F 7F, 05, 05]
+0E42 0E11; [6F 29, 05, 05][6F 81, 05, 05]
+0E43 0E11; [6F 29, 05, 05][6F 83, 05, 05]
+0E44 0E11; [6F 29, 05, 05][6F 85, 05, 05]
+
+0E12; [6F 2B, 05, 05]
+0E40 0E12; [6F 2B, 05, 05][6F 7D, 05, 05]
+0E41 0E12; [6F 2B, 05, 05][6F 7F, 05, 05]
+0E42 0E12; [6F 2B, 05, 05][6F 81, 05, 05]
+0E43 0E12; [6F 2B, 05, 05][6F 83, 05, 05]
+0E44 0E12; [6F 2B, 05, 05][6F 85, 05, 05]
+
+0E13; [6F 2D, 05, 05]
+0E40 0E13; [6F 2D, 05, 05][6F 7D, 05, 05]
+0E41 0E13; [6F 2D, 05, 05][6F 7F, 05, 05]
+0E42 0E13; [6F 2D, 05, 05][6F 81, 05, 05]
+0E43 0E13; [6F 2D, 05, 05][6F 83, 05, 05]
+0E44 0E13; [6F 2D, 05, 05][6F 85, 05, 05]
+
+0E14; [6F 2F, 05, 05]
+0E40 0E14; [6F 2F, 05, 05][6F 7D, 05, 05]
+0E41 0E14; [6F 2F, 05, 05][6F 7F, 05, 05]
+0E42 0E14; [6F 2F, 05, 05][6F 81, 05, 05]
+0E43 0E14; [6F 2F, 05, 05][6F 83, 05, 05]
+0E44 0E14; [6F 2F, 05, 05][6F 85, 05, 05]
+
+0E15; [6F 31, 05, 05]
+0E40 0E15; [6F 31, 05, 05][6F 7D, 05, 05]
+0E41 0E15; [6F 31, 05, 05][6F 7F, 05, 05]
+0E42 0E15; [6F 31, 05, 05][6F 81, 05, 05]
+0E43 0E15; [6F 31, 05, 05][6F 83, 05, 05]
+0E44 0E15; [6F 31, 05, 05][6F 85, 05, 05]
+
+0E16; [6F 33, 05, 05]
+0E40 0E16; [6F 33, 05, 05][6F 7D, 05, 05]
+0E41 0E16; [6F 33, 05, 05][6F 7F, 05, 05]
+0E42 0E16; [6F 33, 05, 05][6F 81, 05, 05]
+0E43 0E16; [6F 33, 05, 05][6F 83, 05, 05]
+0E44 0E16; [6F 33, 05, 05][6F 85, 05, 05]
+
+0E17; [6F 35, 05, 05]
+0E40 0E17; [6F 35, 05, 05][6F 7D, 05, 05]
+0E41 0E17; [6F 35, 05, 05][6F 7F, 05, 05]
+0E42 0E17; [6F 35, 05, 05][6F 81, 05, 05]
+0E43 0E17; [6F 35, 05, 05][6F 83, 05, 05]
+0E44 0E17; [6F 35, 05, 05][6F 85, 05, 05]
+
+0E18; [6F 37, 05, 05]
+0E40 0E18; [6F 37, 05, 05][6F 7D, 05, 05]
+0E41 0E18; [6F 37, 05, 05][6F 7F, 05, 05]
+0E42 0E18; [6F 37, 05, 05][6F 81, 05, 05]
+0E43 0E18; [6F 37, 05, 05][6F 83, 05, 05]
+0E44 0E18; [6F 37, 05, 05][6F 85, 05, 05]
+
+0E19; [6F 39, 05, 05]
+0E40 0E19; [6F 39, 05, 05][6F 7D, 05, 05]
+0E41 0E19; [6F 39, 05, 05][6F 7F, 05, 05]
+0E42 0E19; [6F 39, 05, 05][6F 81, 05, 05]
+0E43 0E19; [6F 39, 05, 05][6F 83, 05, 05]
+0E44 0E19; [6F 39, 05, 05][6F 85, 05, 05]
+
+0E1A; [6F 3B, 05, 05]
+0E40 0E1A; [6F 3B, 05, 05][6F 7D, 05, 05]
+0E41 0E1A; [6F 3B, 05, 05][6F 7F, 05, 05]
+0E42 0E1A; [6F 3B, 05, 05][6F 81, 05, 05]
+0E43 0E1A; [6F 3B, 05, 05][6F 83, 05, 05]
+0E44 0E1A; [6F 3B, 05, 05][6F 85, 05, 05]
+
+0E1B; [6F 3D, 05, 05]
+0E40 0E1B; [6F 3D, 05, 05][6F 7D, 05, 05]
+0E41 0E1B; [6F 3D, 05, 05][6F 7F, 05, 05]
+0E42 0E1B; [6F 3D, 05, 05][6F 81, 05, 05]
+0E43 0E1B; [6F 3D, 05, 05][6F 83, 05, 05]
+0E44 0E1B; [6F 3D, 05, 05][6F 85, 05, 05]
+
+0E1C; [6F 3F, 05, 05]
+0E40 0E1C; [6F 3F, 05, 05][6F 7D, 05, 05]
+0E41 0E1C; [6F 3F, 05, 05][6F 7F, 05, 05]
+0E42 0E1C; [6F 3F, 05, 05][6F 81, 05, 05]
+0E43 0E1C; [6F 3F, 05, 05][6F 83, 05, 05]
+0E44 0E1C; [6F 3F, 05, 05][6F 85, 05, 05]
+
+0E1D; [6F 41, 05, 05]
+0E40 0E1D; [6F 41, 05, 05][6F 7D, 05, 05]
+0E41 0E1D; [6F 41, 05, 05][6F 7F, 05, 05]
+0E42 0E1D; [6F 41, 05, 05][6F 81, 05, 05]
+0E43 0E1D; [6F 41, 05, 05][6F 83, 05, 05]
+0E44 0E1D; [6F 41, 05, 05][6F 85, 05, 05]
+
+0E1E; [6F 43, 05, 05]
+0E40 0E1E; [6F 43, 05, 05][6F 7D, 05, 05]
+0E41 0E1E; [6F 43, 05, 05][6F 7F, 05, 05]
+0E42 0E1E; [6F 43, 05, 05][6F 81, 05, 05]
+0E43 0E1E; [6F 43, 05, 05][6F 83, 05, 05]
+0E44 0E1E; [6F 43, 05, 05][6F 85, 05, 05]
+
+0E1F; [6F 45, 05, 05]
+0E40 0E1F; [6F 45, 05, 05][6F 7D, 05, 05]
+0E41 0E1F; [6F 45, 05, 05][6F 7F, 05, 05]
+0E42 0E1F; [6F 45, 05, 05][6F 81, 05, 05]
+0E43 0E1F; [6F 45, 05, 05][6F 83, 05, 05]
+0E44 0E1F; [6F 45, 05, 05][6F 85, 05, 05]
+
+0E20; [6F 47, 05, 05]
+0E40 0E20; [6F 47, 05, 05][6F 7D, 05, 05]
+0E41 0E20; [6F 47, 05, 05][6F 7F, 05, 05]
+0E42 0E20; [6F 47, 05, 05][6F 81, 05, 05]
+0E43 0E20; [6F 47, 05, 05][6F 83, 05, 05]
+0E44 0E20; [6F 47, 05, 05][6F 85, 05, 05]
+
+0E21; [6F 49, 05, 05]
+0E40 0E21; [6F 49, 05, 05][6F 7D, 05, 05]
+0E41 0E21; [6F 49, 05, 05][6F 7F, 05, 05]
+0E42 0E21; [6F 49, 05, 05][6F 81, 05, 05]
+0E43 0E21; [6F 49, 05, 05][6F 83, 05, 05]
+0E44 0E21; [6F 49, 05, 05][6F 85, 05, 05]
+
+0E22; [6F 4B, 05, 05]
+0E40 0E22; [6F 4B, 05, 05][6F 7D, 05, 05]
+0E41 0E22; [6F 4B, 05, 05][6F 7F, 05, 05]
+0E42 0E22; [6F 4B, 05, 05][6F 81, 05, 05]
+0E43 0E22; [6F 4B, 05, 05][6F 83, 05, 05]
+0E44 0E22; [6F 4B, 05, 05][6F 85, 05, 05]
+
+0E23; [6F 4D, 05, 05]
+0E40 0E23; [6F 4D, 05, 05][6F 7D, 05, 05]
+0E41 0E23; [6F 4D, 05, 05][6F 7F, 05, 05]
+0E42 0E23; [6F 4D, 05, 05][6F 81, 05, 05]
+0E43 0E23; [6F 4D, 05, 05][6F 83, 05, 05]
+0E44 0E23; [6F 4D, 05, 05][6F 85, 05, 05]
+
+0E24; [6F 4F, 05, 05]
+0E40 0E24; [6F 4F, 05, 05][6F 7D, 05, 05]
+0E41 0E24; [6F 4F, 05, 05][6F 7F, 05, 05]
+0E42 0E24; [6F 4F, 05, 05][6F 81, 05, 05]
+0E43 0E24; [6F 4F, 05, 05][6F 83, 05, 05]
+0E44 0E24; [6F 4F, 05, 05][6F 85, 05, 05]
+
+0E25; [6F 51, 05, 05]
+0E40 0E25; [6F 51, 05, 05][6F 7D, 05, 05]
+0E41 0E25; [6F 51, 05, 05][6F 7F, 05, 05]
+0E42 0E25; [6F 51, 05, 05][6F 81, 05, 05]
+0E43 0E25; [6F 51, 05, 05][6F 83, 05, 05]
+0E44 0E25; [6F 51, 05, 05][6F 85, 05, 05]
+
+0E26; [6F 53, 05, 05]
+0E40 0E26; [6F 53, 05, 05][6F 7D, 05, 05]
+0E41 0E26; [6F 53, 05, 05][6F 7F, 05, 05]
+0E42 0E26; [6F 53, 05, 05][6F 81, 05, 05]
+0E43 0E26; [6F 53, 05, 05][6F 83, 05, 05]
+0E44 0E26; [6F 53, 05, 05][6F 85, 05, 05]
+
+0E27; [6F 55, 05, 05]
+0E40 0E27; [6F 55, 05, 05][6F 7D, 05, 05]
+0E41 0E27; [6F 55, 05, 05][6F 7F, 05, 05]
+0E42 0E27; [6F 55, 05, 05][6F 81, 05, 05]
+0E43 0E27; [6F 55, 05, 05][6F 83, 05, 05]
+0E44 0E27; [6F 55, 05, 05][6F 85, 05, 05]
+
+0E28; [6F 57, 05, 05]
+0E40 0E28; [6F 57, 05, 05][6F 7D, 05, 05]
+0E41 0E28; [6F 57, 05, 05][6F 7F, 05, 05]
+0E42 0E28; [6F 57, 05, 05][6F 81, 05, 05]
+0E43 0E28; [6F 57, 05, 05][6F 83, 05, 05]
+0E44 0E28; [6F 57, 05, 05][6F 85, 05, 05]
+
+0E29; [6F 59, 05, 05]
+0E40 0E29; [6F 59, 05, 05][6F 7D, 05, 05]
+0E41 0E29; [6F 59, 05, 05][6F 7F, 05, 05]
+0E42 0E29; [6F 59, 05, 05][6F 81, 05, 05]
+0E43 0E29; [6F 59, 05, 05][6F 83, 05, 05]
+0E44 0E29; [6F 59, 05, 05][6F 85, 05, 05]
+
+0E2A; [6F 5B, 05, 05]
+0E40 0E2A; [6F 5B, 05, 05][6F 7D, 05, 05]
+0E41 0E2A; [6F 5B, 05, 05][6F 7F, 05, 05]
+0E42 0E2A; [6F 5B, 05, 05][6F 81, 05, 05]
+0E43 0E2A; [6F 5B, 05, 05][6F 83, 05, 05]
+0E44 0E2A; [6F 5B, 05, 05][6F 85, 05, 05]
+
+0E2B; [6F 5D, 05, 05]
+0E40 0E2B; [6F 5D, 05, 05][6F 7D, 05, 05]
+0E41 0E2B; [6F 5D, 05, 05][6F 7F, 05, 05]
+0E42 0E2B; [6F 5D, 05, 05][6F 81, 05, 05]
+0E43 0E2B; [6F 5D, 05, 05][6F 83, 05, 05]
+0E44 0E2B; [6F 5D, 05, 05][6F 85, 05, 05]
+
+0E2C; [6F 5F, 05, 05]
+0E40 0E2C; [6F 5F, 05, 05][6F 7D, 05, 05]
+0E41 0E2C; [6F 5F, 05, 05][6F 7F, 05, 05]
+0E42 0E2C; [6F 5F, 05, 05][6F 81, 05, 05]
+0E43 0E2C; [6F 5F, 05, 05][6F 83, 05, 05]
+0E44 0E2C; [6F 5F, 05, 05][6F 85, 05, 05]
+
+0E2D; [6F 61, 05, 05]
+0E40 0E2D; [6F 61, 05, 05][6F 7D, 05, 05]
+0E41 0E2D; [6F 61, 05, 05][6F 7F, 05, 05]
+0E42 0E2D; [6F 61, 05, 05][6F 81, 05, 05]
+0E43 0E2D; [6F 61, 05, 05][6F 83, 05, 05]
+0E44 0E2D; [6F 61, 05, 05][6F 85, 05, 05]
+
+0E2E; [6F 63, 05, 05]
+0E40 0E2E; [6F 63, 05, 05][6F 7D, 05, 05]
+0E41 0E2E; [6F 63, 05, 05][6F 7F, 05, 05]
+0E42 0E2E; [6F 63, 05, 05][6F 81, 05, 05]
+0E43 0E2E; [6F 63, 05, 05][6F 83, 05, 05]
+0E44 0E2E; [6F 63, 05, 05][6F 85, 05, 05]
+
+0E2F; [6F 65, 05, 05]
+
+0E30; [6F 67, 05, 05]
+
+0E31; [6F 69, 05, 05]
+
+0E32; [6F 6B, 05, 05]
+
+0E33; [6F 6D, 05, 05]
+0E4D 0E32; [6F 6D, 05, 05]
+
+0E34; [6F 6F, 05, 05]
+
+0E35; [6F 71, 05, 05]
+
+0E36; [6F 73, 05, 05]
+
+0E37; [6F 75, 05, 05]
+
+0E38; [6F 77, 05, 05]
+
+0E39; [6F 79, 05, 05]
+
+0E3A; [6F 7B, 05, 05]
+
+0E40; [6F 7D, 05, 05]
+
+0E41; [6F 7F, 05, 05]
+
+0E42; [6F 81, 05, 05]
+
+0E43; [6F 83, 05, 05]
+
+0E44; [6F 85, 05, 05]
+
+0E45; [6F 87, 05, 05]
+
+FDD1 0EA5;     [70 04 02, 05, 05]      # LAO first primary starts reordering group (compressible)
+
+0EDE; [70 09, 05, 05]
+0EC0 0EDE; [70 09, 05, 05][70 5F, 05, 05]
+0EC1 0EDE; [70 09, 05, 05][70 61, 05, 05]
+0EC2 0EDE; [70 09, 05, 05][70 63, 05, 05]
+0EC3 0EDE; [70 09, 05, 05][70 65, 05, 05]
+0EC4 0EDE; [70 09, 05, 05][70 67, 05, 05]
+
+0E81; [70 0B, 05, 05]
+0EC0 0E81; [70 0B, 05, 05][70 5F, 05, 05]
+0EC1 0E81; [70 0B, 05, 05][70 61, 05, 05]
+0EC2 0E81; [70 0B, 05, 05][70 63, 05, 05]
+0EC3 0E81; [70 0B, 05, 05][70 65, 05, 05]
+0EC4 0E81; [70 0B, 05, 05][70 67, 05, 05]
+
+0E82; [70 0D, 05, 05]
+0EC0 0E82; [70 0D, 05, 05][70 5F, 05, 05]
+0EC1 0E82; [70 0D, 05, 05][70 61, 05, 05]
+0EC2 0E82; [70 0D, 05, 05][70 63, 05, 05]
+0EC3 0E82; [70 0D, 05, 05][70 65, 05, 05]
+0EC4 0E82; [70 0D, 05, 05][70 67, 05, 05]
+
+0E84; [70 0F, 05, 05]
+0EC0 0E84; [70 0F, 05, 05][70 5F, 05, 05]
+0EC1 0E84; [70 0F, 05, 05][70 61, 05, 05]
+0EC2 0E84; [70 0F, 05, 05][70 63, 05, 05]
+0EC3 0E84; [70 0F, 05, 05][70 65, 05, 05]
+0EC4 0E84; [70 0F, 05, 05][70 67, 05, 05]
+
+0E87; [70 11, 05, 05]
+0EC0 0E87; [70 11, 05, 05][70 5F, 05, 05]
+0EC1 0E87; [70 11, 05, 05][70 61, 05, 05]
+0EC2 0E87; [70 11, 05, 05][70 63, 05, 05]
+0EC3 0E87; [70 11, 05, 05][70 65, 05, 05]
+0EC4 0E87; [70 11, 05, 05][70 67, 05, 05]
+
+0E88; [70 13, 05, 05]
+0EC0 0E88; [70 13, 05, 05][70 5F, 05, 05]
+0EC1 0E88; [70 13, 05, 05][70 61, 05, 05]
+0EC2 0E88; [70 13, 05, 05][70 63, 05, 05]
+0EC3 0E88; [70 13, 05, 05][70 65, 05, 05]
+0EC4 0E88; [70 13, 05, 05][70 67, 05, 05]
+
+0EAA; [70 15, 05, 05]
+0EC0 0EAA; [70 15, 05, 05][70 5F, 05, 05]
+0EC1 0EAA; [70 15, 05, 05][70 61, 05, 05]
+0EC2 0EAA; [70 15, 05, 05][70 63, 05, 05]
+0EC3 0EAA; [70 15, 05, 05][70 65, 05, 05]
+0EC4 0EAA; [70 15, 05, 05][70 67, 05, 05]
+
+0E8A; [70 17, 05, 05]
+0EC0 0E8A; [70 17, 05, 05][70 5F, 05, 05]
+0EC1 0E8A; [70 17, 05, 05][70 61, 05, 05]
+0EC2 0E8A; [70 17, 05, 05][70 63, 05, 05]
+0EC3 0E8A; [70 17, 05, 05][70 65, 05, 05]
+0EC4 0E8A; [70 17, 05, 05][70 67, 05, 05]
+
+0EDF; [70 19, 05, 05]
+0EC0 0EDF; [70 19, 05, 05][70 5F, 05, 05]
+0EC1 0EDF; [70 19, 05, 05][70 61, 05, 05]
+0EC2 0EDF; [70 19, 05, 05][70 63, 05, 05]
+0EC3 0EDF; [70 19, 05, 05][70 65, 05, 05]
+0EC4 0EDF; [70 19, 05, 05][70 67, 05, 05]
+
+0E8D; [70 1B, 05, 05]
+0EC0 0E8D; [70 1B, 05, 05][70 5F, 05, 05]
+0EC1 0E8D; [70 1B, 05, 05][70 61, 05, 05]
+0EC2 0E8D; [70 1B, 05, 05][70 63, 05, 05]
+0EC3 0E8D; [70 1B, 05, 05][70 65, 05, 05]
+0EC4 0E8D; [70 1B, 05, 05][70 67, 05, 05]
+
+0E94; [70 1D, 05, 05]
+0EC0 0E94; [70 1D, 05, 05][70 5F, 05, 05]
+0EC1 0E94; [70 1D, 05, 05][70 61, 05, 05]
+0EC2 0E94; [70 1D, 05, 05][70 63, 05, 05]
+0EC3 0E94; [70 1D, 05, 05][70 65, 05, 05]
+0EC4 0E94; [70 1D, 05, 05][70 67, 05, 05]
+
+0E95; [70 1F, 05, 05]
+0EC0 0E95; [70 1F, 05, 05][70 5F, 05, 05]
+0EC1 0E95; [70 1F, 05, 05][70 61, 05, 05]
+0EC2 0E95; [70 1F, 05, 05][70 63, 05, 05]
+0EC3 0E95; [70 1F, 05, 05][70 65, 05, 05]
+0EC4 0E95; [70 1F, 05, 05][70 67, 05, 05]
+
+0E96; [70 21, 05, 05]
+0EC0 0E96; [70 21, 05, 05][70 5F, 05, 05]
+0EC1 0E96; [70 21, 05, 05][70 61, 05, 05]
+0EC2 0E96; [70 21, 05, 05][70 63, 05, 05]
+0EC3 0E96; [70 21, 05, 05][70 65, 05, 05]
+0EC4 0E96; [70 21, 05, 05][70 67, 05, 05]
+
+0E97; [70 23, 05, 05]
+0EC0 0E97; [70 23, 05, 05][70 5F, 05, 05]
+0EC1 0E97; [70 23, 05, 05][70 61, 05, 05]
+0EC2 0E97; [70 23, 05, 05][70 63, 05, 05]
+0EC3 0E97; [70 23, 05, 05][70 65, 05, 05]
+0EC4 0E97; [70 23, 05, 05][70 67, 05, 05]
+
+0E99; [70 25, 05, 05]
+0EC0 0E99; [70 25, 05, 05][70 5F, 05, 05]
+0EC1 0E99; [70 25, 05, 05][70 61, 05, 05]
+0EC2 0E99; [70 25, 05, 05][70 63, 05, 05]
+0EC3 0E99; [70 25, 05, 05][70 65, 05, 05]
+0EC4 0E99; [70 25, 05, 05][70 67, 05, 05]
+
+0E9A; [70 27, 05, 05]
+0EC0 0E9A; [70 27, 05, 05][70 5F, 05, 05]
+0EC1 0E9A; [70 27, 05, 05][70 61, 05, 05]
+0EC2 0E9A; [70 27, 05, 05][70 63, 05, 05]
+0EC3 0E9A; [70 27, 05, 05][70 65, 05, 05]
+0EC4 0E9A; [70 27, 05, 05][70 67, 05, 05]
+
+0E9B; [70 29, 05, 05]
+0EC0 0E9B; [70 29, 05, 05][70 5F, 05, 05]
+0EC1 0E9B; [70 29, 05, 05][70 61, 05, 05]
+0EC2 0E9B; [70 29, 05, 05][70 63, 05, 05]
+0EC3 0E9B; [70 29, 05, 05][70 65, 05, 05]
+0EC4 0E9B; [70 29, 05, 05][70 67, 05, 05]
+
+0E9C; [70 2B, 05, 05]
+0EC0 0E9C; [70 2B, 05, 05][70 5F, 05, 05]
+0EC1 0E9C; [70 2B, 05, 05][70 61, 05, 05]
+0EC2 0E9C; [70 2B, 05, 05][70 63, 05, 05]
+0EC3 0E9C; [70 2B, 05, 05][70 65, 05, 05]
+0EC4 0E9C; [70 2B, 05, 05][70 67, 05, 05]
+
+0E9D; [70 2D, 05, 05]
+0EC0 0E9D; [70 2D, 05, 05][70 5F, 05, 05]
+0EC1 0E9D; [70 2D, 05, 05][70 61, 05, 05]
+0EC2 0E9D; [70 2D, 05, 05][70 63, 05, 05]
+0EC3 0E9D; [70 2D, 05, 05][70 65, 05, 05]
+0EC4 0E9D; [70 2D, 05, 05][70 67, 05, 05]
+
+0E9E; [70 2F, 05, 05]
+0EC0 0E9E; [70 2F, 05, 05][70 5F, 05, 05]
+0EC1 0E9E; [70 2F, 05, 05][70 61, 05, 05]
+0EC2 0E9E; [70 2F, 05, 05][70 63, 05, 05]
+0EC3 0E9E; [70 2F, 05, 05][70 65, 05, 05]
+0EC4 0E9E; [70 2F, 05, 05][70 67, 05, 05]
+
+0E9F; [70 31, 05, 05]
+0EC0 0E9F; [70 31, 05, 05][70 5F, 05, 05]
+0EC1 0E9F; [70 31, 05, 05][70 61, 05, 05]
+0EC2 0E9F; [70 31, 05, 05][70 63, 05, 05]
+0EC3 0E9F; [70 31, 05, 05][70 65, 05, 05]
+0EC4 0E9F; [70 31, 05, 05][70 67, 05, 05]
+
+0EA1; [70 33, 05, 05]
+0EC0 0EA1; [70 33, 05, 05][70 5F, 05, 05]
+0EC1 0EA1; [70 33, 05, 05][70 61, 05, 05]
+0EC2 0EA1; [70 33, 05, 05][70 63, 05, 05]
+0EC3 0EA1; [70 33, 05, 05][70 65, 05, 05]
+0EC4 0EA1; [70 33, 05, 05][70 67, 05, 05]
+
+0EA2; [70 35, 05, 05]
+0EC0 0EA2; [70 35, 05, 05][70 5F, 05, 05]
+0EC1 0EA2; [70 35, 05, 05][70 61, 05, 05]
+0EC2 0EA2; [70 35, 05, 05][70 63, 05, 05]
+0EC3 0EA2; [70 35, 05, 05][70 65, 05, 05]
+0EC4 0EA2; [70 35, 05, 05][70 67, 05, 05]
+
+0EA3; [70 37, 05, 05]
+0EC0 0EA3; [70 37, 05, 05][70 5F, 05, 05]
+0EC1 0EA3; [70 37, 05, 05][70 61, 05, 05]
+0EC2 0EA3; [70 37, 05, 05][70 63, 05, 05]
+0EC3 0EA3; [70 37, 05, 05][70 65, 05, 05]
+0EC4 0EA3; [70 37, 05, 05][70 67, 05, 05]
+
+0EA5; [70 39, 05, 05]
+0EC0 0EA5; [70 39, 05, 05][70 5F, 05, 05]
+0EC1 0EA5; [70 39, 05, 05][70 61, 05, 05]
+0EC2 0EA5; [70 39, 05, 05][70 63, 05, 05]
+0EC3 0EA5; [70 39, 05, 05][70 65, 05, 05]
+0EC4 0EA5; [70 39, 05, 05][70 67, 05, 05]
+
+0EA7; [70 3B, 05, 05]
+0EC0 0EA7; [70 3B, 05, 05][70 5F, 05, 05]
+0EC1 0EA7; [70 3B, 05, 05][70 61, 05, 05]
+0EC2 0EA7; [70 3B, 05, 05][70 63, 05, 05]
+0EC3 0EA7; [70 3B, 05, 05][70 65, 05, 05]
+0EC4 0EA7; [70 3B, 05, 05][70 67, 05, 05]
+
+0EAB; [70 3D, 05, 05]
+0EDC; [70 3D, 05, 20][70 25, 05, 20]
+0EC0 0EDC; [70 3D, 05, 20][70 25, 05, 20][70 5F, 05, 05]
+0EC1 0EDC; [70 3D, 05, 20][70 25, 05, 20][70 61, 05, 05]
+0EC2 0EDC; [70 3D, 05, 20][70 25, 05, 20][70 63, 05, 05]
+0EC3 0EDC; [70 3D, 05, 20][70 25, 05, 20][70 65, 05, 05]
+0EC4 0EDC; [70 3D, 05, 20][70 25, 05, 20][70 67, 05, 05]
+0EDD; [70 3D, 05, 20][70 33, 05, 20]
+0EC0 0EDD; [70 3D, 05, 20][70 33, 05, 20][70 5F, 05, 05]
+0EC1 0EDD; [70 3D, 05, 20][70 33, 05, 20][70 61, 05, 05]
+0EC2 0EDD; [70 3D, 05, 20][70 33, 05, 20][70 63, 05, 05]
+0EC3 0EDD; [70 3D, 05, 20][70 33, 05, 20][70 65, 05, 05]
+0EC4 0EDD; [70 3D, 05, 20][70 33, 05, 20][70 67, 05, 05]
+0EC0 0EAB; [70 3D, 05, 05][70 5F, 05, 05]
+0EC1 0EAB; [70 3D, 05, 05][70 61, 05, 05]
+0EC2 0EAB; [70 3D, 05, 05][70 63, 05, 05]
+0EC3 0EAB; [70 3D, 05, 05][70 65, 05, 05]
+0EC4 0EAB; [70 3D, 05, 05][70 67, 05, 05]
+
+0EAD; [70 3F, 05, 05]
+0EC0 0EAD; [70 3F, 05, 05][70 5F, 05, 05]
+0EC1 0EAD; [70 3F, 05, 05][70 61, 05, 05]
+0EC2 0EAD; [70 3F, 05, 05][70 63, 05, 05]
+0EC3 0EAD; [70 3F, 05, 05][70 65, 05, 05]
+0EC4 0EAD; [70 3F, 05, 05][70 67, 05, 05]
+
+0EAE; [70 41, 05, 05]
+0EC0 0EAE; [70 41, 05, 05][70 5F, 05, 05]
+0EC1 0EAE; [70 41, 05, 05][70 61, 05, 05]
+0EC2 0EAE; [70 41, 05, 05][70 63, 05, 05]
+0EC3 0EAE; [70 41, 05, 05][70 65, 05, 05]
+0EC4 0EAE; [70 41, 05, 05][70 67, 05, 05]
+
+0EAF; [70 43, 05, 05]
+
+0EB0; [70 45, 05, 05]
+
+0EB1; [70 47, 05, 05]
+
+0EB2; [70 49, 05, 05]
+
+0EB3; [70 4B, 05, 05]
+0ECD 0EB2; [70 4B, 05, 05]
+
+0EB4; [70 4D, 05, 05]
+
+0EB5; [70 4F, 05, 05]
+
+0EB6; [70 51, 05, 05]
+
+0EB7; [70 53, 05, 05]
+
+0EB8; [70 55, 05, 05]
+
+0EB9; [70 57, 05, 05]
+
+0EBB; [70 59, 05, 05]
+
+0EBC; [70 5B, 05, 05]
+
+0EBD; [70 5D, 05, 05]
+
+0EC0; [70 5F, 05, 05]
+
+0EC1; [70 61, 05, 05]
+
+0EC2; [70 63, 05, 05]
+
+0EC3; [70 65, 05, 05]
+
+0EC4; [70 67, 05, 05]
+
+FDD1 AA80;     [70 6C 02, 05, 05]      # Tai Viet first primary
+
+AA80; [70 6C 2B, 05, 05]
+AAB5 AA80; [70 6C 2B, 05, 05][70 6D D5, 05, 05]
+AAB6 AA80; [70 6C 2B, 05, 05][70 6D DD, 05, 05]
+AAB9 AA80; [70 6C 2B, 05, 05][70 6D F5, 05, 05]
+AABB AA80; [70 6C 2B, 05, 05][70 6E 07, 05, 05]
+AABC AA80; [70 6C 2B, 05, 05][70 6E 0F, 05, 05]
+
+AA81; [70 6C 33, 05, 05]
+AAB5 AA81; [70 6C 33, 05, 05][70 6D D5, 05, 05]
+AAB6 AA81; [70 6C 33, 05, 05][70 6D DD, 05, 05]
+AAB9 AA81; [70 6C 33, 05, 05][70 6D F5, 05, 05]
+AABB AA81; [70 6C 33, 05, 05][70 6E 07, 05, 05]
+AABC AA81; [70 6C 33, 05, 05][70 6E 0F, 05, 05]
+
+AA82; [70 6C 3B, 05, 05]
+AAB5 AA82; [70 6C 3B, 05, 05][70 6D D5, 05, 05]
+AAB6 AA82; [70 6C 3B, 05, 05][70 6D DD, 05, 05]
+AAB9 AA82; [70 6C 3B, 05, 05][70 6D F5, 05, 05]
+AABB AA82; [70 6C 3B, 05, 05][70 6E 07, 05, 05]
+AABC AA82; [70 6C 3B, 05, 05][70 6E 0F, 05, 05]
+
+AA83; [70 6C 43, 05, 05]
+AAB5 AA83; [70 6C 43, 05, 05][70 6D D5, 05, 05]
+AAB6 AA83; [70 6C 43, 05, 05][70 6D DD, 05, 05]
+AAB9 AA83; [70 6C 43, 05, 05][70 6D F5, 05, 05]
+AABB AA83; [70 6C 43, 05, 05][70 6E 07, 05, 05]
+AABC AA83; [70 6C 43, 05, 05][70 6E 0F, 05, 05]
+
+AA84; [70 6C 4B, 05, 05]
+AAB5 AA84; [70 6C 4B, 05, 05][70 6D D5, 05, 05]
+AAB6 AA84; [70 6C 4B, 05, 05][70 6D DD, 05, 05]
+AAB9 AA84; [70 6C 4B, 05, 05][70 6D F5, 05, 05]
+AABB AA84; [70 6C 4B, 05, 05][70 6E 07, 05, 05]
+AABC AA84; [70 6C 4B, 05, 05][70 6E 0F, 05, 05]
+
+AA85; [70 6C 53, 05, 05]
+AAB5 AA85; [70 6C 53, 05, 05][70 6D D5, 05, 05]
+AAB6 AA85; [70 6C 53, 05, 05][70 6D DD, 05, 05]
+AAB9 AA85; [70 6C 53, 05, 05][70 6D F5, 05, 05]
+AABB AA85; [70 6C 53, 05, 05][70 6E 07, 05, 05]
+AABC AA85; [70 6C 53, 05, 05][70 6E 0F, 05, 05]
+
+AA86; [70 6C 5B, 05, 05]
+AAB5 AA86; [70 6C 5B, 05, 05][70 6D D5, 05, 05]
+AAB6 AA86; [70 6C 5B, 05, 05][70 6D DD, 05, 05]
+AAB9 AA86; [70 6C 5B, 05, 05][70 6D F5, 05, 05]
+AABB AA86; [70 6C 5B, 05, 05][70 6E 07, 05, 05]
+AABC AA86; [70 6C 5B, 05, 05][70 6E 0F, 05, 05]
+
+AA87; [70 6C 63, 05, 05]
+AAB5 AA87; [70 6C 63, 05, 05][70 6D D5, 05, 05]
+AAB6 AA87; [70 6C 63, 05, 05][70 6D DD, 05, 05]
+AAB9 AA87; [70 6C 63, 05, 05][70 6D F5, 05, 05]
+AABB AA87; [70 6C 63, 05, 05][70 6E 07, 05, 05]
+AABC AA87; [70 6C 63, 05, 05][70 6E 0F, 05, 05]
+
+AA88; [70 6C 6B, 05, 05]
+AAB5 AA88; [70 6C 6B, 05, 05][70 6D D5, 05, 05]
+AAB6 AA88; [70 6C 6B, 05, 05][70 6D DD, 05, 05]
+AAB9 AA88; [70 6C 6B, 05, 05][70 6D F5, 05, 05]
+AABB AA88; [70 6C 6B, 05, 05][70 6E 07, 05, 05]
+AABC AA88; [70 6C 6B, 05, 05][70 6E 0F, 05, 05]
+
+AA89; [70 6C 73, 05, 05]
+AAB5 AA89; [70 6C 73, 05, 05][70 6D D5, 05, 05]
+AAB6 AA89; [70 6C 73, 05, 05][70 6D DD, 05, 05]
+AAB9 AA89; [70 6C 73, 05, 05][70 6D F5, 05, 05]
+AABB AA89; [70 6C 73, 05, 05][70 6E 07, 05, 05]
+AABC AA89; [70 6C 73, 05, 05][70 6E 0F, 05, 05]
+
+AA8A; [70 6C 7B, 05, 05]
+AAB5 AA8A; [70 6C 7B, 05, 05][70 6D D5, 05, 05]
+AAB6 AA8A; [70 6C 7B, 05, 05][70 6D DD, 05, 05]
+AAB9 AA8A; [70 6C 7B, 05, 05][70 6D F5, 05, 05]
+AABB AA8A; [70 6C 7B, 05, 05][70 6E 07, 05, 05]
+AABC AA8A; [70 6C 7B, 05, 05][70 6E 0F, 05, 05]
+
+AA8B; [70 6C 83, 05, 05]
+AAB5 AA8B; [70 6C 83, 05, 05][70 6D D5, 05, 05]
+AAB6 AA8B; [70 6C 83, 05, 05][70 6D DD, 05, 05]
+AAB9 AA8B; [70 6C 83, 05, 05][70 6D F5, 05, 05]
+AABB AA8B; [70 6C 83, 05, 05][70 6E 07, 05, 05]
+AABC AA8B; [70 6C 83, 05, 05][70 6E 0F, 05, 05]
+
+AA8C; [70 6C 8B, 05, 05]
+AAB5 AA8C; [70 6C 8B, 05, 05][70 6D D5, 05, 05]
+AAB6 AA8C; [70 6C 8B, 05, 05][70 6D DD, 05, 05]
+AAB9 AA8C; [70 6C 8B, 05, 05][70 6D F5, 05, 05]
+AABB AA8C; [70 6C 8B, 05, 05][70 6E 07, 05, 05]
+AABC AA8C; [70 6C 8B, 05, 05][70 6E 0F, 05, 05]
+
+AA8D; [70 6C 93, 05, 05]
+AAB5 AA8D; [70 6C 93, 05, 05][70 6D D5, 05, 05]
+AAB6 AA8D; [70 6C 93, 05, 05][70 6D DD, 05, 05]
+AAB9 AA8D; [70 6C 93, 05, 05][70 6D F5, 05, 05]
+AABB AA8D; [70 6C 93, 05, 05][70 6E 07, 05, 05]
+AABC AA8D; [70 6C 93, 05, 05][70 6E 0F, 05, 05]
+
+AA8E; [70 6C 9B, 05, 05]
+AAB5 AA8E; [70 6C 9B, 05, 05][70 6D D5, 05, 05]
+AAB6 AA8E; [70 6C 9B, 05, 05][70 6D DD, 05, 05]
+AAB9 AA8E; [70 6C 9B, 05, 05][70 6D F5, 05, 05]
+AABB AA8E; [70 6C 9B, 05, 05][70 6E 07, 05, 05]
+AABC AA8E; [70 6C 9B, 05, 05][70 6E 0F, 05, 05]
+
+AA8F; [70 6C A3, 05, 05]
+AAB5 AA8F; [70 6C A3, 05, 05][70 6D D5, 05, 05]
+AAB6 AA8F; [70 6C A3, 05, 05][70 6D DD, 05, 05]
+AAB9 AA8F; [70 6C A3, 05, 05][70 6D F5, 05, 05]
+AABB AA8F; [70 6C A3, 05, 05][70 6E 07, 05, 05]
+AABC AA8F; [70 6C A3, 05, 05][70 6E 0F, 05, 05]
+
+AA90; [70 6C AB, 05, 05]
+AAB5 AA90; [70 6C AB, 05, 05][70 6D D5, 05, 05]
+AAB6 AA90; [70 6C AB, 05, 05][70 6D DD, 05, 05]
+AAB9 AA90; [70 6C AB, 05, 05][70 6D F5, 05, 05]
+AABB AA90; [70 6C AB, 05, 05][70 6E 07, 05, 05]
+AABC AA90; [70 6C AB, 05, 05][70 6E 0F, 05, 05]
+
+AA91; [70 6C B3, 05, 05]
+AAB5 AA91; [70 6C B3, 05, 05][70 6D D5, 05, 05]
+AAB6 AA91; [70 6C B3, 05, 05][70 6D DD, 05, 05]
+AAB9 AA91; [70 6C B3, 05, 05][70 6D F5, 05, 05]
+AABB AA91; [70 6C B3, 05, 05][70 6E 07, 05, 05]
+AABC AA91; [70 6C B3, 05, 05][70 6E 0F, 05, 05]
+
+AA92; [70 6C BB, 05, 05]
+AAB5 AA92; [70 6C BB, 05, 05][70 6D D5, 05, 05]
+AAB6 AA92; [70 6C BB, 05, 05][70 6D DD, 05, 05]
+AAB9 AA92; [70 6C BB, 05, 05][70 6D F5, 05, 05]
+AABB AA92; [70 6C BB, 05, 05][70 6E 07, 05, 05]
+AABC AA92; [70 6C BB, 05, 05][70 6E 0F, 05, 05]
+
+AA93; [70 6C C3, 05, 05]
+AAB5 AA93; [70 6C C3, 05, 05][70 6D D5, 05, 05]
+AAB6 AA93; [70 6C C3, 05, 05][70 6D DD, 05, 05]
+AAB9 AA93; [70 6C C3, 05, 05][70 6D F5, 05, 05]
+AABB AA93; [70 6C C3, 05, 05][70 6E 07, 05, 05]
+AABC AA93; [70 6C C3, 05, 05][70 6E 0F, 05, 05]
+
+AA94; [70 6C CB, 05, 05]
+AAB5 AA94; [70 6C CB, 05, 05][70 6D D5, 05, 05]
+AAB6 AA94; [70 6C CB, 05, 05][70 6D DD, 05, 05]
+AAB9 AA94; [70 6C CB, 05, 05][70 6D F5, 05, 05]
+AABB AA94; [70 6C CB, 05, 05][70 6E 07, 05, 05]
+AABC AA94; [70 6C CB, 05, 05][70 6E 0F, 05, 05]
+
+AA95; [70 6C D3, 05, 05]
+AAB5 AA95; [70 6C D3, 05, 05][70 6D D5, 05, 05]
+AAB6 AA95; [70 6C D3, 05, 05][70 6D DD, 05, 05]
+AAB9 AA95; [70 6C D3, 05, 05][70 6D F5, 05, 05]
+AABB AA95; [70 6C D3, 05, 05][70 6E 07, 05, 05]
+AABC AA95; [70 6C D3, 05, 05][70 6E 0F, 05, 05]
+
+AA96; [70 6C DB, 05, 05]
+AAB5 AA96; [70 6C DB, 05, 05][70 6D D5, 05, 05]
+AAB6 AA96; [70 6C DB, 05, 05][70 6D DD, 05, 05]
+AAB9 AA96; [70 6C DB, 05, 05][70 6D F5, 05, 05]
+AABB AA96; [70 6C DB, 05, 05][70 6E 07, 05, 05]
+AABC AA96; [70 6C DB, 05, 05][70 6E 0F, 05, 05]
+
+AA97; [70 6C E3, 05, 05]
+AAB5 AA97; [70 6C E3, 05, 05][70 6D D5, 05, 05]
+AAB6 AA97; [70 6C E3, 05, 05][70 6D DD, 05, 05]
+AAB9 AA97; [70 6C E3, 05, 05][70 6D F5, 05, 05]
+AABB AA97; [70 6C E3, 05, 05][70 6E 07, 05, 05]
+AABC AA97; [70 6C E3, 05, 05][70 6E 0F, 05, 05]
+
+AA98; [70 6C EB, 05, 05]
+AAB5 AA98; [70 6C EB, 05, 05][70 6D D5, 05, 05]
+AAB6 AA98; [70 6C EB, 05, 05][70 6D DD, 05, 05]
+AAB9 AA98; [70 6C EB, 05, 05][70 6D F5, 05, 05]
+AABB AA98; [70 6C EB, 05, 05][70 6E 07, 05, 05]
+AABC AA98; [70 6C EB, 05, 05][70 6E 0F, 05, 05]
+
+AA99; [70 6C F3, 05, 05]
+AAB5 AA99; [70 6C F3, 05, 05][70 6D D5, 05, 05]
+AAB6 AA99; [70 6C F3, 05, 05][70 6D DD, 05, 05]
+AAB9 AA99; [70 6C F3, 05, 05][70 6D F5, 05, 05]
+AABB AA99; [70 6C F3, 05, 05][70 6E 07, 05, 05]
+AABC AA99; [70 6C F3, 05, 05][70 6E 0F, 05, 05]
+
+AA9A; [70 6C FB, 05, 05]
+AAB5 AA9A; [70 6C FB, 05, 05][70 6D D5, 05, 05]
+AAB6 AA9A; [70 6C FB, 05, 05][70 6D DD, 05, 05]
+AAB9 AA9A; [70 6C FB, 05, 05][70 6D F5, 05, 05]
+AABB AA9A; [70 6C FB, 05, 05][70 6E 07, 05, 05]
+AABC AA9A; [70 6C FB, 05, 05][70 6E 0F, 05, 05]
+
+AA9B; [70 6D 05, 05, 05]
+AAB5 AA9B; [70 6D 05, 05, 05][70 6D D5, 05, 05]
+AAB6 AA9B; [70 6D 05, 05, 05][70 6D DD, 05, 05]
+AAB9 AA9B; [70 6D 05, 05, 05][70 6D F5, 05, 05]
+AABB AA9B; [70 6D 05, 05, 05][70 6E 07, 05, 05]
+AABC AA9B; [70 6D 05, 05, 05][70 6E 0F, 05, 05]
+
+AA9C; [70 6D 0D, 05, 05]
+AAB5 AA9C; [70 6D 0D, 05, 05][70 6D D5, 05, 05]
+AAB6 AA9C; [70 6D 0D, 05, 05][70 6D DD, 05, 05]
+AAB9 AA9C; [70 6D 0D, 05, 05][70 6D F5, 05, 05]
+AABB AA9C; [70 6D 0D, 05, 05][70 6E 07, 05, 05]
+AABC AA9C; [70 6D 0D, 05, 05][70 6E 0F, 05, 05]
+
+AA9D; [70 6D 15, 05, 05]
+AAB5 AA9D; [70 6D 15, 05, 05][70 6D D5, 05, 05]
+AAB6 AA9D; [70 6D 15, 05, 05][70 6D DD, 05, 05]
+AAB9 AA9D; [70 6D 15, 05, 05][70 6D F5, 05, 05]
+AABB AA9D; [70 6D 15, 05, 05][70 6E 07, 05, 05]
+AABC AA9D; [70 6D 15, 05, 05][70 6E 0F, 05, 05]
+
+AA9E; [70 6D 1D, 05, 05]
+AAB5 AA9E; [70 6D 1D, 05, 05][70 6D D5, 05, 05]
+AAB6 AA9E; [70 6D 1D, 05, 05][70 6D DD, 05, 05]
+AAB9 AA9E; [70 6D 1D, 05, 05][70 6D F5, 05, 05]
+AABB AA9E; [70 6D 1D, 05, 05][70 6E 07, 05, 05]
+AABC AA9E; [70 6D 1D, 05, 05][70 6E 0F, 05, 05]
+
+AA9F; [70 6D 25, 05, 05]
+AAB5 AA9F; [70 6D 25, 05, 05][70 6D D5, 05, 05]
+AAB6 AA9F; [70 6D 25, 05, 05][70 6D DD, 05, 05]
+AAB9 AA9F; [70 6D 25, 05, 05][70 6D F5, 05, 05]
+AABB AA9F; [70 6D 25, 05, 05][70 6E 07, 05, 05]
+AABC AA9F; [70 6D 25, 05, 05][70 6E 0F, 05, 05]
+
+AAA0; [70 6D 2D, 05, 05]
+AAB5 AAA0; [70 6D 2D, 05, 05][70 6D D5, 05, 05]
+AAB6 AAA0; [70 6D 2D, 05, 05][70 6D DD, 05, 05]
+AAB9 AAA0; [70 6D 2D, 05, 05][70 6D F5, 05, 05]
+AABB AAA0; [70 6D 2D, 05, 05][70 6E 07, 05, 05]
+AABC AAA0; [70 6D 2D, 05, 05][70 6E 0F, 05, 05]
+
+AAA1; [70 6D 35, 05, 05]
+AAB5 AAA1; [70 6D 35, 05, 05][70 6D D5, 05, 05]
+AAB6 AAA1; [70 6D 35, 05, 05][70 6D DD, 05, 05]
+AAB9 AAA1; [70 6D 35, 05, 05][70 6D F5, 05, 05]
+AABB AAA1; [70 6D 35, 05, 05][70 6E 07, 05, 05]
+AABC AAA1; [70 6D 35, 05, 05][70 6E 0F, 05, 05]
+
+AAA2; [70 6D 3D, 05, 05]
+AAB5 AAA2; [70 6D 3D, 05, 05][70 6D D5, 05, 05]
+AAB6 AAA2; [70 6D 3D, 05, 05][70 6D DD, 05, 05]
+AAB9 AAA2; [70 6D 3D, 05, 05][70 6D F5, 05, 05]
+AABB AAA2; [70 6D 3D, 05, 05][70 6E 07, 05, 05]
+AABC AAA2; [70 6D 3D, 05, 05][70 6E 0F, 05, 05]
+
+AAA3; [70 6D 45, 05, 05]
+AAB5 AAA3; [70 6D 45, 05, 05][70 6D D5, 05, 05]
+AAB6 AAA3; [70 6D 45, 05, 05][70 6D DD, 05, 05]
+AAB9 AAA3; [70 6D 45, 05, 05][70 6D F5, 05, 05]
+AABB AAA3; [70 6D 45, 05, 05][70 6E 07, 05, 05]
+AABC AAA3; [70 6D 45, 05, 05][70 6E 0F, 05, 05]
+
+AAA4; [70 6D 4D, 05, 05]
+AAB5 AAA4; [70 6D 4D, 05, 05][70 6D D5, 05, 05]
+AAB6 AAA4; [70 6D 4D, 05, 05][70 6D DD, 05, 05]
+AAB9 AAA4; [70 6D 4D, 05, 05][70 6D F5, 05, 05]
+AABB AAA4; [70 6D 4D, 05, 05][70 6E 07, 05, 05]
+AABC AAA4; [70 6D 4D, 05, 05][70 6E 0F, 05, 05]
+
+AAA5; [70 6D 55, 05, 05]
+AAB5 AAA5; [70 6D 55, 05, 05][70 6D D5, 05, 05]
+AAB6 AAA5; [70 6D 55, 05, 05][70 6D DD, 05, 05]
+AAB9 AAA5; [70 6D 55, 05, 05][70 6D F5, 05, 05]
+AABB AAA5; [70 6D 55, 05, 05][70 6E 07, 05, 05]
+AABC AAA5; [70 6D 55, 05, 05][70 6E 0F, 05, 05]
+
+AAA6; [70 6D 5D, 05, 05]
+AAB5 AAA6; [70 6D 5D, 05, 05][70 6D D5, 05, 05]
+AAB6 AAA6; [70 6D 5D, 05, 05][70 6D DD, 05, 05]
+AAB9 AAA6; [70 6D 5D, 05, 05][70 6D F5, 05, 05]
+AABB AAA6; [70 6D 5D, 05, 05][70 6E 07, 05, 05]
+AABC AAA6; [70 6D 5D, 05, 05][70 6E 0F, 05, 05]
+
+AAA7; [70 6D 65, 05, 05]
+AAB5 AAA7; [70 6D 65, 05, 05][70 6D D5, 05, 05]
+AAB6 AAA7; [70 6D 65, 05, 05][70 6D DD, 05, 05]
+AAB9 AAA7; [70 6D 65, 05, 05][70 6D F5, 05, 05]
+AABB AAA7; [70 6D 65, 05, 05][70 6E 07, 05, 05]
+AABC AAA7; [70 6D 65, 05, 05][70 6E 0F, 05, 05]
+
+AAA8; [70 6D 6D, 05, 05]
+AAB5 AAA8; [70 6D 6D, 05, 05][70 6D D5, 05, 05]
+AAB6 AAA8; [70 6D 6D, 05, 05][70 6D DD, 05, 05]
+AAB9 AAA8; [70 6D 6D, 05, 05][70 6D F5, 05, 05]
+AABB AAA8; [70 6D 6D, 05, 05][70 6E 07, 05, 05]
+AABC AAA8; [70 6D 6D, 05, 05][70 6E 0F, 05, 05]
+
+AAA9; [70 6D 75, 05, 05]
+AAB5 AAA9; [70 6D 75, 05, 05][70 6D D5, 05, 05]
+AAB6 AAA9; [70 6D 75, 05, 05][70 6D DD, 05, 05]
+AAB9 AAA9; [70 6D 75, 05, 05][70 6D F5, 05, 05]
+AABB AAA9; [70 6D 75, 05, 05][70 6E 07, 05, 05]
+AABC AAA9; [70 6D 75, 05, 05][70 6E 0F, 05, 05]
+
+AAAA; [70 6D 7D, 05, 05]
+AAB5 AAAA; [70 6D 7D, 05, 05][70 6D D5, 05, 05]
+AAB6 AAAA; [70 6D 7D, 05, 05][70 6D DD, 05, 05]
+AAB9 AAAA; [70 6D 7D, 05, 05][70 6D F5, 05, 05]
+AABB AAAA; [70 6D 7D, 05, 05][70 6E 07, 05, 05]
+AABC AAAA; [70 6D 7D, 05, 05][70 6E 0F, 05, 05]
 
-10A30; [71 B3 C6, 05, 05]
+AAAB; [70 6D 85, 05, 05]
+AAB5 AAAB; [70 6D 85, 05, 05][70 6D D5, 05, 05]
+AAB6 AAAB; [70 6D 85, 05, 05][70 6D DD, 05, 05]
+AAB9 AAAB; [70 6D 85, 05, 05][70 6D F5, 05, 05]
+AABB AAAB; [70 6D 85, 05, 05][70 6E 07, 05, 05]
+AABC AAAB; [70 6D 85, 05, 05][70 6E 0F, 05, 05]
 
-10A31; [71 B3 CE, 05, 05]
+AAAC; [70 6D 8D, 05, 05]
+AAB5 AAAC; [70 6D 8D, 05, 05][70 6D D5, 05, 05]
+AAB6 AAAC; [70 6D 8D, 05, 05][70 6D DD, 05, 05]
+AAB9 AAAC; [70 6D 8D, 05, 05][70 6D F5, 05, 05]
+AABB AAAC; [70 6D 8D, 05, 05][70 6E 07, 05, 05]
+AABC AAAC; [70 6D 8D, 05, 05][70 6E 0F, 05, 05]
 
-10A32; [71 B3 D6, 05, 05]
+AAAD; [70 6D 95, 05, 05]
+AAB5 AAAD; [70 6D 95, 05, 05][70 6D D5, 05, 05]
+AAB6 AAAD; [70 6D 95, 05, 05][70 6D DD, 05, 05]
+AAB9 AAAD; [70 6D 95, 05, 05][70 6D F5, 05, 05]
+AABB AAAD; [70 6D 95, 05, 05][70 6E 07, 05, 05]
+AABC AAAD; [70 6D 95, 05, 05][70 6E 0F, 05, 05]
 
-10A33; [71 B3 DE, 05, 05]
+AAAE; [70 6D 9D, 05, 05]
+AAB5 AAAE; [70 6D 9D, 05, 05][70 6D D5, 05, 05]
+AAB6 AAAE; [70 6D 9D, 05, 05][70 6D DD, 05, 05]
+AAB9 AAAE; [70 6D 9D, 05, 05][70 6D F5, 05, 05]
+AABB AAAE; [70 6D 9D, 05, 05][70 6E 07, 05, 05]
+AABC AAAE; [70 6D 9D, 05, 05][70 6E 0F, 05, 05]
 
-10A3F; [71 B3 E6, 05, 05]
+AAAF; [70 6D A5, 05, 05]
+AAB5 AAAF; [70 6D A5, 05, 05][70 6D D5, 05, 05]
+AAB6 AAAF; [70 6D A5, 05, 05][70 6D DD, 05, 05]
+AAB9 AAAF; [70 6D A5, 05, 05][70 6D F5, 05, 05]
+AABB AAAF; [70 6D A5, 05, 05][70 6E 07, 05, 05]
+AABC AAAF; [70 6D A5, 05, 05][70 6E 0F, 05, 05]
 
-0E01; [72 0A, 05, 05]
-0E40 0E01; [72 0A, 05, 05][72 7E, 05, 05]
-0E41 0E01; [72 0A, 05, 05][72 80, 05, 05]
-0E42 0E01; [72 0A, 05, 05][72 82, 05, 05]
-0E43 0E01; [72 0A, 05, 05][72 84, 05, 05]
-0E44 0E01; [72 0A, 05, 05][72 86, 05, 05]
+AAB0; [70 6D AD, 05, 05]
 
-0E02; [72 0C, 05, 05]
-0E40 0E02; [72 0C, 05, 05][72 7E, 05, 05]
-0E41 0E02; [72 0C, 05, 05][72 80, 05, 05]
-0E42 0E02; [72 0C, 05, 05][72 82, 05, 05]
-0E43 0E02; [72 0C, 05, 05][72 84, 05, 05]
-0E44 0E02; [72 0C, 05, 05][72 86, 05, 05]
+AAB1; [70 6D B5, 05, 05]
 
-0E03; [72 0E, 05, 05]
-0E40 0E03; [72 0E, 05, 05][72 7E, 05, 05]
-0E41 0E03; [72 0E, 05, 05][72 80, 05, 05]
-0E42 0E03; [72 0E, 05, 05][72 82, 05, 05]
-0E43 0E03; [72 0E, 05, 05][72 84, 05, 05]
-0E44 0E03; [72 0E, 05, 05][72 86, 05, 05]
+AAB2; [70 6D BD, 05, 05]
 
-0E04; [72 10, 05, 05]
-0E40 0E04; [72 10, 05, 05][72 7E, 05, 05]
-0E41 0E04; [72 10, 05, 05][72 80, 05, 05]
-0E42 0E04; [72 10, 05, 05][72 82, 05, 05]
-0E43 0E04; [72 10, 05, 05][72 84, 05, 05]
-0E44 0E04; [72 10, 05, 05][72 86, 05, 05]
+AAB3; [70 6D C5, 05, 05]
 
-0E05; [72 12, 05, 05]
-0E40 0E05; [72 12, 05, 05][72 7E, 05, 05]
-0E41 0E05; [72 12, 05, 05][72 80, 05, 05]
-0E42 0E05; [72 12, 05, 05][72 82, 05, 05]
-0E43 0E05; [72 12, 05, 05][72 84, 05, 05]
-0E44 0E05; [72 12, 05, 05][72 86, 05, 05]
+AAB4; [70 6D CD, 05, 05]
 
-0E06; [72 14, 05, 05]
-0E40 0E06; [72 14, 05, 05][72 7E, 05, 05]
-0E41 0E06; [72 14, 05, 05][72 80, 05, 05]
-0E42 0E06; [72 14, 05, 05][72 82, 05, 05]
-0E43 0E06; [72 14, 05, 05][72 84, 05, 05]
-0E44 0E06; [72 14, 05, 05][72 86, 05, 05]
+AAB5; [70 6D D5, 05, 05]
 
-0E07; [72 16, 05, 05]
-0E40 0E07; [72 16, 05, 05][72 7E, 05, 05]
-0E41 0E07; [72 16, 05, 05][72 80, 05, 05]
-0E42 0E07; [72 16, 05, 05][72 82, 05, 05]
-0E43 0E07; [72 16, 05, 05][72 84, 05, 05]
-0E44 0E07; [72 16, 05, 05][72 86, 05, 05]
-
-0E08; [72 18, 05, 05]
-0E40 0E08; [72 18, 05, 05][72 7E, 05, 05]
-0E41 0E08; [72 18, 05, 05][72 80, 05, 05]
-0E42 0E08; [72 18, 05, 05][72 82, 05, 05]
-0E43 0E08; [72 18, 05, 05][72 84, 05, 05]
-0E44 0E08; [72 18, 05, 05][72 86, 05, 05]
-
-0E09; [72 1A, 05, 05]
-0E40 0E09; [72 1A, 05, 05][72 7E, 05, 05]
-0E41 0E09; [72 1A, 05, 05][72 80, 05, 05]
-0E42 0E09; [72 1A, 05, 05][72 82, 05, 05]
-0E43 0E09; [72 1A, 05, 05][72 84, 05, 05]
-0E44 0E09; [72 1A, 05, 05][72 86, 05, 05]
-
-0E0A; [72 1C, 05, 05]
-0E40 0E0A; [72 1C, 05, 05][72 7E, 05, 05]
-0E41 0E0A; [72 1C, 05, 05][72 80, 05, 05]
-0E42 0E0A; [72 1C, 05, 05][72 82, 05, 05]
-0E43 0E0A; [72 1C, 05, 05][72 84, 05, 05]
-0E44 0E0A; [72 1C, 05, 05][72 86, 05, 05]
-
-0E0B; [72 1E, 05, 05]
-0E40 0E0B; [72 1E, 05, 05][72 7E, 05, 05]
-0E41 0E0B; [72 1E, 05, 05][72 80, 05, 05]
-0E42 0E0B; [72 1E, 05, 05][72 82, 05, 05]
-0E43 0E0B; [72 1E, 05, 05][72 84, 05, 05]
-0E44 0E0B; [72 1E, 05, 05][72 86, 05, 05]
-
-0E0C; [72 20, 05, 05]
-0E40 0E0C; [72 20, 05, 05][72 7E, 05, 05]
-0E41 0E0C; [72 20, 05, 05][72 80, 05, 05]
-0E42 0E0C; [72 20, 05, 05][72 82, 05, 05]
-0E43 0E0C; [72 20, 05, 05][72 84, 05, 05]
-0E44 0E0C; [72 20, 05, 05][72 86, 05, 05]
-
-0E0D; [72 22, 05, 05]
-0E40 0E0D; [72 22, 05, 05][72 7E, 05, 05]
-0E41 0E0D; [72 22, 05, 05][72 80, 05, 05]
-0E42 0E0D; [72 22, 05, 05][72 82, 05, 05]
-0E43 0E0D; [72 22, 05, 05][72 84, 05, 05]
-0E44 0E0D; [72 22, 05, 05][72 86, 05, 05]
-
-0E0E; [72 24, 05, 05]
-0E40 0E0E; [72 24, 05, 05][72 7E, 05, 05]
-0E41 0E0E; [72 24, 05, 05][72 80, 05, 05]
-0E42 0E0E; [72 24, 05, 05][72 82, 05, 05]
-0E43 0E0E; [72 24, 05, 05][72 84, 05, 05]
-0E44 0E0E; [72 24, 05, 05][72 86, 05, 05]
-
-0E0F; [72 26, 05, 05]
-0E40 0E0F; [72 26, 05, 05][72 7E, 05, 05]
-0E41 0E0F; [72 26, 05, 05][72 80, 05, 05]
-0E42 0E0F; [72 26, 05, 05][72 82, 05, 05]
-0E43 0E0F; [72 26, 05, 05][72 84, 05, 05]
-0E44 0E0F; [72 26, 05, 05][72 86, 05, 05]
-
-0E10; [72 28, 05, 05]
-0E40 0E10; [72 28, 05, 05][72 7E, 05, 05]
-0E41 0E10; [72 28, 05, 05][72 80, 05, 05]
-0E42 0E10; [72 28, 05, 05][72 82, 05, 05]
-0E43 0E10; [72 28, 05, 05][72 84, 05, 05]
-0E44 0E10; [72 28, 05, 05][72 86, 05, 05]
-
-0E11; [72 2A, 05, 05]
-0E40 0E11; [72 2A, 05, 05][72 7E, 05, 05]
-0E41 0E11; [72 2A, 05, 05][72 80, 05, 05]
-0E42 0E11; [72 2A, 05, 05][72 82, 05, 05]
-0E43 0E11; [72 2A, 05, 05][72 84, 05, 05]
-0E44 0E11; [72 2A, 05, 05][72 86, 05, 05]
-
-0E12; [72 2C, 05, 05]
-0E40 0E12; [72 2C, 05, 05][72 7E, 05, 05]
-0E41 0E12; [72 2C, 05, 05][72 80, 05, 05]
-0E42 0E12; [72 2C, 05, 05][72 82, 05, 05]
-0E43 0E12; [72 2C, 05, 05][72 84, 05, 05]
-0E44 0E12; [72 2C, 05, 05][72 86, 05, 05]
-
-0E13; [72 2E, 05, 05]
-0E40 0E13; [72 2E, 05, 05][72 7E, 05, 05]
-0E41 0E13; [72 2E, 05, 05][72 80, 05, 05]
-0E42 0E13; [72 2E, 05, 05][72 82, 05, 05]
-0E43 0E13; [72 2E, 05, 05][72 84, 05, 05]
-0E44 0E13; [72 2E, 05, 05][72 86, 05, 05]
-
-0E14; [72 30, 05, 05]
-0E40 0E14; [72 30, 05, 05][72 7E, 05, 05]
-0E41 0E14; [72 30, 05, 05][72 80, 05, 05]
-0E42 0E14; [72 30, 05, 05][72 82, 05, 05]
-0E43 0E14; [72 30, 05, 05][72 84, 05, 05]
-0E44 0E14; [72 30, 05, 05][72 86, 05, 05]
-
-0E15; [72 32, 05, 05]
-0E40 0E15; [72 32, 05, 05][72 7E, 05, 05]
-0E41 0E15; [72 32, 05, 05][72 80, 05, 05]
-0E42 0E15; [72 32, 05, 05][72 82, 05, 05]
-0E43 0E15; [72 32, 05, 05][72 84, 05, 05]
-0E44 0E15; [72 32, 05, 05][72 86, 05, 05]
-
-0E16; [72 34, 05, 05]
-0E40 0E16; [72 34, 05, 05][72 7E, 05, 05]
-0E41 0E16; [72 34, 05, 05][72 80, 05, 05]
-0E42 0E16; [72 34, 05, 05][72 82, 05, 05]
-0E43 0E16; [72 34, 05, 05][72 84, 05, 05]
-0E44 0E16; [72 34, 05, 05][72 86, 05, 05]
-
-0E17; [72 36, 05, 05]
-0E40 0E17; [72 36, 05, 05][72 7E, 05, 05]
-0E41 0E17; [72 36, 05, 05][72 80, 05, 05]
-0E42 0E17; [72 36, 05, 05][72 82, 05, 05]
-0E43 0E17; [72 36, 05, 05][72 84, 05, 05]
-0E44 0E17; [72 36, 05, 05][72 86, 05, 05]
-
-0E18; [72 38, 05, 05]
-0E40 0E18; [72 38, 05, 05][72 7E, 05, 05]
-0E41 0E18; [72 38, 05, 05][72 80, 05, 05]
-0E42 0E18; [72 38, 05, 05][72 82, 05, 05]
-0E43 0E18; [72 38, 05, 05][72 84, 05, 05]
-0E44 0E18; [72 38, 05, 05][72 86, 05, 05]
-
-0E19; [72 3A, 05, 05]
-0E40 0E19; [72 3A, 05, 05][72 7E, 05, 05]
-0E41 0E19; [72 3A, 05, 05][72 80, 05, 05]
-0E42 0E19; [72 3A, 05, 05][72 82, 05, 05]
-0E43 0E19; [72 3A, 05, 05][72 84, 05, 05]
-0E44 0E19; [72 3A, 05, 05][72 86, 05, 05]
-
-0E1A; [72 3C, 05, 05]
-0E40 0E1A; [72 3C, 05, 05][72 7E, 05, 05]
-0E41 0E1A; [72 3C, 05, 05][72 80, 05, 05]
-0E42 0E1A; [72 3C, 05, 05][72 82, 05, 05]
-0E43 0E1A; [72 3C, 05, 05][72 84, 05, 05]
-0E44 0E1A; [72 3C, 05, 05][72 86, 05, 05]
-
-0E1B; [72 3E, 05, 05]
-0E40 0E1B; [72 3E, 05, 05][72 7E, 05, 05]
-0E41 0E1B; [72 3E, 05, 05][72 80, 05, 05]
-0E42 0E1B; [72 3E, 05, 05][72 82, 05, 05]
-0E43 0E1B; [72 3E, 05, 05][72 84, 05, 05]
-0E44 0E1B; [72 3E, 05, 05][72 86, 05, 05]
-
-0E1C; [72 40, 05, 05]
-0E40 0E1C; [72 40, 05, 05][72 7E, 05, 05]
-0E41 0E1C; [72 40, 05, 05][72 80, 05, 05]
-0E42 0E1C; [72 40, 05, 05][72 82, 05, 05]
-0E43 0E1C; [72 40, 05, 05][72 84, 05, 05]
-0E44 0E1C; [72 40, 05, 05][72 86, 05, 05]
-
-0E1D; [72 42, 05, 05]
-0E40 0E1D; [72 42, 05, 05][72 7E, 05, 05]
-0E41 0E1D; [72 42, 05, 05][72 80, 05, 05]
-0E42 0E1D; [72 42, 05, 05][72 82, 05, 05]
-0E43 0E1D; [72 42, 05, 05][72 84, 05, 05]
-0E44 0E1D; [72 42, 05, 05][72 86, 05, 05]
-
-0E1E; [72 44, 05, 05]
-0E40 0E1E; [72 44, 05, 05][72 7E, 05, 05]
-0E41 0E1E; [72 44, 05, 05][72 80, 05, 05]
-0E42 0E1E; [72 44, 05, 05][72 82, 05, 05]
-0E43 0E1E; [72 44, 05, 05][72 84, 05, 05]
-0E44 0E1E; [72 44, 05, 05][72 86, 05, 05]
-
-0E1F; [72 46, 05, 05]
-0E40 0E1F; [72 46, 05, 05][72 7E, 05, 05]
-0E41 0E1F; [72 46, 05, 05][72 80, 05, 05]
-0E42 0E1F; [72 46, 05, 05][72 82, 05, 05]
-0E43 0E1F; [72 46, 05, 05][72 84, 05, 05]
-0E44 0E1F; [72 46, 05, 05][72 86, 05, 05]
-
-0E20; [72 48, 05, 05]
-0E40 0E20; [72 48, 05, 05][72 7E, 05, 05]
-0E41 0E20; [72 48, 05, 05][72 80, 05, 05]
-0E42 0E20; [72 48, 05, 05][72 82, 05, 05]
-0E43 0E20; [72 48, 05, 05][72 84, 05, 05]
-0E44 0E20; [72 48, 05, 05][72 86, 05, 05]
-
-0E21; [72 4A, 05, 05]
-0E40 0E21; [72 4A, 05, 05][72 7E, 05, 05]
-0E41 0E21; [72 4A, 05, 05][72 80, 05, 05]
-0E42 0E21; [72 4A, 05, 05][72 82, 05, 05]
-0E43 0E21; [72 4A, 05, 05][72 84, 05, 05]
-0E44 0E21; [72 4A, 05, 05][72 86, 05, 05]
-
-0E22; [72 4C, 05, 05]
-0E40 0E22; [72 4C, 05, 05][72 7E, 05, 05]
-0E41 0E22; [72 4C, 05, 05][72 80, 05, 05]
-0E42 0E22; [72 4C, 05, 05][72 82, 05, 05]
-0E43 0E22; [72 4C, 05, 05][72 84, 05, 05]
-0E44 0E22; [72 4C, 05, 05][72 86, 05, 05]
-
-0E23; [72 4E, 05, 05]
-0E40 0E23; [72 4E, 05, 05][72 7E, 05, 05]
-0E41 0E23; [72 4E, 05, 05][72 80, 05, 05]
-0E42 0E23; [72 4E, 05, 05][72 82, 05, 05]
-0E43 0E23; [72 4E, 05, 05][72 84, 05, 05]
-0E44 0E23; [72 4E, 05, 05][72 86, 05, 05]
-
-0E24; [72 50, 05, 05]
-0E40 0E24; [72 50, 05, 05][72 7E, 05, 05]
-0E41 0E24; [72 50, 05, 05][72 80, 05, 05]
-0E42 0E24; [72 50, 05, 05][72 82, 05, 05]
-0E43 0E24; [72 50, 05, 05][72 84, 05, 05]
-0E44 0E24; [72 50, 05, 05][72 86, 05, 05]
-
-0E25; [72 52, 05, 05]
-0E40 0E25; [72 52, 05, 05][72 7E, 05, 05]
-0E41 0E25; [72 52, 05, 05][72 80, 05, 05]
-0E42 0E25; [72 52, 05, 05][72 82, 05, 05]
-0E43 0E25; [72 52, 05, 05][72 84, 05, 05]
-0E44 0E25; [72 52, 05, 05][72 86, 05, 05]
-
-0E26; [72 54, 05, 05]
-0E40 0E26; [72 54, 05, 05][72 7E, 05, 05]
-0E41 0E26; [72 54, 05, 05][72 80, 05, 05]
-0E42 0E26; [72 54, 05, 05][72 82, 05, 05]
-0E43 0E26; [72 54, 05, 05][72 84, 05, 05]
-0E44 0E26; [72 54, 05, 05][72 86, 05, 05]
-
-0E27; [72 56, 05, 05]
-0E40 0E27; [72 56, 05, 05][72 7E, 05, 05]
-0E41 0E27; [72 56, 05, 05][72 80, 05, 05]
-0E42 0E27; [72 56, 05, 05][72 82, 05, 05]
-0E43 0E27; [72 56, 05, 05][72 84, 05, 05]
-0E44 0E27; [72 56, 05, 05][72 86, 05, 05]
-
-0E28; [72 58, 05, 05]
-0E40 0E28; [72 58, 05, 05][72 7E, 05, 05]
-0E41 0E28; [72 58, 05, 05][72 80, 05, 05]
-0E42 0E28; [72 58, 05, 05][72 82, 05, 05]
-0E43 0E28; [72 58, 05, 05][72 84, 05, 05]
-0E44 0E28; [72 58, 05, 05][72 86, 05, 05]
-
-0E29; [72 5A, 05, 05]
-0E40 0E29; [72 5A, 05, 05][72 7E, 05, 05]
-0E41 0E29; [72 5A, 05, 05][72 80, 05, 05]
-0E42 0E29; [72 5A, 05, 05][72 82, 05, 05]
-0E43 0E29; [72 5A, 05, 05][72 84, 05, 05]
-0E44 0E29; [72 5A, 05, 05][72 86, 05, 05]
-
-0E2A; [72 5C, 05, 05]
-0E40 0E2A; [72 5C, 05, 05][72 7E, 05, 05]
-0E41 0E2A; [72 5C, 05, 05][72 80, 05, 05]
-0E42 0E2A; [72 5C, 05, 05][72 82, 05, 05]
-0E43 0E2A; [72 5C, 05, 05][72 84, 05, 05]
-0E44 0E2A; [72 5C, 05, 05][72 86, 05, 05]
-
-0E2B; [72 5E, 05, 05]
-0E40 0E2B; [72 5E, 05, 05][72 7E, 05, 05]
-0E41 0E2B; [72 5E, 05, 05][72 80, 05, 05]
-0E42 0E2B; [72 5E, 05, 05][72 82, 05, 05]
-0E43 0E2B; [72 5E, 05, 05][72 84, 05, 05]
-0E44 0E2B; [72 5E, 05, 05][72 86, 05, 05]
-
-0E2C; [72 60, 05, 05]
-0E40 0E2C; [72 60, 05, 05][72 7E, 05, 05]
-0E41 0E2C; [72 60, 05, 05][72 80, 05, 05]
-0E42 0E2C; [72 60, 05, 05][72 82, 05, 05]
-0E43 0E2C; [72 60, 05, 05][72 84, 05, 05]
-0E44 0E2C; [72 60, 05, 05][72 86, 05, 05]
-
-0E2D; [72 62, 05, 05]
-0E40 0E2D; [72 62, 05, 05][72 7E, 05, 05]
-0E41 0E2D; [72 62, 05, 05][72 80, 05, 05]
-0E42 0E2D; [72 62, 05, 05][72 82, 05, 05]
-0E43 0E2D; [72 62, 05, 05][72 84, 05, 05]
-0E44 0E2D; [72 62, 05, 05][72 86, 05, 05]
-
-0E2E; [72 64, 05, 05]
-0E40 0E2E; [72 64, 05, 05][72 7E, 05, 05]
-0E41 0E2E; [72 64, 05, 05][72 80, 05, 05]
-0E42 0E2E; [72 64, 05, 05][72 82, 05, 05]
-0E43 0E2E; [72 64, 05, 05][72 84, 05, 05]
-0E44 0E2E; [72 64, 05, 05][72 86, 05, 05]
-
-0E2F; [72 66, 05, 05]
-
-0E30; [72 68, 05, 05]
-
-0E31; [72 6A, 05, 05]
-
-0E32; [72 6C, 05, 05]
-
-0E33; [72 6E, 05, 05]
-0E4D 0E32; [72 6E, 05, 05]
-
-0E34; [72 70, 05, 05]
-
-0E35; [72 72, 05, 05]
-
-0E36; [72 74, 05, 05]
-
-0E37; [72 76, 05, 05]
-
-0E38; [72 78, 05, 05]
-
-0E39; [72 7A, 05, 05]
-
-0E3A; [72 7C, 05, 05]
-
-0E40; [72 7E, 05, 05]
-
-0E41; [72 80, 05, 05]
-
-0E42; [72 82, 05, 05]
-
-0E43; [72 84, 05, 05]
-
-0E44; [72 86, 05, 05]
-
-0E45; [72 88, 05, 05]
-
-0EDE; [73 0A, 05, 05]
-0EC0 0EDE; [73 0A, 05, 05][73 60, 05, 05]
-0EC1 0EDE; [73 0A, 05, 05][73 62, 05, 05]
-0EC2 0EDE; [73 0A, 05, 05][73 64, 05, 05]
-0EC3 0EDE; [73 0A, 05, 05][73 66, 05, 05]
-0EC4 0EDE; [73 0A, 05, 05][73 68, 05, 05]
-
-0E81; [73 0C, 05, 05]
-0EC0 0E81; [73 0C, 05, 05][73 60, 05, 05]
-0EC1 0E81; [73 0C, 05, 05][73 62, 05, 05]
-0EC2 0E81; [73 0C, 05, 05][73 64, 05, 05]
-0EC3 0E81; [73 0C, 05, 05][73 66, 05, 05]
-0EC4 0E81; [73 0C, 05, 05][73 68, 05, 05]
-
-0E82; [73 0E, 05, 05]
-0EC0 0E82; [73 0E, 05, 05][73 60, 05, 05]
-0EC1 0E82; [73 0E, 05, 05][73 62, 05, 05]
-0EC2 0E82; [73 0E, 05, 05][73 64, 05, 05]
-0EC3 0E82; [73 0E, 05, 05][73 66, 05, 05]
-0EC4 0E82; [73 0E, 05, 05][73 68, 05, 05]
-
-0E84; [73 10, 05, 05]
-0EC0 0E84; [73 10, 05, 05][73 60, 05, 05]
-0EC1 0E84; [73 10, 05, 05][73 62, 05, 05]
-0EC2 0E84; [73 10, 05, 05][73 64, 05, 05]
-0EC3 0E84; [73 10, 05, 05][73 66, 05, 05]
-0EC4 0E84; [73 10, 05, 05][73 68, 05, 05]
-
-0E87; [73 12, 05, 05]
-0EC0 0E87; [73 12, 05, 05][73 60, 05, 05]
-0EC1 0E87; [73 12, 05, 05][73 62, 05, 05]
-0EC2 0E87; [73 12, 05, 05][73 64, 05, 05]
-0EC3 0E87; [73 12, 05, 05][73 66, 05, 05]
-0EC4 0E87; [73 12, 05, 05][73 68, 05, 05]
-
-0E88; [73 14, 05, 05]
-0EC0 0E88; [73 14, 05, 05][73 60, 05, 05]
-0EC1 0E88; [73 14, 05, 05][73 62, 05, 05]
-0EC2 0E88; [73 14, 05, 05][73 64, 05, 05]
-0EC3 0E88; [73 14, 05, 05][73 66, 05, 05]
-0EC4 0E88; [73 14, 05, 05][73 68, 05, 05]
-
-0EAA; [73 16, 05, 05]
-0EC0 0EAA; [73 16, 05, 05][73 60, 05, 05]
-0EC1 0EAA; [73 16, 05, 05][73 62, 05, 05]
-0EC2 0EAA; [73 16, 05, 05][73 64, 05, 05]
-0EC3 0EAA; [73 16, 05, 05][73 66, 05, 05]
-0EC4 0EAA; [73 16, 05, 05][73 68, 05, 05]
-
-0E8A; [73 18, 05, 05]
-0EC0 0E8A; [73 18, 05, 05][73 60, 05, 05]
-0EC1 0E8A; [73 18, 05, 05][73 62, 05, 05]
-0EC2 0E8A; [73 18, 05, 05][73 64, 05, 05]
-0EC3 0E8A; [73 18, 05, 05][73 66, 05, 05]
-0EC4 0E8A; [73 18, 05, 05][73 68, 05, 05]
-
-0EDF; [73 1A, 05, 05]
-0EC0 0EDF; [73 1A, 05, 05][73 60, 05, 05]
-0EC1 0EDF; [73 1A, 05, 05][73 62, 05, 05]
-0EC2 0EDF; [73 1A, 05, 05][73 64, 05, 05]
-0EC3 0EDF; [73 1A, 05, 05][73 66, 05, 05]
-0EC4 0EDF; [73 1A, 05, 05][73 68, 05, 05]
-
-0E8D; [73 1C, 05, 05]
-0EC0 0E8D; [73 1C, 05, 05][73 60, 05, 05]
-0EC1 0E8D; [73 1C, 05, 05][73 62, 05, 05]
-0EC2 0E8D; [73 1C, 05, 05][73 64, 05, 05]
-0EC3 0E8D; [73 1C, 05, 05][73 66, 05, 05]
-0EC4 0E8D; [73 1C, 05, 05][73 68, 05, 05]
-
-0E94; [73 1E, 05, 05]
-0EC0 0E94; [73 1E, 05, 05][73 60, 05, 05]
-0EC1 0E94; [73 1E, 05, 05][73 62, 05, 05]
-0EC2 0E94; [73 1E, 05, 05][73 64, 05, 05]
-0EC3 0E94; [73 1E, 05, 05][73 66, 05, 05]
-0EC4 0E94; [73 1E, 05, 05][73 68, 05, 05]
-
-0E95; [73 20, 05, 05]
-0EC0 0E95; [73 20, 05, 05][73 60, 05, 05]
-0EC1 0E95; [73 20, 05, 05][73 62, 05, 05]
-0EC2 0E95; [73 20, 05, 05][73 64, 05, 05]
-0EC3 0E95; [73 20, 05, 05][73 66, 05, 05]
-0EC4 0E95; [73 20, 05, 05][73 68, 05, 05]
-
-0E96; [73 22, 05, 05]
-0EC0 0E96; [73 22, 05, 05][73 60, 05, 05]
-0EC1 0E96; [73 22, 05, 05][73 62, 05, 05]
-0EC2 0E96; [73 22, 05, 05][73 64, 05, 05]
-0EC3 0E96; [73 22, 05, 05][73 66, 05, 05]
-0EC4 0E96; [73 22, 05, 05][73 68, 05, 05]
-
-0E97; [73 24, 05, 05]
-0EC0 0E97; [73 24, 05, 05][73 60, 05, 05]
-0EC1 0E97; [73 24, 05, 05][73 62, 05, 05]
-0EC2 0E97; [73 24, 05, 05][73 64, 05, 05]
-0EC3 0E97; [73 24, 05, 05][73 66, 05, 05]
-0EC4 0E97; [73 24, 05, 05][73 68, 05, 05]
-
-0E99; [73 26, 05, 05]
-0EC0 0E99; [73 26, 05, 05][73 60, 05, 05]
-0EC1 0E99; [73 26, 05, 05][73 62, 05, 05]
-0EC2 0E99; [73 26, 05, 05][73 64, 05, 05]
-0EC3 0E99; [73 26, 05, 05][73 66, 05, 05]
-0EC4 0E99; [73 26, 05, 05][73 68, 05, 05]
-
-0E9A; [73 28, 05, 05]
-0EC0 0E9A; [73 28, 05, 05][73 60, 05, 05]
-0EC1 0E9A; [73 28, 05, 05][73 62, 05, 05]
-0EC2 0E9A; [73 28, 05, 05][73 64, 05, 05]
-0EC3 0E9A; [73 28, 05, 05][73 66, 05, 05]
-0EC4 0E9A; [73 28, 05, 05][73 68, 05, 05]
-
-0E9B; [73 2A, 05, 05]
-0EC0 0E9B; [73 2A, 05, 05][73 60, 05, 05]
-0EC1 0E9B; [73 2A, 05, 05][73 62, 05, 05]
-0EC2 0E9B; [73 2A, 05, 05][73 64, 05, 05]
-0EC3 0E9B; [73 2A, 05, 05][73 66, 05, 05]
-0EC4 0E9B; [73 2A, 05, 05][73 68, 05, 05]
-
-0E9C; [73 2C, 05, 05]
-0EC0 0E9C; [73 2C, 05, 05][73 60, 05, 05]
-0EC1 0E9C; [73 2C, 05, 05][73 62, 05, 05]
-0EC2 0E9C; [73 2C, 05, 05][73 64, 05, 05]
-0EC3 0E9C; [73 2C, 05, 05][73 66, 05, 05]
-0EC4 0E9C; [73 2C, 05, 05][73 68, 05, 05]
-
-0E9D; [73 2E, 05, 05]
-0EC0 0E9D; [73 2E, 05, 05][73 60, 05, 05]
-0EC1 0E9D; [73 2E, 05, 05][73 62, 05, 05]
-0EC2 0E9D; [73 2E, 05, 05][73 64, 05, 05]
-0EC3 0E9D; [73 2E, 05, 05][73 66, 05, 05]
-0EC4 0E9D; [73 2E, 05, 05][73 68, 05, 05]
-
-0E9E; [73 30, 05, 05]
-0EC0 0E9E; [73 30, 05, 05][73 60, 05, 05]
-0EC1 0E9E; [73 30, 05, 05][73 62, 05, 05]
-0EC2 0E9E; [73 30, 05, 05][73 64, 05, 05]
-0EC3 0E9E; [73 30, 05, 05][73 66, 05, 05]
-0EC4 0E9E; [73 30, 05, 05][73 68, 05, 05]
-
-0E9F; [73 32, 05, 05]
-0EC0 0E9F; [73 32, 05, 05][73 60, 05, 05]
-0EC1 0E9F; [73 32, 05, 05][73 62, 05, 05]
-0EC2 0E9F; [73 32, 05, 05][73 64, 05, 05]
-0EC3 0E9F; [73 32, 05, 05][73 66, 05, 05]
-0EC4 0E9F; [73 32, 05, 05][73 68, 05, 05]
-
-0EA1; [73 34, 05, 05]
-0EC0 0EA1; [73 34, 05, 05][73 60, 05, 05]
-0EC1 0EA1; [73 34, 05, 05][73 62, 05, 05]
-0EC2 0EA1; [73 34, 05, 05][73 64, 05, 05]
-0EC3 0EA1; [73 34, 05, 05][73 66, 05, 05]
-0EC4 0EA1; [73 34, 05, 05][73 68, 05, 05]
-
-0EA2; [73 36, 05, 05]
-0EC0 0EA2; [73 36, 05, 05][73 60, 05, 05]
-0EC1 0EA2; [73 36, 05, 05][73 62, 05, 05]
-0EC2 0EA2; [73 36, 05, 05][73 64, 05, 05]
-0EC3 0EA2; [73 36, 05, 05][73 66, 05, 05]
-0EC4 0EA2; [73 36, 05, 05][73 68, 05, 05]
-
-0EA3; [73 38, 05, 05]
-0EC0 0EA3; [73 38, 05, 05][73 60, 05, 05]
-0EC1 0EA3; [73 38, 05, 05][73 62, 05, 05]
-0EC2 0EA3; [73 38, 05, 05][73 64, 05, 05]
-0EC3 0EA3; [73 38, 05, 05][73 66, 05, 05]
-0EC4 0EA3; [73 38, 05, 05][73 68, 05, 05]
-
-0EA5; [73 3A, 05, 05]
-0EC0 0EA5; [73 3A, 05, 05][73 60, 05, 05]
-0EC1 0EA5; [73 3A, 05, 05][73 62, 05, 05]
-0EC2 0EA5; [73 3A, 05, 05][73 64, 05, 05]
-0EC3 0EA5; [73 3A, 05, 05][73 66, 05, 05]
-0EC4 0EA5; [73 3A, 05, 05][73 68, 05, 05]
-
-0EA7; [73 3C, 05, 05]
-0EC0 0EA7; [73 3C, 05, 05][73 60, 05, 05]
-0EC1 0EA7; [73 3C, 05, 05][73 62, 05, 05]
-0EC2 0EA7; [73 3C, 05, 05][73 64, 05, 05]
-0EC3 0EA7; [73 3C, 05, 05][73 66, 05, 05]
-0EC4 0EA7; [73 3C, 05, 05][73 68, 05, 05]
-
-0EAB; [73 3E, 05, 05]
-0EDC; [73 3E, 05, 09][73 26, 05, 09]
-0EC0 0EDC; [73 3E, 05, 09][73 26, 05, 09][73 60, 05, 05]
-0EC1 0EDC; [73 3E, 05, 09][73 26, 05, 09][73 62, 05, 05]
-0EC2 0EDC; [73 3E, 05, 09][73 26, 05, 09][73 64, 05, 05]
-0EC3 0EDC; [73 3E, 05, 09][73 26, 05, 09][73 66, 05, 05]
-0EC4 0EDC; [73 3E, 05, 09][73 26, 05, 09][73 68, 05, 05]
-0EDD; [73 3E, 05, 09][73 34, 05, 09]
-0EC0 0EDD; [73 3E, 05, 09][73 34, 05, 09][73 60, 05, 05]
-0EC1 0EDD; [73 3E, 05, 09][73 34, 05, 09][73 62, 05, 05]
-0EC2 0EDD; [73 3E, 05, 09][73 34, 05, 09][73 64, 05, 05]
-0EC3 0EDD; [73 3E, 05, 09][73 34, 05, 09][73 66, 05, 05]
-0EC4 0EDD; [73 3E, 05, 09][73 34, 05, 09][73 68, 05, 05]
-0EC0 0EAB; [73 3E, 05, 05][73 60, 05, 05]
-0EC1 0EAB; [73 3E, 05, 05][73 62, 05, 05]
-0EC2 0EAB; [73 3E, 05, 05][73 64, 05, 05]
-0EC3 0EAB; [73 3E, 05, 05][73 66, 05, 05]
-0EC4 0EAB; [73 3E, 05, 05][73 68, 05, 05]
-
-0EAD; [73 40, 05, 05]
-0EC0 0EAD; [73 40, 05, 05][73 60, 05, 05]
-0EC1 0EAD; [73 40, 05, 05][73 62, 05, 05]
-0EC2 0EAD; [73 40, 05, 05][73 64, 05, 05]
-0EC3 0EAD; [73 40, 05, 05][73 66, 05, 05]
-0EC4 0EAD; [73 40, 05, 05][73 68, 05, 05]
-
-0EAE; [73 42, 05, 05]
-0EC0 0EAE; [73 42, 05, 05][73 60, 05, 05]
-0EC1 0EAE; [73 42, 05, 05][73 62, 05, 05]
-0EC2 0EAE; [73 42, 05, 05][73 64, 05, 05]
-0EC3 0EAE; [73 42, 05, 05][73 66, 05, 05]
-0EC4 0EAE; [73 42, 05, 05][73 68, 05, 05]
-
-0EAF; [73 44, 05, 05]
-
-0EB0; [73 46, 05, 05]
-
-0EB1; [73 48, 05, 05]
-
-0EB2; [73 4A, 05, 05]
-
-0EB3; [73 4C, 05, 05]
-0ECD 0EB2; [73 4C, 05, 05]
-
-0EB4; [73 4E, 05, 05]
-
-0EB5; [73 50, 05, 05]
-
-0EB6; [73 52, 05, 05]
-
-0EB7; [73 54, 05, 05]
-
-0EB8; [73 56, 05, 05]
-
-0EB9; [73 58, 05, 05]
-
-0EBB; [73 5A, 05, 05]
-
-0EBC; [73 5C, 05, 05]
-
-0EBD; [73 5E, 05, 05]
-
-0EC0; [73 60, 05, 05]
-
-0EC1; [73 62, 05, 05]
-
-0EC2; [73 64, 05, 05]
-
-0EC3; [73 66, 05, 05]
-
-0EC4; [73 68, 05, 05]
-
-AA80; [73 6A 04, 05, 05]
-AAB5 AA80; [73 6A 04, 05, 05][73 6B B2, 05, 05]
-AAB6 AA80; [73 6A 04, 05, 05][73 6B BA, 05, 05]
-AAB9 AA80; [73 6A 04, 05, 05][73 6B D2, 05, 05]
-AABB AA80; [73 6A 04, 05, 05][73 6B E2, 05, 05]
-AABC AA80; [73 6A 04, 05, 05][73 6B EA, 05, 05]
-
-AA81; [73 6A 0C, 05, 05]
-AAB5 AA81; [73 6A 0C, 05, 05][73 6B B2, 05, 05]
-AAB6 AA81; [73 6A 0C, 05, 05][73 6B BA, 05, 05]
-AAB9 AA81; [73 6A 0C, 05, 05][73 6B D2, 05, 05]
-AABB AA81; [73 6A 0C, 05, 05][73 6B E2, 05, 05]
-AABC AA81; [73 6A 0C, 05, 05][73 6B EA, 05, 05]
-
-AA82; [73 6A 14, 05, 05]
-AAB5 AA82; [73 6A 14, 05, 05][73 6B B2, 05, 05]
-AAB6 AA82; [73 6A 14, 05, 05][73 6B BA, 05, 05]
-AAB9 AA82; [73 6A 14, 05, 05][73 6B D2, 05, 05]
-AABB AA82; [73 6A 14, 05, 05][73 6B E2, 05, 05]
-AABC AA82; [73 6A 14, 05, 05][73 6B EA, 05, 05]
-
-AA83; [73 6A 1C, 05, 05]
-AAB5 AA83; [73 6A 1C, 05, 05][73 6B B2, 05, 05]
-AAB6 AA83; [73 6A 1C, 05, 05][73 6B BA, 05, 05]
-AAB9 AA83; [73 6A 1C, 05, 05][73 6B D2, 05, 05]
-AABB AA83; [73 6A 1C, 05, 05][73 6B E2, 05, 05]
-AABC AA83; [73 6A 1C, 05, 05][73 6B EA, 05, 05]
-
-AA84; [73 6A 24, 05, 05]
-AAB5 AA84; [73 6A 24, 05, 05][73 6B B2, 05, 05]
-AAB6 AA84; [73 6A 24, 05, 05][73 6B BA, 05, 05]
-AAB9 AA84; [73 6A 24, 05, 05][73 6B D2, 05, 05]
-AABB AA84; [73 6A 24, 05, 05][73 6B E2, 05, 05]
-AABC AA84; [73 6A 24, 05, 05][73 6B EA, 05, 05]
-
-AA85; [73 6A 2C, 05, 05]
-AAB5 AA85; [73 6A 2C, 05, 05][73 6B B2, 05, 05]
-AAB6 AA85; [73 6A 2C, 05, 05][73 6B BA, 05, 05]
-AAB9 AA85; [73 6A 2C, 05, 05][73 6B D2, 05, 05]
-AABB AA85; [73 6A 2C, 05, 05][73 6B E2, 05, 05]
-AABC AA85; [73 6A 2C, 05, 05][73 6B EA, 05, 05]
-
-AA86; [73 6A 34, 05, 05]
-AAB5 AA86; [73 6A 34, 05, 05][73 6B B2, 05, 05]
-AAB6 AA86; [73 6A 34, 05, 05][73 6B BA, 05, 05]
-AAB9 AA86; [73 6A 34, 05, 05][73 6B D2, 05, 05]
-AABB AA86; [73 6A 34, 05, 05][73 6B E2, 05, 05]
-AABC AA86; [73 6A 34, 05, 05][73 6B EA, 05, 05]
-
-AA87; [73 6A 3C, 05, 05]
-AAB5 AA87; [73 6A 3C, 05, 05][73 6B B2, 05, 05]
-AAB6 AA87; [73 6A 3C, 05, 05][73 6B BA, 05, 05]
-AAB9 AA87; [73 6A 3C, 05, 05][73 6B D2, 05, 05]
-AABB AA87; [73 6A 3C, 05, 05][73 6B E2, 05, 05]
-AABC AA87; [73 6A 3C, 05, 05][73 6B EA, 05, 05]
-
-AA88; [73 6A 44, 05, 05]
-AAB5 AA88; [73 6A 44, 05, 05][73 6B B2, 05, 05]
-AAB6 AA88; [73 6A 44, 05, 05][73 6B BA, 05, 05]
-AAB9 AA88; [73 6A 44, 05, 05][73 6B D2, 05, 05]
-AABB AA88; [73 6A 44, 05, 05][73 6B E2, 05, 05]
-AABC AA88; [73 6A 44, 05, 05][73 6B EA, 05, 05]
-
-AA89; [73 6A 4C, 05, 05]
-AAB5 AA89; [73 6A 4C, 05, 05][73 6B B2, 05, 05]
-AAB6 AA89; [73 6A 4C, 05, 05][73 6B BA, 05, 05]
-AAB9 AA89; [73 6A 4C, 05, 05][73 6B D2, 05, 05]
-AABB AA89; [73 6A 4C, 05, 05][73 6B E2, 05, 05]
-AABC AA89; [73 6A 4C, 05, 05][73 6B EA, 05, 05]
-
-AA8A; [73 6A 54, 05, 05]
-AAB5 AA8A; [73 6A 54, 05, 05][73 6B B2, 05, 05]
-AAB6 AA8A; [73 6A 54, 05, 05][73 6B BA, 05, 05]
-AAB9 AA8A; [73 6A 54, 05, 05][73 6B D2, 05, 05]
-AABB AA8A; [73 6A 54, 05, 05][73 6B E2, 05, 05]
-AABC AA8A; [73 6A 54, 05, 05][73 6B EA, 05, 05]
-
-AA8B; [73 6A 5C, 05, 05]
-AAB5 AA8B; [73 6A 5C, 05, 05][73 6B B2, 05, 05]
-AAB6 AA8B; [73 6A 5C, 05, 05][73 6B BA, 05, 05]
-AAB9 AA8B; [73 6A 5C, 05, 05][73 6B D2, 05, 05]
-AABB AA8B; [73 6A 5C, 05, 05][73 6B E2, 05, 05]
-AABC AA8B; [73 6A 5C, 05, 05][73 6B EA, 05, 05]
-
-AA8C; [73 6A 64, 05, 05]
-AAB5 AA8C; [73 6A 64, 05, 05][73 6B B2, 05, 05]
-AAB6 AA8C; [73 6A 64, 05, 05][73 6B BA, 05, 05]
-AAB9 AA8C; [73 6A 64, 05, 05][73 6B D2, 05, 05]
-AABB AA8C; [73 6A 64, 05, 05][73 6B E2, 05, 05]
-AABC AA8C; [73 6A 64, 05, 05][73 6B EA, 05, 05]
-
-AA8D; [73 6A 6C, 05, 05]
-AAB5 AA8D; [73 6A 6C, 05, 05][73 6B B2, 05, 05]
-AAB6 AA8D; [73 6A 6C, 05, 05][73 6B BA, 05, 05]
-AAB9 AA8D; [73 6A 6C, 05, 05][73 6B D2, 05, 05]
-AABB AA8D; [73 6A 6C, 05, 05][73 6B E2, 05, 05]
-AABC AA8D; [73 6A 6C, 05, 05][73 6B EA, 05, 05]
-
-AA8E; [73 6A 74, 05, 05]
-AAB5 AA8E; [73 6A 74, 05, 05][73 6B B2, 05, 05]
-AAB6 AA8E; [73 6A 74, 05, 05][73 6B BA, 05, 05]
-AAB9 AA8E; [73 6A 74, 05, 05][73 6B D2, 05, 05]
-AABB AA8E; [73 6A 74, 05, 05][73 6B E2, 05, 05]
-AABC AA8E; [73 6A 74, 05, 05][73 6B EA, 05, 05]
-
-AA8F; [73 6A 7C, 05, 05]
-AAB5 AA8F; [73 6A 7C, 05, 05][73 6B B2, 05, 05]
-AAB6 AA8F; [73 6A 7C, 05, 05][73 6B BA, 05, 05]
-AAB9 AA8F; [73 6A 7C, 05, 05][73 6B D2, 05, 05]
-AABB AA8F; [73 6A 7C, 05, 05][73 6B E2, 05, 05]
-AABC AA8F; [73 6A 7C, 05, 05][73 6B EA, 05, 05]
-
-AA90; [73 6A 84, 05, 05]
-AAB5 AA90; [73 6A 84, 05, 05][73 6B B2, 05, 05]
-AAB6 AA90; [73 6A 84, 05, 05][73 6B BA, 05, 05]
-AAB9 AA90; [73 6A 84, 05, 05][73 6B D2, 05, 05]
-AABB AA90; [73 6A 84, 05, 05][73 6B E2, 05, 05]
-AABC AA90; [73 6A 84, 05, 05][73 6B EA, 05, 05]
-
-AA91; [73 6A 8C, 05, 05]
-AAB5 AA91; [73 6A 8C, 05, 05][73 6B B2, 05, 05]
-AAB6 AA91; [73 6A 8C, 05, 05][73 6B BA, 05, 05]
-AAB9 AA91; [73 6A 8C, 05, 05][73 6B D2, 05, 05]
-AABB AA91; [73 6A 8C, 05, 05][73 6B E2, 05, 05]
-AABC AA91; [73 6A 8C, 05, 05][73 6B EA, 05, 05]
-
-AA92; [73 6A 94, 05, 05]
-AAB5 AA92; [73 6A 94, 05, 05][73 6B B2, 05, 05]
-AAB6 AA92; [73 6A 94, 05, 05][73 6B BA, 05, 05]
-AAB9 AA92; [73 6A 94, 05, 05][73 6B D2, 05, 05]
-AABB AA92; [73 6A 94, 05, 05][73 6B E2, 05, 05]
-AABC AA92; [73 6A 94, 05, 05][73 6B EA, 05, 05]
-
-AA93; [73 6A 9C, 05, 05]
-AAB5 AA93; [73 6A 9C, 05, 05][73 6B B2, 05, 05]
-AAB6 AA93; [73 6A 9C, 05, 05][73 6B BA, 05, 05]
-AAB9 AA93; [73 6A 9C, 05, 05][73 6B D2, 05, 05]
-AABB AA93; [73 6A 9C, 05, 05][73 6B E2, 05, 05]
-AABC AA93; [73 6A 9C, 05, 05][73 6B EA, 05, 05]
-
-AA94; [73 6A A4, 05, 05]
-AAB5 AA94; [73 6A A4, 05, 05][73 6B B2, 05, 05]
-AAB6 AA94; [73 6A A4, 05, 05][73 6B BA, 05, 05]
-AAB9 AA94; [73 6A A4, 05, 05][73 6B D2, 05, 05]
-AABB AA94; [73 6A A4, 05, 05][73 6B E2, 05, 05]
-AABC AA94; [73 6A A4, 05, 05][73 6B EA, 05, 05]
-
-AA95; [73 6A AC, 05, 05]
-AAB5 AA95; [73 6A AC, 05, 05][73 6B B2, 05, 05]
-AAB6 AA95; [73 6A AC, 05, 05][73 6B BA, 05, 05]
-AAB9 AA95; [73 6A AC, 05, 05][73 6B D2, 05, 05]
-AABB AA95; [73 6A AC, 05, 05][73 6B E2, 05, 05]
-AABC AA95; [73 6A AC, 05, 05][73 6B EA, 05, 05]
-
-AA96; [73 6A B4, 05, 05]
-AAB5 AA96; [73 6A B4, 05, 05][73 6B B2, 05, 05]
-AAB6 AA96; [73 6A B4, 05, 05][73 6B BA, 05, 05]
-AAB9 AA96; [73 6A B4, 05, 05][73 6B D2, 05, 05]
-AABB AA96; [73 6A B4, 05, 05][73 6B E2, 05, 05]
-AABC AA96; [73 6A B4, 05, 05][73 6B EA, 05, 05]
-
-AA97; [73 6A BC, 05, 05]
-AAB5 AA97; [73 6A BC, 05, 05][73 6B B2, 05, 05]
-AAB6 AA97; [73 6A BC, 05, 05][73 6B BA, 05, 05]
-AAB9 AA97; [73 6A BC, 05, 05][73 6B D2, 05, 05]
-AABB AA97; [73 6A BC, 05, 05][73 6B E2, 05, 05]
-AABC AA97; [73 6A BC, 05, 05][73 6B EA, 05, 05]
-
-AA98; [73 6A C4, 05, 05]
-AAB5 AA98; [73 6A C4, 05, 05][73 6B B2, 05, 05]
-AAB6 AA98; [73 6A C4, 05, 05][73 6B BA, 05, 05]
-AAB9 AA98; [73 6A C4, 05, 05][73 6B D2, 05, 05]
-AABB AA98; [73 6A C4, 05, 05][73 6B E2, 05, 05]
-AABC AA98; [73 6A C4, 05, 05][73 6B EA, 05, 05]
-
-AA99; [73 6A CC, 05, 05]
-AAB5 AA99; [73 6A CC, 05, 05][73 6B B2, 05, 05]
-AAB6 AA99; [73 6A CC, 05, 05][73 6B BA, 05, 05]
-AAB9 AA99; [73 6A CC, 05, 05][73 6B D2, 05, 05]
-AABB AA99; [73 6A CC, 05, 05][73 6B E2, 05, 05]
-AABC AA99; [73 6A CC, 05, 05][73 6B EA, 05, 05]
-
-AA9A; [73 6A D4, 05, 05]
-AAB5 AA9A; [73 6A D4, 05, 05][73 6B B2, 05, 05]
-AAB6 AA9A; [73 6A D4, 05, 05][73 6B BA, 05, 05]
-AAB9 AA9A; [73 6A D4, 05, 05][73 6B D2, 05, 05]
-AABB AA9A; [73 6A D4, 05, 05][73 6B E2, 05, 05]
-AABC AA9A; [73 6A D4, 05, 05][73 6B EA, 05, 05]
-
-AA9B; [73 6A DC, 05, 05]
-AAB5 AA9B; [73 6A DC, 05, 05][73 6B B2, 05, 05]
-AAB6 AA9B; [73 6A DC, 05, 05][73 6B BA, 05, 05]
-AAB9 AA9B; [73 6A DC, 05, 05][73 6B D2, 05, 05]
-AABB AA9B; [73 6A DC, 05, 05][73 6B E2, 05, 05]
-AABC AA9B; [73 6A DC, 05, 05][73 6B EA, 05, 05]
-
-AA9C; [73 6A E4, 05, 05]
-AAB5 AA9C; [73 6A E4, 05, 05][73 6B B2, 05, 05]
-AAB6 AA9C; [73 6A E4, 05, 05][73 6B BA, 05, 05]
-AAB9 AA9C; [73 6A E4, 05, 05][73 6B D2, 05, 05]
-AABB AA9C; [73 6A E4, 05, 05][73 6B E2, 05, 05]
-AABC AA9C; [73 6A E4, 05, 05][73 6B EA, 05, 05]
-
-AA9D; [73 6A EC, 05, 05]
-AAB5 AA9D; [73 6A EC, 05, 05][73 6B B2, 05, 05]
-AAB6 AA9D; [73 6A EC, 05, 05][73 6B BA, 05, 05]
-AAB9 AA9D; [73 6A EC, 05, 05][73 6B D2, 05, 05]
-AABB AA9D; [73 6A EC, 05, 05][73 6B E2, 05, 05]
-AABC AA9D; [73 6A EC, 05, 05][73 6B EA, 05, 05]
-
-AA9E; [73 6A F4, 05, 05]
-AAB5 AA9E; [73 6A F4, 05, 05][73 6B B2, 05, 05]
-AAB6 AA9E; [73 6A F4, 05, 05][73 6B BA, 05, 05]
-AAB9 AA9E; [73 6A F4, 05, 05][73 6B D2, 05, 05]
-AABB AA9E; [73 6A F4, 05, 05][73 6B E2, 05, 05]
-AABC AA9E; [73 6A F4, 05, 05][73 6B EA, 05, 05]
-
-AA9F; [73 6A FC, 05, 05]
-AAB5 AA9F; [73 6A FC, 05, 05][73 6B B2, 05, 05]
-AAB6 AA9F; [73 6A FC, 05, 05][73 6B BA, 05, 05]
-AAB9 AA9F; [73 6A FC, 05, 05][73 6B D2, 05, 05]
-AABB AA9F; [73 6A FC, 05, 05][73 6B E2, 05, 05]
-AABC AA9F; [73 6A FC, 05, 05][73 6B EA, 05, 05]
-
-AAA0; [73 6B 0A, 05, 05]
-AAB5 AAA0; [73 6B 0A, 05, 05][73 6B B2, 05, 05]
-AAB6 AAA0; [73 6B 0A, 05, 05][73 6B BA, 05, 05]
-AAB9 AAA0; [73 6B 0A, 05, 05][73 6B D2, 05, 05]
-AABB AAA0; [73 6B 0A, 05, 05][73 6B E2, 05, 05]
-AABC AAA0; [73 6B 0A, 05, 05][73 6B EA, 05, 05]
-
-AAA1; [73 6B 12, 05, 05]
-AAB5 AAA1; [73 6B 12, 05, 05][73 6B B2, 05, 05]
-AAB6 AAA1; [73 6B 12, 05, 05][73 6B BA, 05, 05]
-AAB9 AAA1; [73 6B 12, 05, 05][73 6B D2, 05, 05]
-AABB AAA1; [73 6B 12, 05, 05][73 6B E2, 05, 05]
-AABC AAA1; [73 6B 12, 05, 05][73 6B EA, 05, 05]
-
-AAA2; [73 6B 1A, 05, 05]
-AAB5 AAA2; [73 6B 1A, 05, 05][73 6B B2, 05, 05]
-AAB6 AAA2; [73 6B 1A, 05, 05][73 6B BA, 05, 05]
-AAB9 AAA2; [73 6B 1A, 05, 05][73 6B D2, 05, 05]
-AABB AAA2; [73 6B 1A, 05, 05][73 6B E2, 05, 05]
-AABC AAA2; [73 6B 1A, 05, 05][73 6B EA, 05, 05]
-
-AAA3; [73 6B 22, 05, 05]
-AAB5 AAA3; [73 6B 22, 05, 05][73 6B B2, 05, 05]
-AAB6 AAA3; [73 6B 22, 05, 05][73 6B BA, 05, 05]
-AAB9 AAA3; [73 6B 22, 05, 05][73 6B D2, 05, 05]
-AABB AAA3; [73 6B 22, 05, 05][73 6B E2, 05, 05]
-AABC AAA3; [73 6B 22, 05, 05][73 6B EA, 05, 05]
-
-AAA4; [73 6B 2A, 05, 05]
-AAB5 AAA4; [73 6B 2A, 05, 05][73 6B B2, 05, 05]
-AAB6 AAA4; [73 6B 2A, 05, 05][73 6B BA, 05, 05]
-AAB9 AAA4; [73 6B 2A, 05, 05][73 6B D2, 05, 05]
-AABB AAA4; [73 6B 2A, 05, 05][73 6B E2, 05, 05]
-AABC AAA4; [73 6B 2A, 05, 05][73 6B EA, 05, 05]
-
-AAA5; [73 6B 32, 05, 05]
-AAB5 AAA5; [73 6B 32, 05, 05][73 6B B2, 05, 05]
-AAB6 AAA5; [73 6B 32, 05, 05][73 6B BA, 05, 05]
-AAB9 AAA5; [73 6B 32, 05, 05][73 6B D2, 05, 05]
-AABB AAA5; [73 6B 32, 05, 05][73 6B E2, 05, 05]
-AABC AAA5; [73 6B 32, 05, 05][73 6B EA, 05, 05]
-
-AAA6; [73 6B 3A, 05, 05]
-AAB5 AAA6; [73 6B 3A, 05, 05][73 6B B2, 05, 05]
-AAB6 AAA6; [73 6B 3A, 05, 05][73 6B BA, 05, 05]
-AAB9 AAA6; [73 6B 3A, 05, 05][73 6B D2, 05, 05]
-AABB AAA6; [73 6B 3A, 05, 05][73 6B E2, 05, 05]
-AABC AAA6; [73 6B 3A, 05, 05][73 6B EA, 05, 05]
-
-AAA7; [73 6B 42, 05, 05]
-AAB5 AAA7; [73 6B 42, 05, 05][73 6B B2, 05, 05]
-AAB6 AAA7; [73 6B 42, 05, 05][73 6B BA, 05, 05]
-AAB9 AAA7; [73 6B 42, 05, 05][73 6B D2, 05, 05]
-AABB AAA7; [73 6B 42, 05, 05][73 6B E2, 05, 05]
-AABC AAA7; [73 6B 42, 05, 05][73 6B EA, 05, 05]
-
-AAA8; [73 6B 4A, 05, 05]
-AAB5 AAA8; [73 6B 4A, 05, 05][73 6B B2, 05, 05]
-AAB6 AAA8; [73 6B 4A, 05, 05][73 6B BA, 05, 05]
-AAB9 AAA8; [73 6B 4A, 05, 05][73 6B D2, 05, 05]
-AABB AAA8; [73 6B 4A, 05, 05][73 6B E2, 05, 05]
-AABC AAA8; [73 6B 4A, 05, 05][73 6B EA, 05, 05]
-
-AAA9; [73 6B 52, 05, 05]
-AAB5 AAA9; [73 6B 52, 05, 05][73 6B B2, 05, 05]
-AAB6 AAA9; [73 6B 52, 05, 05][73 6B BA, 05, 05]
-AAB9 AAA9; [73 6B 52, 05, 05][73 6B D2, 05, 05]
-AABB AAA9; [73 6B 52, 05, 05][73 6B E2, 05, 05]
-AABC AAA9; [73 6B 52, 05, 05][73 6B EA, 05, 05]
-
-AAAA; [73 6B 5A, 05, 05]
-AAB5 AAAA; [73 6B 5A, 05, 05][73 6B B2, 05, 05]
-AAB6 AAAA; [73 6B 5A, 05, 05][73 6B BA, 05, 05]
-AAB9 AAAA; [73 6B 5A, 05, 05][73 6B D2, 05, 05]
-AABB AAAA; [73 6B 5A, 05, 05][73 6B E2, 05, 05]
-AABC AAAA; [73 6B 5A, 05, 05][73 6B EA, 05, 05]
+AAB6; [70 6D DD, 05, 05]
 
-AAAB; [73 6B 62, 05, 05]
-AAB5 AAAB; [73 6B 62, 05, 05][73 6B B2, 05, 05]
-AAB6 AAAB; [73 6B 62, 05, 05][73 6B BA, 05, 05]
-AAB9 AAAB; [73 6B 62, 05, 05][73 6B D2, 05, 05]
-AABB AAAB; [73 6B 62, 05, 05][73 6B E2, 05, 05]
-AABC AAAB; [73 6B 62, 05, 05][73 6B EA, 05, 05]
+AAB7; [70 6D E5, 05, 05]
 
-AAAC; [73 6B 6A, 05, 05]
-AAB5 AAAC; [73 6B 6A, 05, 05][73 6B B2, 05, 05]
-AAB6 AAAC; [73 6B 6A, 05, 05][73 6B BA, 05, 05]
-AAB9 AAAC; [73 6B 6A, 05, 05][73 6B D2, 05, 05]
-AABB AAAC; [73 6B 6A, 05, 05][73 6B E2, 05, 05]
-AABC AAAC; [73 6B 6A, 05, 05][73 6B EA, 05, 05]
+AAB8; [70 6D ED, 05, 05]
 
-AAAD; [73 6B 72, 05, 05]
-AAB5 AAAD; [73 6B 72, 05, 05][73 6B B2, 05, 05]
-AAB6 AAAD; [73 6B 72, 05, 05][73 6B BA, 05, 05]
-AAB9 AAAD; [73 6B 72, 05, 05][73 6B D2, 05, 05]
-AABB AAAD; [73 6B 72, 05, 05][73 6B E2, 05, 05]
-AABC AAAD; [73 6B 72, 05, 05][73 6B EA, 05, 05]
+AAB9; [70 6D F5, 05, 05]
 
-AAAE; [73 6B 7A, 05, 05]
-AAB5 AAAE; [73 6B 7A, 05, 05][73 6B B2, 05, 05]
-AAB6 AAAE; [73 6B 7A, 05, 05][73 6B BA, 05, 05]
-AAB9 AAAE; [73 6B 7A, 05, 05][73 6B D2, 05, 05]
-AABB AAAE; [73 6B 7A, 05, 05][73 6B E2, 05, 05]
-AABC AAAE; [73 6B 7A, 05, 05][73 6B EA, 05, 05]
+AABA; [70 6D FD, 05, 05]
 
-AAAF; [73 6B 82, 05, 05]
-AAB5 AAAF; [73 6B 82, 05, 05][73 6B B2, 05, 05]
-AAB6 AAAF; [73 6B 82, 05, 05][73 6B BA, 05, 05]
-AAB9 AAAF; [73 6B 82, 05, 05][73 6B D2, 05, 05]
-AABB AAAF; [73 6B 82, 05, 05][73 6B E2, 05, 05]
-AABC AAAF; [73 6B 82, 05, 05][73 6B EA, 05, 05]
+AABB; [70 6E 07, 05, 05]
 
-AAB0; [73 6B 8A, 05, 05]
+AABC; [70 6E 0F, 05, 05]
 
-AAB1; [73 6B 92, 05, 05]
+AABD; [70 6E 17, 05, 05]
 
-AAB2; [73 6B 9A, 05, 05]
+AABE; [70 6E 1F, 05, 05]
 
-AAB3; [73 6B A2, 05, 05]
+AAC0; [70 6E 27, 05, 05]
 
-AAB4; [73 6B AA, 05, 05]
+AAC2; [70 6E 2F, 05, 05]
 
-AAB5; [73 6B B2, 05, 05]
+AADB; [70 6E 37, 05, 05]
 
-AAB6; [73 6B BA, 05, 05]
+AADC; [70 6E 3F, 05, 05]
 
-AAB7; [73 6B C2, 05, 05]
+FDD1 0F40;     [71 04 02, 05, 05]      # TIBETAN first primary starts reordering group (compressible)
 
-AAB8; [73 6B CA, 05, 05]
+0F40; [71 09, 05, 05]
+0F69; [71 09, 05, 05][71 8B, 05, 05]
 
-AAB9; [73 6B D2, 05, 05]
+0F90; [71 0B, 05, 05]
+0FB9; [71 0B, 05, 05][71 8B, 05, 05]
 
-AABA; [73 6B DA, 05, 05]
+0F6B; [71 0D, 05, 05]
 
-AABB; [73 6B E2, 05, 05]
+0F41; [71 0F, 05, 05]
 
-AABC; [73 6B EA, 05, 05]
+0F91; [71 11, 05, 05]
 
-AABD; [73 6B F2, 05, 05]
+0F42; [71 13, 05, 05]
+0F43; [71 13, 05, 05][71 93, 05, 05]
 
-AABE; [73 6B FA, 05, 05]
+0F92; [71 15, 05, 05]
+0F93; [71 15, 05, 05][71 93, 05, 05]
 
-AAC0; [73 6C 08, 05, 05]
+0F44; [71 17, 05, 05]
 
-AAC2; [73 6C 10, 05, 05]
+0F94; [71 19, 05, 05]
 
-AADB; [73 6C 18, 05, 05]
+0F45; [71 1B, 05, 05]
 
-AADC; [73 6C 20, 05, 05]
+0F95; [71 1D, 05, 05]
 
-0F40; [74 0A, 05, 05]
-0F69; [74 0A, 05, 05][74 8C, 05, 05]
+0F46; [71 1F, 05, 05]
 
-0F90; [74 0C, 05, 05]
-0FB9; [74 0C, 05, 05][74 8C, 05, 05]
+0F96; [71 21, 05, 05]
 
-0F6B; [74 0E, 05, 05]
+0F47; [71 23, 05, 05]
 
-0F41; [74 10, 05, 05]
+0F97; [71 25, 05, 05]
 
-0F91; [74 12, 05, 05]
+0F49; [71 27, 05, 05]
 
-0F42; [74 14, 05, 05]
-0F43; [74 14, 05, 05][74 94, 05, 05]
+0F99; [71 29, 05, 05]
 
-0F92; [74 16, 05, 05]
-0F93; [74 16, 05, 05][74 94, 05, 05]
+0F4A; [71 2B, 05, 05]
 
-0F44; [74 18, 05, 05]
+0F9A; [71 2D, 05, 05]
 
-0F94; [74 1A, 05, 05]
+0F4B; [71 2F, 05, 05]
 
-0F45; [74 1C, 05, 05]
+0F9B; [71 31, 05, 05]
 
-0F95; [74 1E, 05, 05]
+0F4C; [71 33, 05, 05]
+0F4D; [71 33, 05, 05][71 93, 05, 05]
 
-0F46; [74 20, 05, 05]
+0F9C; [71 35, 05, 05]
+0F9D; [71 35, 05, 05][71 93, 05, 05]
 
-0F96; [74 22, 05, 05]
+0F4E; [71 37, 05, 05]
 
-0F47; [74 24, 05, 05]
+0F9E; [71 39, 05, 05]
 
-0F97; [74 26, 05, 05]
+0F4F; [71 3B, 05, 05]
 
-0F49; [74 28, 05, 05]
+0F9F; [71 3D, 05, 05]
 
-0F99; [74 2A, 05, 05]
+0F50; [71 3F, 05, 05]
 
-0F4A; [74 2C, 05, 05]
+0FA0; [71 41, 05, 05]
 
-0F9A; [74 2E, 05, 05]
+0F51; [71 43, 05, 05]
+0F52; [71 43, 05, 05][71 93, 05, 05]
 
-0F4B; [74 30, 05, 05]
+0FA1; [71 45, 05, 05]
+0FA2; [71 45, 05, 05][71 93, 05, 05]
 
-0F9B; [74 32, 05, 05]
+0F53; [71 47, 05, 05]
 
-0F4C; [74 34, 05, 05]
-0F4D; [74 34, 05, 05][74 94, 05, 05]
+0FA3; [71 49, 05, 05]
 
-0F9C; [74 36, 05, 05]
-0F9D; [74 36, 05, 05][74 94, 05, 05]
+0F54; [71 4B, 05, 05]
 
-0F4E; [74 38, 05, 05]
+0FA4; [71 4D, 05, 05]
 
-0F9E; [74 3A, 05, 05]
+0F55; [71 4F, 05, 05]
 
-0F4F; [74 3C, 05, 05]
+0FA5; [71 51, 05, 05]
 
-0F9F; [74 3E, 05, 05]
+0F56; [71 53, 05, 05]
+0F57; [71 53, 05, 05][71 93, 05, 05]
 
-0F50; [74 40, 05, 05]
+0FA6; [71 55, 05, 05]
+0FA7; [71 55, 05, 05][71 93, 05, 05]
 
-0FA0; [74 42, 05, 05]
+0F58; [71 57, 05, 05]
 
-0F51; [74 44, 05, 05]
-0F52; [74 44, 05, 05][74 94, 05, 05]
+0FA8; [71 59, 05, 05]
 
-0FA1; [74 46, 05, 05]
-0FA2; [74 46, 05, 05][74 94, 05, 05]
+0F59; [71 5B, 05, 05]
 
-0F53; [74 48, 05, 05]
+0FA9; [71 5D, 05, 05]
 
-0FA3; [74 4A, 05, 05]
+0F5A; [71 5F, 05, 05]
 
-0F54; [74 4C, 05, 05]
+0FAA; [71 61, 05, 05]
 
-0FA4; [74 4E, 05, 05]
+0F5B; [71 63, 05, 05]
+0F5C; [71 63, 05, 05][71 93, 05, 05]
 
-0F55; [74 50, 05, 05]
+0FAB; [71 65, 05, 05]
+0FAC; [71 65, 05, 05][71 93, 05, 05]
 
-0FA5; [74 52, 05, 05]
+0F5D; [71 67, 05, 05]
 
-0F56; [74 54, 05, 05]
-0F57; [74 54, 05, 05][74 94, 05, 05]
+0FAD; [71 69, 05, 05]
+0FBA; [71 69, 70, 20]
 
-0FA6; [74 56, 05, 05]
-0FA7; [74 56, 05, 05][74 94, 05, 05]
+0F5E; [71 6B, 05, 05]
 
-0F58; [74 58, 05, 05]
+0FAE; [71 6D, 05, 05]
 
-0FA8; [74 5A, 05, 05]
+0F5F; [71 6F, 05, 05]
 
-0F59; [74 5C, 05, 05]
+0FAF; [71 71, 05, 05]
 
-0FA9; [74 5E, 05, 05]
+0F60; [71 73, 05, 05]
 
-0F5A; [74 60, 05, 05]
+0FB0; [71 75, 05, 05]
 
-0FAA; [74 62, 05, 05]
+0F61; [71 77, 05, 05]
 
-0F5B; [74 64, 05, 05]
-0F5C; [74 64, 05, 05][74 94, 05, 05]
+0FB1; [71 79, 05, 05]
+0FBB; [71 79, 70, 20]
 
-0FAB; [74 66, 05, 05]
-0FAC; [74 66, 05, 05][74 94, 05, 05]
+0F62; [71 7B, 05, 05]
+0F6A; [71 7B, 70, 20]
 
-0F5D; [74 68, 05, 05]
+0FB2; [71 7D, 05, 05]
+0FBC; [71 7D, 70, 20]
+0FB2 0F71; [71 7D, 05, 05][71 A9, 05, 05]
+0FB2 0F71 0F72; [71 7D, 05, 05][71 AD, 05, 05]
+0FB2 0F73; [71 7D, 05, 05][71 AD, 05, 05]
+0FB2 0F71 0F74; [71 7D, 05, 05][71 B5, 05, 05]
+0FB2 0F75; [71 7D, 05, 05][71 B5, 05, 05]
 
-0FAD; [74 6A, 05, 05]
-0FBA; [74 6A, 05, 09][, DB B9, 09]
+0F6C; [71 7F, 05, 05]
 
-0F5E; [74 6C, 05, 05]
+0F63; [71 81, 05, 05]
 
-0FAE; [74 6E, 05, 05]
+0FB3; [71 83, 05, 05]
+0FB3 0F71; [71 83, 05, 05][71 A9, 05, 05]
+0FB3 0F71 0F72; [71 83, 05, 05][71 AD, 05, 05]
+0FB3 0F73; [71 83, 05, 05][71 AD, 05, 05]
+0FB3 0F71 0F74; [71 83, 05, 05][71 B5, 05, 05]
+0FB3 0F75; [71 83, 05, 05][71 B5, 05, 05]
 
-0F5F; [74 70, 05, 05]
+0F64; [71 85, 05, 05]
 
-0FAF; [74 72, 05, 05]
+0FB4; [71 87, 05, 05]
 
-0F60; [74 74, 05, 05]
+0F65; [71 89, 05, 05]
 
-0FB0; [74 76, 05, 05]
+0FB5; [71 8B, 05, 05]
 
-0F61; [74 78, 05, 05]
+0F66; [71 8D, 05, 05]
 
-0FB1; [74 7A, 05, 05]
-0FBB; [74 7A, 05, 09][, DB B9, 09]
+0FB6; [71 8F, 05, 05]
 
-0F62; [74 7C, 05, 05]
-0F6A; [74 7C, 05, 09][, DB B9, 09]
+0F67; [71 91, 05, 05]
 
-0FB2; [74 7E, 05, 05]
-0FBC; [74 7E, 05, 09][, DB B9, 09]
-0FB2 0F71; [74 7E, 05, 05][74 AA, 05, 05]
-0FB2 0F71 0F72; [74 7E, 05, 05][74 AE, 05, 05]
-0FB2 0F73; [74 7E, 05, 05][74 AE, 05, 05]
-0FB2 0F71 0F74; [74 7E, 05, 05][74 B6, 05, 05]
-0FB2 0F75; [74 7E, 05, 05][74 B6, 05, 05]
+0FB7; [71 93, 05, 05]
 
-0F6C; [74 80, 05, 05]
+0F68; [71 95, 05, 05]
+0F00; [71 95, 05, 20][71 C3, 05, 20][, F2 BA, 20]
 
-0F63; [74 82, 05, 05]
+0FB8; [71 97, 05, 05]
 
-0FB3; [74 84, 05, 05]
-0FB3 0F71; [74 84, 05, 05][74 AA, 05, 05]
-0FB3 0F71 0F72; [74 84, 05, 05][74 AE, 05, 05]
-0FB3 0F73; [74 84, 05, 05][74 AE, 05, 05]
-0FB3 0F71 0F74; [74 84, 05, 05][74 B6, 05, 05]
-0FB3 0F75; [74 84, 05, 05][74 B6, 05, 05]
+0F88; [71 99, 05, 05]
 
-0F64; [74 86, 05, 05]
+0F8D; [71 9B, 05, 05]
 
-0FB4; [74 88, 05, 05]
+0F89; [71 9D, 05, 05]
 
-0F65; [74 8A, 05, 05]
+0F8E; [71 9F, 05, 05]
 
-0FB5; [74 8C, 05, 05]
+0F8C; [71 A1, 05, 05]
 
-0F66; [74 8E, 05, 05]
+0F8F; [71 A3, 05, 05]
 
-0FB6; [74 90, 05, 05]
+0F8A; [71 A5, 05, 05]
 
-0F67; [74 92, 05, 05]
+0F8B; [71 A7, 05, 05]
 
-0FB7; [74 94, 05, 05]
+0F71; [71 A9, 05, 05]
 
-0F68; [74 96, 05, 05]
-0F00; [74 96, 05, 09][74 C4, 05, 09][, D7 39, 09]
+0F72; [71 AB, 05, 05]
 
-0FB8; [74 98, 05, 05]
+0F71 0F72; [71 AD, 05, 05]
+0F73; [71 AD, 05, 05]
 
-0F88; [74 9A, 05, 05]
+0F80; [71 AF, 05, 05]
 
-0F8D; [74 9C, 05, 05]
+0F71 0F80; [71 B1, 05, 05]
+0F81; [71 B1, 05, 05]
 
-0F89; [74 9E, 05, 05]
+0F74; [71 B3, 05, 05]
 
-0F8E; [74 A0, 05, 05]
+0F71 0F74; [71 B5, 05, 05]
+0F75; [71 B5, 05, 05]
 
-0F8C; [74 A2, 05, 05]
+0F76; [71 B7, 05, 05]
+0FB2 0F80; [71 B7, 05, 05]
 
-0F8F; [74 A4, 05, 05]
+0F77; [71 B9, 05, 05]
+0FB2 0F71 0F80; [71 B9, 05, 05]
+0FB2 0F81; [71 B9, 05, 05]
 
-0F8A; [74 A6, 05, 05]
+0F78; [71 BB, 05, 05]
+0FB3 0F80; [71 BB, 05, 05]
 
-0F8B; [74 A8, 05, 05]
+0F79; [71 BD, 05, 05]
+0FB3 0F71 0F80; [71 BD, 05, 05]
+0FB3 0F81; [71 BD, 05, 05]
 
-0F71; [74 AA, 05, 05]
+0F7A; [71 BF, 05, 05]
 
-0F72; [74 AC, 05, 05]
+0F7B; [71 C1, 05, 05]
 
-0F71 0F72; [74 AE, 05, 05]
-0F73; [74 AE, 05, 05]
+0F7C; [71 C3, 05, 05]
 
-0F80; [74 B0, 05, 05]
+0F7D; [71 C5, 05, 05]
 
-0F71 0F80; [74 B2, 05, 05]
-0F81; [74 B2, 05, 05]
+0F84; [71 C7, 05, 05]
 
-0F74; [74 B4, 05, 05]
+FDD1 1C00;     [71 CC 02, 05, 05]      # Lepcha first primary
 
-0F71 0F74; [74 B6, 05, 05]
-0F75; [74 B6, 05, 05]
+1C00; [71 CC 2B, 05, 05]
 
-0F76; [74 B8, 05, 05]
-0FB2 0F80; [74 B8, 05, 05]
+1C01; [71 CC 33, 05, 05]
 
-0F77; [74 BA, 05, 05]
-0FB2 0F71 0F80; [74 BA, 05, 05]
-0FB2 0F81; [74 BA, 05, 05]
+1C02; [71 CC 3B, 05, 05]
 
-0F78; [74 BC, 05, 05]
-0FB3 0F80; [74 BC, 05, 05]
+1C03; [71 CC 43, 05, 05]
 
-0F79; [74 BE, 05, 05]
-0FB3 0F71 0F80; [74 BE, 05, 05]
-0FB3 0F81; [74 BE, 05, 05]
+1C04; [71 CC 4B, 05, 05]
 
-0F7A; [74 C0, 05, 05]
+1C05; [71 CC 53, 05, 05]
 
-0F7B; [74 C2, 05, 05]
+1C06; [71 CC 5B, 05, 05]
 
-0F7C; [74 C4, 05, 05]
+1C07; [71 CC 63, 05, 05]
 
-0F7D; [74 C6, 05, 05]
+1C08; [71 CC 6B, 05, 05]
 
-0F84; [74 C8, 05, 05]
+1C09; [71 CC 73, 05, 05]
 
-1C00; [74 CA 04, 05, 05]
+1C4D; [71 CC 7B, 05, 05]
 
-1C01; [74 CA 0C, 05, 05]
+1C4E; [71 CC 83, 05, 05]
 
-1C02; [74 CA 14, 05, 05]
+1C4F; [71 CC 8B, 05, 05]
 
-1C03; [74 CA 1C, 05, 05]
+1C0A; [71 CC 93, 05, 05]
 
-1C04; [74 CA 24, 05, 05]
+1C0B; [71 CC 9B, 05, 05]
 
-1C05; [74 CA 2C, 05, 05]
+1C0C; [71 CC A3, 05, 05]
 
-1C06; [74 CA 34, 05, 05]
+1C0D; [71 CC AB, 05, 05]
 
-1C07; [74 CA 3C, 05, 05]
+1C0E; [71 CC B3, 05, 05]
 
-1C08; [74 CA 44, 05, 05]
+1C0F; [71 CC BB, 05, 05]
 
-1C09; [74 CA 4C, 05, 05]
+1C10; [71 CC C3, 05, 05]
 
-1C4D; [74 CA 54, 05, 05]
+1C11; [71 CC CB, 05, 05]
 
-1C4E; [74 CA 5C, 05, 05]
+1C12; [71 CC D3, 05, 05]
 
-1C4F; [74 CA 64, 05, 05]
+1C13; [71 CC DB, 05, 05]
 
-1C0A; [74 CA 6C, 05, 05]
+1C14; [71 CC E3, 05, 05]
 
-1C0B; [74 CA 74, 05, 05]
+1C15; [71 CC EB, 05, 05]
 
-1C0C; [74 CA 7C, 05, 05]
+1C16; [71 CC F3, 05, 05]
 
-1C0D; [74 CA 84, 05, 05]
+1C17; [71 CC FB, 05, 05]
 
-1C0E; [74 CA 8C, 05, 05]
+1C18; [71 CD 05, 05, 05]
 
-1C0F; [74 CA 94, 05, 05]
+1C19; [71 CD 0D, 05, 05]
 
-1C10; [74 CA 9C, 05, 05]
+1C1A; [71 CD 15, 05, 05]
 
-1C11; [74 CA A4, 05, 05]
+1C24; [71 CD 1D, 05, 05]
 
-1C12; [74 CA AC, 05, 05]
+1C1B; [71 CD 25, 05, 05]
 
-1C13; [74 CA B4, 05, 05]
+1C25; [71 CD 2D, 05, 05]
 
-1C14; [74 CA BC, 05, 05]
+1C1C; [71 CD 35, 05, 05]
 
-1C15; [74 CA C4, 05, 05]
+1C1D; [71 CD 3D, 05, 05]
 
-1C16; [74 CA CC, 05, 05]
+1C1E; [71 CD 45, 05, 05]
 
-1C17; [74 CA D4, 05, 05]
+1C1F; [71 CD 4D, 05, 05]
 
-1C18; [74 CA DC, 05, 05]
+1C20; [71 CD 55, 05, 05]
 
-1C19; [74 CA E4, 05, 05]
+1C21; [71 CD 5D, 05, 05]
 
-1C1A; [74 CA EC, 05, 05]
+1C22; [71 CD 65, 05, 05]
 
-1C24; [74 CA F4, 05, 05]
+1C23; [71 CD 6D, 05, 05]
 
-1C1B; [74 CA FC, 05, 05]
+1C36; [71 CD 75, 05, 05]
 
-1C25; [74 CB 0A, 05, 05]
+1C26; [71 CD 7D, 05, 05]
 
-1C1C; [74 CB 12, 05, 05]
+1C27; [71 CD 85, 05, 05]
 
-1C1D; [74 CB 1A, 05, 05]
+1C28; [71 CD 8D, 05, 05]
 
-1C1E; [74 CB 22, 05, 05]
+1C29; [71 CD 95, 05, 05]
 
-1C1F; [74 CB 2A, 05, 05]
+1C2A; [71 CD 9D, 05, 05]
 
-1C20; [74 CB 32, 05, 05]
+1C2B; [71 CD A5, 05, 05]
 
-1C21; [74 CB 3A, 05, 05]
+1C2C; [71 CD AD, 05, 05]
 
-1C22; [74 CB 42, 05, 05]
+1C2D; [71 CD B5, 05, 05]
 
-1C23; [74 CB 4A, 05, 05]
+1C2E; [71 CD BD, 05, 05]
 
-1C36; [74 CB 52, 05, 05]
+1C2F; [71 CD C5, 05, 05]
 
-1C26; [74 CB 5A, 05, 05]
+1C30; [71 CD CD, 05, 05]
 
-1C27; [74 CB 62, 05, 05]
+1C31; [71 CD D5, 05, 05]
 
-1C28; [74 CB 6A, 05, 05]
+1C32; [71 CD DD, 05, 05]
 
-1C29; [74 CB 72, 05, 05]
+1C33; [71 CD E5, 05, 05]
 
-1C2A; [74 CB 7A, 05, 05]
+1C34; [71 CD ED, 05, 05]
 
-1C2B; [74 CB 82, 05, 05]
+1C35; [71 CD F5, 05, 05]
 
-1C2C; [74 CB 8A, 05, 05]
+FDD1 A840;     [71 CE 20, 05, 05]      # Phags-pa first primary
 
-1C2D; [74 CB 92, 05, 05]
+A840; [71 CE 49, 05, 05]
 
-1C2E; [74 CB 9A, 05, 05]
+A841; [71 CE 51, 05, 05]
 
-1C2F; [74 CB A2, 05, 05]
+A842; [71 CE 59, 05, 05]
 
-1C30; [74 CB AA, 05, 05]
+A843; [71 CE 61, 05, 05]
 
-1C31; [74 CB B2, 05, 05]
+A844; [71 CE 69, 05, 05]
 
-1C32; [74 CB BA, 05, 05]
+A845; [71 CE 71, 05, 05]
 
-1C33; [74 CB C2, 05, 05]
+A846; [71 CE 79, 05, 05]
 
-1C34; [74 CB CA, 05, 05]
+A847; [71 CE 81, 05, 05]
 
-1C35; [74 CB D2, 05, 05]
+A869; [71 CE 89, 05, 05]
 
-A840; [74 CB DA, 05, 05]
+A86A; [71 CE 91, 05, 05]
 
-A841; [74 CB E2, 05, 05]
+A86B; [71 CE 99, 05, 05]
 
-A842; [74 CB EA, 05, 05]
+A86C; [71 CE A1, 05, 05]
 
-A843; [74 CB F2, 05, 05]
+A848; [71 CE A9, 05, 05]
 
-A844; [74 CB FA, 05, 05]
+A849; [71 CE B1, 05, 05]
 
-A845; [74 CC 08, 05, 05]
+A84A; [71 CE B9, 05, 05]
 
-A846; [74 CC 10, 05, 05]
+A84B; [71 CE C1, 05, 05]
 
-A847; [74 CC 18, 05, 05]
+A84C; [71 CE C9, 05, 05]
 
-A869; [74 CC 20, 05, 05]
+A84D; [71 CE D1, 05, 05]
 
-A86A; [74 CC 28, 05, 05]
+A84E; [71 CE D9, 05, 05]
 
-A86B; [74 CC 30, 05, 05]
+A84F; [71 CE E1, 05, 05]
 
-A86C; [74 CC 38, 05, 05]
+A850; [71 CE E9, 05, 05]
 
-A848; [74 CC 40, 05, 05]
+A851; [71 CE F1, 05, 05]
 
-A849; [74 CC 48, 05, 05]
+A852; [71 CE F9, 05, 05]
 
-A84A; [74 CC 50, 05, 05]
+A853; [71 CF 03, 05, 05]
 
-A84B; [74 CC 58, 05, 05]
+A867; [71 CF 0B, 05, 05]
 
-A84C; [74 CC 60, 05, 05]
+A854; [71 CF 13, 05, 05]
 
-A84D; [74 CC 68, 05, 05]
+A855; [71 CF 1B, 05, 05]
 
-A84E; [74 CC 70, 05, 05]
+A856; [71 CF 23, 05, 05]
 
-A84F; [74 CC 78, 05, 05]
+A857; [71 CF 2B, 05, 05]
 
-A850; [74 CC 80, 05, 05]
+A868; [71 CF 33, 05, 05]
 
-A851; [74 CC 88, 05, 05]
+A86D; [71 CF 3B, 05, 05]
 
-A852; [74 CC 90, 05, 05]
+A858; [71 CF 43, 05, 05]
 
-A853; [74 CC 98, 05, 05]
+A871; [71 CF 4B, 05, 05]
 
-A867; [74 CC A0, 05, 05]
+A872; [71 CF 53, 05, 05]
 
-A854; [74 CC A8, 05, 05]
+A859; [71 CF 5B, 05, 05]
 
-A855; [74 CC B0, 05, 05]
+A85A; [71 CF 63, 05, 05]
 
-A856; [74 CC B8, 05, 05]
+A86E; [71 CF 6B, 05, 05]
 
-A857; [74 CC C0, 05, 05]
+A85B; [71 CF 73, 05, 05]
 
-A868; [74 CC C8, 05, 05]
+A85C; [71 CF 7B, 05, 05]
 
-A86D; [74 CC D0, 05, 05]
+A86F; [71 CF 83, 05, 05]
 
-A858; [74 CC D8, 05, 05]
+A870; [71 CF 8B, 05, 05]
 
-A871; [74 CC E0, 05, 05]
+A85D; [71 CF 93, 05, 05]
 
-A872; [74 CC E8, 05, 05]
+A862; [71 CF 9B, 05, 05]
 
-A859; [74 CC F0, 05, 05]
+A863; [71 CF A3, 05, 05]
 
-A85A; [74 CC F8, 05, 05]
+A864; [71 CF AB, 05, 05]
 
-A86E; [74 CD 06, 05, 05]
+A865; [71 CF B3, 05, 05]
 
-A85B; [74 CD 0E, 05, 05]
+A85E; [71 CF BB, 05, 05]
 
-A85C; [74 CD 16, 05, 05]
+A85F; [71 CF C3, 05, 05]
 
-A86F; [74 CD 1E, 05, 05]
+A860; [71 CF CB, 05, 05]
 
-A870; [74 CD 26, 05, 05]
+A861; [71 CF D3, 05, 05]
 
-A85D; [74 CD 2E, 05, 05]
+A866; [71 CF DB, 05, 05]
 
-A862; [74 CD 36, 05, 05]
+A873; [71 CF E3, 05, 05]
 
-A863; [74 CD 3E, 05, 05]
+FDD1 1900;     [71 D0 0E, 05, 05]      # LIMBU first primary
 
-A864; [74 CD 46, 05, 05]
+1900; [71 D0 37, 05, 05]
 
-A865; [74 CD 4E, 05, 05]
+1901; [71 D0 3F, 05, 05]
 
-A85E; [74 CD 56, 05, 05]
+1902; [71 D0 47, 05, 05]
 
-A85F; [74 CD 5E, 05, 05]
+1903; [71 D0 4F, 05, 05]
 
-A860; [74 CD 66, 05, 05]
+1904; [71 D0 57, 05, 05]
 
-A861; [74 CD 6E, 05, 05]
+1905; [71 D0 5F, 05, 05]
 
-A866; [74 CD 76, 05, 05]
+1906; [71 D0 67, 05, 05]
 
-A873; [74 CD 7E, 05, 05]
+1907; [71 D0 6F, 05, 05]
 
-1900; [74 CD 86, 05, 05]
+1908; [71 D0 77, 05, 05]
 
-1901; [74 CD 8E, 05, 05]
+1909; [71 D0 7F, 05, 05]
 
-1902; [74 CD 96, 05, 05]
+190A; [71 D0 87, 05, 05]
 
-1903; [74 CD 9E, 05, 05]
+190B; [71 D0 8F, 05, 05]
 
-1904; [74 CD A6, 05, 05]
+190C; [71 D0 97, 05, 05]
 
-1905; [74 CD AE, 05, 05]
+190D; [71 D0 9F, 05, 05]
 
-1906; [74 CD B6, 05, 05]
+190E; [71 D0 A7, 05, 05]
 
-1907; [74 CD BE, 05, 05]
+190F; [71 D0 AF, 05, 05]
 
-1908; [74 CD C6, 05, 05]
+1910; [71 D0 B7, 05, 05]
 
-1909; [74 CD CE, 05, 05]
+1911; [71 D0 BF, 05, 05]
 
-190A; [74 CD D6, 05, 05]
+1912; [71 D0 C7, 05, 05]
 
-190B; [74 CD DE, 05, 05]
+1913; [71 D0 CF, 05, 05]
 
-190C; [74 CD E6, 05, 05]
+1914; [71 D0 D7, 05, 05]
 
-190D; [74 CD EE, 05, 05]
+1915; [71 D0 DF, 05, 05]
 
-190E; [74 CD F6, 05, 05]
+1916; [71 D0 E7, 05, 05]
 
-190F; [74 CE 04, 05, 05]
+1917; [71 D0 EF, 05, 05]
 
-1910; [74 CE 0C, 05, 05]
+1918; [71 D0 F7, 05, 05]
 
-1911; [74 CE 14, 05, 05]
+1919; [71 D0 FF, 05, 05]
 
-1912; [74 CE 1C, 05, 05]
+191A; [71 D1 09, 05, 05]
 
-1913; [74 CE 24, 05, 05]
+191B; [71 D1 11, 05, 05]
 
-1914; [74 CE 2C, 05, 05]
+191C; [71 D1 19, 05, 05]
 
-1915; [74 CE 34, 05, 05]
+1920; [71 D1 21, 05, 05]
 
-1916; [74 CE 3C, 05, 05]
+1921; [71 D1 29, 05, 05]
 
-1917; [74 CE 44, 05, 05]
+1922; [71 D1 31, 05, 05]
 
-1918; [74 CE 4C, 05, 05]
+1923; [71 D1 39, 05, 05]
 
-1919; [74 CE 54, 05, 05]
+1924; [71 D1 41, 05, 05]
 
-191A; [74 CE 5C, 05, 05]
+1925; [71 D1 49, 05, 05]
 
-191B; [74 CE 64, 05, 05]
+1926; [71 D1 51, 05, 05]
 
-191C; [74 CE 6C, 05, 05]
+1927; [71 D1 59, 05, 05]
 
-1920; [74 CE 74, 05, 05]
+1928; [71 D1 61, 05, 05]
 
-1921; [74 CE 7C, 05, 05]
+1929; [71 D1 69, 05, 05]
 
-1922; [74 CE 84, 05, 05]
+192A; [71 D1 71, 05, 05]
 
-1923; [74 CE 8C, 05, 05]
+192B; [71 D1 79, 05, 05]
 
-1924; [74 CE 94, 05, 05]
+1930; [71 D1 81, 05, 05]
 
-1925; [74 CE 9C, 05, 05]
+1931; [71 D1 89, 05, 05]
 
-1926; [74 CE A4, 05, 05]
+1932; [71 D1 91, 05, 05]
 
-1927; [74 CE AC, 05, 05]
+1933; [71 D1 99, 05, 05]
 
-1928; [74 CE B4, 05, 05]
+1934; [71 D1 A1, 05, 05]
 
-1929; [74 CE BC, 05, 05]
+1935; [71 D1 A9, 05, 05]
 
-192A; [74 CE C4, 05, 05]
+1936; [71 D1 B1, 05, 05]
 
-192B; [74 CE CC, 05, 05]
+1937; [71 D1 B9, 05, 05]
 
-1930; [74 CE D4, 05, 05]
+1938; [71 D1 C1, 05, 05]
 
-1931; [74 CE DC, 05, 05]
+FDD1 1703;     [71 D1 EA, 05, 05]      # TAGALOG first primary
 
-1932; [74 CE E4, 05, 05]
+1700; [71 D2 15, 05, 05]
 
-1933; [74 CE EC, 05, 05]
+1701; [71 D2 1D, 05, 05]
 
-1934; [74 CE F4, 05, 05]
+1702; [71 D2 25, 05, 05]
 
-1935; [74 CE FC, 05, 05]
+1703; [71 D2 2D, 05, 05]
 
-1936; [74 CF 0A, 05, 05]
+1704; [71 D2 35, 05, 05]
 
-1937; [74 CF 12, 05, 05]
+1705; [71 D2 3D, 05, 05]
 
-1938; [74 CF 1A, 05, 05]
+1706; [71 D2 45, 05, 05]
 
-1700; [74 CF 22, 05, 05]
+1707; [71 D2 4D, 05, 05]
 
-1701; [74 CF 2A, 05, 05]
+1708; [71 D2 55, 05, 05]
 
-1702; [74 CF 32, 05, 05]
+1709; [71 D2 5D, 05, 05]
 
-1703; [74 CF 3A, 05, 05]
+170A; [71 D2 65, 05, 05]
 
-1704; [74 CF 42, 05, 05]
+170B; [71 D2 6D, 05, 05]
 
-1705; [74 CF 4A, 05, 05]
+170C; [71 D2 75, 05, 05]
 
-1706; [74 CF 52, 05, 05]
+170E; [71 D2 7D, 05, 05]
 
-1707; [74 CF 5A, 05, 05]
+170F; [71 D2 85, 05, 05]
 
-1708; [74 CF 62, 05, 05]
+1710; [71 D2 8D, 05, 05]
 
-1709; [74 CF 6A, 05, 05]
+1711; [71 D2 95, 05, 05]
 
-170A; [74 CF 72, 05, 05]
+1712; [71 D2 9D, 05, 05]
 
-170B; [74 CF 7A, 05, 05]
+1713; [71 D2 A5, 05, 05]
 
-170C; [74 CF 82, 05, 05]
+1714; [71 D2 AD, 05, 05]
 
-170E; [74 CF 8A, 05, 05]
+FDD1 1723;     [71 D2 D6, 05, 05]      # HANUNOO first primary
 
-170F; [74 CF 92, 05, 05]
+1720; [71 D2 FF, 05, 05]
 
-1710; [74 CF 9A, 05, 05]
+1721; [71 D3 09, 05, 05]
 
-1711; [74 CF A2, 05, 05]
+1722; [71 D3 11, 05, 05]
 
-1712; [74 CF AA, 05, 05]
+1723; [71 D3 19, 05, 05]
 
-1713; [74 CF B2, 05, 05]
+1724; [71 D3 21, 05, 05]
 
-1714; [74 CF BA, 05, 05]
+1725; [71 D3 29, 05, 05]
 
-1720; [74 CF C2, 05, 05]
+1726; [71 D3 31, 05, 05]
 
-1721; [74 CF CA, 05, 05]
+1727; [71 D3 39, 05, 05]
 
-1722; [74 CF D2, 05, 05]
+1728; [71 D3 41, 05, 05]
 
-1723; [74 CF DA, 05, 05]
+1729; [71 D3 49, 05, 05]
 
-1724; [74 CF E2, 05, 05]
+172A; [71 D3 51, 05, 05]
 
-1725; [74 CF EA, 05, 05]
+172B; [71 D3 59, 05, 05]
 
-1726; [74 CF F2, 05, 05]
+172C; [71 D3 61, 05, 05]
 
-1727; [74 CF FA, 05, 05]
+172D; [71 D3 69, 05, 05]
 
-1728; [74 D0 08, 05, 05]
+172E; [71 D3 71, 05, 05]
 
-1729; [74 D0 10, 05, 05]
+172F; [71 D3 79, 05, 05]
 
-172A; [74 D0 18, 05, 05]
+1730; [71 D3 81, 05, 05]
 
-172B; [74 D0 20, 05, 05]
+1731; [71 D3 89, 05, 05]
 
-172C; [74 D0 28, 05, 05]
+1732; [71 D3 91, 05, 05]
 
-172D; [74 D0 30, 05, 05]
+1733; [71 D3 99, 05, 05]
 
-172E; [74 D0 38, 05, 05]
+1734; [71 D3 A1, 05, 05]
 
-172F; [74 D0 40, 05, 05]
+FDD1 1743;     [71 D3 CA, 05, 05]      # BUHID first primary
 
-1730; [74 D0 48, 05, 05]
+1740; [71 D3 F3, 05, 05]
 
-1731; [74 D0 50, 05, 05]
+1741; [71 D3 FB, 05, 05]
 
-1732; [74 D0 58, 05, 05]
+1742; [71 D4 05, 05, 05]
 
-1733; [74 D0 60, 05, 05]
+1743; [71 D4 0D, 05, 05]
 
-1734; [74 D0 68, 05, 05]
+1744; [71 D4 15, 05, 05]
 
-1740; [74 D0 70, 05, 05]
+1745; [71 D4 1D, 05, 05]
 
-1741; [74 D0 78, 05, 05]
+1746; [71 D4 25, 05, 05]
 
-1742; [74 D0 80, 05, 05]
+1747; [71 D4 2D, 05, 05]
 
-1743; [74 D0 88, 05, 05]
+1748; [71 D4 35, 05, 05]
 
-1744; [74 D0 90, 05, 05]
+1749; [71 D4 3D, 05, 05]
 
-1745; [74 D0 98, 05, 05]
+174A; [71 D4 45, 05, 05]
 
-1746; [74 D0 A0, 05, 05]
+174B; [71 D4 4D, 05, 05]
 
-1747; [74 D0 A8, 05, 05]
+174C; [71 D4 55, 05, 05]
 
-1748; [74 D0 B0, 05, 05]
+174D; [71 D4 5D, 05, 05]
 
-1749; [74 D0 B8, 05, 05]
+174E; [71 D4 65, 05, 05]
 
-174A; [74 D0 C0, 05, 05]
+174F; [71 D4 6D, 05, 05]
 
-174B; [74 D0 C8, 05, 05]
+1750; [71 D4 75, 05, 05]
 
-174C; [74 D0 D0, 05, 05]
+1751; [71 D4 7D, 05, 05]
 
-174D; [74 D0 D8, 05, 05]
+1752; [71 D4 85, 05, 05]
 
-174E; [74 D0 E0, 05, 05]
+1753; [71 D4 8D, 05, 05]
 
-174F; [74 D0 E8, 05, 05]
+FDD1 1763;     [71 D4 B6, 05, 05]      # TAGBANWA first primary
 
-1750; [74 D0 F0, 05, 05]
+1760; [71 D4 DF, 05, 05]
 
-1751; [74 D0 F8, 05, 05]
+1761; [71 D4 E7, 05, 05]
 
-1752; [74 D1 06, 05, 05]
+1762; [71 D4 EF, 05, 05]
 
-1753; [74 D1 0E, 05, 05]
+1763; [71 D4 F7, 05, 05]
 
-1760; [74 D1 16, 05, 05]
+1764; [71 D4 FF, 05, 05]
 
-1761; [74 D1 1E, 05, 05]
+1765; [71 D5 09, 05, 05]
 
-1762; [74 D1 26, 05, 05]
+1766; [71 D5 11, 05, 05]
 
-1763; [74 D1 2E, 05, 05]
+1767; [71 D5 19, 05, 05]
 
-1764; [74 D1 36, 05, 05]
+1768; [71 D5 21, 05, 05]
 
-1765; [74 D1 3E, 05, 05]
+1769; [71 D5 29, 05, 05]
 
-1766; [74 D1 46, 05, 05]
+176A; [71 D5 31, 05, 05]
 
-1767; [74 D1 4E, 05, 05]
+176B; [71 D5 39, 05, 05]
 
-1768; [74 D1 56, 05, 05]
+176C; [71 D5 41, 05, 05]
 
-1769; [74 D1 5E, 05, 05]
+176E; [71 D5 49, 05, 05]
 
-176A; [74 D1 66, 05, 05]
+176F; [71 D5 51, 05, 05]
 
-176B; [74 D1 6E, 05, 05]
+1770; [71 D5 59, 05, 05]
 
-176C; [74 D1 76, 05, 05]
+1772; [71 D5 61, 05, 05]
 
-176E; [74 D1 7E, 05, 05]
+1773; [71 D5 69, 05, 05]
 
-176F; [74 D1 86, 05, 05]
+FDD1 1A00;     [71 D5 92, 05, 05]      # BUGINESE first primary
 
-1770; [74 D1 8E, 05, 05]
+1A00; [71 D5 BB, 05, 05]
 
-1772; [74 D1 96, 05, 05]
+1A01; [71 D5 C3, 05, 05]
 
-1773; [74 D1 9E, 05, 05]
+1A02; [71 D5 CB, 05, 05]
 
-1A00; [74 D1 A6, 05, 05]
+1A03; [71 D5 D3, 05, 05]
 
-1A01; [74 D1 AE, 05, 05]
+1A04; [71 D5 DB, 05, 05]
 
-1A02; [74 D1 B6, 05, 05]
+1A05; [71 D5 E3, 05, 05]
 
-1A03; [74 D1 BE, 05, 05]
+1A06; [71 D5 EB, 05, 05]
 
-1A04; [74 D1 C6, 05, 05]
+1A07; [71 D5 F3, 05, 05]
 
-1A05; [74 D1 CE, 05, 05]
+1A08; [71 D5 FB, 05, 05]
 
-1A06; [74 D1 D6, 05, 05]
+1A09; [71 D6 05, 05, 05]
 
-1A07; [74 D1 DE, 05, 05]
+1A0A; [71 D6 0D, 05, 05]
 
-1A08; [74 D1 E6, 05, 05]
+1A0B; [71 D6 15, 05, 05]
 
-1A09; [74 D1 EE, 05, 05]
+1A0C; [71 D6 1D, 05, 05]
 
-1A0A; [74 D1 F6, 05, 05]
+1A0D; [71 D6 25, 05, 05]
 
-1A0B; [74 D2 04, 05, 05]
+1A0E; [71 D6 2D, 05, 05]
 
-1A0C; [74 D2 0C, 05, 05]
+1A0F; [71 D6 35, 05, 05]
 
-1A0D; [74 D2 14, 05, 05]
+1A10; [71 D6 3D, 05, 05]
 
-1A0E; [74 D2 1C, 05, 05]
+1A11; [71 D6 45, 05, 05]
 
-1A0F; [74 D2 24, 05, 05]
+1A12; [71 D6 4D, 05, 05]
 
-1A10; [74 D2 2C, 05, 05]
+1A13; [71 D6 55, 05, 05]
 
-1A11; [74 D2 34, 05, 05]
+1A14; [71 D6 5D, 05, 05]
 
-1A12; [74 D2 3C, 05, 05]
+1A15; [71 D6 65, 05, 05]
 
-1A13; [74 D2 44, 05, 05]
+1A16; [71 D6 6D, 05, 05]
 
-1A14; [74 D2 4C, 05, 05]
+1A17; [71 D6 75, 05, 05]
 
-1A15; [74 D2 54, 05, 05]
+1A18; [71 D6 7D, 05, 05]
 
-1A16; [74 D2 5C, 05, 05]
+1A19; [71 D6 85, 05, 05]
 
-1A17; [74 D2 64, 05, 05]
+1A1A; [71 D6 8D, 05, 05]
 
-1A18; [74 D2 6C, 05, 05]
+1A1B; [71 D6 95, 05, 05]
 
-1A19; [74 D2 74, 05, 05]
+FDD1 1BC0;     [71 D6 BE, 05, 05]      # Batak first primary
 
-1A1A; [74 D2 7C, 05, 05]
+1BC0; [71 D6 E7, 05, 05]
+1BC1; [71 D6 E7, 05, 20]
 
-1A1B; [74 D2 84, 05, 05]
+1BC2; [71 D6 EF, 05, 05]
+1BC3; [71 D6 EF, 05, 20]
+1BC4; [71 D6 EF, 05, 20]
 
-1BC0; [74 D2 8C, 05, 05]
-1BC1; [74 D2 8C, 05, 09]
+1BC5; [71 D6 F7, 05, 05]
+1BC6; [71 D6 F7, 05, 20]
 
-1BC2; [74 D2 94, 05, 05]
-1BC3; [74 D2 94, 05, 09]
-1BC4; [74 D2 94, 05, 09]
+1BC7; [71 D6 FF, 05, 05]
+1BC8; [71 D6 FF, 05, 20]
 
-1BC5; [74 D2 9C, 05, 05]
-1BC6; [74 D2 9C, 05, 09]
+1BC9; [71 D7 09, 05, 05]
+1BCA; [71 D7 09, 05, 20]
 
-1BC7; [74 D2 A4, 05, 05]
-1BC8; [74 D2 A4, 05, 09]
+1BCB; [71 D7 11, 05, 05]
+1BCC; [71 D7 11, 05, 20]
+1BCD; [71 D7 11, 05, 20]
 
-1BC9; [74 D2 AC, 05, 05]
-1BCA; [74 D2 AC, 05, 09]
+1BCE; [71 D7 19, 05, 05]
+1BCF; [71 D7 19, 05, 20]
 
-1BCB; [74 D2 B4, 05, 05]
-1BCC; [74 D2 B4, 05, 09]
-1BCD; [74 D2 B4, 05, 09]
+1BD0; [71 D7 21, 05, 05]
 
-1BCE; [74 D2 BC, 05, 05]
-1BCF; [74 D2 BC, 05, 09]
+1BD1; [71 D7 29, 05, 05]
 
-1BD0; [74 D2 C4, 05, 05]
+1BD2; [71 D7 31, 05, 05]
+1BD3; [71 D7 31, 05, 20]
 
-1BD1; [74 D2 CC, 05, 05]
+1BD4; [71 D7 39, 05, 05]
+1BD5; [71 D7 39, 05, 20]
 
-1BD2; [74 D2 D4, 05, 05]
-1BD3; [74 D2 D4, 05, 09]
+1BD6; [71 D7 41, 05, 05]
+1BD7; [71 D7 41, 05, 20]
 
-1BD4; [74 D2 DC, 05, 05]
-1BD5; [74 D2 DC, 05, 09]
+1BD8; [71 D7 49, 05, 05]
+1BD9; [71 D7 49, 05, 20]
+1BDA; [71 D7 49, 05, 20]
 
-1BD6; [74 D2 E4, 05, 05]
-1BD7; [74 D2 E4, 05, 09]
+1BDB; [71 D7 51, 05, 05]
+1BDC; [71 D7 51, 05, 20]
 
-1BD8; [74 D2 EC, 05, 05]
-1BD9; [74 D2 EC, 05, 09]
-1BDA; [74 D2 EC, 05, 09]
+1BDD; [71 D7 59, 05, 05]
 
-1BDB; [74 D2 F4, 05, 05]
-1BDC; [74 D2 F4, 05, 09]
+1BDE; [71 D7 61, 05, 05]
+1BDF; [71 D7 61, 05, 20]
 
-1BDD; [74 D2 FC, 05, 05]
+1BE0; [71 D7 69, 05, 05]
 
-1BDE; [74 D3 0A, 05, 05]
-1BDF; [74 D3 0A, 05, 09]
+1BE1; [71 D7 71, 05, 05]
 
-1BE0; [74 D3 12, 05, 05]
+1BE2; [71 D7 79, 05, 05]
 
-1BE1; [74 D3 1A, 05, 05]
+1BE3; [71 D7 81, 05, 05]
 
-1BE2; [74 D3 22, 05, 05]
+1BE4; [71 D7 89, 05, 05]
 
-1BE3; [74 D3 2A, 05, 05]
+1BE5; [71 D7 91, 05, 05]
 
-1BE4; [74 D3 32, 05, 05]
+1BE7; [71 D7 99, 05, 05]
+1BE8; [71 D7 99, 05, 20]
 
-1BE5; [74 D3 3A, 05, 05]
+1BE9; [71 D7 A1, 05, 05]
 
-1BE7; [74 D3 42, 05, 05]
-1BE8; [74 D3 42, 05, 09]
+1BEA; [71 D7 A9, 05, 05]
+1BEB; [71 D7 A9, 05, 20]
 
-1BE9; [74 D3 4A, 05, 05]
+1BEC; [71 D7 B1, 05, 05]
+1BED; [71 D7 B1, 05, 20]
 
-1BEA; [74 D3 52, 05, 05]
-1BEB; [74 D3 52, 05, 09]
+1BEE; [71 D7 B9, 05, 05]
+1BEF; [71 D7 B9, 05, 20]
 
-1BEC; [74 D3 5A, 05, 05]
-1BED; [74 D3 5A, 05, 09]
+1BF0; [71 D7 C1, 05, 05]
 
-1BEE; [74 D3 62, 05, 05]
-1BEF; [74 D3 62, 05, 09]
+1BF1; [71 D7 C9, 05, 05]
 
-1BF0; [74 D3 6A, 05, 05]
+1BF2; [71 D7 D1, 05, 05]
 
-1BF1; [74 D3 72, 05, 05]
+1BF3; [71 D7 D9, 05, 05]
 
-1BF2; [74 D3 7A, 05, 05]
+FDD1 A930;     [71 D8 04, 05, 05]      # Rejang first primary
 
-1BF3; [74 D3 82, 05, 05]
+A930; [71 D8 2D, 05, 05]
 
-A930; [74 D3 8A, 05, 05]
+A931; [71 D8 35, 05, 05]
 
-A931; [74 D3 92, 05, 05]
+A932; [71 D8 3D, 05, 05]
 
-A932; [74 D3 9A, 05, 05]
+A933; [71 D8 45, 05, 05]
 
-A933; [74 D3 A2, 05, 05]
+A934; [71 D8 4D, 05, 05]
 
-A934; [74 D3 AA, 05, 05]
+A935; [71 D8 55, 05, 05]
 
-A935; [74 D3 B2, 05, 05]
+A936; [71 D8 5D, 05, 05]
 
-A936; [74 D3 BA, 05, 05]
+A937; [71 D8 65, 05, 05]
 
-A937; [74 D3 C2, 05, 05]
+A938; [71 D8 6D, 05, 05]
 
-A938; [74 D3 CA, 05, 05]
+A939; [71 D8 75, 05, 05]
 
-A939; [74 D3 D2, 05, 05]
+A93A; [71 D8 7D, 05, 05]
 
-A93A; [74 D3 DA, 05, 05]
+A93B; [71 D8 85, 05, 05]
 
-A93B; [74 D3 E2, 05, 05]
+A93C; [71 D8 8D, 05, 05]
 
-A93C; [74 D3 EA, 05, 05]
+A93D; [71 D8 95, 05, 05]
 
-A93D; [74 D3 F2, 05, 05]
+A93E; [71 D8 9D, 05, 05]
 
-A93E; [74 D3 FA, 05, 05]
+A93F; [71 D8 A5, 05, 05]
 
-A93F; [74 D4 08, 05, 05]
+A940; [71 D8 AD, 05, 05]
 
-A940; [74 D4 10, 05, 05]
+A941; [71 D8 B5, 05, 05]
 
-A941; [74 D4 18, 05, 05]
+A942; [71 D8 BD, 05, 05]
 
-A942; [74 D4 20, 05, 05]
+A943; [71 D8 C5, 05, 05]
 
-A943; [74 D4 28, 05, 05]
+A944; [71 D8 CD, 05, 05]
 
-A944; [74 D4 30, 05, 05]
+A945; [71 D8 D5, 05, 05]
 
-A945; [74 D4 38, 05, 05]
+A946; [71 D8 DD, 05, 05]
 
-A946; [74 D4 40, 05, 05]
+A947; [71 D8 E5, 05, 05]
 
-A947; [74 D4 48, 05, 05]
+A948; [71 D8 ED, 05, 05]
 
-A948; [74 D4 50, 05, 05]
+A949; [71 D8 F5, 05, 05]
 
-A949; [74 D4 58, 05, 05]
+A94A; [71 D8 FD, 05, 05]
 
-A94A; [74 D4 60, 05, 05]
+A94B; [71 D9 07, 05, 05]
 
-A94B; [74 D4 68, 05, 05]
+A94C; [71 D9 0F, 05, 05]
 
-A94C; [74 D4 70, 05, 05]
+A94D; [71 D9 17, 05, 05]
 
-A94D; [74 D4 78, 05, 05]
+A94E; [71 D9 1F, 05, 05]
 
-A94E; [74 D4 80, 05, 05]
+A94F; [71 D9 27, 05, 05]
 
-A94F; [74 D4 88, 05, 05]
+A950; [71 D9 2F, 05, 05]
 
-A950; [74 D4 90, 05, 05]
+A951; [71 D9 37, 05, 05]
 
-A951; [74 D4 98, 05, 05]
+A952; [71 D9 3F, 05, 05]
 
-A952; [74 D4 A0, 05, 05]
+A953; [71 D9 47, 05, 05]
 
-A953; [74 D4 A8, 05, 05]
+FDD1 A90A;     [71 D9 70, 05, 05]      # Kayah Li first primary
 
-A90A; [74 D4 B0, 05, 05]
+A90A; [71 D9 99, 05, 05]
 
-A90B; [74 D4 B8, 05, 05]
+A90B; [71 D9 A1, 05, 05]
 
-A90C; [74 D4 C0, 05, 05]
+A90C; [71 D9 A9, 05, 05]
 
-A90D; [74 D4 C8, 05, 05]
+A90D; [71 D9 B1, 05, 05]
 
-A90E; [74 D4 D0, 05, 05]
+A90E; [71 D9 B9, 05, 05]
 
-A90F; [74 D4 D8, 05, 05]
+A90F; [71 D9 C1, 05, 05]
 
-A910; [74 D4 E0, 05, 05]
+A910; [71 D9 C9, 05, 05]
 
-A911; [74 D4 E8, 05, 05]
+A911; [71 D9 D1, 05, 05]
 
-A912; [74 D4 F0, 05, 05]
+A912; [71 D9 D9, 05, 05]
 
-A913; [74 D4 F8, 05, 05]
+A913; [71 D9 E1, 05, 05]
 
-A914; [74 D5 06, 05, 05]
+A914; [71 D9 E9, 05, 05]
 
-A915; [74 D5 0E, 05, 05]
+A915; [71 D9 F1, 05, 05]
 
-A916; [74 D5 16, 05, 05]
+A916; [71 D9 F9, 05, 05]
 
-A917; [74 D5 1E, 05, 05]
+A917; [71 DA 03, 05, 05]
 
-A918; [74 D5 26, 05, 05]
+A918; [71 DA 0B, 05, 05]
 
-A919; [74 D5 2E, 05, 05]
+A919; [71 DA 13, 05, 05]
 
-A91A; [74 D5 36, 05, 05]
+A91A; [71 DA 1B, 05, 05]
 
-A91B; [74 D5 3E, 05, 05]
+A91B; [71 DA 23, 05, 05]
 
-A91C; [74 D5 46, 05, 05]
+A91C; [71 DA 2B, 05, 05]
 
-A91D; [74 D5 4E, 05, 05]
+A91D; [71 DA 33, 05, 05]
 
-A91E; [74 D5 56, 05, 05]
+A91E; [71 DA 3B, 05, 05]
 
-A91F; [74 D5 5E, 05, 05]
+A91F; [71 DA 43, 05, 05]
 
-A920; [74 D5 66, 05, 05]
+A920; [71 DA 4B, 05, 05]
 
-A921; [74 D5 6E, 05, 05]
+A921; [71 DA 53, 05, 05]
 
-A922; [74 D5 76, 05, 05]
+A922; [71 DA 5B, 05, 05]
 
-A923; [74 D5 7E, 05, 05]
+A923; [71 DA 63, 05, 05]
 
-A924; [74 D5 86, 05, 05]
+A924; [71 DA 6B, 05, 05]
 
-A925; [74 D5 8E, 05, 05]
+A925; [71 DA 73, 05, 05]
 
-A926; [74 D5 96, 05, 05]
+A926; [71 DA 7B, 05, 05]
 
-A927; [74 D5 9E, 05, 05]
+A927; [71 DA 83, 05, 05]
 
-A928; [74 D5 A6, 05, 05]
+A928; [71 DA 8B, 05, 05]
 
-A929; [74 D5 AE, 05, 05]
+A929; [71 DA 93, 05, 05]
 
-A92A; [74 D5 B6, 05, 05]
+A92A; [71 DA 9B, 05, 05]
 
-1000; [75 0A, 05, 05]
+FDD1 1000;     [72 04 02, 05, 05]      # MYANMAR first primary starts reordering group (compressible)
 
-1075; [75 0C, 05, 05]
+1000; [72 08 02, 05, 05]
 
-1001; [75 0E, 05, 05]
+1075; [72 08 0A, 05, 05]
 
-1076; [75 10, 05, 05]
+1001; [72 08 12, 05, 05]
 
-1002; [75 12, 05, 05]
+1076; [72 08 1A, 05, 05]
 
-1077; [75 14, 05, 05]
+1002; [72 08 22, 05, 05]
 
-AA60; [75 16, 05, 05]
+1077; [72 08 2A, 05, 05]
 
-1003; [75 18, 05, 05]
+AA60; [72 08 32, 05, 05]
 
-1004; [75 1A, 05, 05]
+1003; [72 08 3A, 05, 05]
 
-105A; [75 1C, 05, 05]
+1004; [72 08 42, 05, 05]
 
-1005; [75 1E, 05, 05]
+105A; [72 08 4A, 05, 05]
 
-1078; [75 20, 05, 05]
+1005; [72 08 52, 05, 05]
 
-AA61; [75 22, 05, 05]
+1078; [72 08 5A, 05, 05]
 
-1006; [75 24, 05, 05]
+AA61; [72 08 62, 05, 05]
 
-AA62; [75 26, 05, 05]
+1006; [72 08 6A, 05, 05]
 
-1007; [75 28, 05, 05]
+AA62; [72 08 72, 05, 05]
 
-AA63; [75 2A, 05, 05]
+1007; [72 08 7A, 05, 05]
 
-1079; [75 2C, 05, 05]
+AA63; [72 08 82, 05, 05]
 
-AA72; [75 2E, 05, 05]
+1079; [72 08 8A, 05, 05]
 
-1008; [75 30, 05, 05]
+AA72; [72 08 92, 05, 05]
 
-105B; [75 32, 05, 05]
+1008; [72 08 9A, 05, 05]
 
-AA64; [75 34, 05, 05]
+105B; [72 08 A2, 05, 05]
 
-1061; [75 36, 05, 05]
+AA64; [72 08 AA, 05, 05]
 
-1009; [75 38, 05, 05]
+1061; [72 08 B2, 05, 05]
 
-107A; [75 3A, 05, 05]
+1009; [72 08 BA, 05, 05]
 
-AA65; [75 3C, 05, 05]
+107A; [72 08 C2, 05, 05]
 
-100A; [75 3E, 05, 05]
+AA65; [72 08 CA, 05, 05]
 
-100B; [75 40, 05, 05]
+100A; [72 08 D2, 05, 05]
 
-AA66; [75 42, 05, 05]
+100B; [72 08 DA, 05, 05]
 
-100C; [75 44, 05, 05]
+AA66; [72 08 E2, 05, 05]
 
-AA67; [75 46, 05, 05]
+100C; [72 08 EA, 05, 05]
 
-100D; [75 48, 05, 05]
+AA67; [72 08 F2, 05, 05]
 
-AA68; [75 4A, 05, 05]
+100D; [72 08 FA, 05, 05]
 
-100E; [75 4C, 05, 05]
+AA68; [72 09 04, 05, 05]
 
-AA69; [75 4E, 05, 05]
+100E; [72 09 0C, 05, 05]
 
-100F; [75 50, 05, 05]
+AA69; [72 09 14, 05, 05]
 
-106E; [75 52, 05, 05]
+100F; [72 09 1C, 05, 05]
 
-1010; [75 54, 05, 05]
+106E; [72 09 24, 05, 05]
 
-1011; [75 56, 05, 05]
+1010; [72 09 2C, 05, 05]
 
-1012; [75 58, 05, 05]
+1011; [72 09 34, 05, 05]
 
-107B; [75 5A, 05, 05]
+1012; [72 09 3C, 05, 05]
 
-1013; [75 5C, 05, 05]
+107B; [72 09 44, 05, 05]
 
-AA6A; [75 5E, 05, 05]
+1013; [72 09 4C, 05, 05]
 
-1014; [75 60, 05, 05]
+AA6A; [72 09 54, 05, 05]
 
-107C; [75 62, 05, 05]
+1014; [72 09 5C, 05, 05]
 
-AA6B; [75 64, 05, 05]
+107C; [72 09 64, 05, 05]
 
-105E; [75 66, 05, 05]
+AA6B; [72 09 6C, 05, 05]
 
-1015; [75 68, 05, 05]
+105E; [72 09 74, 05, 05]
 
-1016; [75 6A, 05, 05]
+1015; [72 09 7C, 05, 05]
 
-107D; [75 6C, 05, 05]
+1016; [72 09 84, 05, 05]
 
-107E; [75 6E, 05, 05]
+107D; [72 09 8C, 05, 05]
 
-AA6F; [75 70, 05, 05]
+107E; [72 09 94, 05, 05]
 
-108E; [75 72, 05, 05]
+AA6F; [72 09 9C, 05, 05]
 
-1017; [75 74, 05, 05]
+108E; [72 09 A4, 05, 05]
 
-107F; [75 76, 05, 05]
+1017; [72 09 AC, 05, 05]
 
-1018; [75 78, 05, 05]
+107F; [72 09 B4, 05, 05]
 
-1019; [75 7A, 05, 05]
+1018; [72 09 BC, 05, 05]
 
-105F; [75 7C, 05, 05]
+1019; [72 09 C4, 05, 05]
 
-101A; [75 7E, 05, 05]
+105F; [72 09 CC, 05, 05]
 
-103B; [75 80, 05, 05]
+101A; [72 09 D4, 05, 05]
 
-101B; [75 82, 05, 05]
+103B; [72 09 DC, 05, 05]
 
-AA73; [75 84, 05, 05]
+101B; [72 09 E4, 05, 05]
 
-AA7A; [75 86, 05, 05]
+AA73; [72 09 EC, 05, 05]
 
-103C; [75 88, 05, 05]
+AA7A; [72 09 F4, 05, 05]
 
-101C; [75 8A, 05, 05]
+103C; [72 09 FC, 05, 05]
 
-1060; [75 8C, 05, 05]
+101C; [72 0A 06, 05, 05]
 
-101D; [75 8E, 05, 05]
+1060; [72 0A 0E, 05, 05]
 
-103D; [75 90, 05, 05]
+101D; [72 0A 16, 05, 05]
 
-1082; [75 92, 05, 05]
+103D; [72 0A 1E, 05, 05]
 
-1080; [75 94, 05, 05]
+1082; [72 0A 26, 05, 05]
 
-1050; [75 96, 05, 05]
+1080; [72 0A 2E, 05, 05]
 
-1051; [75 98, 05, 05]
+1050; [72 0A 36, 05, 05]
 
-1065; [75 9A, 05, 05]
+1051; [72 0A 3E, 05, 05]
 
-101E; [75 9C, 05, 05]
-103F; [75 9C, 05, 09][76 13, 05, 09][75 9C, 05, 09]
+1065; [72 0A 46, 05, 05]
 
-AA6C; [75 9E, 05, 05]
+101E; [72 0A 4E, 05, 05]
+103F; [72 0A 4E, 05, 20][72 0C 0A, 05, 20][72 0A 4E, 05, 20]
 
-101F; [75 A0, 05, 05]
+AA6C; [72 0A 56, 05, 05]
 
-1081; [75 A2, 05, 05]
+101F; [72 0A 5E, 05, 05]
 
-AA6D; [75 A4, 05, 05]
+1081; [72 0A 66, 05, 05]
 
-103E; [75 A6, 05, 05]
+AA6D; [72 0A 6E, 05, 05]
 
-AA6E; [75 A8, 05, 05]
+103E; [72 0A 76, 05, 05]
 
-AA71; [75 AA, 05, 05]
+AA6E; [72 0A 7E, 05, 05]
 
-1020; [75 AC, 05, 05]
+AA71; [72 0A 86, 05, 05]
 
-105C; [75 AE, 05, 05]
+1020; [72 0A 8E, 05, 05]
 
-105D; [75 B0, 05, 05]
+105C; [72 0A 96, 05, 05]
 
-106F; [75 B2, 05, 05]
+105D; [72 0A 9E, 05, 05]
 
-1070; [75 B4, 05, 05]
+106F; [72 0A A6, 05, 05]
 
-1066; [75 B6, 05, 05]
+1070; [72 0A AE, 05, 05]
 
-1021; [75 B8, 05, 05]
+1066; [72 0A B6, 05, 05]
 
-1022; [75 BA, 05, 05]
+1021; [72 0A BE, 05, 05]
 
-1023; [75 BC, 05, 05]
+1022; [72 0A C6, 05, 05]
 
-1024; [75 BE, 05, 05]
+1023; [72 0A CE, 05, 05]
 
-1025; [75 C0, 05, 05]
+1024; [72 0A D6, 05, 05]
 
-1025 102E; [75 C2, 05, 05]
-1026; [75 C2, 05, 05]
+1025; [72 0A DE, 05, 05]
 
-1052; [75 C4, 05, 05]
+1025 102E; [72 0A E6, 05, 05]
+1026; [72 0A E6, 05, 05]
 
-1053; [75 C6, 05, 05]
+1052; [72 0A EE, 05, 05]
 
-1054; [75 C8, 05, 05]
+1053; [72 0A F6, 05, 05]
 
-1055; [75 CA, 05, 05]
+1054; [72 0A FE, 05, 05]
 
-1027; [75 CC, 05, 05]
+1055; [72 0B 08, 05, 05]
 
-1028; [75 CE, 05, 05]
+1027; [72 0B 10, 05, 05]
 
-1029; [75 D0, 05, 05]
+1028; [72 0B 18, 05, 05]
 
-102A; [75 D2, 05, 05]
+1029; [72 0B 20, 05, 05]
 
-102C; [75 D4, 05, 05]
-102B; [75 D4, 05, 09]
+102A; [72 0B 28, 05, 05]
 
-1083; [75 D6, 05, 05]
+102C; [72 0B 30, 05, 05]
+102B; [72 0B 30, 05, 20]
 
-1072; [75 D8, 05, 05]
+1083; [72 0B 38, 05, 05]
 
-109C; [75 DA, 05, 05]
+1072; [72 0B 40, 05, 05]
 
-102D; [75 DC, 05, 05]
+109C; [72 0B 48, 05, 05]
 
-1071; [75 DE, 05, 05]
+102D; [72 0B 50, 05, 05]
 
-102E; [75 E0, 05, 05]
+1071; [72 0B 58, 05, 05]
 
-1033; [75 E2, 05, 05]
+102E; [72 0B 60, 05, 05]
 
-102F; [75 E4, 05, 05]
+1033; [72 0B 68, 05, 05]
 
-1073; [75 E6, 05, 05]
+102F; [72 0B 70, 05, 05]
 
-1074; [75 E8, 05, 05]
+1073; [72 0B 78, 05, 05]
 
-1030; [75 EA, 05, 05]
+1074; [72 0B 80, 05, 05]
 
-1056; [75 EC, 05, 05]
+1030; [72 0B 88, 05, 05]
 
-1057; [75 EE, 05, 05]
+1056; [72 0B 90, 05, 05]
 
-1058; [75 F0, 05, 05]
+1057; [72 0B 98, 05, 05]
 
-1059; [75 F2, 05, 05]
+1058; [72 0B A0, 05, 05]
 
-1031; [75 F4, 05, 05]
+1059; [72 0B A8, 05, 05]
 
-1084; [75 F6, 05, 05]
+1031; [72 0B B0, 05, 05]
 
-1035; [75 F8, 05, 05]
+1084; [72 0B B8, 05, 05]
 
-1085; [75 FA, 05, 05]
+1035; [72 0B C0, 05, 05]
 
-1032; [76 05, 05, 05]
+1085; [72 0B C8, 05, 05]
 
-109D; [76 07, 05, 05]
+1032; [72 0B D0, 05, 05]
 
-1034; [76 09, 05, 05]
+109D; [72 0B D8, 05, 05]
 
-1062; [76 0B, 05, 05]
+1034; [72 0B E0, 05, 05]
 
-1067; [76 0D, 05, 05]
+1062; [72 0B E8, 05, 05]
 
-1068; [76 0F, 05, 05]
+1067; [72 0B F0, 05, 05]
 
-1086; [76 11, 05, 05]
+1068; [72 0B F8, 05, 05]
 
-1039; [76 13, 05, 05]
+1086; [72 0C 02, 05, 05]
 
-103A; [76 15, 05, 05]
+1039; [72 0C 0A, 05, 05]
 
-1063; [76 17, 05, 05]
+103A; [72 0C 12, 05, 05]
 
-1064; [76 19, 05, 05]
+1063; [72 0C 1A, 05, 05]
 
-1069; [76 1B, 05, 05]
+1064; [72 0C 22, 05, 05]
 
-106A; [76 1D, 05, 05]
+1069; [72 0C 2A, 05, 05]
 
-106B; [76 1F, 05, 05]
+106A; [72 0C 32, 05, 05]
 
-106C; [76 21, 05, 05]
+106B; [72 0C 3A, 05, 05]
 
-106D; [76 23, 05, 05]
+106C; [72 0C 42, 05, 05]
 
-1087; [76 25, 05, 05]
+106D; [72 0C 4A, 05, 05]
 
-108B; [76 27, 05, 05]
+1087; [72 0C 52, 05, 05]
 
-1088; [76 29, 05, 05]
+108B; [72 0C 5A, 05, 05]
 
-108C; [76 2B, 05, 05]
+1088; [72 0C 62, 05, 05]
 
-1089; [76 2D, 05, 05]
+108C; [72 0C 6A, 05, 05]
 
-108A; [76 2F, 05, 05]
+1089; [72 0C 72, 05, 05]
 
-108F; [76 31, 05, 05]
+108A; [72 0C 7A, 05, 05]
 
-109A; [76 33, 05, 05]
+108F; [72 0C 82, 05, 05]
 
-109B; [76 35, 05, 05]
+109A; [72 0C 8A, 05, 05]
 
-AA7B; [76 37, 05, 05]
+109B; [72 0C 92, 05, 05]
 
-AA74; [76 39, 05, 05]
+AA7B; [72 0C 9A, 05, 05]
 
-AA75; [76 3B, 05, 05]
+AA74; [72 0C A2, 05, 05]
 
-AA76; [76 3D, 05, 05]
+AA75; [72 0C AA, 05, 05]
 
-11103; [76 3F 04, 05, 05]
+AA76; [72 0C B2, 05, 05]
 
-11104; [76 3F 0C, 05, 05]
+FDD1 11103;    [72 11 02, 05, 05]      # Chakma first primary
 
-11105; [76 3F 14, 05, 05]
+11103; [72 11 2B, 05, 05]
 
-11106; [76 3F 1C, 05, 05]
+11104; [72 11 33, 05, 05]
 
-11107; [76 3F 24, 05, 05]
+11105; [72 11 3B, 05, 05]
 
-11108; [76 3F 2C, 05, 05]
+11106; [72 11 43, 05, 05]
 
-11109; [76 3F 34, 05, 05]
+11107; [72 11 4B, 05, 05]
 
-1110A; [76 3F 3C, 05, 05]
+11108; [72 11 53, 05, 05]
 
-1110B; [76 3F 44, 05, 05]
+11109; [72 11 5B, 05, 05]
 
-1110C; [76 3F 4C, 05, 05]
+1110A; [72 11 63, 05, 05]
 
-1110D; [76 3F 54, 05, 05]
+1110B; [72 11 6B, 05, 05]
 
-1110E; [76 3F 5C, 05, 05]
+1110C; [72 11 73, 05, 05]
 
-1110F; [76 3F 64, 05, 05]
+1110D; [72 11 7B, 05, 05]
 
-11110; [76 3F 6C, 05, 05]
+1110E; [72 11 83, 05, 05]
 
-11111; [76 3F 74, 05, 05]
+1110F; [72 11 8B, 05, 05]
 
-11112; [76 3F 7C, 05, 05]
+11110; [72 11 93, 05, 05]
 
-11113; [76 3F 84, 05, 05]
+11111; [72 11 9B, 05, 05]
 
-11114; [76 3F 8C, 05, 05]
+11112; [72 11 A3, 05, 05]
 
-11115; [76 3F 94, 05, 05]
+11113; [72 11 AB, 05, 05]
 
-11116; [76 3F 9C, 05, 05]
+11114; [72 11 B3, 05, 05]
 
-11117; [76 3F A4, 05, 05]
+11115; [72 11 BB, 05, 05]
 
-11118; [76 3F AC, 05, 05]
+11116; [72 11 C3, 05, 05]
 
-11119; [76 3F B4, 05, 05]
+11117; [72 11 CB, 05, 05]
 
-1111A; [76 3F BC, 05, 05]
+11118; [72 11 D3, 05, 05]
 
-1111B; [76 3F C4, 05, 05]
+11119; [72 11 DB, 05, 05]
 
-1111C; [76 3F CC, 05, 05]
+1111A; [72 11 E3, 05, 05]
 
-1111D; [76 3F D4, 05, 05]
+1111B; [72 11 EB, 05, 05]
 
-1111E; [76 3F DC, 05, 05]
+1111C; [72 11 F3, 05, 05]
 
-1111F; [76 3F E4, 05, 05]
+1111D; [72 11 FB, 05, 05]
 
-11120; [76 3F EC, 05, 05]
+1111E; [72 12 05, 05, 05]
 
-11121; [76 3F F4, 05, 05]
+1111F; [72 12 0D, 05, 05]
 
-11122; [76 3F FC, 05, 05]
+11120; [72 12 15, 05, 05]
 
-11123; [76 40 0A, 05, 05]
+11121; [72 12 1D, 05, 05]
 
-11124; [76 40 12, 05, 05]
+11122; [72 12 25, 05, 05]
 
-11125; [76 40 1A, 05, 05]
+11123; [72 12 2D, 05, 05]
 
-11126; [76 40 22, 05, 05]
+11124; [72 12 35, 05, 05]
 
-11127; [76 40 2A, 05, 05]
+11125; [72 12 3D, 05, 05]
 
-11128; [76 40 32, 05, 05]
+11126; [72 12 45, 05, 05]
 
-11129; [76 40 3A, 05, 05]
+11127; [72 12 4D, 05, 05]
 
-1112A; [76 40 42, 05, 05]
+11128; [72 12 55, 05, 05]
 
-1112B; [76 40 4A, 05, 05]
+11129; [72 12 5D, 05, 05]
 
-1112C; [76 40 52, 05, 05]
+1112A; [72 12 65, 05, 05]
 
-1112D; [76 40 5A, 05, 05]
+1112B; [72 12 6D, 05, 05]
 
-1112E; [76 40 62, 05, 05]
-11131 11127; [76 40 62, 05, 05]
+1112C; [72 12 75, 05, 05]
 
-1112F; [76 40 6A, 05, 05]
-11132 11127; [76 40 6A, 05, 05]
+1112D; [72 12 7D, 05, 05]
 
-11130; [76 40 72, 05, 05]
+1112E; [72 12 85, 05, 05]
+11131 11127; [72 12 85, 05, 05]
 
-11131; [76 40 7A, 05, 05]
+1112F; [72 12 8D, 05, 05]
+11132 11127; [72 12 8D, 05, 05]
 
-11132; [76 40 82, 05, 05]
+11130; [72 12 95, 05, 05]
 
-11133; [76 40 8A, 05, 05]
+11131; [72 12 9D, 05, 05]
 
-11134; [76 40 92, 05, 05]
+11132; [72 12 A5, 05, 05]
 
-1780; [77 0A, 05, 05]
+11133; [72 12 AD, 05, 05]
 
-1781; [77 0C, 05, 05]
+11134; [72 12 B5, 05, 05]
 
-1782; [77 0E, 05, 05]
+FDD1 1780;     [73 04 02, 05, 05]      # KHMER first primary starts reordering group (compressible)
 
-1783; [77 10, 05, 05]
+1780; [73 09, 05, 05]
 
-1784; [77 12, 05, 05]
+1781; [73 0B, 05, 05]
 
-1785; [77 14, 05, 05]
+1782; [73 0D, 05, 05]
 
-1786; [77 16, 05, 05]
+1783; [73 0F, 05, 05]
 
-1787; [77 18, 05, 05]
+1784; [73 11, 05, 05]
 
-1788; [77 1A, 05, 05]
+1785; [73 13, 05, 05]
 
-1789; [77 1C, 05, 05]
+1786; [73 15, 05, 05]
 
-178A; [77 1E, 05, 05]
+1787; [73 17, 05, 05]
 
-178B; [77 20, 05, 05]
+1788; [73 19, 05, 05]
 
-178C; [77 22, 05, 05]
+1789; [73 1B, 05, 05]
 
-178D; [77 24, 05, 05]
+178A; [73 1D, 05, 05]
 
-178E; [77 26, 05, 05]
+178B; [73 1F, 05, 05]
 
-178F; [77 28, 05, 05]
+178C; [73 21, 05, 05]
 
-1790; [77 2A, 05, 05]
+178D; [73 23, 05, 05]
 
-1791; [77 2C, 05, 05]
+178E; [73 25, 05, 05]
 
-1792; [77 2E, 05, 05]
+178F; [73 27, 05, 05]
 
-1793; [77 30, 05, 05]
+1790; [73 29, 05, 05]
 
-1794; [77 32, 05, 05]
+1791; [73 2B, 05, 05]
 
-1795; [77 34, 05, 05]
+1792; [73 2D, 05, 05]
 
-1796; [77 36, 05, 05]
+1793; [73 2F, 05, 05]
 
-1797; [77 38, 05, 05]
+1794; [73 31, 05, 05]
 
-1798; [77 3A, 05, 05]
+1795; [73 33, 05, 05]
 
-1799; [77 3C, 05, 05]
+1796; [73 35, 05, 05]
 
-179A; [77 3E, 05, 05]
+1797; [73 37, 05, 05]
 
-179B; [77 40, 05, 05]
+1798; [73 39, 05, 05]
 
-179C; [77 42, 05, 05]
+1799; [73 3B, 05, 05]
 
-179D; [77 44, 05, 05]
+179A; [73 3D, 05, 05]
 
-179E; [77 46, 05, 05]
+179B; [73 3F, 05, 05]
 
-179F; [77 48, 05, 05]
+179C; [73 41, 05, 05]
 
-17A0; [77 4A, 05, 05]
+179D; [73 43, 05, 05]
 
-17A1; [77 4C, 05, 05]
+179E; [73 45, 05, 05]
 
-17A2; [77 4E, 05, 05]
+179F; [73 47, 05, 05]
 
-17DC; [77 50, 05, 05]
+17A0; [73 49, 05, 05]
 
-17A3; [77 52, 05, 05]
+17A1; [73 4B, 05, 05]
 
-17A4; [77 54, 05, 05]
+17A2; [73 4D, 05, 05]
 
-17A5; [77 56, 05, 05]
+17DC; [73 4F, 05, 05]
 
-17A6; [77 58, 05, 05]
+17A3; [73 51, 05, 05]
 
-17A7; [77 5A, 05, 05]
+17A4; [73 53, 05, 05]
 
-17A8; [77 5C, 05, 05]
+17A5; [73 55, 05, 05]
 
-17A9; [77 5E, 05, 05]
+17A6; [73 57, 05, 05]
 
-17AA; [77 60, 05, 05]
+17A7; [73 59, 05, 05]
 
-17AB; [77 62, 05, 05]
+17A8; [73 5B, 05, 05]
 
-17AC; [77 64, 05, 05]
+17A9; [73 5D, 05, 05]
 
-17AD; [77 66, 05, 05]
+17AA; [73 5F, 05, 05]
 
-17AE; [77 68, 05, 05]
+17AB; [73 61, 05, 05]
 
-17AF; [77 6A, 05, 05]
+17AC; [73 63, 05, 05]
 
-17B0; [77 6C, 05, 05]
+17AD; [73 65, 05, 05]
 
-17B1; [77 6E, 05, 05]
+17AE; [73 67, 05, 05]
 
-17B2; [77 70, 05, 05]
+17AF; [73 69, 05, 05]
 
-17B3; [77 72, 05, 05]
+17B0; [73 6B, 05, 05]
 
-17B6; [77 74, 05, 05]
+17B1; [73 6D, 05, 05]
 
-17B7; [77 76, 05, 05]
+17B2; [73 6F, 05, 05]
 
-17B8; [77 78, 05, 05]
+17B3; [73 71, 05, 05]
 
-17B9; [77 7A, 05, 05]
+17B6; [73 73, 05, 05]
 
-17BA; [77 7C, 05, 05]
+17B7; [73 75, 05, 05]
 
-17BB; [77 7E, 05, 05]
+17B8; [73 77, 05, 05]
 
-17BC; [77 80, 05, 05]
+17B9; [73 79, 05, 05]
 
-17BD; [77 82, 05, 05]
+17BA; [73 7B, 05, 05]
 
-17BE; [77 84, 05, 05]
+17BB; [73 7D, 05, 05]
 
-17BF; [77 86, 05, 05]
+17BC; [73 7F, 05, 05]
 
-17C0; [77 88, 05, 05]
+17BD; [73 81, 05, 05]
 
-17C1; [77 8A, 05, 05]
+17BE; [73 83, 05, 05]
 
-17C2; [77 8C, 05, 05]
+17BF; [73 85, 05, 05]
 
-17C3; [77 8E, 05, 05]
+17C0; [73 87, 05, 05]
 
-17C4; [77 90, 05, 05]
+17C1; [73 89, 05, 05]
 
-17C5; [77 92, 05, 05]
+17C2; [73 8B, 05, 05]
 
-17D2; [77 94, 05, 05]
+17C3; [73 8D, 05, 05]
 
-1950; [77 96 04, 05, 05]
+17C4; [73 8F, 05, 05]
 
-1951; [77 96 0C, 05, 05]
+17C5; [73 91, 05, 05]
 
-1952; [77 96 14, 05, 05]
+17D2; [73 93, 05, 05]
 
-1953; [77 96 1C, 05, 05]
+FDD1 1950;     [73 98 02, 05, 05]      # TAI_LE first primary
 
-1954; [77 96 24, 05, 05]
+1950; [73 98 2B, 05, 05]
 
-1955; [77 96 2C, 05, 05]
+1951; [73 98 33, 05, 05]
 
-1956; [77 96 34, 05, 05]
+1952; [73 98 3B, 05, 05]
 
-1957; [77 96 3C, 05, 05]
+1953; [73 98 43, 05, 05]
 
-1958; [77 96 44, 05, 05]
+1954; [73 98 4B, 05, 05]
 
-1959; [77 96 4C, 05, 05]
+1955; [73 98 53, 05, 05]
 
-195A; [77 96 54, 05, 05]
+1956; [73 98 5B, 05, 05]
 
-195B; [77 96 5C, 05, 05]
+1957; [73 98 63, 05, 05]
 
-195C; [77 96 64, 05, 05]
+1958; [73 98 6B, 05, 05]
 
-195D; [77 96 6C, 05, 05]
+1959; [73 98 73, 05, 05]
 
-195E; [77 96 74, 05, 05]
+195A; [73 98 7B, 05, 05]
 
-195F; [77 96 7C, 05, 05]
+195B; [73 98 83, 05, 05]
 
-1960; [77 96 84, 05, 05]
+195C; [73 98 8B, 05, 05]
 
-1961; [77 96 8C, 05, 05]
+195D; [73 98 93, 05, 05]
 
-1962; [77 96 94, 05, 05]
+195E; [73 98 9B, 05, 05]
 
-1963; [77 96 9C, 05, 05]
+195F; [73 98 A3, 05, 05]
 
-1964; [77 96 A4, 05, 05]
+1960; [73 98 AB, 05, 05]
 
-1965; [77 96 AC, 05, 05]
+1961; [73 98 B3, 05, 05]
 
-1966; [77 96 B4, 05, 05]
+1962; [73 98 BB, 05, 05]
 
-1967; [77 96 BC, 05, 05]
+1963; [73 98 C3, 05, 05]
 
-1968; [77 96 C4, 05, 05]
+1964; [73 98 CB, 05, 05]
 
-1969; [77 96 CC, 05, 05]
+1965; [73 98 D3, 05, 05]
 
-196A; [77 96 D4, 05, 05]
+1966; [73 98 DB, 05, 05]
 
-196B; [77 96 DC, 05, 05]
+1967; [73 98 E3, 05, 05]
 
-196C; [77 96 E4, 05, 05]
+1968; [73 98 EB, 05, 05]
 
-196D; [77 96 EC, 05, 05]
+1969; [73 98 F3, 05, 05]
 
-1970; [77 96 F4, 05, 05]
+196A; [73 98 FB, 05, 05]
 
-1971; [77 96 FC, 05, 05]
+196B; [73 99 05, 05, 05]
 
-1972; [77 97 0A, 05, 05]
+196C; [73 99 0D, 05, 05]
 
-1973; [77 97 12, 05, 05]
+196D; [73 99 15, 05, 05]
 
-1974; [77 97 1A, 05, 05]
+1970; [73 99 1D, 05, 05]
 
-1980; [77 97 22, 05, 05]
+1971; [73 99 25, 05, 05]
 
-1981; [77 97 2A, 05, 05]
+1972; [73 99 2D, 05, 05]
 
-1982; [77 97 32, 05, 05]
+1973; [73 99 35, 05, 05]
 
-1983; [77 97 3A, 05, 05]
+1974; [73 99 3D, 05, 05]
 
-1984; [77 97 42, 05, 05]
+FDD1 1980;     [73 99 66, 05, 05]      # NEW_TAI_LUE first primary
 
-1985; [77 97 4A, 05, 05]
+1980; [73 99 8F, 05, 05]
 
-1986; [77 97 52, 05, 05]
+1981; [73 99 97, 05, 05]
 
-1987; [77 97 5A, 05, 05]
+1982; [73 99 9F, 05, 05]
 
-1988; [77 97 62, 05, 05]
+1983; [73 99 A7, 05, 05]
 
-1989; [77 97 6A, 05, 05]
+1984; [73 99 AF, 05, 05]
 
-198A; [77 97 72, 05, 05]
+1985; [73 99 B7, 05, 05]
 
-198B; [77 97 7A, 05, 05]
+1986; [73 99 BF, 05, 05]
 
-198C; [77 97 82, 05, 05]
+1987; [73 99 C7, 05, 05]
 
-198D; [77 97 8A, 05, 05]
+1988; [73 99 CF, 05, 05]
 
-198E; [77 97 92, 05, 05]
+1989; [73 99 D7, 05, 05]
 
-198F; [77 97 9A, 05, 05]
+198A; [73 99 DF, 05, 05]
 
-1990; [77 97 A2, 05, 05]
+198B; [73 99 E7, 05, 05]
 
-1991; [77 97 AA, 05, 05]
+198C; [73 99 EF, 05, 05]
 
-1992; [77 97 B2, 05, 05]
+198D; [73 99 F7, 05, 05]
 
-1993; [77 97 BA, 05, 05]
+198E; [73 99 FF, 05, 05]
 
-1994; [77 97 C2, 05, 05]
+198F; [73 9A 09, 05, 05]
 
-1995; [77 97 CA, 05, 05]
+1990; [73 9A 11, 05, 05]
 
-1996; [77 97 D2, 05, 05]
+1991; [73 9A 19, 05, 05]
 
-1997; [77 97 DA, 05, 05]
+1992; [73 9A 21, 05, 05]
 
-1998; [77 97 E2, 05, 05]
+1993; [73 9A 29, 05, 05]
 
-1999; [77 97 EA, 05, 05]
+1994; [73 9A 31, 05, 05]
 
-199A; [77 97 F2, 05, 05]
+1995; [73 9A 39, 05, 05]
 
-199B; [77 97 FA, 05, 05]
+1996; [73 9A 41, 05, 05]
 
-199C; [77 98 08, 05, 05]
-19DE; [77 98 08, 05, 09][77 98 B8, 05, 09]
-19DF; [77 98 08, 05, 09][77 98 B8, 05, 09][77 99 16, 05, 09]
+1997; [73 9A 49, 05, 05]
 
-199D; [77 98 10, 05, 05]
+1998; [73 9A 51, 05, 05]
 
-199E; [77 98 18, 05, 05]
+1999; [73 9A 59, 05, 05]
 
-199F; [77 98 20, 05, 05]
+199A; [73 9A 61, 05, 05]
 
-19A0; [77 98 28, 05, 05]
+199B; [73 9A 69, 05, 05]
 
-19A1; [77 98 30, 05, 05]
+199C; [73 9A 71, 05, 05]
+19DE; [73 9A 71, 05, 20][73 9B 23, 05, 20]
+19DF; [73 9A 71, 05, 20][73 9B 23, 05, 20][73 9B 7B, 05, 20]
 
-19A2; [77 98 38, 05, 05]
+199D; [73 9A 79, 05, 05]
 
-19A3; [77 98 40, 05, 05]
+199E; [73 9A 81, 05, 05]
 
-19A4; [77 98 48, 05, 05]
+199F; [73 9A 89, 05, 05]
 
-19A5; [77 98 50, 05, 05]
+19A0; [73 9A 91, 05, 05]
 
-19A6; [77 98 58, 05, 05]
+19A1; [73 9A 99, 05, 05]
 
-19A7; [77 98 60, 05, 05]
+19A2; [73 9A A1, 05, 05]
 
-19A8; [77 98 68, 05, 05]
+19A3; [73 9A A9, 05, 05]
 
-19A9; [77 98 70, 05, 05]
+19A4; [73 9A B1, 05, 05]
 
-19AA; [77 98 78, 05, 05]
+19A5; [73 9A B9, 05, 05]
 
-19AB; [77 98 80, 05, 05]
+19A6; [73 9A C1, 05, 05]
 
-19B0; [77 98 88, 05, 05]
+19A7; [73 9A C9, 05, 05]
 
-19B1; [77 98 90, 05, 05]
+19A8; [73 9A D1, 05, 05]
 
-19B2; [77 98 98, 05, 05]
+19A9; [73 9A D9, 05, 05]
 
-19B3; [77 98 A0, 05, 05]
+19AA; [73 9A E1, 05, 05]
 
-19B4; [77 98 A8, 05, 05]
+19AB; [73 9A E9, 05, 05]
 
-19B5; [77 98 B0, 05, 05]
+19B0; [73 9A F1, 05, 05]
 
-19B6; [77 98 B8, 05, 05]
+19B1; [73 9A F9, 05, 05]
 
-19B7; [77 98 C0, 05, 05]
+19B2; [73 9B 03, 05, 05]
 
-19B8; [77 98 C8, 05, 05]
+19B3; [73 9B 0B, 05, 05]
 
-19B9; [77 98 D0, 05, 05]
+19B4; [73 9B 13, 05, 05]
 
-19BA; [77 98 D8, 05, 05]
+19B5; [73 9B 1B, 05, 05]
 
-19BB; [77 98 E0, 05, 05]
+19B6; [73 9B 23, 05, 05]
 
-19BC; [77 98 E8, 05, 05]
+19B7; [73 9B 2B, 05, 05]
 
-19BD; [77 98 F0, 05, 05]
+19B8; [73 9B 33, 05, 05]
 
-19BE; [77 98 F8, 05, 05]
+19B9; [73 9B 3B, 05, 05]
 
-19BF; [77 99 06, 05, 05]
+19BA; [73 9B 43, 05, 05]
 
-19C0; [77 99 0E, 05, 05]
+19BB; [73 9B 4B, 05, 05]
 
-19C1; [77 99 16, 05, 05]
+19BC; [73 9B 53, 05, 05]
 
-19C2; [77 99 1E, 05, 05]
+19BD; [73 9B 5B, 05, 05]
 
-19C3; [77 99 26, 05, 05]
+19BE; [73 9B 63, 05, 05]
 
-19C4; [77 99 2E, 05, 05]
+19BF; [73 9B 6B, 05, 05]
 
-19C5; [77 99 36, 05, 05]
+19C0; [73 9B 73, 05, 05]
 
-19C6; [77 99 3E, 05, 05]
+19C1; [73 9B 7B, 05, 05]
 
-19C7; [77 99 46, 05, 05]
+19C2; [73 9B 83, 05, 05]
 
-19C8; [77 99 4E, 05, 05]
+19C3; [73 9B 8B, 05, 05]
 
-19C9; [77 99 56, 05, 05]
+19C4; [73 9B 93, 05, 05]
 
-1A20; [77 99 5E, 05, 05]
+19C5; [73 9B 9B, 05, 05]
 
-1A21; [77 99 66, 05, 05]
+19C6; [73 9B A3, 05, 05]
 
-1A22; [77 99 6E, 05, 05]
+19C7; [73 9B AB, 05, 05]
 
-1A23; [77 99 76, 05, 05]
+19C8; [73 9B B3, 05, 05]
 
-1A24; [77 99 7E, 05, 05]
+19C9; [73 9B BB, 05, 05]
 
-1A25; [77 99 86, 05, 05]
+FDD1 1A20;     [73 9B E4, 05, 05]      # Tai Tham first primary
 
-1A26; [77 99 8E, 05, 05]
-1A58; [77 99 8E, 05, 09]
-1A59; [77 99 8E, 05, 09]
+1A20; [73 9C 0F, 05, 05]
 
-1A27; [77 99 96, 05, 05]
+1A21; [73 9C 17, 05, 05]
 
-1A28; [77 99 9E, 05, 05]
+1A22; [73 9C 1F, 05, 05]
 
-1A29; [77 99 A6, 05, 05]
+1A23; [73 9C 27, 05, 05]
 
-1A2A; [77 99 AE, 05, 05]
+1A24; [73 9C 2F, 05, 05]
 
-1A2B; [77 99 B6, 05, 05]
+1A25; [73 9C 37, 05, 05]
 
-1A2C; [77 99 BE, 05, 05]
+1A26; [73 9C 3F, 05, 05]
+1A58; [73 9C 3F, 05, 20]
+1A59; [73 9C 3F, 05, 20]
 
-1A2D; [77 99 C6, 05, 05]
+1A27; [73 9C 47, 05, 05]
 
-1A2E; [77 99 CE, 05, 05]
+1A28; [73 9C 4F, 05, 05]
 
-1A2F; [77 99 D6, 05, 05]
+1A29; [73 9C 57, 05, 05]
 
-1A30; [77 99 DE, 05, 05]
+1A2A; [73 9C 5F, 05, 05]
 
-1A31; [77 99 E6, 05, 05]
+1A2B; [73 9C 67, 05, 05]
 
-1A32; [77 99 EE, 05, 05]
+1A2C; [73 9C 6F, 05, 05]
 
-1A33; [77 99 F6, 05, 05]
+1A2D; [73 9C 77, 05, 05]
 
-1A34; [77 9A 04, 05, 05]
+1A2E; [73 9C 7F, 05, 05]
 
-1A35; [77 9A 0C, 05, 05]
+1A2F; [73 9C 87, 05, 05]
 
-1A36; [77 9A 14, 05, 05]
+1A30; [73 9C 8F, 05, 05]
 
-1A37; [77 9A 1C, 05, 05]
+1A31; [73 9C 97, 05, 05]
 
-1A38; [77 9A 24, 05, 05]
+1A32; [73 9C 9F, 05, 05]
 
-1A39; [77 9A 2C, 05, 05]
+1A33; [73 9C A7, 05, 05]
 
-1A3A; [77 9A 34, 05, 05]
+1A34; [73 9C AF, 05, 05]
 
-1A3B; [77 9A 3C, 05, 05]
-1A5A; [77 9A 3C, 05, 09]
-1A5B; [77 9A 3C, 05, 09]
+1A35; [73 9C B7, 05, 05]
 
-1A3C; [77 9A 44, 05, 05]
+1A36; [73 9C BF, 05, 05]
 
-1A3D; [77 9A 4C, 05, 05]
+1A37; [73 9C C7, 05, 05]
 
-1A3E; [77 9A 54, 05, 05]
+1A38; [73 9C CF, 05, 05]
 
-1A3F; [77 9A 5C, 05, 05]
+1A39; [73 9C D7, 05, 05]
 
-1A40; [77 9A 64, 05, 05]
+1A3A; [73 9C DF, 05, 05]
 
-1A41; [77 9A 6C, 05, 05]
+1A3B; [73 9C E7, 05, 05]
+1A5A; [73 9C E7, 05, 20]
+1A5B; [73 9C E7, 05, 20]
 
-1A42; [77 9A 74, 05, 05]
+1A3C; [73 9C EF, 05, 05]
 
-1A43; [77 9A 7C, 05, 05]
+1A3D; [73 9C F7, 05, 05]
 
-1A44; [77 9A 84, 05, 05]
+1A3E; [73 9C FF, 05, 05]
 
-1A45; [77 9A 8C, 05, 05]
+1A3F; [73 9D 09, 05, 05]
 
-1A46; [77 9A 94, 05, 05]
-1A54; [77 9A 94, 05, 09][77 9B CA, 05, 09][77 9A 94, 05, 09]
+1A40; [73 9D 11, 05, 05]
 
-1A47; [77 9A 9C, 05, 05]
+1A41; [73 9D 19, 05, 05]
 
-1A48; [77 9A A4, 05, 05]
+1A42; [73 9D 21, 05, 05]
 
-1A49; [77 9A AC, 05, 05]
+1A43; [73 9D 29, 05, 05]
 
-1A4A; [77 9A B4, 05, 05]
+1A44; [73 9D 31, 05, 05]
 
-1A4B; [77 9A BC, 05, 05]
+1A45; [73 9D 39, 05, 05]
 
-1A4C; [77 9A C4, 05, 05]
+1A46; [73 9D 41, 05, 05]
+1A54; [73 9D 41, 05, 20][73 9E 73, 05, 20][73 9D 41, 05, 20]
 
-1A53; [77 9A CC, 05, 05]
+1A47; [73 9D 49, 05, 05]
 
-1A6B; [77 9A D4, 05, 05]
+1A48; [73 9D 51, 05, 05]
 
-1A55; [77 9A DC, 05, 05]
+1A49; [73 9D 59, 05, 05]
 
-1A56; [77 9A E4, 05, 05]
+1A4A; [73 9D 61, 05, 05]
 
-1A57; [77 9A EC, 05, 05]
+1A4B; [73 9D 69, 05, 05]
 
-1A5C; [77 9A F4, 05, 05]
+1A4C; [73 9D 71, 05, 05]
 
-1A5D; [77 9A FC, 05, 05]
+1A53; [73 9D 79, 05, 05]
 
-1A5E; [77 9B 0A, 05, 05]
+1A6B; [73 9D 81, 05, 05]
 
-1A4D; [77 9B 12, 05, 05]
+1A55; [73 9D 89, 05, 05]
 
-1A4E; [77 9B 1A, 05, 05]
+1A56; [73 9D 91, 05, 05]
 
-1A4F; [77 9B 22, 05, 05]
+1A57; [73 9D 99, 05, 05]
 
-1A50; [77 9B 2A, 05, 05]
+1A5C; [73 9D A1, 05, 05]
 
-1A51; [77 9B 32, 05, 05]
+1A5D; [73 9D A9, 05, 05]
 
-1A52; [77 9B 3A, 05, 05]
+1A5E; [73 9D B1, 05, 05]
 
-1A61; [77 9B 42, 05, 05]
+1A4D; [73 9D B9, 05, 05]
 
-1A6C; [77 9B 4A, 05, 05]
+1A4E; [73 9D C1, 05, 05]
 
-1A62; [77 9B 52, 05, 05]
+1A4F; [73 9D C9, 05, 05]
 
-1A63; [77 9B 5A, 05, 05]
-1A64; [77 9B 5A, 05, 09]
+1A50; [73 9D D1, 05, 05]
 
-1A65; [77 9B 62, 05, 05]
+1A51; [73 9D D9, 05, 05]
 
-1A66; [77 9B 6A, 05, 05]
+1A52; [73 9D E1, 05, 05]
 
-1A67; [77 9B 72, 05, 05]
+1A61; [73 9D E9, 05, 05]
 
-1A68; [77 9B 7A, 05, 05]
+1A6C; [73 9D F1, 05, 05]
 
-1A69; [77 9B 82, 05, 05]
+1A62; [73 9D F9, 05, 05]
 
-1A6A; [77 9B 8A, 05, 05]
+1A63; [73 9E 03, 05, 05]
+1A64; [73 9E 03, 05, 20]
 
-1A6E; [77 9B 92, 05, 05]
+1A65; [73 9E 0B, 05, 05]
 
-1A6F; [77 9B 9A, 05, 05]
+1A66; [73 9E 13, 05, 05]
 
-1A73; [77 9B A2, 05, 05]
+1A67; [73 9E 1B, 05, 05]
 
-1A70; [77 9B AA, 05, 05]
+1A68; [73 9E 23, 05, 05]
 
-1A71; [77 9B B2, 05, 05]
+1A69; [73 9E 2B, 05, 05]
 
-1A72; [77 9B BA, 05, 05]
+1A6A; [73 9E 33, 05, 05]
 
-1A6D; [77 9B C2, 05, 05]
+1A6E; [73 9E 3B, 05, 05]
 
-1A60; [77 9B CA, 05, 05]
+1A6F; [73 9E 43, 05, 05]
 
-AA00; [77 9B D2, 05, 05]
+1A73; [73 9E 4B, 05, 05]
 
-AA01; [77 9B DA, 05, 05]
+1A70; [73 9E 53, 05, 05]
 
-AA02; [77 9B E2, 05, 05]
+1A71; [73 9E 5B, 05, 05]
 
-AA03; [77 9B EA, 05, 05]
+1A72; [73 9E 63, 05, 05]
 
-AA04; [77 9B F2, 05, 05]
+1A6D; [73 9E 6B, 05, 05]
 
-AA05; [77 9B FA, 05, 05]
+1A60; [73 9E 73, 05, 05]
 
-AA06; [77 9C 08, 05, 05]
+FDD1 AA00;     [73 9E 9C, 05, 05]      # Cham first primary
 
-AA07; [77 9C 10, 05, 05]
+AA00; [73 9E C5, 05, 05]
 
-AA08; [77 9C 18, 05, 05]
+AA01; [73 9E CD, 05, 05]
 
-AA09; [77 9C 20, 05, 05]
+AA02; [73 9E D5, 05, 05]
 
-AA0A; [77 9C 28, 05, 05]
+AA03; [73 9E DD, 05, 05]
 
-AA0B; [77 9C 30, 05, 05]
+AA04; [73 9E E5, 05, 05]
 
-AA0C; [77 9C 38, 05, 05]
+AA05; [73 9E ED, 05, 05]
 
-AA0D; [77 9C 40, 05, 05]
+AA06; [73 9E F5, 05, 05]
 
-AA0E; [77 9C 48, 05, 05]
+AA07; [73 9E FD, 05, 05]
 
-AA0F; [77 9C 50, 05, 05]
+AA08; [73 9F 07, 05, 05]
 
-AA10; [77 9C 58, 05, 05]
+AA09; [73 9F 0F, 05, 05]
 
-AA11; [77 9C 60, 05, 05]
+AA0A; [73 9F 17, 05, 05]
 
-AA12; [77 9C 68, 05, 05]
+AA0B; [73 9F 1F, 05, 05]
 
-AA13; [77 9C 70, 05, 05]
+AA0C; [73 9F 27, 05, 05]
 
-AA14; [77 9C 78, 05, 05]
+AA0D; [73 9F 2F, 05, 05]
 
-AA15; [77 9C 80, 05, 05]
+AA0E; [73 9F 37, 05, 05]
 
-AA16; [77 9C 88, 05, 05]
+AA0F; [73 9F 3F, 05, 05]
 
-AA17; [77 9C 90, 05, 05]
+AA10; [73 9F 47, 05, 05]
 
-AA18; [77 9C 98, 05, 05]
+AA11; [73 9F 4F, 05, 05]
 
-AA19; [77 9C A0, 05, 05]
+AA12; [73 9F 57, 05, 05]
 
-AA1A; [77 9C A8, 05, 05]
+AA13; [73 9F 5F, 05, 05]
 
-AA1B; [77 9C B0, 05, 05]
+AA14; [73 9F 67, 05, 05]
 
-AA1C; [77 9C B8, 05, 05]
+AA15; [73 9F 6F, 05, 05]
 
-AA1D; [77 9C C0, 05, 05]
+AA16; [73 9F 77, 05, 05]
 
-AA1E; [77 9C C8, 05, 05]
+AA17; [73 9F 7F, 05, 05]
 
-AA1F; [77 9C D0, 05, 05]
+AA18; [73 9F 87, 05, 05]
 
-AA20; [77 9C D8, 05, 05]
+AA19; [73 9F 8F, 05, 05]
 
-AA21; [77 9C E0, 05, 05]
+AA1A; [73 9F 97, 05, 05]
 
-AA22; [77 9C E8, 05, 05]
+AA1B; [73 9F 9F, 05, 05]
 
-AA23; [77 9C F0, 05, 05]
+AA1C; [73 9F A7, 05, 05]
 
-AA24; [77 9C F8, 05, 05]
+AA1D; [73 9F AF, 05, 05]
 
-AA25; [77 9D 06, 05, 05]
+AA1E; [73 9F B7, 05, 05]
 
-AA26; [77 9D 0E, 05, 05]
+AA1F; [73 9F BF, 05, 05]
 
-AA27; [77 9D 16, 05, 05]
+AA20; [73 9F C7, 05, 05]
 
-AA28; [77 9D 1E, 05, 05]
+AA21; [73 9F CF, 05, 05]
 
-AA33; [77 9D 26, 05, 05]
+AA22; [73 9F D7, 05, 05]
 
-AA34; [77 9D 2E, 05, 05]
+AA23; [73 9F DF, 05, 05]
 
-AA35; [77 9D 36, 05, 05]
+AA24; [73 9F E7, 05, 05]
 
-AA36; [77 9D 3E, 05, 05]
+AA25; [73 9F EF, 05, 05]
 
-AA29; [77 9D 46, 05, 05]
+AA26; [73 9F F7, 05, 05]
 
-AA2A; [77 9D 4E, 05, 05]
+AA27; [73 9F FF, 05, 05]
 
-AA2B; [77 9D 56, 05, 05]
+AA28; [73 A0 09, 05, 05]
 
-AA2C; [77 9D 5E, 05, 05]
+AA33; [73 A0 11, 05, 05]
 
-AA2D; [77 9D 66, 05, 05]
+AA34; [73 A0 19, 05, 05]
 
-AA2E; [77 9D 6E, 05, 05]
+AA35; [73 A0 21, 05, 05]
 
-AA2F; [77 9D 76, 05, 05]
+AA36; [73 A0 29, 05, 05]
 
-AA30; [77 9D 7E, 05, 05]
+AA29; [73 A0 31, 05, 05]
 
-AA31; [77 9D 86, 05, 05]
+AA2A; [73 A0 39, 05, 05]
 
-AA32; [77 9D 8E, 05, 05]
+AA2B; [73 A0 41, 05, 05]
 
-AA40; [77 9D 96, 05, 05]
+AA2C; [73 A0 49, 05, 05]
 
-AA41; [77 9D 9E, 05, 05]
+AA2D; [73 A0 51, 05, 05]
 
-AA42; [77 9D A6, 05, 05]
+AA2E; [73 A0 59, 05, 05]
 
-AA43; [77 9D AE, 05, 05]
+AA2F; [73 A0 61, 05, 05]
 
-AA44; [77 9D B6, 05, 05]
+AA30; [73 A0 69, 05, 05]
 
-AA45; [77 9D BE, 05, 05]
+AA31; [73 A0 71, 05, 05]
 
-AA46; [77 9D C6, 05, 05]
+AA32; [73 A0 79, 05, 05]
 
-AA47; [77 9D CE, 05, 05]
+AA40; [73 A0 81, 05, 05]
 
-AA48; [77 9D D6, 05, 05]
+AA41; [73 A0 89, 05, 05]
 
-AA49; [77 9D DE, 05, 05]
+AA42; [73 A0 91, 05, 05]
 
-AA4A; [77 9D E6, 05, 05]
+AA43; [73 A0 99, 05, 05]
 
-AA4B; [77 9D EE, 05, 05]
+AA44; [73 A0 A1, 05, 05]
 
-AA4C; [77 9D F6, 05, 05]
+AA45; [73 A0 A9, 05, 05]
 
-AA4D; [77 9E 04, 05, 05]
+AA46; [73 A0 B1, 05, 05]
 
-1B05; [77 9E 0C, 05, 05]
+AA47; [73 A0 B9, 05, 05]
 
-1B05 1B35; [77 9E 14, 05, 05]
-1B06; [77 9E 14, 05, 05]
+AA48; [73 A0 C1, 05, 05]
 
-1B07; [77 9E 1C, 05, 05]
+AA49; [73 A0 C9, 05, 05]
 
-1B07 1B35; [77 9E 24, 05, 05]
-1B08; [77 9E 24, 05, 05]
+AA4A; [73 A0 D1, 05, 05]
 
-1B09; [77 9E 2C, 05, 05]
+AA4B; [73 A0 D9, 05, 05]
 
-1B09 1B35; [77 9E 34, 05, 05]
-1B0A; [77 9E 34, 05, 05]
+AA4C; [73 A0 E1, 05, 05]
 
-1B0B; [77 9E 3C, 05, 05]
+AA4D; [73 A0 E9, 05, 05]
 
-1B0B 1B35; [77 9E 44, 05, 05]
-1B0C; [77 9E 44, 05, 05]
+FDD1 1B05;     [73 A1 14, 05, 05]      # Balinese first primary
 
-1B0D; [77 9E 4C, 05, 05]
+1B05; [73 A1 3D, 05, 05]
 
-1B0D 1B35; [77 9E 54, 05, 05]
-1B0E; [77 9E 54, 05, 05]
+1B05 1B35; [73 A1 45, 05, 05]
+1B06; [73 A1 45, 05, 05]
 
-1B0F; [77 9E 5C, 05, 05]
+1B07; [73 A1 4D, 05, 05]
 
-1B10; [77 9E 64, 05, 05]
+1B07 1B35; [73 A1 55, 05, 05]
+1B08; [73 A1 55, 05, 05]
 
-1B11; [77 9E 6C, 05, 05]
+1B09; [73 A1 5D, 05, 05]
 
-1B11 1B35; [77 9E 74, 05, 05]
-1B12; [77 9E 74, 05, 05]
+1B09 1B35; [73 A1 65, 05, 05]
+1B0A; [73 A1 65, 05, 05]
 
-1B13; [77 9E 7C, 05, 05]
+1B0B; [73 A1 6D, 05, 05]
 
-1B45; [77 9E 84, 05, 05]
+1B0B 1B35; [73 A1 75, 05, 05]
+1B0C; [73 A1 75, 05, 05]
 
-1B46; [77 9E 8C, 05, 05]
+1B0D; [73 A1 7D, 05, 05]
 
-1B14; [77 9E 94, 05, 05]
+1B0D 1B35; [73 A1 85, 05, 05]
+1B0E; [73 A1 85, 05, 05]
 
-1B15; [77 9E 9C, 05, 05]
+1B0F; [73 A1 8D, 05, 05]
 
-1B16; [77 9E A4, 05, 05]
+1B10; [73 A1 95, 05, 05]
 
-1B17; [77 9E AC, 05, 05]
+1B11; [73 A1 9D, 05, 05]
 
-1B18; [77 9E B4, 05, 05]
+1B11 1B35; [73 A1 A5, 05, 05]
+1B12; [73 A1 A5, 05, 05]
 
-1B19; [77 9E BC, 05, 05]
+1B13; [73 A1 AD, 05, 05]
 
-1B1A; [77 9E C4, 05, 05]
+1B45; [73 A1 B5, 05, 05]
 
-1B1B; [77 9E CC, 05, 05]
+1B46; [73 A1 BD, 05, 05]
 
-1B1C; [77 9E D4, 05, 05]
+1B14; [73 A1 C5, 05, 05]
 
-1B1D; [77 9E DC, 05, 05]
+1B15; [73 A1 CD, 05, 05]
 
-1B1E; [77 9E E4, 05, 05]
+1B16; [73 A1 D5, 05, 05]
 
-1B1F; [77 9E EC, 05, 05]
+1B17; [73 A1 DD, 05, 05]
 
-1B20; [77 9E F4, 05, 05]
+1B18; [73 A1 E5, 05, 05]
 
-1B21; [77 9E FC, 05, 05]
+1B19; [73 A1 ED, 05, 05]
 
-1B22; [77 9F 0A, 05, 05]
+1B1A; [73 A1 F5, 05, 05]
 
-1B47; [77 9F 12, 05, 05]
+1B1B; [73 A1 FD, 05, 05]
 
-1B23; [77 9F 1A, 05, 05]
+1B1C; [73 A2 07, 05, 05]
 
-1B24; [77 9F 22, 05, 05]
+1B1D; [73 A2 0F, 05, 05]
 
-1B25; [77 9F 2A, 05, 05]
+1B1E; [73 A2 17, 05, 05]
 
-1B26; [77 9F 32, 05, 05]
+1B1F; [73 A2 1F, 05, 05]
 
-1B27; [77 9F 3A, 05, 05]
+1B20; [73 A2 27, 05, 05]
 
-1B48; [77 9F 42, 05, 05]
+1B21; [73 A2 2F, 05, 05]
 
-1B28; [77 9F 4A, 05, 05]
+1B22; [73 A2 37, 05, 05]
 
-1B29; [77 9F 52, 05, 05]
+1B47; [73 A2 3F, 05, 05]
 
-1B2A; [77 9F 5A, 05, 05]
+1B23; [73 A2 47, 05, 05]
 
-1B2B; [77 9F 62, 05, 05]
+1B24; [73 A2 4F, 05, 05]
 
-1B2C; [77 9F 6A, 05, 05]
+1B25; [73 A2 57, 05, 05]
 
-1B2D; [77 9F 72, 05, 05]
+1B26; [73 A2 5F, 05, 05]
 
-1B2E; [77 9F 7A, 05, 05]
+1B27; [73 A2 67, 05, 05]
 
-1B2F; [77 9F 82, 05, 05]
+1B48; [73 A2 6F, 05, 05]
 
-1B49; [77 9F 8A, 05, 05]
+1B28; [73 A2 77, 05, 05]
 
-1B30; [77 9F 92, 05, 05]
+1B29; [73 A2 7F, 05, 05]
 
-1B31; [77 9F 9A, 05, 05]
+1B2A; [73 A2 87, 05, 05]
 
-1B32; [77 9F A2, 05, 05]
+1B2B; [73 A2 8F, 05, 05]
 
-1B4A; [77 9F AA, 05, 05]
+1B2C; [73 A2 97, 05, 05]
 
-1B4B; [77 9F B2, 05, 05]
+1B2D; [73 A2 9F, 05, 05]
 
-1B33; [77 9F BA, 05, 05]
+1B2E; [73 A2 A7, 05, 05]
 
-1B35; [77 9F C2, 05, 05]
+1B2F; [73 A2 AF, 05, 05]
 
-1B36; [77 9F CA, 05, 05]
+1B49; [73 A2 B7, 05, 05]
 
-1B37; [77 9F D2, 05, 05]
+1B30; [73 A2 BF, 05, 05]
 
-1B38; [77 9F DA, 05, 05]
+1B31; [73 A2 C7, 05, 05]
 
-1B39; [77 9F E2, 05, 05]
+1B32; [73 A2 CF, 05, 05]
 
-1B3A; [77 9F EA, 05, 05]
+1B4A; [73 A2 D7, 05, 05]
 
-1B3A 1B35; [77 9F F2, 05, 05]
-1B3B; [77 9F F2, 05, 05]
+1B4B; [73 A2 DF, 05, 05]
 
-1B3C; [77 9F FA, 05, 05]
+1B33; [73 A2 E7, 05, 05]
 
-1B3C 1B35; [77 A0 08, 05, 05]
-1B3D; [77 A0 08, 05, 05]
+1B35; [73 A2 EF, 05, 05]
 
-1B3E; [77 A0 10, 05, 05]
+1B36; [73 A2 F7, 05, 05]
 
-1B3F; [77 A0 18, 05, 05]
+1B37; [73 A2 FF, 05, 05]
 
-1B3E 1B35; [77 A0 20, 05, 05]
-1B40; [77 A0 20, 05, 05]
+1B38; [73 A3 09, 05, 05]
 
-1B3F 1B35; [77 A0 28, 05, 05]
-1B41; [77 A0 28, 05, 05]
+1B39; [73 A3 11, 05, 05]
 
-1B42; [77 A0 30, 05, 05]
+1B3A; [73 A3 19, 05, 05]
 
-1B42 1B35; [77 A0 38, 05, 05]
-1B43; [77 A0 38, 05, 05]
+1B3A 1B35; [73 A3 21, 05, 05]
+1B3B; [73 A3 21, 05, 05]
 
-1B44; [77 A0 40, 05, 05]
+1B3C; [73 A3 29, 05, 05]
 
-A984; [77 A0 48, 05, 05]
+1B3C 1B35; [73 A3 31, 05, 05]
+1B3D; [73 A3 31, 05, 05]
 
-A985; [77 A0 50, 05, 05]
+1B3E; [73 A3 39, 05, 05]
 
-A986; [77 A0 58, 05, 05]
+1B3F; [73 A3 41, 05, 05]
 
-A987; [77 A0 60, 05, 05]
+1B3E 1B35; [73 A3 49, 05, 05]
+1B40; [73 A3 49, 05, 05]
 
-A988; [77 A0 68, 05, 05]
+1B3F 1B35; [73 A3 51, 05, 05]
+1B41; [73 A3 51, 05, 05]
 
-A989; [77 A0 70, 05, 05]
+1B42; [73 A3 59, 05, 05]
 
-A98A; [77 A0 78, 05, 05]
+1B42 1B35; [73 A3 61, 05, 05]
+1B43; [73 A3 61, 05, 05]
 
-A98B; [77 A0 80, 05, 05]
+1B44; [73 A3 69, 05, 05]
 
-A98C; [77 A0 88, 05, 05]
+FDD1 A984;     [73 A3 92, 05, 05]      # Javanese first primary
 
-A98D; [77 A0 90, 05, 05]
+A984; [73 A3 BB, 05, 05]
 
-A98E; [77 A0 98, 05, 05]
+A985; [73 A3 C3, 05, 05]
 
-A98F; [77 A0 A0, 05, 05]
+A986; [73 A3 CB, 05, 05]
 
-A990; [77 A0 A8, 05, 05]
+A987; [73 A3 D3, 05, 05]
 
-A991; [77 A0 B0, 05, 05]
+A988; [73 A3 DB, 05, 05]
 
-A992; [77 A0 B8, 05, 05]
+A989; [73 A3 E3, 05, 05]
 
-A993; [77 A0 C0, 05, 05]
+A98A; [73 A3 EB, 05, 05]
 
-A994; [77 A0 C8, 05, 05]
+A98B; [73 A3 F3, 05, 05]
 
-A995; [77 A0 D0, 05, 05]
+A98C; [73 A3 FB, 05, 05]
 
-A996; [77 A0 D8, 05, 05]
+A98D; [73 A4 05, 05, 05]
 
-A997; [77 A0 E0, 05, 05]
+A98E; [73 A4 0D, 05, 05]
 
-A998; [77 A0 E8, 05, 05]
+A98F; [73 A4 15, 05, 05]
 
-A999; [77 A0 F0, 05, 05]
+A990; [73 A4 1D, 05, 05]
 
-A99A; [77 A0 F8, 05, 05]
+A991; [73 A4 25, 05, 05]
 
-A99B; [77 A1 06, 05, 05]
+A992; [73 A4 2D, 05, 05]
 
-A99C; [77 A1 0E, 05, 05]
+A993; [73 A4 35, 05, 05]
 
-A99D; [77 A1 16, 05, 05]
+A994; [73 A4 3D, 05, 05]
 
-A99E; [77 A1 1E, 05, 05]
+A995; [73 A4 45, 05, 05]
 
-A99F; [77 A1 26, 05, 05]
+A996; [73 A4 4D, 05, 05]
 
-A9A0; [77 A1 2E, 05, 05]
+A997; [73 A4 55, 05, 05]
 
-A9A1; [77 A1 36, 05, 05]
+A998; [73 A4 5D, 05, 05]
 
-A9A2; [77 A1 3E, 05, 05]
+A999; [73 A4 65, 05, 05]
 
-A9A3; [77 A1 46, 05, 05]
+A99A; [73 A4 6D, 05, 05]
 
-A9A4; [77 A1 4E, 05, 05]
+A99B; [73 A4 75, 05, 05]
 
-A9A5; [77 A1 56, 05, 05]
+A99C; [73 A4 7D, 05, 05]
 
-A9A6; [77 A1 5E, 05, 05]
+A99D; [73 A4 85, 05, 05]
 
-A9A7; [77 A1 66, 05, 05]
+A99E; [73 A4 8D, 05, 05]
 
-A9A8; [77 A1 6E, 05, 05]
+A99F; [73 A4 95, 05, 05]
 
-A9A9; [77 A1 76, 05, 05]
+A9A0; [73 A4 9D, 05, 05]
 
-A9AA; [77 A1 7E, 05, 05]
+A9A1; [73 A4 A5, 05, 05]
 
-A9BE; [77 A1 86, 05, 05]
+A9A2; [73 A4 AD, 05, 05]
 
-A9AB; [77 A1 8E, 05, 05]
-A9AC; [77 A1 8E, 05, 09]
+A9A3; [73 A4 B5, 05, 05]
 
-A9BF; [77 A1 96, 05, 05]
+A9A4; [73 A4 BD, 05, 05]
 
-A9AD; [77 A1 9E, 05, 05]
+A9A5; [73 A4 C5, 05, 05]
 
-A9AE; [77 A1 A6, 05, 05]
+A9A6; [73 A4 CD, 05, 05]
 
-A9AF; [77 A1 AE, 05, 05]
+A9A7; [73 A4 D5, 05, 05]
 
-A9B0; [77 A1 B6, 05, 05]
+A9A8; [73 A4 DD, 05, 05]
 
-A9B1; [77 A1 BE, 05, 05]
+A9A9; [73 A4 E5, 05, 05]
 
-A9B2; [77 A1 C6, 05, 05]
+A9AA; [73 A4 ED, 05, 05]
 
-A9B4; [77 A1 CE, 05, 05]
+A9BE; [73 A4 F5, 05, 05]
 
-A9BC; [77 A1 D6, 05, 05]
+A9AB; [73 A4 FD, 05, 05]
+A9AC; [73 A4 FD, 05, 20]
 
-A9B6; [77 A1 DE, 05, 05]
+A9BF; [73 A5 07, 05, 05]
 
-A9B7; [77 A1 E6, 05, 05]
+A9AD; [73 A5 0F, 05, 05]
 
-A9B8; [77 A1 EE, 05, 05]
+A9AE; [73 A5 17, 05, 05]
 
-A9B9; [77 A1 F6, 05, 05]
+A9AF; [73 A5 1F, 05, 05]
 
-A9BD; [77 A2 04, 05, 05]
+A9B0; [73 A5 27, 05, 05]
 
-A9BA; [77 A2 0C, 05, 05]
+A9B1; [73 A5 2F, 05, 05]
 
-A9BB; [77 A2 14, 05, 05]
+A9B2; [73 A5 37, 05, 05]
 
-A9B5; [77 A2 1C, 05, 05]
+A9B4; [73 A5 3F, 05, 05]
 
-A9C0; [77 A2 24, 05, 05]
+A9BC; [73 A5 47, 05, 05]
 
-1880; [77 A2 2C, 05, 05]
+A9B6; [73 A5 4F, 05, 05]
 
-1881; [77 A2 34, 05, 05]
+A9B7; [73 A5 57, 05, 05]
 
-1882; [77 A2 3C, 05, 05]
+A9B8; [73 A5 5F, 05, 05]
 
-1883; [77 A2 44, 05, 05]
+A9B9; [73 A5 67, 05, 05]
 
-1884; [77 A2 4C, 05, 05]
+A9BD; [73 A5 6F, 05, 05]
 
-1885; [77 A2 54, 05, 05]
+A9BA; [73 A5 77, 05, 05]
 
-1886; [77 A2 5C, 05, 05]
+A9BB; [73 A5 7F, 05, 05]
 
-1843; [77 A2 64, 05, 05]
+A9B5; [73 A5 87, 05, 05]
 
-1820; [77 A2 6C, 05, 05]
+A9C0; [73 A5 8F, 05, 05]
 
-1887; [77 A2 74, 05, 05]
+FDD1 1826;     [73 A5 B8, 05, 05]      # MONGOLIAN first primary
 
-1821; [77 A2 7C, 05, 05]
+1880; [73 A5 E1, 05, 05]
 
-1844; [77 A2 84, 05, 05]
+1881; [73 A5 E9, 05, 05]
 
-185D; [77 A2 8C, 05, 05]
+1882; [73 A5 F1, 05, 05]
 
-1822; [77 A2 94, 05, 05]
+1883; [73 A5 F9, 05, 05]
 
-1845; [77 A2 9C, 05, 05]
+1884; [73 A6 03, 05, 05]
 
-185E; [77 A2 A4, 05, 05]
+1885; [73 A6 0B, 05, 05]
 
-1873; [77 A2 AC, 05, 05]
+1886; [73 A6 13, 05, 05]
 
-1888; [77 A2 B4, 05, 05]
+1843; [73 A6 1B, 05, 05]
 
-185F; [77 A2 BC, 05, 05]
+1820; [73 A6 23, 05, 05]
 
-1823; [77 A2 C4, 05, 05]
+1887; [73 A6 2B, 05, 05]
 
-1846; [77 A2 CC, 05, 05]
+1821; [73 A6 33, 05, 05]
 
-1824; [77 A2 D4, 05, 05]
+1844; [73 A6 3B, 05, 05]
 
-1847; [77 A2 DC, 05, 05]
+185D; [73 A6 43, 05, 05]
 
-1861; [77 A2 E4, 05, 05]
+1822; [73 A6 4B, 05, 05]
 
-1825; [77 A2 EC, 05, 05]
+1845; [73 A6 53, 05, 05]
 
-1848; [77 A2 F4, 05, 05]
+185E; [73 A6 5B, 05, 05]
 
-1826; [77 A2 FC, 05, 05]
+1873; [73 A6 63, 05, 05]
 
-1849; [77 A3 0A, 05, 05]
+1888; [73 A6 6B, 05, 05]
 
-1860; [77 A3 12, 05, 05]
+185F; [73 A6 73, 05, 05]
 
-1827; [77 A3 1A, 05, 05]
+1823; [73 A6 7B, 05, 05]
 
-1828; [77 A3 22, 05, 05]
+1846; [73 A6 83, 05, 05]
 
-1829; [77 A3 2A, 05, 05]
+1824; [73 A6 8B, 05, 05]
 
-184A; [77 A3 32, 05, 05]
+1847; [73 A6 93, 05, 05]
 
-1862; [77 A3 3A, 05, 05]
+1861; [73 A6 9B, 05, 05]
 
-188A; [77 A3 42, 05, 05]
+1825; [73 A6 A3, 05, 05]
 
-189B; [77 A3 4A, 05, 05]
+1848; [73 A6 AB, 05, 05]
 
-182A; [77 A3 52, 05, 05]
+1826; [73 A6 B3, 05, 05]
 
-184B; [77 A3 5A, 05, 05]
+1849; [73 A6 BB, 05, 05]
 
-182B; [77 A3 62, 05, 05]
+1860; [73 A6 C3, 05, 05]
 
-184C; [77 A3 6A, 05, 05]
+1827; [73 A6 CB, 05, 05]
 
-1866; [77 A3 72, 05, 05]
+1828; [73 A6 D3, 05, 05]
 
-182C; [77 A3 7A, 05, 05]
+1829; [73 A6 DB, 05, 05]
 
-184D; [77 A3 82, 05, 05]
+184A; [73 A6 E3, 05, 05]
 
-182D; [77 A3 8A, 05, 05]
+1862; [73 A6 EB, 05, 05]
 
-184E; [77 A3 92, 05, 05]
+188A; [73 A6 F3, 05, 05]
 
-1864; [77 A3 9A, 05, 05]
+189B; [73 A6 FB, 05, 05]
 
-189A; [77 A3 A2, 05, 05]
+182A; [73 A7 05, 05, 05]
 
-1865; [77 A3 AA, 05, 05]
+184B; [73 A7 0D, 05, 05]
 
-182E; [77 A3 B2, 05, 05]
+182B; [73 A7 15, 05, 05]
 
-184F; [77 A3 BA, 05, 05]
+184C; [73 A7 1D, 05, 05]
 
-182F; [77 A3 C2, 05, 05]
+1866; [73 A7 25, 05, 05]
 
-1830; [77 A3 CA, 05, 05]
+182C; [73 A7 2D, 05, 05]
 
-1831; [77 A3 D2, 05, 05]
+184D; [73 A7 35, 05, 05]
 
-1867; [77 A3 DA, 05, 05]
+182D; [73 A7 3D, 05, 05]
 
-189C; [77 A3 E2, 05, 05]
+184E; [73 A7 45, 05, 05]
 
-189D; [77 A3 EA, 05, 05]
+1864; [73 A7 4D, 05, 05]
 
-18A2; [77 A3 F2, 05, 05]
+189A; [73 A7 55, 05, 05]
 
-18A4; [77 A3 FA, 05, 05]
+1865; [73 A7 5D, 05, 05]
 
-18A5; [77 A4 08, 05, 05]
+182E; [73 A7 65, 05, 05]
 
-1832; [77 A4 10, 05, 05]
+184F; [73 A7 6D, 05, 05]
 
-1850; [77 A4 18, 05, 05]
+182F; [73 A7 75, 05, 05]
 
-1868; [77 A4 20, 05, 05]
+1830; [73 A7 7D, 05, 05]
 
-1833; [77 A4 28, 05, 05]
+1831; [73 A7 85, 05, 05]
 
-1851; [77 A4 30, 05, 05]
+1867; [73 A7 8D, 05, 05]
 
-1869; [77 A4 38, 05, 05]
+189C; [73 A7 95, 05, 05]
 
-1834; [77 A4 40, 05, 05]
+189D; [73 A7 9D, 05, 05]
 
-1852; [77 A4 48, 05, 05]
+18A2; [73 A7 A5, 05, 05]
 
-1871; [77 A4 50, 05, 05]
+18A4; [73 A7 AD, 05, 05]
 
-185C; [77 A4 58, 05, 05]
+18A5; [73 A7 B5, 05, 05]
 
-188B; [77 A4 60, 05, 05]
+1832; [73 A7 BD, 05, 05]
 
-1835; [77 A4 68, 05, 05]
+1850; [73 A7 C5, 05, 05]
 
-1853; [77 A4 70, 05, 05]
+1868; [73 A7 CD, 05, 05]
 
-186A; [77 A4 78, 05, 05]
+1833; [73 A7 D5, 05, 05]
 
-1877; [77 A4 80, 05, 05]
+1851; [73 A7 DD, 05, 05]
 
-1836; [77 A4 88, 05, 05]
+1869; [73 A7 E5, 05, 05]
 
-1855; [77 A4 90, 05, 05]
+1834; [73 A7 ED, 05, 05]
 
-1872; [77 A4 98, 05, 05]
+1852; [73 A7 F5, 05, 05]
 
-1837; [77 A4 A0, 05, 05]
+1871; [73 A7 FD, 05, 05]
 
-1875; [77 A4 A8, 05, 05]
+185C; [73 A8 07, 05, 05]
 
-1838; [77 A4 B0, 05, 05]
+188B; [73 A8 0F, 05, 05]
 
-1856; [77 A4 B8, 05, 05]
+1835; [73 A8 17, 05, 05]
 
-1839; [77 A4 C0, 05, 05]
+1853; [73 A8 1F, 05, 05]
 
-186B; [77 A4 C8, 05, 05]
+186A; [73 A8 27, 05, 05]
 
-1876; [77 A4 D0, 05, 05]
+1877; [73 A8 2F, 05, 05]
 
-183A; [77 A4 D8, 05, 05]
+1836; [73 A8 37, 05, 05]
 
-1857; [77 A4 E0, 05, 05]
+1855; [73 A8 3F, 05, 05]
 
-1863; [77 A4 E8, 05, 05]
+1872; [73 A8 47, 05, 05]
 
-1874; [77 A4 F0, 05, 05]
+1837; [73 A8 4F, 05, 05]
 
-1889; [77 A4 F8, 05, 05]
+1875; [73 A8 57, 05, 05]
 
-183B; [77 A5 06, 05, 05]
+1838; [73 A8 5F, 05, 05]
 
-183C; [77 A5 0E, 05, 05]
+1856; [73 A8 67, 05, 05]
 
-1854; [77 A5 16, 05, 05]
+1839; [73 A8 6F, 05, 05]
 
-186E; [77 A5 1E, 05, 05]
+186B; [73 A8 77, 05, 05]
 
-183D; [77 A5 26, 05, 05]
+1876; [73 A8 7F, 05, 05]
 
-186F; [77 A5 2E, 05, 05]
+183A; [73 A8 87, 05, 05]
 
-1858; [77 A5 36, 05, 05]
+1857; [73 A8 8F, 05, 05]
 
-186C; [77 A5 3E, 05, 05]
+1863; [73 A8 97, 05, 05]
 
-183E; [77 A5 46, 05, 05]
+1874; [73 A8 9F, 05, 05]
 
-1859; [77 A5 4E, 05, 05]
+1889; [73 A8 A7, 05, 05]
 
-186D; [77 A5 56, 05, 05]
+183B; [73 A8 AF, 05, 05]
 
-183F; [77 A5 5E, 05, 05]
+183C; [73 A8 B7, 05, 05]
 
-1840; [77 A5 66, 05, 05]
+1854; [73 A8 BF, 05, 05]
 
-1841; [77 A5 6E, 05, 05]
+186E; [73 A8 C7, 05, 05]
 
-1842; [77 A5 76, 05, 05]
+183D; [73 A8 CF, 05, 05]
 
-185A; [77 A5 7E, 05, 05]
+186F; [73 A8 D7, 05, 05]
 
-185B; [77 A5 86, 05, 05]
+1858; [73 A8 DF, 05, 05]
 
-1870; [77 A5 8E, 05, 05]
+186C; [73 A8 E7, 05, 05]
 
-188C; [77 A5 96, 05, 05]
+183E; [73 A8 EF, 05, 05]
 
-189E; [77 A5 9E, 05, 05]
+1859; [73 A8 F7, 05, 05]
 
-188D; [77 A5 A6, 05, 05]
+186D; [73 A8 FF, 05, 05]
 
-188E; [77 A5 AE, 05, 05]
+183F; [73 A9 09, 05, 05]
 
-189F; [77 A5 B6, 05, 05]
+1840; [73 A9 11, 05, 05]
 
-188F; [77 A5 BE, 05, 05]
+1841; [73 A9 19, 05, 05]
 
-1890; [77 A5 C6, 05, 05]
+1842; [73 A9 21, 05, 05]
 
-1898; [77 A5 CE, 05, 05]
+185A; [73 A9 29, 05, 05]
 
-18A0; [77 A5 D6, 05, 05]
+185B; [73 A9 31, 05, 05]
 
-1891; [77 A5 DE, 05, 05]
+1870; [73 A9 39, 05, 05]
 
-18A1; [77 A5 E6, 05, 05]
+188C; [73 A9 41, 05, 05]
 
-1892; [77 A5 EE, 05, 05]
+189E; [73 A9 49, 05, 05]
 
-1893; [77 A5 F6, 05, 05]
+188D; [73 A9 51, 05, 05]
 
-18A8; [77 A6 04, 05, 05]
+188E; [73 A9 59, 05, 05]
 
-1894; [77 A6 0C, 05, 05]
+189F; [73 A9 61, 05, 05]
 
-18A3; [77 A6 14, 05, 05]
+188F; [73 A9 69, 05, 05]
 
-1895; [77 A6 1C, 05, 05]
+1890; [73 A9 71, 05, 05]
 
-1899; [77 A6 24, 05, 05]
+1898; [73 A9 79, 05, 05]
 
-1896; [77 A6 2C, 05, 05]
+18A0; [73 A9 81, 05, 05]
 
-1897; [77 A6 34, 05, 05]
+1891; [73 A9 89, 05, 05]
 
-18A6; [77 A6 3C, 05, 05]
+18A1; [73 A9 91, 05, 05]
 
-18A7; [77 A6 44, 05, 05]
+1892; [73 A9 99, 05, 05]
 
-18AA; [77 A6 4C, 05, 05]
+1893; [73 A9 A1, 05, 05]
 
-18A9; [77 A6 54, 05, 05]
+18A8; [73 A9 A9, 05, 05]
 
-1C5A; [77 A6 5C, 05, 05]
+1894; [73 A9 B1, 05, 05]
 
-1C5B; [77 A6 64, 05, 05]
+18A3; [73 A9 B9, 05, 05]
 
-1C5C; [77 A6 6C, 05, 05]
+1895; [73 A9 C1, 05, 05]
 
-1C5D; [77 A6 74, 05, 05]
+1899; [73 A9 C9, 05, 05]
 
-1C5E; [77 A6 7C, 05, 05]
+1896; [73 A9 D1, 05, 05]
 
-1C5F; [77 A6 84, 05, 05]
+1897; [73 A9 D9, 05, 05]
 
-1C60; [77 A6 8C, 05, 05]
+18A6; [73 A9 E1, 05, 05]
 
-1C61; [77 A6 94, 05, 05]
+18A7; [73 A9 E9, 05, 05]
 
-1C62; [77 A6 9C, 05, 05]
+18AA; [73 A9 F1, 05, 05]
 
-1C63; [77 A6 A4, 05, 05]
+18A9; [73 A9 F9, 05, 05]
 
-1C64; [77 A6 AC, 05, 05]
+FDD1 1C5A;     [73 AA 24, 05, 05]      # Ol Chiki first primary
 
-1C65; [77 A6 B4, 05, 05]
+1C5A; [73 AA 4D, 05, 05]
 
-1C66; [77 A6 BC, 05, 05]
+1C5B; [73 AA 55, 05, 05]
 
-1C67; [77 A6 C4, 05, 05]
+1C5C; [73 AA 5D, 05, 05]
 
-1C68; [77 A6 CC, 05, 05]
+1C5D; [73 AA 65, 05, 05]
 
-1C69; [77 A6 D4, 05, 05]
+1C5E; [73 AA 6D, 05, 05]
 
-1C6A; [77 A6 DC, 05, 05]
+1C5F; [73 AA 75, 05, 05]
 
-1C6B; [77 A6 E4, 05, 05]
+1C60; [73 AA 7D, 05, 05]
 
-1C6C; [77 A6 EC, 05, 05]
+1C61; [73 AA 85, 05, 05]
 
-1C6D; [77 A6 F4, 05, 05]
+1C62; [73 AA 8D, 05, 05]
 
-1C6E; [77 A6 FC, 05, 05]
+1C63; [73 AA 95, 05, 05]
 
-1C6F; [77 A7 0A, 05, 05]
+1C64; [73 AA 9D, 05, 05]
 
-1C70; [77 A7 12, 05, 05]
+1C65; [73 AA A5, 05, 05]
 
-1C71; [77 A7 1A, 05, 05]
+1C66; [73 AA AD, 05, 05]
 
-1C72; [77 A7 22, 05, 05]
+1C67; [73 AA B5, 05, 05]
 
-1C73; [77 A7 2A, 05, 05]
+1C68; [73 AA BD, 05, 05]
 
-1C74; [77 A7 32, 05, 05]
+1C69; [73 AA C5, 05, 05]
 
-1C75; [77 A7 3A, 05, 05]
+1C6A; [73 AA CD, 05, 05]
 
-1C76; [77 A7 42, 05, 05]
+1C6B; [73 AA D5, 05, 05]
 
-1C77; [77 A7 4A, 05, 05]
+1C6C; [73 AA DD, 05, 05]
 
-1C78; [77 A7 52, 05, 05]
+1C6D; [73 AA E5, 05, 05]
 
-1C79; [77 A7 5A, 05, 05]
+1C6E; [73 AA ED, 05, 05]
 
-1C7A; [77 A7 62, 05, 05]
+1C6F; [73 AA F5, 05, 05]
 
-1C7B; [77 A7 6A, 05, 05]
+1C70; [73 AA FD, 05, 05]
 
-1C7C; [77 A7 72, 05, 05]
+1C71; [73 AB 07, 05, 05]
 
-1C7D; [77 A7 7A, 05, 05]
+1C72; [73 AB 0F, 05, 05]
 
-13A0; [77 A7 82, 05, 05]
+1C73; [73 AB 17, 05, 05]
 
-13A1; [77 A7 8A, 05, 05]
+1C74; [73 AB 1F, 05, 05]
 
-13A2; [77 A7 92, 05, 05]
+1C75; [73 AB 27, 05, 05]
 
-13A3; [77 A7 9A, 05, 05]
+1C76; [73 AB 2F, 05, 05]
 
-13A4; [77 A7 A2, 05, 05]
+1C77; [73 AB 37, 05, 05]
 
-13A5; [77 A7 AA, 05, 05]
+1C78; [73 AB 3F, 05, 05]
 
-13A6; [77 A7 B2, 05, 05]
+1C79; [73 AB 47, 05, 05]
 
-13A7; [77 A7 BA, 05, 05]
+1C7A; [73 AB 4F, 05, 05]
 
-13A8; [77 A7 C2, 05, 05]
+1C7B; [73 AB 57, 05, 05]
 
-13A9; [77 A7 CA, 05, 05]
+1C7C; [73 AB 5F, 05, 05]
 
-13AA; [77 A7 D2, 05, 05]
+1C7D; [73 AB 67, 05, 05]
 
-13AB; [77 A7 DA, 05, 05]
+FDD1 13C4;     [74 04 02, 05, 05]      # CHEROKEE first primary starts reordering group (compressible)
 
-13AC; [77 A7 E2, 05, 05]
+13A0; [74 08 02, 05, 05]
 
-13AD; [77 A7 EA, 05, 05]
+13A1; [74 08 0A, 05, 05]
 
-13AE; [77 A7 F2, 05, 05]
+13A2; [74 08 12, 05, 05]
 
-13AF; [77 A7 FA, 05, 05]
+13A3; [74 08 1A, 05, 05]
 
-13B0; [77 A8 08, 05, 05]
+13A4; [74 08 22, 05, 05]
 
-13B1; [77 A8 10, 05, 05]
+13A5; [74 08 2A, 05, 05]
 
-13B2; [77 A8 18, 05, 05]
+13A6; [74 08 32, 05, 05]
 
-13B3; [77 A8 20, 05, 05]
+13A7; [74 08 3A, 05, 05]
 
-13B4; [77 A8 28, 05, 05]
+13A8; [74 08 42, 05, 05]
 
-13B5; [77 A8 30, 05, 05]
+13A9; [74 08 4A, 05, 05]
 
-13B6; [77 A8 38, 05, 05]
+13AA; [74 08 52, 05, 05]
 
-13B7; [77 A8 40, 05, 05]
+13AB; [74 08 5A, 05, 05]
 
-13B8; [77 A8 48, 05, 05]
+13AC; [74 08 62, 05, 05]
 
-13B9; [77 A8 50, 05, 05]
+13AD; [74 08 6A, 05, 05]
 
-13BA; [77 A8 58, 05, 05]
+13AE; [74 08 72, 05, 05]
 
-13BB; [77 A8 60, 05, 05]
+13AF; [74 08 7A, 05, 05]
 
-13BC; [77 A8 68, 05, 05]
+13B0; [74 08 82, 05, 05]
 
-13BD; [77 A8 70, 05, 05]
+13B1; [74 08 8A, 05, 05]
 
-13BE; [77 A8 78, 05, 05]
+13B2; [74 08 92, 05, 05]
 
-13BF; [77 A8 80, 05, 05]
+13B3; [74 08 9A, 05, 05]
 
-13C0; [77 A8 88, 05, 05]
+13B4; [74 08 A2, 05, 05]
 
-13C1; [77 A8 90, 05, 05]
+13B5; [74 08 AA, 05, 05]
 
-13C2; [77 A8 98, 05, 05]
+13B6; [74 08 B2, 05, 05]
 
-13C3; [77 A8 A0, 05, 05]
+13B7; [74 08 BA, 05, 05]
 
-13C4; [77 A8 A8, 05, 05]
+13B8; [74 08 C2, 05, 05]
 
-13C5; [77 A8 B0, 05, 05]
+13B9; [74 08 CA, 05, 05]
 
-13C6; [77 A8 B8, 05, 05]
+13BA; [74 08 D2, 05, 05]
 
-13C7; [77 A8 C0, 05, 05]
+13BB; [74 08 DA, 05, 05]
 
-13C8; [77 A8 C8, 05, 05]
+13BC; [74 08 E2, 05, 05]
 
-13C9; [77 A8 D0, 05, 05]
+13BD; [74 08 EA, 05, 05]
 
-13CA; [77 A8 D8, 05, 05]
+13BE; [74 08 F2, 05, 05]
 
-13CB; [77 A8 E0, 05, 05]
+13BF; [74 08 FA, 05, 05]
 
-13CC; [77 A8 E8, 05, 05]
+13C0; [74 09 04, 05, 05]
 
-13CD; [77 A8 F0, 05, 05]
+13C1; [74 09 0C, 05, 05]
 
-13CE; [77 A8 F8, 05, 05]
+13C2; [74 09 14, 05, 05]
 
-13CF; [77 A9 06, 05, 05]
+13C3; [74 09 1C, 05, 05]
 
-13D0; [77 A9 0E, 05, 05]
+13C4; [74 09 24, 05, 05]
 
-13D1; [77 A9 16, 05, 05]
+13C5; [74 09 2C, 05, 05]
 
-13D2; [77 A9 1E, 05, 05]
+13C6; [74 09 34, 05, 05]
 
-13D3; [77 A9 26, 05, 05]
+13C7; [74 09 3C, 05, 05]
 
-13D4; [77 A9 2E, 05, 05]
+13C8; [74 09 44, 05, 05]
 
-13D5; [77 A9 36, 05, 05]
+13C9; [74 09 4C, 05, 05]
 
-13D6; [77 A9 3E, 05, 05]
+13CA; [74 09 54, 05, 05]
 
-13D7; [77 A9 46, 05, 05]
+13CB; [74 09 5C, 05, 05]
 
-13D8; [77 A9 4E, 05, 05]
+13CC; [74 09 64, 05, 05]
 
-13D9; [77 A9 56, 05, 05]
+13CD; [74 09 6C, 05, 05]
 
-13DA; [77 A9 5E, 05, 05]
+13CE; [74 09 74, 05, 05]
 
-13DB; [77 A9 66, 05, 05]
+13CF; [74 09 7C, 05, 05]
 
-13DC; [77 A9 6E, 05, 05]
+13D0; [74 09 84, 05, 05]
 
-13DD; [77 A9 76, 05, 05]
+13D1; [74 09 8C, 05, 05]
 
-13DE; [77 A9 7E, 05, 05]
+13D2; [74 09 94, 05, 05]
 
-13DF; [77 A9 86, 05, 05]
+13D3; [74 09 9C, 05, 05]
 
-13E0; [77 A9 8E, 05, 05]
+13D4; [74 09 A4, 05, 05]
 
-13E1; [77 A9 96, 05, 05]
+13D5; [74 09 AC, 05, 05]
 
-13E2; [77 A9 9E, 05, 05]
+13D6; [74 09 B4, 05, 05]
 
-13E3; [77 A9 A6, 05, 05]
+13D7; [74 09 BC, 05, 05]
 
-13E4; [77 A9 AE, 05, 05]
+13D8; [74 09 C4, 05, 05]
 
-13E5; [77 A9 B6, 05, 05]
+13D9; [74 09 CC, 05, 05]
 
-13E6; [77 A9 BE, 05, 05]
+13DA; [74 09 D4, 05, 05]
 
-13E7; [77 A9 C6, 05, 05]
+13DB; [74 09 DC, 05, 05]
 
-13E8; [77 A9 CE, 05, 05]
+13DC; [74 09 E4, 05, 05]
 
-13E9; [77 A9 D6, 05, 05]
+13DD; [74 09 EC, 05, 05]
 
-13EA; [77 A9 DE, 05, 05]
+13DE; [74 09 F4, 05, 05]
 
-13EB; [77 A9 E6, 05, 05]
+13DF; [74 09 FC, 05, 05]
 
-13EC; [77 A9 EE, 05, 05]
+13E0; [74 0A 06, 05, 05]
 
-13ED; [77 A9 F6, 05, 05]
+13E1; [74 0A 0E, 05, 05]
 
-13EE; [77 AA 04, 05, 05]
+13E2; [74 0A 16, 05, 05]
 
-13EF; [77 AA 0C, 05, 05]
+13E3; [74 0A 1E, 05, 05]
 
-13F0; [77 AA 14, 05, 05]
+13E4; [74 0A 26, 05, 05]
 
-13F1; [77 AA 1C, 05, 05]
+13E5; [74 0A 2E, 05, 05]
 
-13F2; [77 AA 24, 05, 05]
+13E6; [74 0A 36, 05, 05]
 
-13F3; [77 AA 2C, 05, 05]
+13E7; [74 0A 3E, 05, 05]
 
-13F4; [77 AA 34, 05, 05]
+13E8; [74 0A 46, 05, 05]
 
-1401; [77 AA 3C, 05, 05]
+13E9; [74 0A 4E, 05, 05]
 
-1402; [77 AA 44, 05, 05]
+13EA; [74 0A 56, 05, 05]
 
-1403; [77 AA 4C, 05, 05]
+13EB; [74 0A 5E, 05, 05]
 
-1404; [77 AA 54, 05, 05]
+13EC; [74 0A 66, 05, 05]
 
-1405; [77 AA 5C, 05, 05]
+13ED; [74 0A 6E, 05, 05]
 
-1406; [77 AA 64, 05, 05]
+13EE; [74 0A 76, 05, 05]
 
-1407; [77 AA 6C, 05, 05]
+13EF; [74 0A 7E, 05, 05]
 
-1408; [77 AA 74, 05, 05]
+13F0; [74 0A 86, 05, 05]
 
-1409; [77 AA 7C, 05, 05]
+13F1; [74 0A 8E, 05, 05]
 
-140A; [77 AA 84, 05, 05]
+13F2; [74 0A 96, 05, 05]
 
-140B; [77 AA 8C, 05, 05]
+13F3; [74 0A 9E, 05, 05]
 
-140C; [77 AA 94, 05, 05]
+13F4; [74 0A A6, 05, 05]
 
-140D; [77 AA 9C, 05, 05]
+FDD1 14C0;     [74 0F 02, 05, 05]      # CANADIAN-ABORIGINAL first primary
 
-140E; [77 AA A4, 05, 05]
+1401; [74 0F 2B, 05, 05]
 
-140F; [77 AA AC, 05, 05]
+1402; [74 0F 33, 05, 05]
 
-1410; [77 AA B4, 05, 05]
+1403; [74 0F 3B, 05, 05]
 
-1411; [77 AA BC, 05, 05]
+1404; [74 0F 43, 05, 05]
 
-1412; [77 AA C4, 05, 05]
+1405; [74 0F 4B, 05, 05]
 
-1413; [77 AA CC, 05, 05]
+1406; [74 0F 53, 05, 05]
 
-1414; [77 AA D4, 05, 05]
+1407; [74 0F 5B, 05, 05]
 
-1415; [77 AA DC, 05, 05]
+1408; [74 0F 63, 05, 05]
 
-1416; [77 AA E4, 05, 05]
+1409; [74 0F 6B, 05, 05]
 
-1417; [77 AA EC, 05, 05]
+140A; [74 0F 73, 05, 05]
 
-1418; [77 AA F4, 05, 05]
+140B; [74 0F 7B, 05, 05]
 
-1419; [77 AA FC, 05, 05]
+140C; [74 0F 83, 05, 05]
 
-141A; [77 AB 0A, 05, 05]
+140D; [74 0F 8B, 05, 05]
 
-141B; [77 AB 12, 05, 05]
+140E; [74 0F 93, 05, 05]
 
-141C; [77 AB 1A, 05, 05]
+140F; [74 0F 9B, 05, 05]
 
-141D; [77 AB 22, 05, 05]
+1410; [74 0F A3, 05, 05]
 
-141E; [77 AB 2A, 05, 05]
+1411; [74 0F AB, 05, 05]
 
-141F; [77 AB 32, 05, 05]
+1412; [74 0F B3, 05, 05]
 
-1420; [77 AB 3A, 05, 05]
+1413; [74 0F BB, 05, 05]
 
-1421; [77 AB 42, 05, 05]
+1414; [74 0F C3, 05, 05]
 
-1422; [77 AB 4A, 05, 05]
+1415; [74 0F CB, 05, 05]
 
-1423; [77 AB 52, 05, 05]
+1416; [74 0F D3, 05, 05]
 
-1424; [77 AB 5A, 05, 05]
+1417; [74 0F DB, 05, 05]
 
-1425; [77 AB 62, 05, 05]
+1418; [74 0F E3, 05, 05]
 
-1426; [77 AB 6A, 05, 05]
+1419; [74 0F EB, 05, 05]
 
-1427; [77 AB 72, 05, 05]
+141A; [74 0F F3, 05, 05]
 
-1428; [77 AB 7A, 05, 05]
+141B; [74 0F FB, 05, 05]
 
-1429; [77 AB 82, 05, 05]
+141C; [74 10 05, 05, 05]
 
-142A; [77 AB 8A, 05, 05]
+141D; [74 10 0D, 05, 05]
 
-142B; [77 AB 92, 05, 05]
+141E; [74 10 15, 05, 05]
 
-142C; [77 AB 9A, 05, 05]
+141F; [74 10 1D, 05, 05]
 
-142D; [77 AB A2, 05, 05]
+1420; [74 10 25, 05, 05]
 
-142E; [77 AB AA, 05, 05]
+1421; [74 10 2D, 05, 05]
 
-142F; [77 AB B2, 05, 05]
+1422; [74 10 35, 05, 05]
 
-1430; [77 AB BA, 05, 05]
+1423; [74 10 3D, 05, 05]
 
-1431; [77 AB C2, 05, 05]
+1424; [74 10 45, 05, 05]
 
-1432; [77 AB CA, 05, 05]
+1425; [74 10 4D, 05, 05]
 
-1433; [77 AB D2, 05, 05]
+1426; [74 10 55, 05, 05]
 
-1434; [77 AB DA, 05, 05]
+1427; [74 10 5D, 05, 05]
 
-1435; [77 AB E2, 05, 05]
+1428; [74 10 65, 05, 05]
 
-1436; [77 AB EA, 05, 05]
+1429; [74 10 6D, 05, 05]
 
-1437; [77 AB F2, 05, 05]
+142A; [74 10 75, 05, 05]
 
-1438; [77 AB FA, 05, 05]
+142B; [74 10 7D, 05, 05]
 
-1439; [77 AC 08, 05, 05]
+142C; [74 10 85, 05, 05]
 
-143A; [77 AC 10, 05, 05]
+142D; [74 10 8D, 05, 05]
 
-143B; [77 AC 18, 05, 05]
+142E; [74 10 95, 05, 05]
 
-143C; [77 AC 20, 05, 05]
+142F; [74 10 9D, 05, 05]
 
-143D; [77 AC 28, 05, 05]
+1430; [74 10 A5, 05, 05]
 
-143E; [77 AC 30, 05, 05]
+1431; [74 10 AD, 05, 05]
 
-143F; [77 AC 38, 05, 05]
+1432; [74 10 B5, 05, 05]
 
-1440; [77 AC 40, 05, 05]
+1433; [74 10 BD, 05, 05]
 
-1441; [77 AC 48, 05, 05]
+1434; [74 10 C5, 05, 05]
 
-1442; [77 AC 50, 05, 05]
+1435; [74 10 CD, 05, 05]
 
-1443; [77 AC 58, 05, 05]
+1436; [74 10 D5, 05, 05]
 
-1444; [77 AC 60, 05, 05]
+1437; [74 10 DD, 05, 05]
 
-1445; [77 AC 68, 05, 05]
+1438; [74 10 E5, 05, 05]
 
-1446; [77 AC 70, 05, 05]
+1439; [74 10 ED, 05, 05]
 
-1447; [77 AC 78, 05, 05]
+143A; [74 10 F5, 05, 05]
 
-1448; [77 AC 80, 05, 05]
+143B; [74 10 FD, 05, 05]
 
-1449; [77 AC 88, 05, 05]
+143C; [74 11 07, 05, 05]
 
-144A; [77 AC 90, 05, 05]
+143D; [74 11 0F, 05, 05]
 
-144B; [77 AC 98, 05, 05]
+143E; [74 11 17, 05, 05]
 
-144C; [77 AC A0, 05, 05]
+143F; [74 11 1F, 05, 05]
 
-144D; [77 AC A8, 05, 05]
+1440; [74 11 27, 05, 05]
 
-144E; [77 AC B0, 05, 05]
+1441; [74 11 2F, 05, 05]
 
-144F; [77 AC B8, 05, 05]
+1442; [74 11 37, 05, 05]
 
-1450; [77 AC C0, 05, 05]
+1443; [74 11 3F, 05, 05]
 
-1451; [77 AC C8, 05, 05]
+1444; [74 11 47, 05, 05]
 
-1452; [77 AC D0, 05, 05]
+1445; [74 11 4F, 05, 05]
 
-1453; [77 AC D8, 05, 05]
+1446; [74 11 57, 05, 05]
 
-1454; [77 AC E0, 05, 05]
+1447; [74 11 5F, 05, 05]
 
-1455; [77 AC E8, 05, 05]
+1448; [74 11 67, 05, 05]
 
-1456; [77 AC F0, 05, 05]
+1449; [74 11 6F, 05, 05]
 
-1457; [77 AC F8, 05, 05]
+144A; [74 11 77, 05, 05]
 
-1458; [77 AD 06, 05, 05]
+144B; [74 11 7F, 05, 05]
 
-1459; [77 AD 0E, 05, 05]
+144C; [74 11 87, 05, 05]
 
-145A; [77 AD 16, 05, 05]
+144D; [74 11 8F, 05, 05]
 
-145B; [77 AD 1E, 05, 05]
+144E; [74 11 97, 05, 05]
 
-145C; [77 AD 26, 05, 05]
+144F; [74 11 9F, 05, 05]
 
-145D; [77 AD 2E, 05, 05]
+1450; [74 11 A7, 05, 05]
 
-145E; [77 AD 36, 05, 05]
+1451; [74 11 AF, 05, 05]
 
-145F; [77 AD 3E, 05, 05]
+1452; [74 11 B7, 05, 05]
 
-1460; [77 AD 46, 05, 05]
+1453; [74 11 BF, 05, 05]
 
-1461; [77 AD 4E, 05, 05]
+1454; [74 11 C7, 05, 05]
 
-1462; [77 AD 56, 05, 05]
+1455; [74 11 CF, 05, 05]
 
-1463; [77 AD 5E, 05, 05]
+1456; [74 11 D7, 05, 05]
 
-1464; [77 AD 66, 05, 05]
+1457; [74 11 DF, 05, 05]
 
-1465; [77 AD 6E, 05, 05]
+1458; [74 11 E7, 05, 05]
 
-1466; [77 AD 76, 05, 05]
+1459; [74 11 EF, 05, 05]
 
-1467; [77 AD 7E, 05, 05]
+145A; [74 11 F7, 05, 05]
 
-1468; [77 AD 86, 05, 05]
+145B; [74 11 FF, 05, 05]
 
-1469; [77 AD 8E, 05, 05]
+145C; [74 12 09, 05, 05]
 
-146A; [77 AD 96, 05, 05]
+145D; [74 12 11, 05, 05]
 
-146B; [77 AD 9E, 05, 05]
+145E; [74 12 19, 05, 05]
 
-146C; [77 AD A6, 05, 05]
+145F; [74 12 21, 05, 05]
 
-146D; [77 AD AE, 05, 05]
+1460; [74 12 29, 05, 05]
 
-146E; [77 AD B6, 05, 05]
+1461; [74 12 31, 05, 05]
 
-146F; [77 AD BE, 05, 05]
+1462; [74 12 39, 05, 05]
 
-1470; [77 AD C6, 05, 05]
+1463; [74 12 41, 05, 05]
 
-1471; [77 AD CE, 05, 05]
+1464; [74 12 49, 05, 05]
 
-1472; [77 AD D6, 05, 05]
+1465; [74 12 51, 05, 05]
 
-1473; [77 AD DE, 05, 05]
+1466; [74 12 59, 05, 05]
 
-1474; [77 AD E6, 05, 05]
+1467; [74 12 61, 05, 05]
 
-1475; [77 AD EE, 05, 05]
+1468; [74 12 69, 05, 05]
 
-1476; [77 AD F6, 05, 05]
+1469; [74 12 71, 05, 05]
 
-1477; [77 AE 04, 05, 05]
+146A; [74 12 79, 05, 05]
 
-1478; [77 AE 0C, 05, 05]
+146B; [74 12 81, 05, 05]
 
-1479; [77 AE 14, 05, 05]
+146C; [74 12 89, 05, 05]
 
-147A; [77 AE 1C, 05, 05]
+146D; [74 12 91, 05, 05]
 
-147B; [77 AE 24, 05, 05]
+146E; [74 12 99, 05, 05]
 
-147C; [77 AE 2C, 05, 05]
+146F; [74 12 A1, 05, 05]
 
-147D; [77 AE 34, 05, 05]
+1470; [74 12 A9, 05, 05]
 
-147E; [77 AE 3C, 05, 05]
+1471; [74 12 B1, 05, 05]
 
-147F; [77 AE 44, 05, 05]
+1472; [74 12 B9, 05, 05]
 
-1480; [77 AE 4C, 05, 05]
+1473; [74 12 C1, 05, 05]
 
-1481; [77 AE 54, 05, 05]
+1474; [74 12 C9, 05, 05]
 
-1482; [77 AE 5C, 05, 05]
+1475; [74 12 D1, 05, 05]
 
-1483; [77 AE 64, 05, 05]
+1476; [74 12 D9, 05, 05]
 
-1484; [77 AE 6C, 05, 05]
+1477; [74 12 E1, 05, 05]
 
-1485; [77 AE 74, 05, 05]
+1478; [74 12 E9, 05, 05]
 
-1486; [77 AE 7C, 05, 05]
+1479; [74 12 F1, 05, 05]
 
-1487; [77 AE 84, 05, 05]
+147A; [74 12 F9, 05, 05]
 
-1488; [77 AE 8C, 05, 05]
+147B; [74 13 03, 05, 05]
 
-1489; [77 AE 94, 05, 05]
+147C; [74 13 0B, 05, 05]
 
-148A; [77 AE 9C, 05, 05]
+147D; [74 13 13, 05, 05]
 
-148B; [77 AE A4, 05, 05]
+147E; [74 13 1B, 05, 05]
 
-148C; [77 AE AC, 05, 05]
+147F; [74 13 23, 05, 05]
 
-148D; [77 AE B4, 05, 05]
+1480; [74 13 2B, 05, 05]
 
-148E; [77 AE BC, 05, 05]
+1481; [74 13 33, 05, 05]
 
-148F; [77 AE C4, 05, 05]
+1482; [74 13 3B, 05, 05]
 
-1490; [77 AE CC, 05, 05]
+1483; [74 13 43, 05, 05]
 
-1491; [77 AE D4, 05, 05]
+1484; [74 13 4B, 05, 05]
 
-1492; [77 AE DC, 05, 05]
+1485; [74 13 53, 05, 05]
 
-1493; [77 AE E4, 05, 05]
+1486; [74 13 5B, 05, 05]
 
-1494; [77 AE EC, 05, 05]
+1487; [74 13 63, 05, 05]
 
-1495; [77 AE F4, 05, 05]
+1488; [74 13 6B, 05, 05]
 
-1496; [77 AE FC, 05, 05]
+1489; [74 13 73, 05, 05]
 
-1497; [77 AF 0A, 05, 05]
+148A; [74 13 7B, 05, 05]
 
-1498; [77 AF 12, 05, 05]
+148B; [74 13 83, 05, 05]
 
-1499; [77 AF 1A, 05, 05]
+148C; [74 13 8B, 05, 05]
 
-149A; [77 AF 22, 05, 05]
+148D; [74 13 93, 05, 05]
 
-149B; [77 AF 2A, 05, 05]
+148E; [74 13 9B, 05, 05]
 
-149C; [77 AF 32, 05, 05]
+148F; [74 13 A3, 05, 05]
 
-149D; [77 AF 3A, 05, 05]
+1490; [74 13 AB, 05, 05]
 
-149E; [77 AF 42, 05, 05]
+1491; [74 13 B3, 05, 05]
 
-149F; [77 AF 4A, 05, 05]
+1492; [74 13 BB, 05, 05]
 
-14A0; [77 AF 52, 05, 05]
+1493; [74 13 C3, 05, 05]
 
-14A1; [77 AF 5A, 05, 05]
+1494; [74 13 CB, 05, 05]
 
-14A2; [77 AF 62, 05, 05]
+1495; [74 13 D3, 05, 05]
 
-14A3; [77 AF 6A, 05, 05]
+1496; [74 13 DB, 05, 05]
 
-14A4; [77 AF 72, 05, 05]
+1497; [74 13 E3, 05, 05]
 
-14A5; [77 AF 7A, 05, 05]
+1498; [74 13 EB, 05, 05]
 
-14A6; [77 AF 82, 05, 05]
+1499; [74 13 F3, 05, 05]
 
-14A7; [77 AF 8A, 05, 05]
+149A; [74 13 FB, 05, 05]
 
-14A8; [77 AF 92, 05, 05]
+149B; [74 14 05, 05, 05]
 
-14A9; [77 AF 9A, 05, 05]
+149C; [74 14 0D, 05, 05]
 
-14AA; [77 AF A2, 05, 05]
+149D; [74 14 15, 05, 05]
 
-14AB; [77 AF AA, 05, 05]
+149E; [74 14 1D, 05, 05]
 
-14AC; [77 AF B2, 05, 05]
+149F; [74 14 25, 05, 05]
 
-14AD; [77 AF BA, 05, 05]
+14A0; [74 14 2D, 05, 05]
 
-14AE; [77 AF C2, 05, 05]
+14A1; [74 14 35, 05, 05]
 
-14AF; [77 AF CA, 05, 05]
+14A2; [74 14 3D, 05, 05]
 
-14B0; [77 AF D2, 05, 05]
+14A3; [74 14 45, 05, 05]
 
-14B1; [77 AF DA, 05, 05]
+14A4; [74 14 4D, 05, 05]
 
-14B2; [77 AF E2, 05, 05]
+14A5; [74 14 55, 05, 05]
 
-14B3; [77 AF EA, 05, 05]
+14A6; [74 14 5D, 05, 05]
 
-14B4; [77 AF F2, 05, 05]
+14A7; [74 14 65, 05, 05]
 
-14B5; [77 AF FA, 05, 05]
+14A8; [74 14 6D, 05, 05]
 
-14B6; [77 B0 08, 05, 05]
+14A9; [74 14 75, 05, 05]
 
-14B7; [77 B0 10, 05, 05]
+14AA; [74 14 7D, 05, 05]
 
-14B8; [77 B0 18, 05, 05]
+14AB; [74 14 85, 05, 05]
 
-14B9; [77 B0 20, 05, 05]
+14AC; [74 14 8D, 05, 05]
 
-14BA; [77 B0 28, 05, 05]
+14AD; [74 14 95, 05, 05]
 
-14BB; [77 B0 30, 05, 05]
+14AE; [74 14 9D, 05, 05]
 
-14BC; [77 B0 38, 05, 05]
+14AF; [74 14 A5, 05, 05]
 
-14BD; [77 B0 40, 05, 05]
+14B0; [74 14 AD, 05, 05]
 
-14BE; [77 B0 48, 05, 05]
+14B1; [74 14 B5, 05, 05]
 
-14BF; [77 B0 50, 05, 05]
+14B2; [74 14 BD, 05, 05]
 
-14C0; [77 B0 58, 05, 05]
+14B3; [74 14 C5, 05, 05]
 
-14C1; [77 B0 60, 05, 05]
+14B4; [74 14 CD, 05, 05]
 
-14C2; [77 B0 68, 05, 05]
+14B5; [74 14 D5, 05, 05]
 
-14C3; [77 B0 70, 05, 05]
+14B6; [74 14 DD, 05, 05]
 
-14C4; [77 B0 78, 05, 05]
+14B7; [74 14 E5, 05, 05]
 
-14C5; [77 B0 80, 05, 05]
+14B8; [74 14 ED, 05, 05]
 
-14C6; [77 B0 88, 05, 05]
+14B9; [74 14 F5, 05, 05]
 
-14C7; [77 B0 90, 05, 05]
+14BA; [74 14 FD, 05, 05]
 
-14C8; [77 B0 98, 05, 05]
+14BB; [74 15 07, 05, 05]
 
-14C9; [77 B0 A0, 05, 05]
+14BC; [74 15 0F, 05, 05]
 
-14CA; [77 B0 A8, 05, 05]
+14BD; [74 15 17, 05, 05]
 
-14CB; [77 B0 B0, 05, 05]
+14BE; [74 15 1F, 05, 05]
 
-14CC; [77 B0 B8, 05, 05]
+14BF; [74 15 27, 05, 05]
 
-14CD; [77 B0 C0, 05, 05]
+14C0; [74 15 2F, 05, 05]
 
-14CE; [77 B0 C8, 05, 05]
+14C1; [74 15 37, 05, 05]
 
-14CF; [77 B0 D0, 05, 05]
+14C2; [74 15 3F, 05, 05]
 
-14D0; [77 B0 D8, 05, 05]
+14C3; [74 15 47, 05, 05]
 
-14D1; [77 B0 E0, 05, 05]
+14C4; [74 15 4F, 05, 05]
 
-14D2; [77 B0 E8, 05, 05]
+14C5; [74 15 57, 05, 05]
 
-14D3; [77 B0 F0, 05, 05]
+14C6; [74 15 5F, 05, 05]
 
-14D4; [77 B0 F8, 05, 05]
+14C7; [74 15 67, 05, 05]
 
-14D5; [77 B1 06, 05, 05]
+14C8; [74 15 6F, 05, 05]
 
-14D6; [77 B1 0E, 05, 05]
+14C9; [74 15 77, 05, 05]
 
-14D7; [77 B1 16, 05, 05]
+14CA; [74 15 7F, 05, 05]
 
-14D8; [77 B1 1E, 05, 05]
+14CB; [74 15 87, 05, 05]
 
-14D9; [77 B1 26, 05, 05]
+14CC; [74 15 8F, 05, 05]
 
-14DA; [77 B1 2E, 05, 05]
+14CD; [74 15 97, 05, 05]
 
-14DB; [77 B1 36, 05, 05]
+14CE; [74 15 9F, 05, 05]
 
-14DC; [77 B1 3E, 05, 05]
+14CF; [74 15 A7, 05, 05]
 
-14DD; [77 B1 46, 05, 05]
+14D0; [74 15 AF, 05, 05]
 
-14DE; [77 B1 4E, 05, 05]
+14D1; [74 15 B7, 05, 05]
 
-14DF; [77 B1 56, 05, 05]
+14D2; [74 15 BF, 05, 05]
 
-14E0; [77 B1 5E, 05, 05]
+14D3; [74 15 C7, 05, 05]
 
-14E1; [77 B1 66, 05, 05]
+14D4; [74 15 CF, 05, 05]
 
-14E2; [77 B1 6E, 05, 05]
+14D5; [74 15 D7, 05, 05]
 
-14E3; [77 B1 76, 05, 05]
+14D6; [74 15 DF, 05, 05]
 
-14E4; [77 B1 7E, 05, 05]
+14D7; [74 15 E7, 05, 05]
 
-14E5; [77 B1 86, 05, 05]
+14D8; [74 15 EF, 05, 05]
 
-14E6; [77 B1 8E, 05, 05]
+14D9; [74 15 F7, 05, 05]
 
-14E7; [77 B1 96, 05, 05]
+14DA; [74 15 FF, 05, 05]
 
-14E8; [77 B1 9E, 05, 05]
+14DB; [74 16 09, 05, 05]
 
-14E9; [77 B1 A6, 05, 05]
+14DC; [74 16 11, 05, 05]
 
-14EA; [77 B1 AE, 05, 05]
+14DD; [74 16 19, 05, 05]
 
-14EB; [77 B1 B6, 05, 05]
+14DE; [74 16 21, 05, 05]
 
-14EC; [77 B1 BE, 05, 05]
+14DF; [74 16 29, 05, 05]
 
-14ED; [77 B1 C6, 05, 05]
+14E0; [74 16 31, 05, 05]
 
-14EE; [77 B1 CE, 05, 05]
+14E1; [74 16 39, 05, 05]
 
-14EF; [77 B1 D6, 05, 05]
+14E2; [74 16 41, 05, 05]
 
-14F0; [77 B1 DE, 05, 05]
+14E3; [74 16 49, 05, 05]
 
-14F1; [77 B1 E6, 05, 05]
+14E4; [74 16 51, 05, 05]
 
-14F2; [77 B1 EE, 05, 05]
+14E5; [74 16 59, 05, 05]
 
-14F3; [77 B1 F6, 05, 05]
+14E6; [74 16 61, 05, 05]
 
-14F4; [77 B2 04, 05, 05]
+14E7; [74 16 69, 05, 05]
 
-14F5; [77 B2 0C, 05, 05]
+14E8; [74 16 71, 05, 05]
 
-14F6; [77 B2 14, 05, 05]
+14E9; [74 16 79, 05, 05]
 
-14F7; [77 B2 1C, 05, 05]
+14EA; [74 16 81, 05, 05]
 
-14F8; [77 B2 24, 05, 05]
+14EB; [74 16 89, 05, 05]
 
-14F9; [77 B2 2C, 05, 05]
+14EC; [74 16 91, 05, 05]
 
-14FA; [77 B2 34, 05, 05]
+14ED; [74 16 99, 05, 05]
 
-14FB; [77 B2 3C, 05, 05]
+14EE; [74 16 A1, 05, 05]
 
-14FC; [77 B2 44, 05, 05]
+14EF; [74 16 A9, 05, 05]
 
-14FD; [77 B2 4C, 05, 05]
+14F0; [74 16 B1, 05, 05]
 
-14FE; [77 B2 54, 05, 05]
+14F1; [74 16 B9, 05, 05]
 
-14FF; [77 B2 5C, 05, 05]
+14F2; [74 16 C1, 05, 05]
 
-1500; [77 B2 64, 05, 05]
+14F3; [74 16 C9, 05, 05]
 
-1501; [77 B2 6C, 05, 05]
+14F4; [74 16 D1, 05, 05]
 
-1502; [77 B2 74, 05, 05]
+14F5; [74 16 D9, 05, 05]
 
-1503; [77 B2 7C, 05, 05]
+14F6; [74 16 E1, 05, 05]
 
-1504; [77 B2 84, 05, 05]
+14F7; [74 16 E9, 05, 05]
 
-1505; [77 B2 8C, 05, 05]
+14F8; [74 16 F1, 05, 05]
 
-1506; [77 B2 94, 05, 05]
+14F9; [74 16 F9, 05, 05]
 
-1507; [77 B2 9C, 05, 05]
+14FA; [74 17 03, 05, 05]
 
-1508; [77 B2 A4, 05, 05]
+14FB; [74 17 0B, 05, 05]
 
-1509; [77 B2 AC, 05, 05]
+14FC; [74 17 13, 05, 05]
 
-150A; [77 B2 B4, 05, 05]
+14FD; [74 17 1B, 05, 05]
 
-150B; [77 B2 BC, 05, 05]
+14FE; [74 17 23, 05, 05]
 
-150C; [77 B2 C4, 05, 05]
+14FF; [74 17 2B, 05, 05]
 
-150D; [77 B2 CC, 05, 05]
+1500; [74 17 33, 05, 05]
 
-150E; [77 B2 D4, 05, 05]
+1501; [74 17 3B, 05, 05]
 
-150F; [77 B2 DC, 05, 05]
+1502; [74 17 43, 05, 05]
 
-1510; [77 B2 E4, 05, 05]
+1503; [74 17 4B, 05, 05]
 
-1511; [77 B2 EC, 05, 05]
+1504; [74 17 53, 05, 05]
 
-1512; [77 B2 F4, 05, 05]
+1505; [74 17 5B, 05, 05]
 
-1513; [77 B2 FC, 05, 05]
+1506; [74 17 63, 05, 05]
 
-1514; [77 B3 0A, 05, 05]
+1507; [74 17 6B, 05, 05]
 
-1515; [77 B3 12, 05, 05]
+1508; [74 17 73, 05, 05]
 
-1516; [77 B3 1A, 05, 05]
+1509; [74 17 7B, 05, 05]
 
-1517; [77 B3 22, 05, 05]
+150A; [74 17 83, 05, 05]
 
-1518; [77 B3 2A, 05, 05]
+150B; [74 17 8B, 05, 05]
 
-1519; [77 B3 32, 05, 05]
+150C; [74 17 93, 05, 05]
 
-151A; [77 B3 3A, 05, 05]
+150D; [74 17 9B, 05, 05]
 
-151B; [77 B3 42, 05, 05]
+150E; [74 17 A3, 05, 05]
 
-151C; [77 B3 4A, 05, 05]
+150F; [74 17 AB, 05, 05]
 
-151D; [77 B3 52, 05, 05]
+1510; [74 17 B3, 05, 05]
 
-151E; [77 B3 5A, 05, 05]
+1511; [74 17 BB, 05, 05]
 
-151F; [77 B3 62, 05, 05]
+1512; [74 17 C3, 05, 05]
 
-1520; [77 B3 6A, 05, 05]
+1513; [74 17 CB, 05, 05]
 
-1521; [77 B3 72, 05, 05]
+1514; [74 17 D3, 05, 05]
 
-1522; [77 B3 7A, 05, 05]
+1515; [74 17 DB, 05, 05]
 
-1523; [77 B3 82, 05, 05]
+1516; [74 17 E3, 05, 05]
 
-1524; [77 B3 8A, 05, 05]
+1517; [74 17 EB, 05, 05]
 
-1525; [77 B3 92, 05, 05]
+1518; [74 17 F3, 05, 05]
 
-1526; [77 B3 9A, 05, 05]
+1519; [74 17 FB, 05, 05]
 
-1527; [77 B3 A2, 05, 05]
+151A; [74 18 05, 05, 05]
 
-1528; [77 B3 AA, 05, 05]
+151B; [74 18 0D, 05, 05]
 
-1529; [77 B3 B2, 05, 05]
+151C; [74 18 15, 05, 05]
 
-152A; [77 B3 BA, 05, 05]
+151D; [74 18 1D, 05, 05]
 
-152B; [77 B3 C2, 05, 05]
+151E; [74 18 25, 05, 05]
 
-152C; [77 B3 CA, 05, 05]
+151F; [74 18 2D, 05, 05]
 
-152D; [77 B3 D2, 05, 05]
+1520; [74 18 35, 05, 05]
 
-152E; [77 B3 DA, 05, 05]
+1521; [74 18 3D, 05, 05]
 
-152F; [77 B3 E2, 05, 05]
+1522; [74 18 45, 05, 05]
 
-1530; [77 B3 EA, 05, 05]
+1523; [74 18 4D, 05, 05]
 
-1531; [77 B3 F2, 05, 05]
+1524; [74 18 55, 05, 05]
 
-1532; [77 B3 FA, 05, 05]
+1525; [74 18 5D, 05, 05]
 
-1533; [77 B4 08, 05, 05]
+1526; [74 18 65, 05, 05]
 
-1534; [77 B4 10, 05, 05]
+1527; [74 18 6D, 05, 05]
 
-1535; [77 B4 18, 05, 05]
+1528; [74 18 75, 05, 05]
 
-1536; [77 B4 20, 05, 05]
+1529; [74 18 7D, 05, 05]
 
-1537; [77 B4 28, 05, 05]
+152A; [74 18 85, 05, 05]
 
-1538; [77 B4 30, 05, 05]
+152B; [74 18 8D, 05, 05]
 
-1539; [77 B4 38, 05, 05]
+152C; [74 18 95, 05, 05]
 
-153A; [77 B4 40, 05, 05]
+152D; [74 18 9D, 05, 05]
 
-153B; [77 B4 48, 05, 05]
+152E; [74 18 A5, 05, 05]
 
-153C; [77 B4 50, 05, 05]
+152F; [74 18 AD, 05, 05]
 
-153D; [77 B4 58, 05, 05]
+1530; [74 18 B5, 05, 05]
 
-153E; [77 B4 60, 05, 05]
+1531; [74 18 BD, 05, 05]
 
-153F; [77 B4 68, 05, 05]
+1532; [74 18 C5, 05, 05]
 
-1540; [77 B4 70, 05, 05]
+1533; [74 18 CD, 05, 05]
 
-1541; [77 B4 78, 05, 05]
+1534; [74 18 D5, 05, 05]
 
-1542; [77 B4 80, 05, 05]
+1535; [74 18 DD, 05, 05]
 
-1543; [77 B4 88, 05, 05]
+1536; [74 18 E5, 05, 05]
 
-1544; [77 B4 90, 05, 05]
+1537; [74 18 ED, 05, 05]
 
-1545; [77 B4 98, 05, 05]
+1538; [74 18 F5, 05, 05]
 
-1546; [77 B4 A0, 05, 05]
+1539; [74 18 FD, 05, 05]
 
-1547; [77 B4 A8, 05, 05]
+153A; [74 19 07, 05, 05]
 
-1548; [77 B4 B0, 05, 05]
+153B; [74 19 0F, 05, 05]
 
-1549; [77 B4 B8, 05, 05]
+153C; [74 19 17, 05, 05]
 
-154A; [77 B4 C0, 05, 05]
+153D; [74 19 1F, 05, 05]
 
-154B; [77 B4 C8, 05, 05]
+153E; [74 19 27, 05, 05]
 
-154C; [77 B4 D0, 05, 05]
+153F; [74 19 2F, 05, 05]
 
-154D; [77 B4 D8, 05, 05]
+1540; [74 19 37, 05, 05]
 
-154E; [77 B4 E0, 05, 05]
+1541; [74 19 3F, 05, 05]
 
-154F; [77 B4 E8, 05, 05]
+1542; [74 19 47, 05, 05]
 
-1550; [77 B4 F0, 05, 05]
+1543; [74 19 4F, 05, 05]
 
-1551; [77 B4 F8, 05, 05]
+1544; [74 19 57, 05, 05]
 
-1552; [77 B5 06, 05, 05]
+1545; [74 19 5F, 05, 05]
 
-1553; [77 B5 0E, 05, 05]
+1546; [74 19 67, 05, 05]
 
-1554; [77 B5 16, 05, 05]
+1547; [74 19 6F, 05, 05]
 
-1555; [77 B5 1E, 05, 05]
+1548; [74 19 77, 05, 05]
 
-1556; [77 B5 26, 05, 05]
+1549; [74 19 7F, 05, 05]
 
-1557; [77 B5 2E, 05, 05]
+154A; [74 19 87, 05, 05]
 
-1558; [77 B5 36, 05, 05]
+154B; [74 19 8F, 05, 05]
 
-1559; [77 B5 3E, 05, 05]
+154C; [74 19 97, 05, 05]
 
-155A; [77 B5 46, 05, 05]
+154D; [74 19 9F, 05, 05]
 
-155B; [77 B5 4E, 05, 05]
+154E; [74 19 A7, 05, 05]
 
-155C; [77 B5 56, 05, 05]
+154F; [74 19 AF, 05, 05]
 
-155D; [77 B5 5E, 05, 05]
+1550; [74 19 B7, 05, 05]
 
-155E; [77 B5 66, 05, 05]
+1551; [74 19 BF, 05, 05]
 
-155F; [77 B5 6E, 05, 05]
+1552; [74 19 C7, 05, 05]
 
-1560; [77 B5 76, 05, 05]
+1553; [74 19 CF, 05, 05]
 
-1561; [77 B5 7E, 05, 05]
+1554; [74 19 D7, 05, 05]
 
-1562; [77 B5 86, 05, 05]
+1555; [74 19 DF, 05, 05]
 
-1563; [77 B5 8E, 05, 05]
+1556; [74 19 E7, 05, 05]
 
-1564; [77 B5 96, 05, 05]
+1557; [74 19 EF, 05, 05]
 
-1565; [77 B5 9E, 05, 05]
+1558; [74 19 F7, 05, 05]
 
-1566; [77 B5 A6, 05, 05]
+1559; [74 19 FF, 05, 05]
 
-1567; [77 B5 AE, 05, 05]
+155A; [74 1A 09, 05, 05]
 
-1568; [77 B5 B6, 05, 05]
+155B; [74 1A 11, 05, 05]
 
-1569; [77 B5 BE, 05, 05]
+155C; [74 1A 19, 05, 05]
 
-156A; [77 B5 C6, 05, 05]
+155D; [74 1A 21, 05, 05]
 
-156B; [77 B5 CE, 05, 05]
+155E; [74 1A 29, 05, 05]
 
-156C; [77 B5 D6, 05, 05]
+155F; [74 1A 31, 05, 05]
 
-156D; [77 B5 DE, 05, 05]
+1560; [74 1A 39, 05, 05]
 
-156E; [77 B5 E6, 05, 05]
+1561; [74 1A 41, 05, 05]
 
-156F; [77 B5 EE, 05, 05]
+1562; [74 1A 49, 05, 05]
 
-1570; [77 B5 F6, 05, 05]
+1563; [74 1A 51, 05, 05]
 
-1571; [77 B6 04, 05, 05]
+1564; [74 1A 59, 05, 05]
 
-1572; [77 B6 0C, 05, 05]
+1565; [74 1A 61, 05, 05]
 
-1573; [77 B6 14, 05, 05]
+1566; [74 1A 69, 05, 05]
 
-1574; [77 B6 1C, 05, 05]
+1567; [74 1A 71, 05, 05]
 
-1575; [77 B6 24, 05, 05]
+1568; [74 1A 79, 05, 05]
 
-1576; [77 B6 2C, 05, 05]
+1569; [74 1A 81, 05, 05]
 
-1577; [77 B6 34, 05, 05]
+156A; [74 1A 89, 05, 05]
 
-1578; [77 B6 3C, 05, 05]
+156B; [74 1A 91, 05, 05]
 
-1579; [77 B6 44, 05, 05]
+156C; [74 1A 99, 05, 05]
 
-157A; [77 B6 4C, 05, 05]
+156D; [74 1A A1, 05, 05]
 
-157B; [77 B6 54, 05, 05]
+156E; [74 1A A9, 05, 05]
 
-157D; [77 B6 5C, 05, 05]
+156F; [74 1A B1, 05, 05]
 
-166F; [77 B6 64, 05, 05]
+1570; [74 1A B9, 05, 05]
 
-157E; [77 B6 6C, 05, 05]
+1571; [74 1A C1, 05, 05]
 
-157F; [77 B6 74, 05, 05]
+1572; [74 1A C9, 05, 05]
 
-1580; [77 B6 7C, 05, 05]
+1573; [74 1A D1, 05, 05]
 
-1581; [77 B6 84, 05, 05]
+1574; [74 1A D9, 05, 05]
 
-1582; [77 B6 8C, 05, 05]
+1575; [74 1A E1, 05, 05]
 
-1583; [77 B6 94, 05, 05]
+1576; [74 1A E9, 05, 05]
 
-1584; [77 B6 9C, 05, 05]
+1577; [74 1A F1, 05, 05]
 
-1585; [77 B6 A4, 05, 05]
+1578; [74 1A F9, 05, 05]
 
-1586; [77 B6 AC, 05, 05]
+1579; [74 1B 03, 05, 05]
 
-1587; [77 B6 B4, 05, 05]
+157A; [74 1B 0B, 05, 05]
 
-1588; [77 B6 BC, 05, 05]
+157B; [74 1B 13, 05, 05]
 
-1589; [77 B6 C4, 05, 05]
+157D; [74 1B 1B, 05, 05]
 
-158A; [77 B6 CC, 05, 05]
+166F; [74 1B 23, 05, 05]
 
-158B; [77 B6 D4, 05, 05]
+157E; [74 1B 2B, 05, 05]
 
-158C; [77 B6 DC, 05, 05]
+157F; [74 1B 33, 05, 05]
 
-158D; [77 B6 E4, 05, 05]
+1580; [74 1B 3B, 05, 05]
 
-1670; [77 B6 EC, 05, 05]
+1581; [74 1B 43, 05, 05]
 
-158E; [77 B6 F4, 05, 05]
+1582; [74 1B 4B, 05, 05]
 
-158F; [77 B6 FC, 05, 05]
+1583; [74 1B 53, 05, 05]
 
-1590; [77 B7 0A, 05, 05]
+1584; [74 1B 5B, 05, 05]
 
-1591; [77 B7 12, 05, 05]
+1585; [74 1B 63, 05, 05]
 
-1592; [77 B7 1A, 05, 05]
+1586; [74 1B 6B, 05, 05]
 
-1593; [77 B7 22, 05, 05]
+1587; [74 1B 73, 05, 05]
 
-1594; [77 B7 2A, 05, 05]
+1588; [74 1B 7B, 05, 05]
 
-1595; [77 B7 32, 05, 05]
+1589; [74 1B 83, 05, 05]
 
-1671; [77 B7 3A, 05, 05]
+158A; [74 1B 8B, 05, 05]
 
-1672; [77 B7 42, 05, 05]
+158B; [74 1B 93, 05, 05]
 
-1673; [77 B7 4A, 05, 05]
+158C; [74 1B 9B, 05, 05]
 
-1674; [77 B7 52, 05, 05]
+158D; [74 1B A3, 05, 05]
 
-1675; [77 B7 5A, 05, 05]
+1670; [74 1B AB, 05, 05]
 
-1676; [77 B7 62, 05, 05]
+158E; [74 1B B3, 05, 05]
 
-1596; [77 B7 6A, 05, 05]
+158F; [74 1B BB, 05, 05]
 
-1597; [77 B7 72, 05, 05]
+1590; [74 1B C3, 05, 05]
 
-1598; [77 B7 7A, 05, 05]
+1591; [74 1B CB, 05, 05]
 
-1599; [77 B7 82, 05, 05]
+1592; [74 1B D3, 05, 05]
 
-159A; [77 B7 8A, 05, 05]
+1593; [74 1B DB, 05, 05]
 
-159B; [77 B7 92, 05, 05]
+1594; [74 1B E3, 05, 05]
 
-159C; [77 B7 9A, 05, 05]
+1595; [74 1B EB, 05, 05]
 
-159D; [77 B7 A2, 05, 05]
+1671; [74 1B F3, 05, 05]
 
-159E; [77 B7 AA, 05, 05]
+1672; [74 1B FB, 05, 05]
 
-159F; [77 B7 B2, 05, 05]
+1673; [74 1C 05, 05, 05]
 
-15A0; [77 B7 BA, 05, 05]
+1674; [74 1C 0D, 05, 05]
 
-15A1; [77 B7 C2, 05, 05]
+1675; [74 1C 15, 05, 05]
 
-15A2; [77 B7 CA, 05, 05]
+1676; [74 1C 1D, 05, 05]
 
-15A3; [77 B7 D2, 05, 05]
+1596; [74 1C 25, 05, 05]
 
-15A4; [77 B7 DA, 05, 05]
+1597; [74 1C 2D, 05, 05]
 
-15A5; [77 B7 E2, 05, 05]
+1598; [74 1C 35, 05, 05]
 
-15A6; [77 B7 EA, 05, 05]
+1599; [74 1C 3D, 05, 05]
 
-157C; [77 B7 F2, 05, 05]
+159A; [74 1C 45, 05, 05]
 
-15A7; [77 B7 FA, 05, 05]
+159B; [74 1C 4D, 05, 05]
 
-15A8; [77 B8 08, 05, 05]
+159C; [74 1C 55, 05, 05]
 
-15A9; [77 B8 10, 05, 05]
+159D; [74 1C 5D, 05, 05]
 
-15AA; [77 B8 18, 05, 05]
+159E; [74 1C 65, 05, 05]
 
-15AB; [77 B8 20, 05, 05]
+159F; [74 1C 6D, 05, 05]
 
-15AC; [77 B8 28, 05, 05]
+15A0; [74 1C 75, 05, 05]
 
-15AD; [77 B8 30, 05, 05]
+15A1; [74 1C 7D, 05, 05]
 
-15AE; [77 B8 38, 05, 05]
+15A2; [74 1C 85, 05, 05]
 
-15AF; [77 B8 40, 05, 05]
+15A3; [74 1C 8D, 05, 05]
 
-15B0; [77 B8 48, 05, 05]
+15A4; [74 1C 95, 05, 05]
 
-15B1; [77 B8 50, 05, 05]
+15A5; [74 1C 9D, 05, 05]
 
-15B2; [77 B8 58, 05, 05]
+15A6; [74 1C A5, 05, 05]
 
-15B3; [77 B8 60, 05, 05]
+157C; [74 1C AD, 05, 05]
 
-15B4; [77 B8 68, 05, 05]
+15A7; [74 1C B5, 05, 05]
 
-15B5; [77 B8 70, 05, 05]
+15A8; [74 1C BD, 05, 05]
 
-15B6; [77 B8 78, 05, 05]
+15A9; [74 1C C5, 05, 05]
 
-15B7; [77 B8 80, 05, 05]
+15AA; [74 1C CD, 05, 05]
 
-15B8; [77 B8 88, 05, 05]
+15AB; [74 1C D5, 05, 05]
 
-15B9; [77 B8 90, 05, 05]
+15AC; [74 1C DD, 05, 05]
 
-15BA; [77 B8 98, 05, 05]
+15AD; [74 1C E5, 05, 05]
 
-15BB; [77 B8 A0, 05, 05]
+15AE; [74 1C ED, 05, 05]
 
-15BC; [77 B8 A8, 05, 05]
+15AF; [74 1C F5, 05, 05]
 
-15BD; [77 B8 B0, 05, 05]
+15B0; [74 1C FD, 05, 05]
 
-15BE; [77 B8 B8, 05, 05]
+15B1; [74 1D 07, 05, 05]
 
-15BF; [77 B8 C0, 05, 05]
+15B2; [74 1D 0F, 05, 05]
 
-15C0; [77 B8 C8, 05, 05]
+15B3; [74 1D 17, 05, 05]
 
-15C1; [77 B8 D0, 05, 05]
+15B4; [74 1D 1F, 05, 05]
 
-15C2; [77 B8 D8, 05, 05]
+15B5; [74 1D 27, 05, 05]
 
-15C3; [77 B8 E0, 05, 05]
+15B6; [74 1D 2F, 05, 05]
 
-15C4; [77 B8 E8, 05, 05]
+15B7; [74 1D 37, 05, 05]
 
-15C5; [77 B8 F0, 05, 05]
+15B8; [74 1D 3F, 05, 05]
 
-15C6; [77 B8 F8, 05, 05]
+15B9; [74 1D 47, 05, 05]
 
-15C7; [77 B9 06, 05, 05]
+15BA; [74 1D 4F, 05, 05]
 
-15C8; [77 B9 0E, 05, 05]
+15BB; [74 1D 57, 05, 05]
 
-15C9; [77 B9 16, 05, 05]
+15BC; [74 1D 5F, 05, 05]
 
-15CA; [77 B9 1E, 05, 05]
+15BD; [74 1D 67, 05, 05]
 
-15CB; [77 B9 26, 05, 05]
+15BE; [74 1D 6F, 05, 05]
 
-15CC; [77 B9 2E, 05, 05]
+15BF; [74 1D 77, 05, 05]
 
-15CD; [77 B9 36, 05, 05]
+15C0; [74 1D 7F, 05, 05]
 
-15CE; [77 B9 3E, 05, 05]
+15C1; [74 1D 87, 05, 05]
 
-15CF; [77 B9 46, 05, 05]
+15C2; [74 1D 8F, 05, 05]
 
-15D0; [77 B9 4E, 05, 05]
+15C3; [74 1D 97, 05, 05]
 
-15D1; [77 B9 56, 05, 05]
+15C4; [74 1D 9F, 05, 05]
 
-15D2; [77 B9 5E, 05, 05]
+15C5; [74 1D A7, 05, 05]
 
-15D3; [77 B9 66, 05, 05]
+15C6; [74 1D AF, 05, 05]
 
-15D4; [77 B9 6E, 05, 05]
+15C7; [74 1D B7, 05, 05]
 
-15D5; [77 B9 76, 05, 05]
+15C8; [74 1D BF, 05, 05]
 
-15D6; [77 B9 7E, 05, 05]
+15C9; [74 1D C7, 05, 05]
 
-15D7; [77 B9 86, 05, 05]
+15CA; [74 1D CF, 05, 05]
 
-15D8; [77 B9 8E, 05, 05]
+15CB; [74 1D D7, 05, 05]
 
-15D9; [77 B9 96, 05, 05]
+15CC; [74 1D DF, 05, 05]
 
-15DA; [77 B9 9E, 05, 05]
+15CD; [74 1D E7, 05, 05]
 
-15DB; [77 B9 A6, 05, 05]
+15CE; [74 1D EF, 05, 05]
 
-15DC; [77 B9 AE, 05, 05]
+15CF; [74 1D F7, 05, 05]
 
-15DD; [77 B9 B6, 05, 05]
+15D0; [74 1D FF, 05, 05]
 
-15DE; [77 B9 BE, 05, 05]
+15D1; [74 1E 09, 05, 05]
 
-15DF; [77 B9 C6, 05, 05]
+15D2; [74 1E 11, 05, 05]
 
-15E0; [77 B9 CE, 05, 05]
+15D3; [74 1E 19, 05, 05]
 
-15E1; [77 B9 D6, 05, 05]
+15D4; [74 1E 21, 05, 05]
 
-15E2; [77 B9 DE, 05, 05]
+15D5; [74 1E 29, 05, 05]
 
-15E3; [77 B9 E6, 05, 05]
+15D6; [74 1E 31, 05, 05]
 
-15E4; [77 B9 EE, 05, 05]
+15D7; [74 1E 39, 05, 05]
 
-15E5; [77 B9 F6, 05, 05]
+15D8; [74 1E 41, 05, 05]
 
-15E6; [77 BA 04, 05, 05]
+15D9; [74 1E 49, 05, 05]
 
-15E7; [77 BA 0C, 05, 05]
+15DA; [74 1E 51, 05, 05]
 
-15E8; [77 BA 14, 05, 05]
+15DB; [74 1E 59, 05, 05]
 
-15E9; [77 BA 1C, 05, 05]
+15DC; [74 1E 61, 05, 05]
 
-15EA; [77 BA 24, 05, 05]
+15DD; [74 1E 69, 05, 05]
 
-15EB; [77 BA 2C, 05, 05]
+15DE; [74 1E 71, 05, 05]
 
-15EC; [77 BA 34, 05, 05]
+15DF; [74 1E 79, 05, 05]
 
-15ED; [77 BA 3C, 05, 05]
+15E0; [74 1E 81, 05, 05]
 
-15EE; [77 BA 44, 05, 05]
+15E1; [74 1E 89, 05, 05]
 
-15EF; [77 BA 4C, 05, 05]
+15E2; [74 1E 91, 05, 05]
 
-15F0; [77 BA 54, 05, 05]
+15E3; [74 1E 99, 05, 05]
 
-15F1; [77 BA 5C, 05, 05]
+15E4; [74 1E A1, 05, 05]
 
-15F2; [77 BA 64, 05, 05]
+15E5; [74 1E A9, 05, 05]
 
-15F3; [77 BA 6C, 05, 05]
+15E6; [74 1E B1, 05, 05]
 
-15F4; [77 BA 74, 05, 05]
+15E7; [74 1E B9, 05, 05]
 
-15F5; [77 BA 7C, 05, 05]
+15E8; [74 1E C1, 05, 05]
 
-15F6; [77 BA 84, 05, 05]
+15E9; [74 1E C9, 05, 05]
 
-15F7; [77 BA 8C, 05, 05]
+15EA; [74 1E D1, 05, 05]
 
-15F8; [77 BA 94, 05, 05]
+15EB; [74 1E D9, 05, 05]
 
-15F9; [77 BA 9C, 05, 05]
+15EC; [74 1E E1, 05, 05]
 
-15FA; [77 BA A4, 05, 05]
+15ED; [74 1E E9, 05, 05]
 
-15FB; [77 BA AC, 05, 05]
+15EE; [74 1E F1, 05, 05]
 
-15FC; [77 BA B4, 05, 05]
+15EF; [74 1E F9, 05, 05]
 
-15FD; [77 BA BC, 05, 05]
+15F0; [74 1F 03, 05, 05]
 
-15FE; [77 BA C4, 05, 05]
+15F1; [74 1F 0B, 05, 05]
 
-15FF; [77 BA CC, 05, 05]
+15F2; [74 1F 13, 05, 05]
 
-1600; [77 BA D4, 05, 05]
+15F3; [74 1F 1B, 05, 05]
 
-1601; [77 BA DC, 05, 05]
+15F4; [74 1F 23, 05, 05]
 
-1602; [77 BA E4, 05, 05]
+15F5; [74 1F 2B, 05, 05]
 
-1603; [77 BA EC, 05, 05]
+15F6; [74 1F 33, 05, 05]
 
-1604; [77 BA F4, 05, 05]
+15F7; [74 1F 3B, 05, 05]
 
-1605; [77 BA FC, 05, 05]
+15F8; [74 1F 43, 05, 05]
 
-1606; [77 BB 0A, 05, 05]
+15F9; [74 1F 4B, 05, 05]
 
-1607; [77 BB 12, 05, 05]
+15FA; [74 1F 53, 05, 05]
 
-1608; [77 BB 1A, 05, 05]
+15FB; [74 1F 5B, 05, 05]
 
-1609; [77 BB 22, 05, 05]
+15FC; [74 1F 63, 05, 05]
 
-160A; [77 BB 2A, 05, 05]
+15FD; [74 1F 6B, 05, 05]
 
-160B; [77 BB 32, 05, 05]
+15FE; [74 1F 73, 05, 05]
 
-160C; [77 BB 3A, 05, 05]
+15FF; [74 1F 7B, 05, 05]
 
-160D; [77 BB 42, 05, 05]
+1600; [74 1F 83, 05, 05]
 
-160E; [77 BB 4A, 05, 05]
+1601; [74 1F 8B, 05, 05]
 
-160F; [77 BB 52, 05, 05]
+1602; [74 1F 93, 05, 05]
 
-1610; [77 BB 5A, 05, 05]
+1603; [74 1F 9B, 05, 05]
 
-1611; [77 BB 62, 05, 05]
+1604; [74 1F A3, 05, 05]
 
-1612; [77 BB 6A, 05, 05]
+1605; [74 1F AB, 05, 05]
 
-1613; [77 BB 72, 05, 05]
+1606; [74 1F B3, 05, 05]
 
-1614; [77 BB 7A, 05, 05]
+1607; [74 1F BB, 05, 05]
 
-1615; [77 BB 82, 05, 05]
+1608; [74 1F C3, 05, 05]
 
-1616; [77 BB 8A, 05, 05]
+1609; [74 1F CB, 05, 05]
 
-1617; [77 BB 92, 05, 05]
+160A; [74 1F D3, 05, 05]
 
-1618; [77 BB 9A, 05, 05]
+160B; [74 1F DB, 05, 05]
 
-1619; [77 BB A2, 05, 05]
+160C; [74 1F E3, 05, 05]
 
-161A; [77 BB AA, 05, 05]
+160D; [74 1F EB, 05, 05]
 
-161B; [77 BB B2, 05, 05]
+160E; [74 1F F3, 05, 05]
 
-161C; [77 BB BA, 05, 05]
+160F; [74 1F FB, 05, 05]
 
-161D; [77 BB C2, 05, 05]
+1610; [74 20 05, 05, 05]
 
-161E; [77 BB CA, 05, 05]
+1611; [74 20 0D, 05, 05]
 
-161F; [77 BB D2, 05, 05]
+1612; [74 20 15, 05, 05]
 
-1620; [77 BB DA, 05, 05]
+1613; [74 20 1D, 05, 05]
 
-1621; [77 BB E2, 05, 05]
+1614; [74 20 25, 05, 05]
 
-1622; [77 BB EA, 05, 05]
+1615; [74 20 2D, 05, 05]
 
-1623; [77 BB F2, 05, 05]
+1616; [74 20 35, 05, 05]
 
-1624; [77 BB FA, 05, 05]
+1617; [74 20 3D, 05, 05]
 
-1625; [77 BC 08, 05, 05]
+1618; [74 20 45, 05, 05]
 
-1626; [77 BC 10, 05, 05]
+1619; [74 20 4D, 05, 05]
 
-1627; [77 BC 18, 05, 05]
+161A; [74 20 55, 05, 05]
 
-1628; [77 BC 20, 05, 05]
+161B; [74 20 5D, 05, 05]
 
-1629; [77 BC 28, 05, 05]
+161C; [74 20 65, 05, 05]
 
-162A; [77 BC 30, 05, 05]
+161D; [74 20 6D, 05, 05]
 
-162B; [77 BC 38, 05, 05]
+161E; [74 20 75, 05, 05]
 
-162C; [77 BC 40, 05, 05]
+161F; [74 20 7D, 05, 05]
 
-162D; [77 BC 48, 05, 05]
+1620; [74 20 85, 05, 05]
 
-162E; [77 BC 50, 05, 05]
+1621; [74 20 8D, 05, 05]
 
-162F; [77 BC 58, 05, 05]
+1622; [74 20 95, 05, 05]
 
-1630; [77 BC 60, 05, 05]
+1623; [74 20 9D, 05, 05]
 
-1631; [77 BC 68, 05, 05]
+1624; [74 20 A5, 05, 05]
 
-1632; [77 BC 70, 05, 05]
+1625; [74 20 AD, 05, 05]
 
-1633; [77 BC 78, 05, 05]
+1626; [74 20 B5, 05, 05]
 
-1634; [77 BC 80, 05, 05]
+1627; [74 20 BD, 05, 05]
 
-1635; [77 BC 88, 05, 05]
+1628; [74 20 C5, 05, 05]
 
-1636; [77 BC 90, 05, 05]
+1629; [74 20 CD, 05, 05]
 
-1637; [77 BC 98, 05, 05]
+162A; [74 20 D5, 05, 05]
 
-1638; [77 BC A0, 05, 05]
+162B; [74 20 DD, 05, 05]
 
-1639; [77 BC A8, 05, 05]
+162C; [74 20 E5, 05, 05]
 
-163A; [77 BC B0, 05, 05]
+162D; [74 20 ED, 05, 05]
 
-163B; [77 BC B8, 05, 05]
+162E; [74 20 F5, 05, 05]
 
-163C; [77 BC C0, 05, 05]
+162F; [74 20 FD, 05, 05]
 
-163D; [77 BC C8, 05, 05]
+1630; [74 21 07, 05, 05]
 
-163E; [77 BC D0, 05, 05]
+1631; [74 21 0F, 05, 05]
 
-163F; [77 BC D8, 05, 05]
+1632; [74 21 17, 05, 05]
 
-1640; [77 BC E0, 05, 05]
+1633; [74 21 1F, 05, 05]
 
-1641; [77 BC E8, 05, 05]
+1634; [74 21 27, 05, 05]
 
-1642; [77 BC F0, 05, 05]
+1635; [74 21 2F, 05, 05]
 
-1643; [77 BC F8, 05, 05]
+1636; [74 21 37, 05, 05]
 
-1644; [77 BD 06, 05, 05]
+1637; [74 21 3F, 05, 05]
 
-1645; [77 BD 0E, 05, 05]
+1638; [74 21 47, 05, 05]
 
-1646; [77 BD 16, 05, 05]
+1639; [74 21 4F, 05, 05]
 
-1647; [77 BD 1E, 05, 05]
+163A; [74 21 57, 05, 05]
 
-1648; [77 BD 26, 05, 05]
+163B; [74 21 5F, 05, 05]
 
-1649; [77 BD 2E, 05, 05]
+163C; [74 21 67, 05, 05]
 
-164A; [77 BD 36, 05, 05]
+163D; [74 21 6F, 05, 05]
 
-164B; [77 BD 3E, 05, 05]
+163E; [74 21 77, 05, 05]
 
-164C; [77 BD 46, 05, 05]
+163F; [74 21 7F, 05, 05]
 
-164D; [77 BD 4E, 05, 05]
+1640; [74 21 87, 05, 05]
 
-164E; [77 BD 56, 05, 05]
+1641; [74 21 8F, 05, 05]
 
-164F; [77 BD 5E, 05, 05]
+1642; [74 21 97, 05, 05]
 
-1650; [77 BD 66, 05, 05]
+1643; [74 21 9F, 05, 05]
 
-1651; [77 BD 6E, 05, 05]
+1644; [74 21 A7, 05, 05]
 
-1652; [77 BD 76, 05, 05]
+1645; [74 21 AF, 05, 05]
 
-1653; [77 BD 7E, 05, 05]
+1646; [74 21 B7, 05, 05]
 
-1654; [77 BD 86, 05, 05]
+1647; [74 21 BF, 05, 05]
 
-1655; [77 BD 8E, 05, 05]
+1648; [74 21 C7, 05, 05]
 
-1656; [77 BD 96, 05, 05]
+1649; [74 21 CF, 05, 05]
 
-1657; [77 BD 9E, 05, 05]
+164A; [74 21 D7, 05, 05]
 
-1658; [77 BD A6, 05, 05]
+164B; [74 21 DF, 05, 05]
 
-1659; [77 BD AE, 05, 05]
+164C; [74 21 E7, 05, 05]
 
-165A; [77 BD B6, 05, 05]
+164D; [74 21 EF, 05, 05]
 
-165B; [77 BD BE, 05, 05]
+164E; [74 21 F7, 05, 05]
 
-165C; [77 BD C6, 05, 05]
+164F; [74 21 FF, 05, 05]
 
-165D; [77 BD CE, 05, 05]
+1650; [74 22 09, 05, 05]
 
-165E; [77 BD D6, 05, 05]
+1651; [74 22 11, 05, 05]
 
-165F; [77 BD DE, 05, 05]
+1652; [74 22 19, 05, 05]
 
-1660; [77 BD E6, 05, 05]
+1653; [74 22 21, 05, 05]
 
-1661; [77 BD EE, 05, 05]
+1654; [74 22 29, 05, 05]
 
-1662; [77 BD F6, 05, 05]
+1655; [74 22 31, 05, 05]
 
-1663; [77 BE 04, 05, 05]
+1656; [74 22 39, 05, 05]
 
-1664; [77 BE 0C, 05, 05]
+1657; [74 22 41, 05, 05]
 
-1665; [77 BE 14, 05, 05]
+1658; [74 22 49, 05, 05]
 
-1666; [77 BE 1C, 05, 05]
+1659; [74 22 51, 05, 05]
 
-1667; [77 BE 24, 05, 05]
+165A; [74 22 59, 05, 05]
 
-1668; [77 BE 2C, 05, 05]
+165B; [74 22 61, 05, 05]
 
-1669; [77 BE 34, 05, 05]
+165C; [74 22 69, 05, 05]
 
-166A; [77 BE 3C, 05, 05]
+165D; [74 22 71, 05, 05]
 
-166B; [77 BE 44, 05, 05]
+165E; [74 22 79, 05, 05]
 
-166C; [77 BE 4C, 05, 05]
+165F; [74 22 81, 05, 05]
 
-1677; [77 BE 54, 05, 05]
+1660; [74 22 89, 05, 05]
 
-1678; [77 BE 5C, 05, 05]
+1661; [74 22 91, 05, 05]
 
-1679; [77 BE 64, 05, 05]
+1662; [74 22 99, 05, 05]
 
-167A; [77 BE 6C, 05, 05]
+1663; [74 22 A1, 05, 05]
 
-167B; [77 BE 74, 05, 05]
+1664; [74 22 A9, 05, 05]
 
-167C; [77 BE 7C, 05, 05]
+1665; [74 22 B1, 05, 05]
 
-167D; [77 BE 84, 05, 05]
+1666; [74 22 B9, 05, 05]
 
-167E; [77 BE 8C, 05, 05]
+1667; [74 22 C1, 05, 05]
 
-167F; [77 BE 94, 05, 05]
+1668; [74 22 C9, 05, 05]
 
-18B0; [77 BE 9C, 05, 05]
+1669; [74 22 D1, 05, 05]
 
-18B1; [77 BE A4, 05, 05]
+166A; [74 22 D9, 05, 05]
 
-18B2; [77 BE AC, 05, 05]
+166B; [74 22 E1, 05, 05]
 
-18B3; [77 BE B4, 05, 05]
+166C; [74 22 E9, 05, 05]
 
-18B4; [77 BE BC, 05, 05]
+1677; [74 22 F1, 05, 05]
 
-18B5; [77 BE C4, 05, 05]
+1678; [74 22 F9, 05, 05]
 
-18B6; [77 BE CC, 05, 05]
+1679; [74 23 03, 05, 05]
 
-18B7; [77 BE D4, 05, 05]
+167A; [74 23 0B, 05, 05]
 
-18B8; [77 BE DC, 05, 05]
+167B; [74 23 13, 05, 05]
 
-18B9; [77 BE E4, 05, 05]
+167C; [74 23 1B, 05, 05]
 
-18BA; [77 BE EC, 05, 05]
+167D; [74 23 23, 05, 05]
 
-18BB; [77 BE F4, 05, 05]
+167E; [74 23 2B, 05, 05]
 
-18BC; [77 BE FC, 05, 05]
+167F; [74 23 33, 05, 05]
 
-18BD; [77 BF 0A, 05, 05]
+18B0; [74 23 3B, 05, 05]
 
-18BE; [77 BF 12, 05, 05]
+18B1; [74 23 43, 05, 05]
 
-18BF; [77 BF 1A, 05, 05]
+18B2; [74 23 4B, 05, 05]
 
-18C0; [77 BF 22, 05, 05]
+18B3; [74 23 53, 05, 05]
 
-18C1; [77 BF 2A, 05, 05]
+18B4; [74 23 5B, 05, 05]
 
-18C2; [77 BF 32, 05, 05]
+18B5; [74 23 63, 05, 05]
 
-18C3; [77 BF 3A, 05, 05]
+18B6; [74 23 6B, 05, 05]
 
-18C4; [77 BF 42, 05, 05]
+18B7; [74 23 73, 05, 05]
 
-18C5; [77 BF 4A, 05, 05]
+18B8; [74 23 7B, 05, 05]
 
-18C6; [77 BF 52, 05, 05]
+18B9; [74 23 83, 05, 05]
 
-18C7; [77 BF 5A, 05, 05]
+18BA; [74 23 8B, 05, 05]
 
-18C8; [77 BF 62, 05, 05]
+18BB; [74 23 93, 05, 05]
 
-18C9; [77 BF 6A, 05, 05]
+18BC; [74 23 9B, 05, 05]
 
-18CA; [77 BF 72, 05, 05]
+18BD; [74 23 A3, 05, 05]
 
-18CB; [77 BF 7A, 05, 05]
+18BE; [74 23 AB, 05, 05]
 
-18CC; [77 BF 82, 05, 05]
+18BF; [74 23 B3, 05, 05]
 
-18CD; [77 BF 8A, 05, 05]
+18C0; [74 23 BB, 05, 05]
 
-18CE; [77 BF 92, 05, 05]
+18C1; [74 23 C3, 05, 05]
 
-18CF; [77 BF 9A, 05, 05]
+18C2; [74 23 CB, 05, 05]
 
-18D0; [77 BF A2, 05, 05]
+18C3; [74 23 D3, 05, 05]
 
-18D1; [77 BF AA, 05, 05]
+18C4; [74 23 DB, 05, 05]
 
-18D2; [77 BF B2, 05, 05]
+18C5; [74 23 E3, 05, 05]
 
-18D3; [77 BF BA, 05, 05]
+18C6; [74 23 EB, 05, 05]
 
-18D4; [77 BF C2, 05, 05]
+18C7; [74 23 F3, 05, 05]
 
-18D5; [77 BF CA, 05, 05]
+18C8; [74 23 FB, 05, 05]
 
-18D6; [77 BF D2, 05, 05]
+18C9; [74 24 05, 05, 05]
 
-18D7; [77 BF DA, 05, 05]
+18CA; [74 24 0D, 05, 05]
 
-18D8; [77 BF E2, 05, 05]
+18CB; [74 24 15, 05, 05]
 
-18D9; [77 BF EA, 05, 05]
+18CC; [74 24 1D, 05, 05]
 
-18DA; [77 BF F2, 05, 05]
+18CD; [74 24 25, 05, 05]
 
-18DB; [77 BF FA, 05, 05]
+18CE; [74 24 2D, 05, 05]
 
-18DC; [77 C0 08, 05, 05]
+18CF; [74 24 35, 05, 05]
 
-18DD; [77 C0 10, 05, 05]
+18D0; [74 24 3D, 05, 05]
 
-18DE; [77 C0 18, 05, 05]
+18D1; [74 24 45, 05, 05]
 
-18DF; [77 C0 20, 05, 05]
+18D2; [74 24 4D, 05, 05]
 
-18E0; [77 C0 28, 05, 05]
+18D3; [74 24 55, 05, 05]
 
-18E1; [77 C0 30, 05, 05]
+18D4; [74 24 5D, 05, 05]
 
-18E2; [77 C0 38, 05, 05]
+18D5; [74 24 65, 05, 05]
 
-18E3; [77 C0 40, 05, 05]
+18D6; [74 24 6D, 05, 05]
 
-18E4; [77 C0 48, 05, 05]
+18D7; [74 24 75, 05, 05]
 
-18E5; [77 C0 50, 05, 05]
+18D8; [74 24 7D, 05, 05]
 
-18E6; [77 C0 58, 05, 05]
+18D9; [74 24 85, 05, 05]
 
-18E7; [77 C0 60, 05, 05]
+18DA; [74 24 8D, 05, 05]
 
-18E8; [77 C0 68, 05, 05]
+18DB; [74 24 95, 05, 05]
 
-18E9; [77 C0 70, 05, 05]
+18DC; [74 24 9D, 05, 05]
 
-18EA; [77 C0 78, 05, 05]
+18DD; [74 24 A5, 05, 05]
 
-18EB; [77 C0 80, 05, 05]
+18DE; [74 24 AD, 05, 05]
 
-18EC; [77 C0 88, 05, 05]
+18DF; [74 24 B5, 05, 05]
 
-18ED; [77 C0 90, 05, 05]
+18E0; [74 24 BD, 05, 05]
 
-18EE; [77 C0 98, 05, 05]
+18E1; [74 24 C5, 05, 05]
 
-18EF; [77 C0 A0, 05, 05]
+18E2; [74 24 CD, 05, 05]
 
-18F0; [77 C0 A8, 05, 05]
+18E3; [74 24 D5, 05, 05]
 
-18F1; [77 C0 B0, 05, 05]
+18E4; [74 24 DD, 05, 05]
 
-18F2; [77 C0 B8, 05, 05]
+18E5; [74 24 E5, 05, 05]
 
-18F3; [77 C0 C0, 05, 05]
+18E6; [74 24 ED, 05, 05]
 
-18F4; [77 C0 C8, 05, 05]
+18E7; [74 24 F5, 05, 05]
 
-18F5; [77 C0 D0, 05, 05]
+18E8; [74 24 FD, 05, 05]
 
-1681; [77 C0 D8, 05, 05]
+18E9; [74 25 07, 05, 05]
 
-1682; [77 C0 E0, 05, 05]
+18EA; [74 25 0F, 05, 05]
 
-1683; [77 C0 E8, 05, 05]
+18EB; [74 25 17, 05, 05]
 
-1684; [77 C0 F0, 05, 05]
+18EC; [74 25 1F, 05, 05]
 
-1685; [77 C0 F8, 05, 05]
+18ED; [74 25 27, 05, 05]
 
-1686; [77 C1 06, 05, 05]
+18EE; [74 25 2F, 05, 05]
 
-1687; [77 C1 0E, 05, 05]
+18EF; [74 25 37, 05, 05]
 
-1688; [77 C1 16, 05, 05]
+18F0; [74 25 3F, 05, 05]
 
-1689; [77 C1 1E, 05, 05]
+18F1; [74 25 47, 05, 05]
 
-168A; [77 C1 26, 05, 05]
+18F2; [74 25 4F, 05, 05]
 
-168B; [77 C1 2E, 05, 05]
+18F3; [74 25 57, 05, 05]
 
-168C; [77 C1 36, 05, 05]
+18F4; [74 25 5F, 05, 05]
 
-168D; [77 C1 3E, 05, 05]
+18F5; [74 25 67, 05, 05]
 
-168E; [77 C1 46, 05, 05]
+FDD1 168F;     [74 25 90, 05, 05]      # OGHAM first primary
 
-168F; [77 C1 4E, 05, 05]
+1681; [74 25 B9, 05, 05]
 
-1690; [77 C1 56, 05, 05]
+1682; [74 25 C1, 05, 05]
 
-1691; [77 C1 5E, 05, 05]
+1683; [74 25 C9, 05, 05]
 
-1692; [77 C1 66, 05, 05]
+1684; [74 25 D1, 05, 05]
 
-1693; [77 C1 6E, 05, 05]
+1685; [74 25 D9, 05, 05]
 
-1694; [77 C1 76, 05, 05]
+1686; [74 25 E1, 05, 05]
 
-1695; [77 C1 7E, 05, 05]
+1687; [74 25 E9, 05, 05]
 
-1696; [77 C1 86, 05, 05]
+1688; [74 25 F1, 05, 05]
 
-1697; [77 C1 8E, 05, 05]
+1689; [74 25 F9, 05, 05]
 
-1698; [77 C1 96, 05, 05]
+168A; [74 26 03, 05, 05]
 
-1699; [77 C1 9E, 05, 05]
+168B; [74 26 0B, 05, 05]
 
-169A; [77 C1 A6, 05, 05]
+168C; [74 26 13, 05, 05]
 
-16A0; [77 C1 AE, 05, 05]
-16A1; [77 C1 AE, 05, 09][, DB A9, 09]
+168D; [74 26 1B, 05, 05]
 
-16A2; [77 C1 B6, 05, 05]
-16A4; [77 C1 B6, 05, 09][, DB A9, 09]
-16A5; [77 C1 B6, 05, 09][, DB B9, 09]
+168E; [74 26 23, 05, 05]
 
-16A6; [77 C1 BE, 05, 05]
-16A7; [77 C1 BE, 05, 09][, DB A9, 09]
-16F0; [77 C1 BE, 05, 09][77 C1 BE, 05, 09]
+168F; [74 26 2B, 05, 05]
 
-16A8; [77 C1 C6, 05, 05]
-16A9; [77 C1 C6, 05, 09][, DB A9, 09]
-16AC; [77 C1 C6, 05, 09][, DB B9, 09]
-16AD; [77 C1 C6, 05, 09][, DB C9, 09]
-16AE; [77 C1 C6, 05, 09][, DB D9, 09]
+1690; [74 26 33, 05, 05]
 
-16AF; [77 C1 CE, 05, 05]
+1691; [74 26 3B, 05, 05]
 
-16B0; [77 C1 D6, 05, 05]
+1692; [74 26 43, 05, 05]
 
-16B1; [77 C1 DE, 05, 05]
+1693; [74 26 4B, 05, 05]
 
-16B2; [77 C1 E6, 05, 05]
-16B3; [77 C1 E6, 05, 09][, DB A9, 09]
-16B4; [77 C1 E6, 05, 09][, DB B9, 09]
-16B5; [77 C1 E6, 05, 09][, DB C9, 09]
-16B6; [77 C1 E6, 05, 09][, DB D9, 09]
+1694; [74 26 53, 05, 05]
 
-16B7; [77 C1 EE, 05, 05]
+1695; [74 26 5B, 05, 05]
 
-16B9; [77 C1 F6, 05, 05]
-16E9; [77 C1 F6, 05, 09][, DB A9, 09]
+1696; [74 26 63, 05, 05]
 
-16BA; [77 C2 04, 05, 05]
-16BB; [77 C2 04, 05, 09][, DB A9, 09]
-16BC; [77 C2 04, 05, 09][, DB B9, 09]
-16BD; [77 C2 04, 05, 09][, DB C9, 09]
+1697; [74 26 6B, 05, 05]
 
-16BE; [77 C2 0C, 05, 05]
-16BF; [77 C2 0C, 05, 09][, DB A9, 09]
-16C0; [77 C2 0C, 05, 09][, DB B9, 09]
+1698; [74 26 73, 05, 05]
 
-16C1; [77 C2 14, 05, 05]
-16C2; [77 C2 14, 05, 09][, DB A9, 09]
+1699; [74 26 7B, 05, 05]
 
-16C3; [77 C2 1C, 05, 05]
-16C4; [77 C2 1C, 05, 09][, DB A9, 09]
+169A; [74 26 83, 05, 05]
 
-16C5; [77 C2 24, 05, 05]
-16C6; [77 C2 24, 05, 09][, DB A9, 09]
-16EE; [77 C2 24, 05, 09][77 C2 6C, 05, 09]
+FDD1 16A0;     [74 26 AC, 05, 05]      # RUNIC first primary
 
-16C7; [77 C2 2C, 05, 05]
+16A0; [74 26 D5, 05, 05]
+16A1; [74 26 D5, 70, 20]
 
-16C8; [77 C2 34, 05, 05]
-16D5; [77 C2 34, 05, 09][, DB A9, 09]
+16A2; [74 26 DD, 05, 05]
+16A4; [74 26 DD, 70, 20]
+16A5; [74 26 DD, 78, 20]
 
-16C9; [77 C2 3C, 05, 05]
+16A6; [74 26 E5, 05, 05]
+16A7; [74 26 E5, 70, 20]
+16F0; [74 26 E5, 05, 20][74 26 E5, 05, 20]
 
-16CA; [77 C2 44, 05, 05]
-16CB; [77 C2 44, 05, 09][, DB A9, 09]
-16EA; [77 C2 44, 05, 09][, DB B9, 09]
-16CC; [77 C2 44, 05, 09][, DB C9, 09]
-16CD; [77 C2 44, 05, 09][, DB D9, 09]
-16CE; [77 C2 44, 05, 09][, DB E9, 09]
+16A8; [74 26 ED, 05, 05]
+16A9; [74 26 ED, 70, 20]
+16AC; [74 26 ED, 74, 20]
+16AD; [74 26 ED, 78, 20]
+16AE; [74 26 ED, 7C, 20]
 
-16CF; [77 C2 4C, 05, 05]
-16D0; [77 C2 4C, 05, 09][, DB A9, 09]
-16D1; [77 C2 4C, 05, 09][, DB B9, 09]
+16AF; [74 26 F5, 05, 05]
 
-16D2; [77 C2 54, 05, 05]
-16D3; [77 C2 54, 05, 09][, DB A9, 09]
-16D4; [77 C2 54, 05, 09][, DB B9, 09]
+16B0; [74 26 FD, 05, 05]
 
-16D6; [77 C2 5C, 05, 05]
+16B1; [74 27 07, 05, 05]
 
-16D7; [77 C2 64, 05, 05]
-16D8; [77 C2 64, 05, 09][, DB A9, 09]
-16D9; [77 C2 64, 05, 09][, DB B9, 09]
-16EF; [77 C2 64, 05, 09][, DB A9, 09][77 C2 64, 05, 09][, DB A9, 09]
+16B2; [74 27 0F, 05, 05]
+16B3; [74 27 0F, 70, 20]
+16B4; [74 27 0F, 74, 20]
+16B5; [74 27 0F, 78, 20]
+16B6; [74 27 0F, 7C, 20]
 
-16DA; [77 C2 6C, 05, 05]
-16DB; [77 C2 6C, 05, 09][, DB A9, 09]
+16B7; [74 27 17, 05, 05]
 
-16DC; [77 C2 74, 05, 05]
-16DD; [77 C2 74, 05, 09][, DB A9, 09]
+16B9; [74 27 1F, 05, 05]
+16E9; [74 27 1F, 70, 20]
 
-16DE; [77 C2 7C, 05, 05]
+16BA; [74 27 27, 05, 05]
+16BB; [74 27 27, 70, 20]
+16BC; [74 27 27, 75, 20]
+16BD; [74 27 27, 7A, 20]
 
-16DF; [77 C2 84, 05, 05]
+16BE; [74 27 2F, 05, 05]
+16BF; [74 27 2F, 70, 20]
+16C0; [74 27 2F, 78, 20]
 
-16AA; [77 C2 8C, 05, 05]
+16C1; [74 27 37, 05, 05]
+16C2; [74 27 37, 70, 20]
 
-16AB; [77 C2 94, 05, 05]
+16C3; [74 27 3F, 05, 05]
+16C4; [74 27 3F, 70, 20]
 
-16A3; [77 C2 9C, 05, 05]
+16C5; [74 27 47, 05, 05]
+16C6; [74 27 47, 70, 20]
+16EE; [74 27 47, 05, 20][74 27 8F, 05, 20]
 
-16E0; [77 C2 A4, 05, 05]
+16C7; [74 27 4F, 05, 05]
 
-16E3; [77 C2 AC, 05, 05]
+16C8; [74 27 57, 05, 05]
+16D5; [74 27 57, 70, 20]
 
-16B8; [77 C2 B4, 05, 05]
+16C9; [74 27 5F, 05, 05]
 
-16E4; [77 C2 BC, 05, 05]
+16CA; [74 27 67, 05, 05]
+16CB; [74 27 67, 70, 20]
+16EA; [74 27 67, 73, 20]
+16CC; [74 27 67, 76, 20]
+16CD; [74 27 67, 79, 20]
+16CE; [74 27 67, 7C, 20]
 
-16E1; [77 C2 C4, 05, 05]
+16CF; [74 27 6F, 05, 05]
+16D0; [74 27 6F, 70, 20]
+16D1; [74 27 6F, 78, 20]
 
-16E2; [77 C2 CC, 05, 05]
+16D2; [74 27 77, 05, 05]
+16D3; [74 27 77, 70, 20]
+16D4; [74 27 77, 78, 20]
 
-16E5; [77 C2 D4, 05, 05]
+16D6; [74 27 7F, 05, 05]
 
-16E6; [77 C2 DC, 05, 05]
-16E7; [77 C2 DC, 05, 09][, DB A9, 09]
-16E8; [77 C2 DC, 05, 09][, DB B9, 09]
+16D7; [74 27 87, 05, 05]
+16D8; [74 27 87, 70, 20]
+16D9; [74 27 87, 78, 20]
+16EF; [74 27 87, 70, 20][74 27 87, 70, 20]
 
-10C00; [77 C2 E4, 05, 05]
-10C01; [77 C2 E4, 05, 09][, DB A9, 09]
+16DA; [74 27 8F, 05, 05]
+16DB; [74 27 8F, 70, 20]
 
-10C02; [77 C2 EC, 05, 05]
+16DC; [74 27 97, 05, 05]
+16DD; [74 27 97, 70, 20]
 
-10C03; [77 C2 F4, 05, 05]
-10C04; [77 C2 F4, 05, 09][, DB A9, 09]
+16DE; [74 27 9F, 05, 05]
 
-10C05; [77 C2 FC, 05, 05]
+16DF; [74 27 A7, 05, 05]
 
-10C06; [77 C3 0A, 05, 05]
+16AA; [74 27 AF, 05, 05]
 
-10C07; [77 C3 12, 05, 05]
-10C08; [77 C3 12, 05, 09][, DB A9, 09]
+16AB; [74 27 B7, 05, 05]
 
-10C09; [77 C3 1A, 05, 05]
-10C0A; [77 C3 1A, 05, 09][, DB A9, 09]
+16A3; [74 27 BF, 05, 05]
 
-10C0B; [77 C3 22, 05, 05]
-10C0C; [77 C3 22, 05, 09][, DB A9, 09]
+16E0; [74 27 C7, 05, 05]
 
-10C0D; [77 C3 2A, 05, 05]
-10C0E; [77 C3 2A, 05, 09][, DB A9, 09]
+16E3; [74 27 CF, 05, 05]
 
-10C0F; [77 C3 32, 05, 05]
-10C10; [77 C3 32, 05, 09][, DB A9, 09]
+16B8; [74 27 D7, 05, 05]
 
-10C11; [77 C3 3A, 05, 05]
-10C12; [77 C3 3A, 05, 09][, DB A9, 09]
+16E4; [74 27 DF, 05, 05]
 
-10C13; [77 C3 42, 05, 05]
+16E1; [74 27 E7, 05, 05]
 
-10C14; [77 C3 4A, 05, 05]
-10C15; [77 C3 4A, 05, 09][, DB A9, 09]
+16E2; [74 27 EF, 05, 05]
 
-10C16; [77 C3 52, 05, 05]
-10C17; [77 C3 52, 05, 09][, DB A9, 09]
+16E5; [74 27 F7, 05, 05]
 
-10C18; [77 C3 5A, 05, 05]
-10C19; [77 C3 5A, 05, 09][, DB A9, 09]
+16E6; [74 27 FF, 05, 05]
+16E7; [74 27 FF, 70, 20]
+16E8; [74 27 FF, 78, 20]
 
-10C1A; [77 C3 62, 05, 05]
-10C1B; [77 C3 62, 05, 09][, DB A9, 09]
+FDD1 10C00;    [74 28 2A, 05, 05]      # Old Turkic first primary
 
-10C1C; [77 C3 6A, 05, 05]
-10C1D; [77 C3 6A, 05, 09][, DB A9, 09]
+10C00; [74 28 53, 05, 05]
+10C01; [74 28 53, 70, 20]
 
-10C1E; [77 C3 72, 05, 05]
-10C1F; [77 C3 72, 05, 09][, DB A9, 09]
+10C02; [74 28 5B, 05, 05]
 
-10C20; [77 C3 7A, 05, 05]
+10C03; [74 28 63, 05, 05]
+10C04; [74 28 63, 70, 20]
 
-10C21; [77 C3 82, 05, 05]
+10C05; [74 28 6B, 05, 05]
 
-10C22; [77 C3 8A, 05, 05]
+10C06; [74 28 73, 05, 05]
 
-10C23; [77 C3 92, 05, 05]
+10C07; [74 28 7B, 05, 05]
+10C08; [74 28 7B, 70, 20]
 
-10C24; [77 C3 9A, 05, 05]
-10C25; [77 C3 9A, 05, 09][, DB A9, 09]
+10C09; [74 28 83, 05, 05]
+10C0A; [74 28 83, 70, 20]
 
-10C26; [77 C3 A2, 05, 05]
-10C27; [77 C3 A2, 05, 09][, DB A9, 09]
+10C0B; [74 28 8B, 05, 05]
+10C0C; [74 28 8B, 70, 20]
 
-10C28; [77 C3 AA, 05, 05]
-10C29; [77 C3 AA, 05, 09][, DB A9, 09]
+10C0D; [74 28 93, 05, 05]
+10C0E; [74 28 93, 70, 20]
 
-10C2A; [77 C3 B2, 05, 05]
-10C2B; [77 C3 B2, 05, 09][, DB A9, 09]
+10C0F; [74 28 9B, 05, 05]
+10C10; [74 28 9B, 70, 20]
 
-10C2C; [77 C3 BA, 05, 05]
+10C11; [74 28 A3, 05, 05]
+10C12; [74 28 A3, 70, 20]
 
-10C2D; [77 C3 C2, 05, 05]
-10C2E; [77 C3 C2, 05, 09][, DB A9, 09]
+10C13; [74 28 AB, 05, 05]
 
-10C2F; [77 C3 CA, 05, 05]
+10C14; [74 28 B3, 05, 05]
+10C15; [74 28 B3, 70, 20]
 
-10C30; [77 C3 D2, 05, 05]
+10C16; [74 28 BB, 05, 05]
+10C17; [74 28 BB, 70, 20]
 
-10C31; [77 C3 DA, 05, 05]
+10C18; [74 28 C3, 05, 05]
+10C19; [74 28 C3, 70, 20]
 
-10C32; [77 C3 E2, 05, 05]
-10C33; [77 C3 E2, 05, 09][, DB A9, 09]
+10C1A; [74 28 CB, 05, 05]
+10C1B; [74 28 CB, 70, 20]
 
-10C34; [77 C3 EA, 05, 05]
-10C35; [77 C3 EA, 05, 09][, DB A9, 09]
+10C1C; [74 28 D3, 05, 05]
+10C1D; [74 28 D3, 70, 20]
 
-10C36; [77 C3 F2, 05, 05]
-10C37; [77 C3 F2, 05, 09][, DB A9, 09]
+10C1E; [74 28 DB, 05, 05]
+10C1F; [74 28 DB, 70, 20]
 
-10C38; [77 C3 FA, 05, 05]
-10C39; [77 C3 FA, 05, 09][, DB A9, 09]
+10C20; [74 28 E3, 05, 05]
 
-10C3A; [77 C4 08, 05, 05]
-10C3B; [77 C4 08, 05, 09][, DB A9, 09]
+10C21; [74 28 EB, 05, 05]
 
-10C3C; [77 C4 10, 05, 05]
+10C22; [74 28 F3, 05, 05]
 
-10C3D; [77 C4 18, 05, 05]
+10C23; [74 28 FB, 05, 05]
 
-10C3E; [77 C4 20, 05, 05]
+10C24; [74 29 05, 05, 05]
+10C25; [74 29 05, 70, 20]
 
-10C3F; [77 C4 28, 05, 05]
-10C40; [77 C4 28, 05, 09][, DB A9, 09]
+10C26; [74 29 0D, 05, 05]
+10C27; [74 29 0D, 70, 20]
 
-10C41; [77 C4 30, 05, 05]
-10C42; [77 C4 30, 05, 09][, DB A9, 09]
+10C28; [74 29 15, 05, 05]
+10C29; [74 29 15, 70, 20]
 
-10C43; [77 C4 38, 05, 05]
-10C44; [77 C4 38, 05, 09][, DB A9, 09]
+10C2A; [74 29 1D, 05, 05]
+10C2B; [74 29 1D, 70, 20]
 
-10C45; [77 C4 40, 05, 05]
-10C46; [77 C4 40, 05, 09][, DB A9, 09]
+10C2C; [74 29 25, 05, 05]
 
-10C47; [77 C4 48, 05, 05]
+10C2D; [74 29 2D, 05, 05]
+10C2E; [74 29 2D, 70, 20]
 
-10C48; [77 C4 50, 05, 05]
+10C2F; [74 29 35, 05, 05]
 
-A500; [77 C4 58, 05, 05]
+10C30; [74 29 3D, 05, 05]
 
-A501; [77 C4 60, 05, 05]
+10C31; [74 29 45, 05, 05]
 
-A502; [77 C4 68, 05, 05]
+10C32; [74 29 4D, 05, 05]
+10C33; [74 29 4D, 70, 20]
 
-A503; [77 C4 70, 05, 05]
+10C34; [74 29 55, 05, 05]
+10C35; [74 29 55, 70, 20]
 
-A504; [77 C4 78, 05, 05]
+10C36; [74 29 5D, 05, 05]
+10C37; [74 29 5D, 70, 20]
 
-A505; [77 C4 80, 05, 05]
+10C38; [74 29 65, 05, 05]
+10C39; [74 29 65, 70, 20]
 
-A506; [77 C4 88, 05, 05]
+10C3A; [74 29 6D, 05, 05]
+10C3B; [74 29 6D, 70, 20]
 
-A507; [77 C4 90, 05, 05]
+10C3C; [74 29 75, 05, 05]
 
-A508; [77 C4 98, 05, 05]
+10C3D; [74 29 7D, 05, 05]
 
-A509; [77 C4 A0, 05, 05]
+10C3E; [74 29 85, 05, 05]
 
-A50A; [77 C4 A8, 05, 05]
+10C3F; [74 29 8D, 05, 05]
+10C40; [74 29 8D, 70, 20]
 
-A50B; [77 C4 B0, 05, 05]
+10C41; [74 29 95, 05, 05]
+10C42; [74 29 95, 70, 20]
 
-A50C; [77 C4 B8, 05, 05]
-A613; [77 C4 B8, 05, 09][77 CC E0, 05, 09]
+10C43; [74 29 9D, 05, 05]
+10C44; [74 29 9D, 70, 20]
 
-A50D; [77 C4 C0, 05, 05]
+10C45; [74 29 A5, 05, 05]
+10C46; [74 29 A5, 70, 20]
 
-A50E; [77 C4 C8, 05, 05]
+10C47; [74 29 AD, 05, 05]
 
-A50F; [77 C4 D0, 05, 05]
+10C48; [74 29 B5, 05, 05]
 
-A510; [77 C4 D8, 05, 05]
+FDD1 A549;     [74 29 DE, 05, 05]      # Vai first primary
 
-A511; [77 C4 E0, 05, 05]
+A500; [74 2A 09, 05, 05]
 
-A512; [77 C4 E8, 05, 05]
+A501; [74 2A 11, 05, 05]
 
-A513; [77 C4 F0, 05, 05]
+A502; [74 2A 19, 05, 05]
 
-A514; [77 C4 F8, 05, 05]
+A503; [74 2A 21, 05, 05]
 
-A515; [77 C5 06, 05, 05]
+A504; [74 2A 29, 05, 05]
 
-A516; [77 C5 0E, 05, 05]
+A505; [74 2A 31, 05, 05]
 
-A517; [77 C5 16, 05, 05]
+A506; [74 2A 39, 05, 05]
 
-A518; [77 C5 1E, 05, 05]
+A507; [74 2A 41, 05, 05]
 
-A519; [77 C5 26, 05, 05]
+A508; [74 2A 49, 05, 05]
 
-A51A; [77 C5 2E, 05, 05]
+A509; [74 2A 51, 05, 05]
 
-A51B; [77 C5 36, 05, 05]
+A50A; [74 2A 59, 05, 05]
 
-A51C; [77 C5 3E, 05, 05]
+A50B; [74 2A 61, 05, 05]
 
-A51D; [77 C5 46, 05, 05]
+A50C; [74 2A 69, 05, 05]
+A613; [74 2A 69, 05, 20][74 32 71, 05, 20]
 
-A51E; [77 C5 4E, 05, 05]
-A614; [77 C5 4E, 05, 09][77 CC E0, 05, 09]
+A50D; [74 2A 71, 05, 05]
 
-A51F; [77 C5 56, 05, 05]
+A50E; [74 2A 79, 05, 05]
 
-A520; [77 C5 5E, 05, 05]
+A50F; [74 2A 81, 05, 05]
 
-A521; [77 C5 66, 05, 05]
+A510; [74 2A 89, 05, 05]
 
-A522; [77 C5 6E, 05, 05]
+A511; [74 2A 91, 05, 05]
 
-A523; [77 C5 76, 05, 05]
+A512; [74 2A 99, 05, 05]
 
-A524; [77 C5 7E, 05, 05]
+A513; [74 2A A1, 05, 05]
 
-A525; [77 C5 86, 05, 05]
+A514; [74 2A A9, 05, 05]
 
-A526; [77 C5 8E, 05, 05]
+A515; [74 2A B1, 05, 05]
 
-A527; [77 C5 96, 05, 05]
+A516; [74 2A B9, 05, 05]
 
-A528; [77 C5 9E, 05, 05]
+A517; [74 2A C1, 05, 05]
 
-A529; [77 C5 A6, 05, 05]
+A518; [74 2A C9, 05, 05]
 
-A52A; [77 C5 AE, 05, 05]
+A519; [74 2A D1, 05, 05]
 
-A52B; [77 C5 B6, 05, 05]
+A51A; [74 2A D9, 05, 05]
 
-A52C; [77 C5 BE, 05, 05]
+A51B; [74 2A E1, 05, 05]
 
-A52D; [77 C5 C6, 05, 05]
+A51C; [74 2A E9, 05, 05]
 
-A52E; [77 C5 CE, 05, 05]
+A51D; [74 2A F1, 05, 05]
 
-A52F; [77 C5 D6, 05, 05]
+A51E; [74 2A F9, 05, 05]
+A614; [74 2A F9, 05, 20][74 32 71, 05, 20]
 
-A530; [77 C5 DE, 05, 05]
+A51F; [74 2B 03, 05, 05]
 
-A531; [77 C5 E6, 05, 05]
+A520; [74 2B 0B, 05, 05]
 
-A532; [77 C5 EE, 05, 05]
+A521; [74 2B 13, 05, 05]
 
-A533; [77 C5 F6, 05, 05]
-A615; [77 C5 F6, 05, 09][77 CC E0, 05, 09]
+A522; [74 2B 1B, 05, 05]
 
-A534; [77 C6 04, 05, 05]
+A523; [74 2B 23, 05, 05]
 
-A535; [77 C6 0C, 05, 05]
+A524; [74 2B 2B, 05, 05]
 
-A536; [77 C6 14, 05, 05]
+A525; [74 2B 33, 05, 05]
 
-A537; [77 C6 1C, 05, 05]
+A526; [74 2B 3B, 05, 05]
 
-A538; [77 C6 24, 05, 05]
+A527; [74 2B 43, 05, 05]
 
-A539; [77 C6 2C, 05, 05]
+A528; [74 2B 4B, 05, 05]
 
-A53A; [77 C6 34, 05, 05]
+A529; [74 2B 53, 05, 05]
 
-A53B; [77 C6 3C, 05, 05]
+A52A; [74 2B 5B, 05, 05]
 
-A53C; [77 C6 44, 05, 05]
+A52B; [74 2B 63, 05, 05]
 
-A53D; [77 C6 4C, 05, 05]
+A52C; [74 2B 6B, 05, 05]
 
-A53E; [77 C6 54, 05, 05]
+A52D; [74 2B 73, 05, 05]
 
-A53F; [77 C6 5C, 05, 05]
+A52E; [74 2B 7B, 05, 05]
 
-A540; [77 C6 64, 05, 05]
+A52F; [74 2B 83, 05, 05]
 
-A541; [77 C6 6C, 05, 05]
+A530; [74 2B 8B, 05, 05]
 
-A542; [77 C6 74, 05, 05]
+A531; [74 2B 93, 05, 05]
 
-A543; [77 C6 7C, 05, 05]
+A532; [74 2B 9B, 05, 05]
 
-A544; [77 C6 84, 05, 05]
+A533; [74 2B A3, 05, 05]
+A615; [74 2B A3, 05, 20][74 32 71, 05, 20]
 
-A545; [77 C6 8C, 05, 05]
+A534; [74 2B AB, 05, 05]
 
-A546; [77 C6 94, 05, 05]
+A535; [74 2B B3, 05, 05]
 
-A547; [77 C6 9C, 05, 05]
-A616; [77 C6 9C, 05, 09][77 CC E8, 05, 09]
+A536; [74 2B BB, 05, 05]
 
-A548; [77 C6 A4, 05, 05]
+A537; [74 2B C3, 05, 05]
 
-A549; [77 C6 AC, 05, 05]
+A538; [74 2B CB, 05, 05]
 
-A54A; [77 C6 B4, 05, 05]
+A539; [74 2B D3, 05, 05]
 
-A54B; [77 C6 BC, 05, 05]
+A53A; [74 2B DB, 05, 05]
 
-A54C; [77 C6 C4, 05, 05]
+A53B; [74 2B E3, 05, 05]
 
-A54D; [77 C6 CC, 05, 05]
+A53C; [74 2B EB, 05, 05]
 
-A54E; [77 C6 D4, 05, 05]
+A53D; [74 2B F3, 05, 05]
 
-A54F; [77 C6 DC, 05, 05]
+A53E; [74 2B FB, 05, 05]
 
-A550; [77 C6 E4, 05, 05]
+A53F; [74 2C 05, 05, 05]
 
-A551; [77 C6 EC, 05, 05]
+A540; [74 2C 0D, 05, 05]
 
-A552; [77 C6 F4, 05, 05]
-A617; [77 C6 F4, 05, 09][77 CC E0, 05, 09]
+A541; [74 2C 15, 05, 05]
 
-A553; [77 C6 FC, 05, 05]
+A542; [74 2C 1D, 05, 05]
 
-A554; [77 C7 0A, 05, 05]
+A543; [74 2C 25, 05, 05]
 
-A555; [77 C7 12, 05, 05]
+A544; [74 2C 2D, 05, 05]
 
-A556; [77 C7 1A, 05, 05]
+A545; [74 2C 35, 05, 05]
 
-A557; [77 C7 22, 05, 05]
+A546; [74 2C 3D, 05, 05]
 
-A558; [77 C7 2A, 05, 05]
-A610; [77 C7 2A, 05, 09]
-A618; [77 C7 2A, 05, 09][77 CC E8, 05, 09]
+A547; [74 2C 45, 05, 05]
+A616; [74 2C 45, 05, 20][74 32 79, 05, 20]
 
-A559; [77 C7 32, 05, 05]
+A548; [74 2C 4D, 05, 05]
 
-A55A; [77 C7 3A, 05, 05]
-A619; [77 C7 3A, 05, 09][77 CC E8, 05, 09]
+A549; [74 2C 55, 05, 05]
 
-A55B; [77 C7 42, 05, 05]
+A54A; [74 2C 5D, 05, 05]
 
-A55C; [77 C7 4A, 05, 05]
+A54B; [74 2C 65, 05, 05]
 
-A55D; [77 C7 52, 05, 05]
+A54C; [74 2C 6D, 05, 05]
 
-A55E; [77 C7 5A, 05, 05]
+A54D; [74 2C 75, 05, 05]
 
-A55F; [77 C7 62, 05, 05]
+A54E; [74 2C 7D, 05, 05]
 
-A560; [77 C7 6A, 05, 05]
-A61A; [77 C7 6A, 05, 09][77 CC E0, 05, 09]
+A54F; [74 2C 85, 05, 05]
 
-A561; [77 C7 72, 05, 05]
+A550; [74 2C 8D, 05, 05]
 
-A562; [77 C7 7A, 05, 05]
+A551; [74 2C 95, 05, 05]
 
-A563; [77 C7 82, 05, 05]
+A552; [74 2C 9D, 05, 05]
+A617; [74 2C 9D, 05, 20][74 32 71, 05, 20]
 
-A564; [77 C7 8A, 05, 05]
+A553; [74 2C A5, 05, 05]
 
-A565; [77 C7 92, 05, 05]
+A554; [74 2C AD, 05, 05]
 
-A566; [77 C7 9A, 05, 05]
+A555; [74 2C B5, 05, 05]
 
-A567; [77 C7 A2, 05, 05]
+A556; [74 2C BD, 05, 05]
 
-A568; [77 C7 AA, 05, 05]
+A557; [74 2C C5, 05, 05]
 
-A569; [77 C7 B2, 05, 05]
+A558; [74 2C CD, 05, 05]
+A610; [74 2C CD, 05, 20]
+A618; [74 2C CD, 05, 20][74 32 79, 05, 20]
 
-A56A; [77 C7 BA, 05, 05]
-A611; [77 C7 BA, 05, 09]
+A559; [74 2C D5, 05, 05]
 
-A56B; [77 C7 C2, 05, 05]
+A55A; [74 2C DD, 05, 05]
+A619; [74 2C DD, 05, 20][74 32 79, 05, 20]
 
-A56C; [77 C7 CA, 05, 05]
+A55B; [74 2C E5, 05, 05]
 
-A56D; [77 C7 D2, 05, 05]
+A55C; [74 2C ED, 05, 05]
 
-A56E; [77 C7 DA, 05, 05]
-A62A; [77 C7 DA, 05, 09]
+A55D; [74 2C F5, 05, 05]
 
-A56F; [77 C7 E2, 05, 05]
+A55E; [74 2C FD, 05, 05]
 
-A570; [77 C7 EA, 05, 05]
+A55F; [74 2D 07, 05, 05]
 
-A571; [77 C7 F2, 05, 05]
+A560; [74 2D 0F, 05, 05]
+A61A; [74 2D 0F, 05, 20][74 32 71, 05, 20]
 
-A572; [77 C7 FA, 05, 05]
+A561; [74 2D 17, 05, 05]
 
-A573; [77 C8 08, 05, 05]
+A562; [74 2D 1F, 05, 05]
 
-A574; [77 C8 10, 05, 05]
+A563; [74 2D 27, 05, 05]
 
-A575; [77 C8 18, 05, 05]
+A564; [74 2D 2F, 05, 05]
 
-A576; [77 C8 20, 05, 05]
+A565; [74 2D 37, 05, 05]
 
-A577; [77 C8 28, 05, 05]
+A566; [74 2D 3F, 05, 05]
 
-A578; [77 C8 30, 05, 05]
+A567; [74 2D 47, 05, 05]
 
-A579; [77 C8 38, 05, 05]
+A568; [74 2D 4F, 05, 05]
 
-A57A; [77 C8 40, 05, 05]
+A569; [74 2D 57, 05, 05]
 
-A57B; [77 C8 48, 05, 05]
+A56A; [74 2D 5F, 05, 05]
+A611; [74 2D 5F, 05, 20]
 
-A57C; [77 C8 50, 05, 05]
+A56B; [74 2D 67, 05, 05]
 
-A57D; [77 C8 58, 05, 05]
+A56C; [74 2D 6F, 05, 05]
 
-A57E; [77 C8 60, 05, 05]
+A56D; [74 2D 77, 05, 05]
 
-A57F; [77 C8 68, 05, 05]
+A56E; [74 2D 7F, 05, 05]
+A62A; [74 2D 7F, 05, 20]
 
-A580; [77 C8 70, 05, 05]
+A56F; [74 2D 87, 05, 05]
 
-A581; [77 C8 78, 05, 05]
+A570; [74 2D 8F, 05, 05]
 
-A582; [77 C8 80, 05, 05]
+A571; [74 2D 97, 05, 05]
 
-A583; [77 C8 88, 05, 05]
+A572; [74 2D 9F, 05, 05]
 
-A584; [77 C8 90, 05, 05]
+A573; [74 2D A7, 05, 05]
 
-A585; [77 C8 98, 05, 05]
-A61B; [77 C8 98, 05, 09][77 CC E0, 05, 09]
+A574; [74 2D AF, 05, 05]
 
-A586; [77 C8 A0, 05, 05]
+A575; [74 2D B7, 05, 05]
 
-A587; [77 C8 A8, 05, 05]
-A612; [77 C8 A8, 05, 09]
+A576; [74 2D BF, 05, 05]
 
-A588; [77 C8 B0, 05, 05]
+A577; [74 2D C7, 05, 05]
 
-A589; [77 C8 B8, 05, 05]
+A578; [74 2D CF, 05, 05]
 
-A58A; [77 C8 C0, 05, 05]
+A579; [74 2D D7, 05, 05]
 
-A58B; [77 C8 C8, 05, 05]
+A57A; [74 2D DF, 05, 05]
 
-A58C; [77 C8 D0, 05, 05]
+A57B; [74 2D E7, 05, 05]
 
-A58D; [77 C8 D8, 05, 05]
+A57C; [74 2D EF, 05, 05]
 
-A58E; [77 C8 E0, 05, 05]
+A57D; [74 2D F7, 05, 05]
 
-A58F; [77 C8 E8, 05, 05]
+A57E; [74 2D FF, 05, 05]
 
-A590; [77 C8 F0, 05, 05]
+A57F; [74 2E 09, 05, 05]
 
-A591; [77 C8 F8, 05, 05]
+A580; [74 2E 11, 05, 05]
 
-A592; [77 C9 06, 05, 05]
+A581; [74 2E 19, 05, 05]
 
-A593; [77 C9 0E, 05, 05]
+A582; [74 2E 21, 05, 05]
 
-A594; [77 C9 16, 05, 05]
+A583; [74 2E 29, 05, 05]
 
-A595; [77 C9 1E, 05, 05]
+A584; [74 2E 31, 05, 05]
 
-A596; [77 C9 26, 05, 05]
+A585; [74 2E 39, 05, 05]
+A61B; [74 2E 39, 05, 20][74 32 71, 05, 20]
 
-A597; [77 C9 2E, 05, 05]
+A586; [74 2E 41, 05, 05]
 
-A598; [77 C9 36, 05, 05]
+A587; [74 2E 49, 05, 05]
+A612; [74 2E 49, 05, 20]
 
-A599; [77 C9 3E, 05, 05]
+A588; [74 2E 51, 05, 05]
 
-A59A; [77 C9 46, 05, 05]
+A589; [74 2E 59, 05, 05]
 
-A59B; [77 C9 4E, 05, 05]
+A58A; [74 2E 61, 05, 05]
 
-A59C; [77 C9 56, 05, 05]
+A58B; [74 2E 69, 05, 05]
 
-A59D; [77 C9 5E, 05, 05]
+A58C; [74 2E 71, 05, 05]
 
-A59E; [77 C9 66, 05, 05]
+A58D; [74 2E 79, 05, 05]
 
-A59F; [77 C9 6E, 05, 05]
+A58E; [74 2E 81, 05, 05]
 
-A5A0; [77 C9 76, 05, 05]
+A58F; [74 2E 89, 05, 05]
 
-A5A1; [77 C9 7E, 05, 05]
+A590; [74 2E 91, 05, 05]
 
-A5A2; [77 C9 86, 05, 05]
+A591; [74 2E 99, 05, 05]
 
-A5A3; [77 C9 8E, 05, 05]
+A592; [74 2E A1, 05, 05]
 
-A5A4; [77 C9 96, 05, 05]
+A593; [74 2E A9, 05, 05]
 
-A5A5; [77 C9 9E, 05, 05]
+A594; [74 2E B1, 05, 05]
 
-A5A6; [77 C9 A6, 05, 05]
+A595; [74 2E B9, 05, 05]
 
-A5A7; [77 C9 AE, 05, 05]
+A596; [74 2E C1, 05, 05]
 
-A5A8; [77 C9 B6, 05, 05]
+A597; [74 2E C9, 05, 05]
 
-A5A9; [77 C9 BE, 05, 05]
+A598; [74 2E D1, 05, 05]
 
-A5AA; [77 C9 C6, 05, 05]
+A599; [74 2E D9, 05, 05]
 
-A5AB; [77 C9 CE, 05, 05]
+A59A; [74 2E E1, 05, 05]
 
-A5AC; [77 C9 D6, 05, 05]
+A59B; [74 2E E9, 05, 05]
 
-A5AD; [77 C9 DE, 05, 05]
+A59C; [74 2E F1, 05, 05]
 
-A5AE; [77 C9 E6, 05, 05]
+A59D; [74 2E F9, 05, 05]
 
-A5AF; [77 C9 EE, 05, 05]
+A59E; [74 2F 03, 05, 05]
 
-A5B0; [77 C9 F6, 05, 05]
+A59F; [74 2F 0B, 05, 05]
 
-A5B1; [77 CA 04, 05, 05]
+A5A0; [74 2F 13, 05, 05]
 
-A5B2; [77 CA 0C, 05, 05]
+A5A1; [74 2F 1B, 05, 05]
 
-A5B3; [77 CA 14, 05, 05]
+A5A2; [74 2F 23, 05, 05]
 
-A5B4; [77 CA 1C, 05, 05]
-A61C; [77 CA 1C, 05, 09][77 CC E0, 05, 09]
+A5A3; [74 2F 2B, 05, 05]
 
-A5B5; [77 CA 24, 05, 05]
+A5A4; [74 2F 33, 05, 05]
 
-A5B6; [77 CA 2C, 05, 05]
+A5A5; [74 2F 3B, 05, 05]
 
-A5B7; [77 CA 34, 05, 05]
+A5A6; [74 2F 43, 05, 05]
 
-A5B8; [77 CA 3C, 05, 05]
+A5A7; [74 2F 4B, 05, 05]
 
-A5B9; [77 CA 44, 05, 05]
+A5A8; [74 2F 53, 05, 05]
 
-A5BA; [77 CA 4C, 05, 05]
+A5A9; [74 2F 5B, 05, 05]
 
-A5BB; [77 CA 54, 05, 05]
+A5AA; [74 2F 63, 05, 05]
 
-A5BC; [77 CA 5C, 05, 05]
+A5AB; [74 2F 6B, 05, 05]
 
-A5BD; [77 CA 64, 05, 05]
+A5AC; [74 2F 73, 05, 05]
 
-A5BE; [77 CA 6C, 05, 05]
+A5AD; [74 2F 7B, 05, 05]
 
-A5BF; [77 CA 74, 05, 05]
+A5AE; [74 2F 83, 05, 05]
 
-A5C0; [77 CA 7C, 05, 05]
+A5AF; [74 2F 8B, 05, 05]
 
-A5C1; [77 CA 84, 05, 05]
+A5B0; [74 2F 93, 05, 05]
 
-A5C2; [77 CA 8C, 05, 05]
+A5B1; [74 2F 9B, 05, 05]
 
-A5C3; [77 CA 94, 05, 05]
+A5B2; [74 2F A3, 05, 05]
 
-A5C4; [77 CA 9C, 05, 05]
+A5B3; [74 2F AB, 05, 05]
 
-A5C5; [77 CA A4, 05, 05]
+A5B4; [74 2F B3, 05, 05]
+A61C; [74 2F B3, 05, 20][74 32 71, 05, 20]
 
-A5C6; [77 CA AC, 05, 05]
+A5B5; [74 2F BB, 05, 05]
 
-A5C7; [77 CA B4, 05, 05]
+A5B6; [74 2F C3, 05, 05]
 
-A5C8; [77 CA BC, 05, 05]
+A5B7; [74 2F CB, 05, 05]
 
-A5C9; [77 CA C4, 05, 05]
+A5B8; [74 2F D3, 05, 05]
 
-A5CA; [77 CA CC, 05, 05]
+A5B9; [74 2F DB, 05, 05]
 
-A5CB; [77 CA D4, 05, 05]
-A61D; [77 CA D4, 05, 09][77 CC E0, 05, 09]
+A5BA; [74 2F E3, 05, 05]
 
-A5CC; [77 CA DC, 05, 05]
+A5BB; [74 2F EB, 05, 05]
 
-A5CD; [77 CA E4, 05, 05]
+A5BC; [74 2F F3, 05, 05]
 
-A5CE; [77 CA EC, 05, 05]
+A5BD; [74 2F FB, 05, 05]
 
-A5CF; [77 CA F4, 05, 05]
+A5BE; [74 30 05, 05, 05]
 
-A5D0; [77 CA FC, 05, 05]
+A5BF; [74 30 0D, 05, 05]
 
-A5D1; [77 CB 0A, 05, 05]
-A62B; [77 CB 0A, 05, 09]
-A61E; [77 CB 0A, 05, 09][77 CC E8, 05, 09]
+A5C0; [74 30 15, 05, 05]
 
-A5D2; [77 CB 12, 05, 05]
+A5C1; [74 30 1D, 05, 05]
 
-A5D3; [77 CB 1A, 05, 05]
+A5C2; [74 30 25, 05, 05]
 
-A5D4; [77 CB 22, 05, 05]
+A5C3; [74 30 2D, 05, 05]
 
-A5D5; [77 CB 2A, 05, 05]
+A5C4; [74 30 35, 05, 05]
 
-A5D6; [77 CB 32, 05, 05]
+A5C5; [74 30 3D, 05, 05]
 
-A5D7; [77 CB 3A, 05, 05]
+A5C6; [74 30 45, 05, 05]
 
-A5D8; [77 CB 42, 05, 05]
-A61F; [77 CB 42, 05, 09][77 CC E0, 05, 09]
+A5C7; [74 30 4D, 05, 05]
 
-A5D9; [77 CB 4A, 05, 05]
+A5C8; [74 30 55, 05, 05]
 
-A5DA; [77 CB 52, 05, 05]
+A5C9; [74 30 5D, 05, 05]
 
-A5DB; [77 CB 5A, 05, 05]
+A5CA; [74 30 65, 05, 05]
 
-A5DC; [77 CB 62, 05, 05]
+A5CB; [74 30 6D, 05, 05]
+A61D; [74 30 6D, 05, 20][74 32 71, 05, 20]
 
-A5DD; [77 CB 6A, 05, 05]
+A5CC; [74 30 75, 05, 05]
 
-A5DE; [77 CB 72, 05, 05]
+A5CD; [74 30 7D, 05, 05]
 
-A5DF; [77 CB 7A, 05, 05]
+A5CE; [74 30 85, 05, 05]
 
-A5E0; [77 CB 82, 05, 05]
+A5CF; [74 30 8D, 05, 05]
 
-A5E1; [77 CB 8A, 05, 05]
+A5D0; [74 30 95, 05, 05]
 
-A5E2; [77 CB 92, 05, 05]
+A5D1; [74 30 9D, 05, 05]
+A62B; [74 30 9D, 05, 20]
+A61E; [74 30 9D, 05, 20][74 32 79, 05, 20]
 
-A5E3; [77 CB 9A, 05, 05]
+A5D2; [74 30 A5, 05, 05]
 
-A5E4; [77 CB A2, 05, 05]
+A5D3; [74 30 AD, 05, 05]
 
-A5E5; [77 CB AA, 05, 05]
+A5D4; [74 30 B5, 05, 05]
 
-A5E6; [77 CB B2, 05, 05]
+A5D5; [74 30 BD, 05, 05]
 
-A5E7; [77 CB BA, 05, 05]
+A5D6; [74 30 C5, 05, 05]
 
-A5E8; [77 CB C2, 05, 05]
+A5D7; [74 30 CD, 05, 05]
 
-A5E9; [77 CB CA, 05, 05]
+A5D8; [74 30 D5, 05, 05]
+A61F; [74 30 D5, 05, 20][74 32 71, 05, 20]
 
-A5EA; [77 CB D2, 05, 05]
+A5D9; [74 30 DD, 05, 05]
 
-A5EB; [77 CB DA, 05, 05]
+A5DA; [74 30 E5, 05, 05]
 
-A5EC; [77 CB E2, 05, 05]
+A5DB; [74 30 ED, 05, 05]
 
-A5ED; [77 CB EA, 05, 05]
+A5DC; [74 30 F5, 05, 05]
 
-A5EE; [77 CB F2, 05, 05]
+A5DD; [74 30 FD, 05, 05]
 
-A5EF; [77 CB FA, 05, 05]
+A5DE; [74 31 07, 05, 05]
 
-A5F0; [77 CC 08, 05, 05]
+A5DF; [74 31 0F, 05, 05]
 
-A5F1; [77 CC 10, 05, 05]
+A5E0; [74 31 17, 05, 05]
 
-A5F2; [77 CC 18, 05, 05]
+A5E1; [74 31 1F, 05, 05]
 
-A5F3; [77 CC 20, 05, 05]
+A5E2; [74 31 27, 05, 05]
 
-A5F4; [77 CC 28, 05, 05]
+A5E3; [74 31 2F, 05, 05]
 
-A5F5; [77 CC 30, 05, 05]
+A5E4; [74 31 37, 05, 05]
 
-A5F6; [77 CC 38, 05, 05]
+A5E5; [74 31 3F, 05, 05]
 
-A5F7; [77 CC 40, 05, 05]
+A5E6; [74 31 47, 05, 05]
 
-A5F8; [77 CC 48, 05, 05]
+A5E7; [74 31 4F, 05, 05]
 
-A5F9; [77 CC 50, 05, 05]
+A5E8; [74 31 57, 05, 05]
 
-A5FA; [77 CC 58, 05, 05]
+A5E9; [74 31 5F, 05, 05]
 
-A5FB; [77 CC 60, 05, 05]
+A5EA; [74 31 67, 05, 05]
 
-A5FC; [77 CC 68, 05, 05]
+A5EB; [74 31 6F, 05, 05]
 
-A5FD; [77 CC 70, 05, 05]
+A5EC; [74 31 77, 05, 05]
 
-A5FE; [77 CC 78, 05, 05]
+A5ED; [74 31 7F, 05, 05]
 
-A5FF; [77 CC 80, 05, 05]
+A5EE; [74 31 87, 05, 05]
 
-A600; [77 CC 88, 05, 05]
+A5EF; [74 31 8F, 05, 05]
 
-A601; [77 CC 90, 05, 05]
+A5F0; [74 31 97, 05, 05]
 
-A602; [77 CC 98, 05, 05]
+A5F1; [74 31 9F, 05, 05]
 
-A603; [77 CC A0, 05, 05]
+A5F2; [74 31 A7, 05, 05]
 
-A604; [77 CC A8, 05, 05]
+A5F3; [74 31 AF, 05, 05]
 
-A605; [77 CC B0, 05, 05]
+A5F4; [74 31 B7, 05, 05]
 
-A606; [77 CC B8, 05, 05]
+A5F5; [74 31 BF, 05, 05]
 
-A607; [77 CC C0, 05, 05]
+A5F6; [74 31 C7, 05, 05]
 
-A608; [77 CC C8, 05, 05]
+A5F7; [74 31 CF, 05, 05]
 
-A609; [77 CC D0, 05, 05]
+A5F8; [74 31 D7, 05, 05]
 
-A60A; [77 CC D8, 05, 05]
+A5F9; [74 31 DF, 05, 05]
 
-A60B; [77 CC E0, 05, 05]
+A5FA; [74 31 E7, 05, 05]
 
-A60C; [77 CC E8, 05, 05]
+A5FB; [74 31 EF, 05, 05]
 
-A6A0; [77 CC F0, 05, 05]
+A5FC; [74 31 F7, 05, 05]
 
-A6A1; [77 CC F8, 05, 05]
+A5FD; [74 31 FF, 05, 05]
 
-A6A2; [77 CD 06, 05, 05]
+A5FE; [74 32 09, 05, 05]
 
-A6A3; [77 CD 0E, 05, 05]
+A5FF; [74 32 11, 05, 05]
 
-A6A4; [77 CD 16, 05, 05]
+A600; [74 32 19, 05, 05]
 
-A6A5; [77 CD 1E, 05, 05]
+A601; [74 32 21, 05, 05]
 
-A6A6; [77 CD 26, 05, 05]
+A602; [74 32 29, 05, 05]
 
-A6A7; [77 CD 2E, 05, 05]
+A603; [74 32 31, 05, 05]
 
-A6A8; [77 CD 36, 05, 05]
+A604; [74 32 39, 05, 05]
 
-A6A9; [77 CD 3E, 05, 05]
+A605; [74 32 41, 05, 05]
 
-A6AA; [77 CD 46, 05, 05]
+A606; [74 32 49, 05, 05]
 
-A6AB; [77 CD 4E, 05, 05]
+A607; [74 32 51, 05, 05]
 
-A6AC; [77 CD 56, 05, 05]
+A608; [74 32 59, 05, 05]
 
-A6AD; [77 CD 5E, 05, 05]
+A609; [74 32 61, 05, 05]
 
-A6AE; [77 CD 66, 05, 05]
+A60A; [74 32 69, 05, 05]
 
-A6AF; [77 CD 6E, 05, 05]
+A60B; [74 32 71, 05, 05]
 
-A6B0; [77 CD 76, 05, 05]
+A60C; [74 32 79, 05, 05]
 
-A6B1; [77 CD 7E, 05, 05]
+FDD1 A6A0;     [74 32 A2, 05, 05]      # Bamum first primary
 
-A6B2; [77 CD 86, 05, 05]
+A6A0; [74 32 CB, 05, 05]
 
-A6B3; [77 CD 8E, 05, 05]
+A6A1; [74 32 D3, 05, 05]
 
-A6B4; [77 CD 96, 05, 05]
+A6A2; [74 32 DB, 05, 05]
 
-A6B5; [77 CD 9E, 05, 05]
+A6A3; [74 32 E3, 05, 05]
 
-A6B6; [77 CD A6, 05, 05]
+A6A4; [74 32 EB, 05, 05]
 
-A6B7; [77 CD AE, 05, 05]
+A6A5; [74 32 F3, 05, 05]
 
-A6B8; [77 CD B6, 05, 05]
+A6A6; [74 32 FB, 05, 05]
 
-A6B9; [77 CD BE, 05, 05]
+A6A7; [74 33 05, 05, 05]
 
-A6BA; [77 CD C6, 05, 05]
+A6A8; [74 33 0D, 05, 05]
 
-A6BB; [77 CD CE, 05, 05]
+A6A9; [74 33 15, 05, 05]
 
-A6BC; [77 CD D6, 05, 05]
+A6AA; [74 33 1D, 05, 05]
 
-A6BD; [77 CD DE, 05, 05]
+A6AB; [74 33 25, 05, 05]
 
-A6BE; [77 CD E6, 05, 05]
+A6AC; [74 33 2D, 05, 05]
 
-A6BF; [77 CD EE, 05, 05]
+A6AD; [74 33 35, 05, 05]
 
-A6C0; [77 CD F6, 05, 05]
+A6AE; [74 33 3D, 05, 05]
 
-A6C1; [77 CE 04, 05, 05]
+A6AF; [74 33 45, 05, 05]
 
-A6C2; [77 CE 0C, 05, 05]
+A6B0; [74 33 4D, 05, 05]
 
-A6C3; [77 CE 14, 05, 05]
+A6B1; [74 33 55, 05, 05]
 
-A6C4; [77 CE 1C, 05, 05]
+A6B2; [74 33 5D, 05, 05]
 
-A6C5; [77 CE 24, 05, 05]
+A6B3; [74 33 65, 05, 05]
 
-A6C6; [77 CE 2C, 05, 05]
+A6B4; [74 33 6D, 05, 05]
 
-A6C7; [77 CE 34, 05, 05]
+A6B5; [74 33 75, 05, 05]
 
-A6C8; [77 CE 3C, 05, 05]
+A6B6; [74 33 7D, 05, 05]
 
-A6C9; [77 CE 44, 05, 05]
+A6B7; [74 33 85, 05, 05]
 
-A6CA; [77 CE 4C, 05, 05]
+A6B8; [74 33 8D, 05, 05]
 
-A6CB; [77 CE 54, 05, 05]
+A6B9; [74 33 95, 05, 05]
 
-A6CC; [77 CE 5C, 05, 05]
+A6BA; [74 33 9D, 05, 05]
 
-A6CD; [77 CE 64, 05, 05]
+A6BB; [74 33 A5, 05, 05]
 
-A6CE; [77 CE 6C, 05, 05]
+A6BC; [74 33 AD, 05, 05]
 
-A6CF; [77 CE 74, 05, 05]
+A6BD; [74 33 B5, 05, 05]
 
-A6D0; [77 CE 7C, 05, 05]
+A6BE; [74 33 BD, 05, 05]
 
-A6D1; [77 CE 84, 05, 05]
+A6BF; [74 33 C5, 05, 05]
 
-A6D2; [77 CE 8C, 05, 05]
+A6C0; [74 33 CD, 05, 05]
 
-A6D3; [77 CE 94, 05, 05]
+A6C1; [74 33 D5, 05, 05]
 
-A6D4; [77 CE 9C, 05, 05]
+A6C2; [74 33 DD, 05, 05]
 
-A6D5; [77 CE A4, 05, 05]
+A6C3; [74 33 E5, 05, 05]
 
-A6D6; [77 CE AC, 05, 05]
+A6C4; [74 33 ED, 05, 05]
 
-A6D7; [77 CE B4, 05, 05]
+A6C5; [74 33 F5, 05, 05]
 
-A6D8; [77 CE BC, 05, 05]
+A6C6; [74 33 FD, 05, 05]
 
-A6D9; [77 CE C4, 05, 05]
+A6C7; [74 34 07, 05, 05]
 
-A6DA; [77 CE CC, 05, 05]
+A6C8; [74 34 0F, 05, 05]
 
-A6DB; [77 CE D4, 05, 05]
+A6C9; [74 34 17, 05, 05]
 
-A6DC; [77 CE DC, 05, 05]
+A6CA; [74 34 1F, 05, 05]
 
-A6DD; [77 CE E4, 05, 05]
+A6CB; [74 34 27, 05, 05]
 
-A6DE; [77 CE EC, 05, 05]
+A6CC; [74 34 2F, 05, 05]
 
-A6DF; [77 CE F4, 05, 05]
+A6CD; [74 34 37, 05, 05]
 
-A6E0; [77 CE FC, 05, 05]
+A6CE; [74 34 3F, 05, 05]
 
-A6E1; [77 CF 0A, 05, 05]
+A6CF; [74 34 47, 05, 05]
 
-A6E2; [77 CF 12, 05, 05]
+A6D0; [74 34 4F, 05, 05]
 
-A6E3; [77 CF 1A, 05, 05]
+A6D1; [74 34 57, 05, 05]
 
-A6E4; [77 CF 22, 05, 05]
+A6D2; [74 34 5F, 05, 05]
 
-A6E5; [77 CF 2A, 05, 05]
+A6D3; [74 34 67, 05, 05]
 
-A6E6; [77 CF 32, 05, 05]
+A6D4; [74 34 6F, 05, 05]
 
-A6E7; [77 CF 3A, 05, 05]
+A6D5; [74 34 77, 05, 05]
 
-A6E8; [77 CF 42, 05, 05]
+A6D6; [74 34 7F, 05, 05]
 
-A6E9; [77 CF 4A, 05, 05]
+A6D7; [74 34 87, 05, 05]
 
-A6EA; [77 CF 52, 05, 05]
+A6D8; [74 34 8F, 05, 05]
 
-A6EB; [77 CF 5A, 05, 05]
+A6D9; [74 34 97, 05, 05]
 
-A6EC; [77 CF 62, 05, 05]
+A6DA; [74 34 9F, 05, 05]
 
-A6ED; [77 CF 6A, 05, 05]
+A6DB; [74 34 A7, 05, 05]
 
-A6EE; [77 CF 72, 05, 05]
+A6DC; [74 34 AF, 05, 05]
 
-A6EF; [77 CF 7A, 05, 05]
+A6DD; [74 34 B7, 05, 05]
 
-16800; [77 CF 82, 05, 05]
+A6DE; [74 34 BF, 05, 05]
 
-16801; [77 CF 8A, 05, 05]
+A6DF; [74 34 C7, 05, 05]
 
-16802; [77 CF 92, 05, 05]
+A6E0; [74 34 CF, 05, 05]
 
-16803; [77 CF 9A, 05, 05]
+A6E1; [74 34 D7, 05, 05]
 
-16804; [77 CF A2, 05, 05]
+A6E2; [74 34 DF, 05, 05]
 
-16805; [77 CF AA, 05, 05]
+A6E3; [74 34 E7, 05, 05]
 
-16806; [77 CF B2, 05, 05]
+A6E4; [74 34 EF, 05, 05]
 
-16807; [77 CF BA, 05, 05]
+A6E5; [74 34 F7, 05, 05]
 
-16808; [77 CF C2, 05, 05]
+A6E6; [74 34 FF, 05, 05]
 
-16809; [77 CF CA, 05, 05]
+A6E7; [74 35 09, 05, 05]
 
-1680A; [77 CF D2, 05, 05]
+A6E8; [74 35 11, 05, 05]
 
-1680B; [77 CF DA, 05, 05]
+A6E9; [74 35 19, 05, 05]
 
-1680C; [77 CF E2, 05, 05]
+A6EA; [74 35 21, 05, 05]
 
-1680D; [77 CF EA, 05, 05]
+A6EB; [74 35 29, 05, 05]
 
-1680E; [77 CF F2, 05, 05]
+A6EC; [74 35 31, 05, 05]
 
-1680F; [77 CF FA, 05, 05]
+A6ED; [74 35 39, 05, 05]
 
-16810; [77 D0 08, 05, 05]
+A6EE; [74 35 41, 05, 05]
 
-16811; [77 D0 10, 05, 05]
+A6EF; [74 35 49, 05, 05]
 
-16812; [77 D0 18, 05, 05]
+16800; [74 35 51, 05, 05]
 
-16813; [77 D0 20, 05, 05]
+16801; [74 35 59, 05, 05]
 
-16814; [77 D0 28, 05, 05]
+16802; [74 35 61, 05, 05]
 
-16815; [77 D0 30, 05, 05]
+16803; [74 35 69, 05, 05]
 
-16816; [77 D0 38, 05, 05]
+16804; [74 35 71, 05, 05]
 
-16817; [77 D0 40, 05, 05]
+16805; [74 35 79, 05, 05]
 
-16818; [77 D0 48, 05, 05]
+16806; [74 35 81, 05, 05]
 
-16819; [77 D0 50, 05, 05]
+16807; [74 35 89, 05, 05]
 
-1681A; [77 D0 58, 05, 05]
+16808; [74 35 91, 05, 05]
 
-1681B; [77 D0 60, 05, 05]
+16809; [74 35 99, 05, 05]
 
-1681C; [77 D0 68, 05, 05]
+1680A; [74 35 A1, 05, 05]
 
-1681D; [77 D0 70, 05, 05]
+1680B; [74 35 A9, 05, 05]
 
-1681E; [77 D0 78, 05, 05]
+1680C; [74 35 B1, 05, 05]
 
-1681F; [77 D0 80, 05, 05]
+1680D; [74 35 B9, 05, 05]
 
-16820; [77 D0 88, 05, 05]
+1680E; [74 35 C1, 05, 05]
 
-16821; [77 D0 90, 05, 05]
+1680F; [74 35 C9, 05, 05]
 
-16822; [77 D0 98, 05, 05]
+16810; [74 35 D1, 05, 05]
 
-16823; [77 D0 A0, 05, 05]
+16811; [74 35 D9, 05, 05]
 
-16824; [77 D0 A8, 05, 05]
+16812; [74 35 E1, 05, 05]
 
-16825; [77 D0 B0, 05, 05]
+16813; [74 35 E9, 05, 05]
 
-16826; [77 D0 B8, 05, 05]
+16814; [74 35 F1, 05, 05]
 
-16827; [77 D0 C0, 05, 05]
+16815; [74 35 F9, 05, 05]
 
-16828; [77 D0 C8, 05, 05]
+16816; [74 36 03, 05, 05]
 
-16829; [77 D0 D0, 05, 05]
+16817; [74 36 0B, 05, 05]
 
-1682A; [77 D0 D8, 05, 05]
+16818; [74 36 13, 05, 05]
 
-1682B; [77 D0 E0, 05, 05]
+16819; [74 36 1B, 05, 05]
 
-1682C; [77 D0 E8, 05, 05]
+1681A; [74 36 23, 05, 05]
 
-1682D; [77 D0 F0, 05, 05]
+1681B; [74 36 2B, 05, 05]
 
-1682E; [77 D0 F8, 05, 05]
+1681C; [74 36 33, 05, 05]
 
-1682F; [77 D1 06, 05, 05]
+1681D; [74 36 3B, 05, 05]
 
-16830; [77 D1 0E, 05, 05]
+1681E; [74 36 43, 05, 05]
 
-16831; [77 D1 16, 05, 05]
+1681F; [74 36 4B, 05, 05]
 
-16832; [77 D1 1E, 05, 05]
+16820; [74 36 53, 05, 05]
 
-16833; [77 D1 26, 05, 05]
+16821; [74 36 5B, 05, 05]
 
-16834; [77 D1 2E, 05, 05]
+16822; [74 36 63, 05, 05]
 
-16835; [77 D1 36, 05, 05]
+16823; [74 36 6B, 05, 05]
 
-16836; [77 D1 3E, 05, 05]
+16824; [74 36 73, 05, 05]
 
-16837; [77 D1 46, 05, 05]
+16825; [74 36 7B, 05, 05]
 
-16838; [77 D1 4E, 05, 05]
+16826; [74 36 83, 05, 05]
 
-16839; [77 D1 56, 05, 05]
+16827; [74 36 8B, 05, 05]
 
-1683A; [77 D1 5E, 05, 05]
+16828; [74 36 93, 05, 05]
 
-1683B; [77 D1 66, 05, 05]
+16829; [74 36 9B, 05, 05]
 
-1683C; [77 D1 6E, 05, 05]
+1682A; [74 36 A3, 05, 05]
 
-1683D; [77 D1 76, 05, 05]
+1682B; [74 36 AB, 05, 05]
 
-1683E; [77 D1 7E, 05, 05]
+1682C; [74 36 B3, 05, 05]
 
-1683F; [77 D1 86, 05, 05]
+1682D; [74 36 BB, 05, 05]
 
-16840; [77 D1 8E, 05, 05]
+1682E; [74 36 C3, 05, 05]
 
-16841; [77 D1 96, 05, 05]
+1682F; [74 36 CB, 05, 05]
 
-16842; [77 D1 9E, 05, 05]
+16830; [74 36 D3, 05, 05]
 
-16843; [77 D1 A6, 05, 05]
+16831; [74 36 DB, 05, 05]
 
-16844; [77 D1 AE, 05, 05]
+16832; [74 36 E3, 05, 05]
 
-16845; [77 D1 B6, 05, 05]
+16833; [74 36 EB, 05, 05]
 
-16846; [77 D1 BE, 05, 05]
+16834; [74 36 F3, 05, 05]
 
-16847; [77 D1 C6, 05, 05]
+16835; [74 36 FB, 05, 05]
 
-16848; [77 D1 CE, 05, 05]
+16836; [74 37 05, 05, 05]
 
-16849; [77 D1 D6, 05, 05]
+16837; [74 37 0D, 05, 05]
 
-1684A; [77 D1 DE, 05, 05]
+16838; [74 37 15, 05, 05]
 
-1684B; [77 D1 E6, 05, 05]
+16839; [74 37 1D, 05, 05]
 
-1684C; [77 D1 EE, 05, 05]
+1683A; [74 37 25, 05, 05]
 
-1684D; [77 D1 F6, 05, 05]
+1683B; [74 37 2D, 05, 05]
 
-1684E; [77 D2 04, 05, 05]
+1683C; [74 37 35, 05, 05]
 
-1684F; [77 D2 0C, 05, 05]
+1683D; [74 37 3D, 05, 05]
 
-16850; [77 D2 14, 05, 05]
+1683E; [74 37 45, 05, 05]
 
-16851; [77 D2 1C, 05, 05]
+1683F; [74 37 4D, 05, 05]
 
-16852; [77 D2 24, 05, 05]
+16840; [74 37 55, 05, 05]
 
-16853; [77 D2 2C, 05, 05]
+16841; [74 37 5D, 05, 05]
 
-16854; [77 D2 34, 05, 05]
+16842; [74 37 65, 05, 05]
 
-16855; [77 D2 3C, 05, 05]
+16843; [74 37 6D, 05, 05]
 
-16856; [77 D2 44, 05, 05]
+16844; [74 37 75, 05, 05]
 
-16857; [77 D2 4C, 05, 05]
+16845; [74 37 7D, 05, 05]
 
-16858; [77 D2 54, 05, 05]
+16846; [74 37 85, 05, 05]
 
-16859; [77 D2 5C, 05, 05]
+16847; [74 37 8D, 05, 05]
 
-1685A; [77 D2 64, 05, 05]
+16848; [74 37 95, 05, 05]
 
-1685B; [77 D2 6C, 05, 05]
+16849; [74 37 9D, 05, 05]
 
-1685C; [77 D2 74, 05, 05]
+1684A; [74 37 A5, 05, 05]
 
-1685D; [77 D2 7C, 05, 05]
+1684B; [74 37 AD, 05, 05]
 
-1685E; [77 D2 84, 05, 05]
+1684C; [74 37 B5, 05, 05]
 
-1685F; [77 D2 8C, 05, 05]
+1684D; [74 37 BD, 05, 05]
 
-16860; [77 D2 94, 05, 05]
+1684E; [74 37 C5, 05, 05]
 
-16861; [77 D2 9C, 05, 05]
+1684F; [74 37 CD, 05, 05]
 
-16862; [77 D2 A4, 05, 05]
+16850; [74 37 D5, 05, 05]
 
-16863; [77 D2 AC, 05, 05]
+16851; [74 37 DD, 05, 05]
 
-16864; [77 D2 B4, 05, 05]
+16852; [74 37 E5, 05, 05]
 
-16865; [77 D2 BC, 05, 05]
+16853; [74 37 ED, 05, 05]
 
-16866; [77 D2 C4, 05, 05]
+16854; [74 37 F5, 05, 05]
 
-16867; [77 D2 CC, 05, 05]
+16855; [74 37 FD, 05, 05]
 
-16868; [77 D2 D4, 05, 05]
+16856; [74 38 07, 05, 05]
 
-16869; [77 D2 DC, 05, 05]
+16857; [74 38 0F, 05, 05]
 
-1686A; [77 D2 E4, 05, 05]
+16858; [74 38 17, 05, 05]
 
-1686B; [77 D2 EC, 05, 05]
+16859; [74 38 1F, 05, 05]
 
-1686C; [77 D2 F4, 05, 05]
+1685A; [74 38 27, 05, 05]
 
-1686D; [77 D2 FC, 05, 05]
+1685B; [74 38 2F, 05, 05]
 
-1686E; [77 D3 0A, 05, 05]
+1685C; [74 38 37, 05, 05]
 
-1686F; [77 D3 12, 05, 05]
+1685D; [74 38 3F, 05, 05]
 
-16870; [77 D3 1A, 05, 05]
+1685E; [74 38 47, 05, 05]
 
-16871; [77 D3 22, 05, 05]
+1685F; [74 38 4F, 05, 05]
 
-16872; [77 D3 2A, 05, 05]
+16860; [74 38 57, 05, 05]
 
-16873; [77 D3 32, 05, 05]
+16861; [74 38 5F, 05, 05]
 
-16874; [77 D3 3A, 05, 05]
+16862; [74 38 67, 05, 05]
 
-16875; [77 D3 42, 05, 05]
+16863; [74 38 6F, 05, 05]
 
-16876; [77 D3 4A, 05, 05]
+16864; [74 38 77, 05, 05]
 
-16877; [77 D3 52, 05, 05]
+16865; [74 38 7F, 05, 05]
 
-16878; [77 D3 5A, 05, 05]
+16866; [74 38 87, 05, 05]
 
-16879; [77 D3 62, 05, 05]
+16867; [74 38 8F, 05, 05]
 
-1687A; [77 D3 6A, 05, 05]
+16868; [74 38 97, 05, 05]
 
-1687B; [77 D3 72, 05, 05]
+16869; [74 38 9F, 05, 05]
 
-1687C; [77 D3 7A, 05, 05]
+1686A; [74 38 A7, 05, 05]
 
-1687D; [77 D3 82, 05, 05]
+1686B; [74 38 AF, 05, 05]
 
-1687E; [77 D3 8A, 05, 05]
+1686C; [74 38 B7, 05, 05]
 
-1687F; [77 D3 92, 05, 05]
+1686D; [74 38 BF, 05, 05]
 
-16880; [77 D3 9A, 05, 05]
+1686E; [74 38 C7, 05, 05]
 
-16881; [77 D3 A2, 05, 05]
+1686F; [74 38 CF, 05, 05]
 
-16882; [77 D3 AA, 05, 05]
+16870; [74 38 D7, 05, 05]
 
-16883; [77 D3 B2, 05, 05]
+16871; [74 38 DF, 05, 05]
 
-16884; [77 D3 BA, 05, 05]
+16872; [74 38 E7, 05, 05]
 
-16885; [77 D3 C2, 05, 05]
+16873; [74 38 EF, 05, 05]
 
-16886; [77 D3 CA, 05, 05]
+16874; [74 38 F7, 05, 05]
 
-16887; [77 D3 D2, 05, 05]
+16875; [74 38 FF, 05, 05]
 
-16888; [77 D3 DA, 05, 05]
+16876; [74 39 09, 05, 05]
 
-16889; [77 D3 E2, 05, 05]
+16877; [74 39 11, 05, 05]
 
-1688A; [77 D3 EA, 05, 05]
+16878; [74 39 19, 05, 05]
 
-1688B; [77 D3 F2, 05, 05]
+16879; [74 39 21, 05, 05]
 
-1688C; [77 D3 FA, 05, 05]
+1687A; [74 39 29, 05, 05]
 
-1688D; [77 D4 08, 05, 05]
+1687B; [74 39 31, 05, 05]
 
-1688E; [77 D4 10, 05, 05]
+1687C; [74 39 39, 05, 05]
 
-1688F; [77 D4 18, 05, 05]
+1687D; [74 39 41, 05, 05]
 
-16890; [77 D4 20, 05, 05]
+1687E; [74 39 49, 05, 05]
 
-16891; [77 D4 28, 05, 05]
+1687F; [74 39 51, 05, 05]
 
-16892; [77 D4 30, 05, 05]
+16880; [74 39 59, 05, 05]
 
-16893; [77 D4 38, 05, 05]
+16881; [74 39 61, 05, 05]
 
-16894; [77 D4 40, 05, 05]
+16882; [74 39 69, 05, 05]
 
-16895; [77 D4 48, 05, 05]
+16883; [74 39 71, 05, 05]
 
-16896; [77 D4 50, 05, 05]
+16884; [74 39 79, 05, 05]
 
-16897; [77 D4 58, 05, 05]
+16885; [74 39 81, 05, 05]
 
-16898; [77 D4 60, 05, 05]
+16886; [74 39 89, 05, 05]
 
-16899; [77 D4 68, 05, 05]
+16887; [74 39 91, 05, 05]
 
-1689A; [77 D4 70, 05, 05]
+16888; [74 39 99, 05, 05]
 
-1689B; [77 D4 78, 05, 05]
+16889; [74 39 A1, 05, 05]
 
-1689C; [77 D4 80, 05, 05]
+1688A; [74 39 A9, 05, 05]
 
-1689D; [77 D4 88, 05, 05]
+1688B; [74 39 B1, 05, 05]
 
-1689E; [77 D4 90, 05, 05]
+1688C; [74 39 B9, 05, 05]
 
-1689F; [77 D4 98, 05, 05]
+1688D; [74 39 C1, 05, 05]
 
-168A0; [77 D4 A0, 05, 05]
+1688E; [74 39 C9, 05, 05]
 
-168A1; [77 D4 A8, 05, 05]
+1688F; [74 39 D1, 05, 05]
 
-168A2; [77 D4 B0, 05, 05]
+16890; [74 39 D9, 05, 05]
 
-168A3; [77 D4 B8, 05, 05]
+16891; [74 39 E1, 05, 05]
 
-168A4; [77 D4 C0, 05, 05]
+16892; [74 39 E9, 05, 05]
 
-168A5; [77 D4 C8, 05, 05]
+16893; [74 39 F1, 05, 05]
 
-168A6; [77 D4 D0, 05, 05]
+16894; [74 39 F9, 05, 05]
 
-168A7; [77 D4 D8, 05, 05]
+16895; [74 3A 03, 05, 05]
 
-168A8; [77 D4 E0, 05, 05]
+16896; [74 3A 0B, 05, 05]
 
-168A9; [77 D4 E8, 05, 05]
+16897; [74 3A 13, 05, 05]
 
-168AA; [77 D4 F0, 05, 05]
+16898; [74 3A 1B, 05, 05]
 
-168AB; [77 D4 F8, 05, 05]
+16899; [74 3A 23, 05, 05]
 
-168AC; [77 D5 06, 05, 05]
+1689A; [74 3A 2B, 05, 05]
 
-168AD; [77 D5 0E, 05, 05]
+1689B; [74 3A 33, 05, 05]
 
-168AE; [77 D5 16, 05, 05]
+1689C; [74 3A 3B, 05, 05]
 
-168AF; [77 D5 1E, 05, 05]
+1689D; [74 3A 43, 05, 05]
 
-168B0; [77 D5 26, 05, 05]
+1689E; [74 3A 4B, 05, 05]
 
-168B1; [77 D5 2E, 05, 05]
+1689F; [74 3A 53, 05, 05]
 
-168B2; [77 D5 36, 05, 05]
+168A0; [74 3A 5B, 05, 05]
 
-168B3; [77 D5 3E, 05, 05]
+168A1; [74 3A 63, 05, 05]
 
-168B4; [77 D5 46, 05, 05]
+168A2; [74 3A 6B, 05, 05]
 
-168B5; [77 D5 4E, 05, 05]
+168A3; [74 3A 73, 05, 05]
 
-168B6; [77 D5 56, 05, 05]
+168A4; [74 3A 7B, 05, 05]
 
-168B7; [77 D5 5E, 05, 05]
+168A5; [74 3A 83, 05, 05]
 
-168B8; [77 D5 66, 05, 05]
+168A6; [74 3A 8B, 05, 05]
 
-168B9; [77 D5 6E, 05, 05]
+168A7; [74 3A 93, 05, 05]
 
-168BA; [77 D5 76, 05, 05]
+168A8; [74 3A 9B, 05, 05]
 
-168BB; [77 D5 7E, 05, 05]
+168A9; [74 3A A3, 05, 05]
 
-168BC; [77 D5 86, 05, 05]
+168AA; [74 3A AB, 05, 05]
 
-168BD; [77 D5 8E, 05, 05]
+168AB; [74 3A B3, 05, 05]
 
-168BE; [77 D5 96, 05, 05]
+168AC; [74 3A BB, 05, 05]
 
-168BF; [77 D5 9E, 05, 05]
+168AD; [74 3A C3, 05, 05]
 
-168C0; [77 D5 A6, 05, 05]
+168AE; [74 3A CB, 05, 05]
 
-168C1; [77 D5 AE, 05, 05]
+168AF; [74 3A D3, 05, 05]
 
-168C2; [77 D5 B6, 05, 05]
+168B0; [74 3A DB, 05, 05]
 
-168C3; [77 D5 BE, 05, 05]
+168B1; [74 3A E3, 05, 05]
 
-168C4; [77 D5 C6, 05, 05]
+168B2; [74 3A EB, 05, 05]
 
-168C5; [77 D5 CE, 05, 05]
+168B3; [74 3A F3, 05, 05]
 
-168C6; [77 D5 D6, 05, 05]
+168B4; [74 3A FB, 05, 05]
 
-168C7; [77 D5 DE, 05, 05]
+168B5; [74 3B 05, 05, 05]
 
-168C8; [77 D5 E6, 05, 05]
+168B6; [74 3B 0D, 05, 05]
 
-168C9; [77 D5 EE, 05, 05]
+168B7; [74 3B 15, 05, 05]
 
-168CA; [77 D5 F6, 05, 05]
+168B8; [74 3B 1D, 05, 05]
 
-168CB; [77 D6 04, 05, 05]
+168B9; [74 3B 25, 05, 05]
 
-168CC; [77 D6 0C, 05, 05]
+168BA; [74 3B 2D, 05, 05]
 
-168CD; [77 D6 14, 05, 05]
+168BB; [74 3B 35, 05, 05]
 
-168CE; [77 D6 1C, 05, 05]
+168BC; [74 3B 3D, 05, 05]
 
-168CF; [77 D6 24, 05, 05]
+168BD; [74 3B 45, 05, 05]
 
-168D0; [77 D6 2C, 05, 05]
+168BE; [74 3B 4D, 05, 05]
 
-168D1; [77 D6 34, 05, 05]
+168BF; [74 3B 55, 05, 05]
 
-168D2; [77 D6 3C, 05, 05]
+168C0; [74 3B 5D, 05, 05]
 
-168D3; [77 D6 44, 05, 05]
+168C1; [74 3B 65, 05, 05]
 
-168D4; [77 D6 4C, 05, 05]
+168C2; [74 3B 6D, 05, 05]
 
-168D5; [77 D6 54, 05, 05]
+168C3; [74 3B 75, 05, 05]
 
-168D6; [77 D6 5C, 05, 05]
+168C4; [74 3B 7D, 05, 05]
 
-168D7; [77 D6 64, 05, 05]
+168C5; [74 3B 85, 05, 05]
 
-168D8; [77 D6 6C, 05, 05]
+168C6; [74 3B 8D, 05, 05]
 
-168D9; [77 D6 74, 05, 05]
+168C7; [74 3B 95, 05, 05]
 
-168DA; [77 D6 7C, 05, 05]
+168C8; [74 3B 9D, 05, 05]
 
-168DB; [77 D6 84, 05, 05]
+168C9; [74 3B A5, 05, 05]
 
-168DC; [77 D6 8C, 05, 05]
+168CA; [74 3B AD, 05, 05]
 
-168DD; [77 D6 94, 05, 05]
+168CB; [74 3B B5, 05, 05]
 
-168DE; [77 D6 9C, 05, 05]
+168CC; [74 3B BD, 05, 05]
 
-168DF; [77 D6 A4, 05, 05]
+168CD; [74 3B C5, 05, 05]
 
-168E0; [77 D6 AC, 05, 05]
+168CE; [74 3B CD, 05, 05]
 
-168E1; [77 D6 B4, 05, 05]
+168CF; [74 3B D5, 05, 05]
 
-168E2; [77 D6 BC, 05, 05]
+168D0; [74 3B DD, 05, 05]
 
-168E3; [77 D6 C4, 05, 05]
+168D1; [74 3B E5, 05, 05]
 
-168E4; [77 D6 CC, 05, 05]
+168D2; [74 3B ED, 05, 05]
 
-168E5; [77 D6 D4, 05, 05]
+168D3; [74 3B F5, 05, 05]
 
-168E6; [77 D6 DC, 05, 05]
+168D4; [74 3B FD, 05, 05]
 
-168E7; [77 D6 E4, 05, 05]
+168D5; [74 3C 07, 05, 05]
 
-168E8; [77 D6 EC, 05, 05]
+168D6; [74 3C 0F, 05, 05]
 
-168E9; [77 D6 F4, 05, 05]
+168D7; [74 3C 17, 05, 05]
 
-168EA; [77 D6 FC, 05, 05]
+168D8; [74 3C 1F, 05, 05]
 
-168EB; [77 D7 0A, 05, 05]
+168D9; [74 3C 27, 05, 05]
 
-168EC; [77 D7 12, 05, 05]
+168DA; [74 3C 2F, 05, 05]
 
-168ED; [77 D7 1A, 05, 05]
+168DB; [74 3C 37, 05, 05]
 
-168EE; [77 D7 22, 05, 05]
+168DC; [74 3C 3F, 05, 05]
 
-168EF; [77 D7 2A, 05, 05]
+168DD; [74 3C 47, 05, 05]
 
-168F0; [77 D7 32, 05, 05]
+168DE; [74 3C 4F, 05, 05]
 
-168F1; [77 D7 3A, 05, 05]
+168DF; [74 3C 57, 05, 05]
 
-168F2; [77 D7 42, 05, 05]
+168E0; [74 3C 5F, 05, 05]
 
-168F3; [77 D7 4A, 05, 05]
+168E1; [74 3C 67, 05, 05]
 
-168F4; [77 D7 52, 05, 05]
+168E2; [74 3C 6F, 05, 05]
 
-168F5; [77 D7 5A, 05, 05]
+168E3; [74 3C 77, 05, 05]
 
-168F6; [77 D7 62, 05, 05]
+168E4; [74 3C 7F, 05, 05]
 
-168F7; [77 D7 6A, 05, 05]
+168E5; [74 3C 87, 05, 05]
 
-168F8; [77 D7 72, 05, 05]
+168E6; [74 3C 8F, 05, 05]
 
-168F9; [77 D7 7A, 05, 05]
+168E7; [74 3C 97, 05, 05]
 
-168FA; [77 D7 82, 05, 05]
+168E8; [74 3C 9F, 05, 05]
 
-168FB; [77 D7 8A, 05, 05]
+168E9; [74 3C A7, 05, 05]
 
-168FC; [77 D7 92, 05, 05]
+168EA; [74 3C AF, 05, 05]
 
-168FD; [77 D7 9A, 05, 05]
+168EB; [74 3C B7, 05, 05]
 
-168FE; [77 D7 A2, 05, 05]
+168EC; [74 3C BF, 05, 05]
 
-168FF; [77 D7 AA, 05, 05]
+168ED; [74 3C C7, 05, 05]
 
-16900; [77 D7 B2, 05, 05]
+168EE; [74 3C CF, 05, 05]
 
-16901; [77 D7 BA, 05, 05]
+168EF; [74 3C D7, 05, 05]
 
-16902; [77 D7 C2, 05, 05]
+168F0; [74 3C DF, 05, 05]
 
-16903; [77 D7 CA, 05, 05]
+168F1; [74 3C E7, 05, 05]
 
-16904; [77 D7 D2, 05, 05]
+168F2; [74 3C EF, 05, 05]
 
-16905; [77 D7 DA, 05, 05]
+168F3; [74 3C F7, 05, 05]
 
-16906; [77 D7 E2, 05, 05]
+168F4; [74 3C FF, 05, 05]
 
-16907; [77 D7 EA, 05, 05]
+168F5; [74 3D 09, 05, 05]
 
-16908; [77 D7 F2, 05, 05]
+168F6; [74 3D 11, 05, 05]
 
-16909; [77 D7 FA, 05, 05]
+168F7; [74 3D 19, 05, 05]
 
-1690A; [77 D8 08, 05, 05]
+168F8; [74 3D 21, 05, 05]
 
-1690B; [77 D8 10, 05, 05]
+168F9; [74 3D 29, 05, 05]
 
-1690C; [77 D8 18, 05, 05]
+168FA; [74 3D 31, 05, 05]
 
-1690D; [77 D8 20, 05, 05]
+168FB; [74 3D 39, 05, 05]
 
-1690E; [77 D8 28, 05, 05]
+168FC; [74 3D 41, 05, 05]
 
-1690F; [77 D8 30, 05, 05]
+168FD; [74 3D 49, 05, 05]
 
-16910; [77 D8 38, 05, 05]
+168FE; [74 3D 51, 05, 05]
 
-16911; [77 D8 40, 05, 05]
+168FF; [74 3D 59, 05, 05]
 
-16912; [77 D8 48, 05, 05]
+16900; [74 3D 61, 05, 05]
 
-16913; [77 D8 50, 05, 05]
+16901; [74 3D 69, 05, 05]
 
-16914; [77 D8 58, 05, 05]
+16902; [74 3D 71, 05, 05]
 
-16915; [77 D8 60, 05, 05]
+16903; [74 3D 79, 05, 05]
 
-16916; [77 D8 68, 05, 05]
+16904; [74 3D 81, 05, 05]
 
-16917; [77 D8 70, 05, 05]
+16905; [74 3D 89, 05, 05]
 
-16918; [77 D8 78, 05, 05]
+16906; [74 3D 91, 05, 05]
 
-16919; [77 D8 80, 05, 05]
+16907; [74 3D 99, 05, 05]
 
-1691A; [77 D8 88, 05, 05]
+16908; [74 3D A1, 05, 05]
 
-1691B; [77 D8 90, 05, 05]
+16909; [74 3D A9, 05, 05]
 
-1691C; [77 D8 98, 05, 05]
+1690A; [74 3D B1, 05, 05]
 
-1691D; [77 D8 A0, 05, 05]
+1690B; [74 3D B9, 05, 05]
 
-1691E; [77 D8 A8, 05, 05]
+1690C; [74 3D C1, 05, 05]
 
-1691F; [77 D8 B0, 05, 05]
+1690D; [74 3D C9, 05, 05]
 
-16920; [77 D8 B8, 05, 05]
+1690E; [74 3D D1, 05, 05]
 
-16921; [77 D8 C0, 05, 05]
+1690F; [74 3D D9, 05, 05]
 
-16922; [77 D8 C8, 05, 05]
+16910; [74 3D E1, 05, 05]
 
-16923; [77 D8 D0, 05, 05]
+16911; [74 3D E9, 05, 05]
 
-16924; [77 D8 D8, 05, 05]
+16912; [74 3D F1, 05, 05]
 
-16925; [77 D8 E0, 05, 05]
+16913; [74 3D F9, 05, 05]
 
-16926; [77 D8 E8, 05, 05]
+16914; [74 3E 03, 05, 05]
 
-16927; [77 D8 F0, 05, 05]
+16915; [74 3E 0B, 05, 05]
 
-16928; [77 D8 F8, 05, 05]
+16916; [74 3E 13, 05, 05]
 
-16929; [77 D9 06, 05, 05]
+16917; [74 3E 1B, 05, 05]
 
-1692A; [77 D9 0E, 05, 05]
+16918; [74 3E 23, 05, 05]
 
-1692B; [77 D9 16, 05, 05]
+16919; [74 3E 2B, 05, 05]
 
-1692C; [77 D9 1E, 05, 05]
+1691A; [74 3E 33, 05, 05]
 
-1692D; [77 D9 26, 05, 05]
+1691B; [74 3E 3B, 05, 05]
 
-1692E; [77 D9 2E, 05, 05]
+1691C; [74 3E 43, 05, 05]
 
-1692F; [77 D9 36, 05, 05]
+1691D; [74 3E 4B, 05, 05]
 
-16930; [77 D9 3E, 05, 05]
+1691E; [74 3E 53, 05, 05]
 
-16931; [77 D9 46, 05, 05]
+1691F; [74 3E 5B, 05, 05]
 
-16932; [77 D9 4E, 05, 05]
+16920; [74 3E 63, 05, 05]
 
-16933; [77 D9 56, 05, 05]
+16921; [74 3E 6B, 05, 05]
 
-16934; [77 D9 5E, 05, 05]
+16922; [74 3E 73, 05, 05]
 
-16935; [77 D9 66, 05, 05]
+16923; [74 3E 7B, 05, 05]
 
-16936; [77 D9 6E, 05, 05]
+16924; [74 3E 83, 05, 05]
 
-16937; [77 D9 76, 05, 05]
+16925; [74 3E 8B, 05, 05]
 
-16938; [77 D9 7E, 05, 05]
+16926; [74 3E 93, 05, 05]
 
-16939; [77 D9 86, 05, 05]
+16927; [74 3E 9B, 05, 05]
 
-1693A; [77 D9 8E, 05, 05]
+16928; [74 3E A3, 05, 05]
 
-1693B; [77 D9 96, 05, 05]
+16929; [74 3E AB, 05, 05]
 
-1693C; [77 D9 9E, 05, 05]
+1692A; [74 3E B3, 05, 05]
 
-1693D; [77 D9 A6, 05, 05]
+1692B; [74 3E BB, 05, 05]
 
-1693E; [77 D9 AE, 05, 05]
+1692C; [74 3E C3, 05, 05]
 
-1693F; [77 D9 B6, 05, 05]
+1692D; [74 3E CB, 05, 05]
 
-16940; [77 D9 BE, 05, 05]
+1692E; [74 3E D3, 05, 05]
 
-16941; [77 D9 C6, 05, 05]
+1692F; [74 3E DB, 05, 05]
 
-16942; [77 D9 CE, 05, 05]
+16930; [74 3E E3, 05, 05]
 
-16943; [77 D9 D6, 05, 05]
+16931; [74 3E EB, 05, 05]
 
-16944; [77 D9 DE, 05, 05]
+16932; [74 3E F3, 05, 05]
 
-16945; [77 D9 E6, 05, 05]
+16933; [74 3E FB, 05, 05]
 
-16946; [77 D9 EE, 05, 05]
+16934; [74 3F 05, 05, 05]
 
-16947; [77 D9 F6, 05, 05]
+16935; [74 3F 0D, 05, 05]
 
-16948; [77 DA 04, 05, 05]
+16936; [74 3F 15, 05, 05]
 
-16949; [77 DA 0C, 05, 05]
+16937; [74 3F 1D, 05, 05]
 
-1694A; [77 DA 14, 05, 05]
+16938; [74 3F 25, 05, 05]
 
-1694B; [77 DA 1C, 05, 05]
+16939; [74 3F 2D, 05, 05]
 
-1694C; [77 DA 24, 05, 05]
+1693A; [74 3F 35, 05, 05]
 
-1694D; [77 DA 2C, 05, 05]
+1693B; [74 3F 3D, 05, 05]
 
-1694E; [77 DA 34, 05, 05]
+1693C; [74 3F 45, 05, 05]
 
-1694F; [77 DA 3C, 05, 05]
+1693D; [74 3F 4D, 05, 05]
 
-16950; [77 DA 44, 05, 05]
+1693E; [74 3F 55, 05, 05]
 
-16951; [77 DA 4C, 05, 05]
+1693F; [74 3F 5D, 05, 05]
 
-16952; [77 DA 54, 05, 05]
+16940; [74 3F 65, 05, 05]
 
-16953; [77 DA 5C, 05, 05]
+16941; [74 3F 6D, 05, 05]
 
-16954; [77 DA 64, 05, 05]
+16942; [74 3F 75, 05, 05]
 
-16955; [77 DA 6C, 05, 05]
+16943; [74 3F 7D, 05, 05]
 
-16956; [77 DA 74, 05, 05]
+16944; [74 3F 85, 05, 05]
 
-16957; [77 DA 7C, 05, 05]
+16945; [74 3F 8D, 05, 05]
 
-16958; [77 DA 84, 05, 05]
+16946; [74 3F 95, 05, 05]
 
-16959; [77 DA 8C, 05, 05]
+16947; [74 3F 9D, 05, 05]
 
-1695A; [77 DA 94, 05, 05]
+16948; [74 3F A5, 05, 05]
 
-1695B; [77 DA 9C, 05, 05]
+16949; [74 3F AD, 05, 05]
 
-1695C; [77 DA A4, 05, 05]
+1694A; [74 3F B5, 05, 05]
 
-1695D; [77 DA AC, 05, 05]
+1694B; [74 3F BD, 05, 05]
 
-1695E; [77 DA B4, 05, 05]
+1694C; [74 3F C5, 05, 05]
 
-1695F; [77 DA BC, 05, 05]
+1694D; [74 3F CD, 05, 05]
 
-16960; [77 DA C4, 05, 05]
+1694E; [74 3F D5, 05, 05]
 
-16961; [77 DA CC, 05, 05]
+1694F; [74 3F DD, 05, 05]
 
-16962; [77 DA D4, 05, 05]
+16950; [74 3F E5, 05, 05]
 
-16963; [77 DA DC, 05, 05]
+16951; [74 3F ED, 05, 05]
 
-16964; [77 DA E4, 05, 05]
+16952; [74 3F F5, 05, 05]
 
-16965; [77 DA EC, 05, 05]
+16953; [74 3F FD, 05, 05]
 
-16966; [77 DA F4, 05, 05]
+16954; [74 40 07, 05, 05]
 
-16967; [77 DA FC, 05, 05]
+16955; [74 40 0F, 05, 05]
 
-16968; [77 DB 0A, 05, 05]
+16956; [74 40 17, 05, 05]
 
-16969; [77 DB 12, 05, 05]
+16957; [74 40 1F, 05, 05]
 
-1696A; [77 DB 1A, 05, 05]
+16958; [74 40 27, 05, 05]
 
-1696B; [77 DB 22, 05, 05]
+16959; [74 40 2F, 05, 05]
 
-1696C; [77 DB 2A, 05, 05]
+1695A; [74 40 37, 05, 05]
 
-1696D; [77 DB 32, 05, 05]
+1695B; [74 40 3F, 05, 05]
 
-1696E; [77 DB 3A, 05, 05]
+1695C; [74 40 47, 05, 05]
 
-1696F; [77 DB 42, 05, 05]
+1695D; [74 40 4F, 05, 05]
 
-16970; [77 DB 4A, 05, 05]
+1695E; [74 40 57, 05, 05]
 
-16971; [77 DB 52, 05, 05]
+1695F; [74 40 5F, 05, 05]
 
-16972; [77 DB 5A, 05, 05]
+16960; [74 40 67, 05, 05]
 
-16973; [77 DB 62, 05, 05]
+16961; [74 40 6F, 05, 05]
 
-16974; [77 DB 6A, 05, 05]
+16962; [74 40 77, 05, 05]
 
-16975; [77 DB 72, 05, 05]
+16963; [74 40 7F, 05, 05]
 
-16976; [77 DB 7A, 05, 05]
+16964; [74 40 87, 05, 05]
 
-16977; [77 DB 82, 05, 05]
+16965; [74 40 8F, 05, 05]
 
-16978; [77 DB 8A, 05, 05]
+16966; [74 40 97, 05, 05]
 
-16979; [77 DB 92, 05, 05]
+16967; [74 40 9F, 05, 05]
 
-1697A; [77 DB 9A, 05, 05]
+16968; [74 40 A7, 05, 05]
 
-1697B; [77 DB A2, 05, 05]
+16969; [74 40 AF, 05, 05]
 
-1697C; [77 DB AA, 05, 05]
+1696A; [74 40 B7, 05, 05]
 
-1697D; [77 DB B2, 05, 05]
+1696B; [74 40 BF, 05, 05]
 
-1697E; [77 DB BA, 05, 05]
+1696C; [74 40 C7, 05, 05]
 
-1697F; [77 DB C2, 05, 05]
+1696D; [74 40 CF, 05, 05]
 
-16980; [77 DB CA, 05, 05]
+1696E; [74 40 D7, 05, 05]
 
-16981; [77 DB D2, 05, 05]
+1696F; [74 40 DF, 05, 05]
 
-16982; [77 DB DA, 05, 05]
+16970; [74 40 E7, 05, 05]
 
-16983; [77 DB E2, 05, 05]
+16971; [74 40 EF, 05, 05]
 
-16984; [77 DB EA, 05, 05]
+16972; [74 40 F7, 05, 05]
 
-16985; [77 DB F2, 05, 05]
+16973; [74 40 FF, 05, 05]
 
-16986; [77 DB FA, 05, 05]
+16974; [74 41 09, 05, 05]
 
-16987; [77 DC 08, 05, 05]
+16975; [74 41 11, 05, 05]
 
-16988; [77 DC 10, 05, 05]
+16976; [74 41 19, 05, 05]
 
-16989; [77 DC 18, 05, 05]
+16977; [74 41 21, 05, 05]
 
-1698A; [77 DC 20, 05, 05]
+16978; [74 41 29, 05, 05]
 
-1698B; [77 DC 28, 05, 05]
+16979; [74 41 31, 05, 05]
 
-1698C; [77 DC 30, 05, 05]
+1697A; [74 41 39, 05, 05]
 
-1698D; [77 DC 38, 05, 05]
+1697B; [74 41 41, 05, 05]
 
-1698E; [77 DC 40, 05, 05]
+1697C; [74 41 49, 05, 05]
 
-1698F; [77 DC 48, 05, 05]
+1697D; [74 41 51, 05, 05]
 
-16990; [77 DC 50, 05, 05]
+1697E; [74 41 59, 05, 05]
 
-16991; [77 DC 58, 05, 05]
+1697F; [74 41 61, 05, 05]
 
-16992; [77 DC 60, 05, 05]
+16980; [74 41 69, 05, 05]
 
-16993; [77 DC 68, 05, 05]
+16981; [74 41 71, 05, 05]
 
-16994; [77 DC 70, 05, 05]
+16982; [74 41 79, 05, 05]
 
-16995; [77 DC 78, 05, 05]
+16983; [74 41 81, 05, 05]
 
-16996; [77 DC 80, 05, 05]
+16984; [74 41 89, 05, 05]
 
-16997; [77 DC 88, 05, 05]
+16985; [74 41 91, 05, 05]
 
-16998; [77 DC 90, 05, 05]
+16986; [74 41 99, 05, 05]
 
-16999; [77 DC 98, 05, 05]
+16987; [74 41 A1, 05, 05]
 
-1699A; [77 DC A0, 05, 05]
+16988; [74 41 A9, 05, 05]
 
-1699B; [77 DC A8, 05, 05]
+16989; [74 41 B1, 05, 05]
 
-1699C; [77 DC B0, 05, 05]
+1698A; [74 41 B9, 05, 05]
 
-1699D; [77 DC B8, 05, 05]
+1698B; [74 41 C1, 05, 05]
 
-1699E; [77 DC C0, 05, 05]
+1698C; [74 41 C9, 05, 05]
 
-1699F; [77 DC C8, 05, 05]
+1698D; [74 41 D1, 05, 05]
 
-169A0; [77 DC D0, 05, 05]
+1698E; [74 41 D9, 05, 05]
 
-169A1; [77 DC D8, 05, 05]
+1698F; [74 41 E1, 05, 05]
 
-169A2; [77 DC E0, 05, 05]
+16990; [74 41 E9, 05, 05]
 
-169A3; [77 DC E8, 05, 05]
+16991; [74 41 F1, 05, 05]
 
-169A4; [77 DC F0, 05, 05]
+16992; [74 41 F9, 05, 05]
 
-169A5; [77 DC F8, 05, 05]
+16993; [74 42 03, 05, 05]
 
-169A6; [77 DD 06, 05, 05]
+16994; [74 42 0B, 05, 05]
 
-169A7; [77 DD 0E, 05, 05]
+16995; [74 42 13, 05, 05]
 
-169A8; [77 DD 16, 05, 05]
+16996; [74 42 1B, 05, 05]
 
-169A9; [77 DD 1E, 05, 05]
+16997; [74 42 23, 05, 05]
 
-169AA; [77 DD 26, 05, 05]
+16998; [74 42 2B, 05, 05]
 
-169AB; [77 DD 2E, 05, 05]
+16999; [74 42 33, 05, 05]
 
-169AC; [77 DD 36, 05, 05]
+1699A; [74 42 3B, 05, 05]
 
-169AD; [77 DD 3E, 05, 05]
+1699B; [74 42 43, 05, 05]
 
-169AE; [77 DD 46, 05, 05]
+1699C; [74 42 4B, 05, 05]
 
-169AF; [77 DD 4E, 05, 05]
+1699D; [74 42 53, 05, 05]
 
-169B0; [77 DD 56, 05, 05]
+1699E; [74 42 5B, 05, 05]
 
-169B1; [77 DD 5E, 05, 05]
+1699F; [74 42 63, 05, 05]
 
-169B2; [77 DD 66, 05, 05]
+169A0; [74 42 6B, 05, 05]
 
-169B3; [77 DD 6E, 05, 05]
+169A1; [74 42 73, 05, 05]
 
-169B4; [77 DD 76, 05, 05]
+169A2; [74 42 7B, 05, 05]
 
-169B5; [77 DD 7E, 05, 05]
+169A3; [74 42 83, 05, 05]
 
-169B6; [77 DD 86, 05, 05]
+169A4; [74 42 8B, 05, 05]
 
-169B7; [77 DD 8E, 05, 05]
+169A5; [74 42 93, 05, 05]
 
-169B8; [77 DD 96, 05, 05]
+169A6; [74 42 9B, 05, 05]
 
-169B9; [77 DD 9E, 05, 05]
+169A7; [74 42 A3, 05, 05]
 
-169BA; [77 DD A6, 05, 05]
+169A8; [74 42 AB, 05, 05]
 
-169BB; [77 DD AE, 05, 05]
+169A9; [74 42 B3, 05, 05]
 
-169BC; [77 DD B6, 05, 05]
+169AA; [74 42 BB, 05, 05]
 
-169BD; [77 DD BE, 05, 05]
+169AB; [74 42 C3, 05, 05]
 
-169BE; [77 DD C6, 05, 05]
+169AC; [74 42 CB, 05, 05]
 
-169BF; [77 DD CE, 05, 05]
+169AD; [74 42 D3, 05, 05]
 
-169C0; [77 DD D6, 05, 05]
+169AE; [74 42 DB, 05, 05]
 
-169C1; [77 DD DE, 05, 05]
+169AF; [74 42 E3, 05, 05]
 
-169C2; [77 DD E6, 05, 05]
+169B0; [74 42 EB, 05, 05]
 
-169C3; [77 DD EE, 05, 05]
+169B1; [74 42 F3, 05, 05]
 
-169C4; [77 DD F6, 05, 05]
+169B2; [74 42 FB, 05, 05]
 
-169C5; [77 DE 04, 05, 05]
+169B3; [74 43 05, 05, 05]
 
-169C6; [77 DE 0C, 05, 05]
+169B4; [74 43 0D, 05, 05]
 
-169C7; [77 DE 14, 05, 05]
+169B5; [74 43 15, 05, 05]
 
-169C8; [77 DE 1C, 05, 05]
+169B6; [74 43 1D, 05, 05]
 
-169C9; [77 DE 24, 05, 05]
+169B7; [74 43 25, 05, 05]
 
-169CA; [77 DE 2C, 05, 05]
+169B8; [74 43 2D, 05, 05]
 
-169CB; [77 DE 34, 05, 05]
+169B9; [74 43 35, 05, 05]
 
-169CC; [77 DE 3C, 05, 05]
+169BA; [74 43 3D, 05, 05]
 
-169CD; [77 DE 44, 05, 05]
+169BB; [74 43 45, 05, 05]
 
-169CE; [77 DE 4C, 05, 05]
+169BC; [74 43 4D, 05, 05]
 
-169CF; [77 DE 54, 05, 05]
+169BD; [74 43 55, 05, 05]
 
-169D0; [77 DE 5C, 05, 05]
+169BE; [74 43 5D, 05, 05]
 
-169D1; [77 DE 64, 05, 05]
+169BF; [74 43 65, 05, 05]
 
-169D2; [77 DE 6C, 05, 05]
+169C0; [74 43 6D, 05, 05]
 
-169D3; [77 DE 74, 05, 05]
+169C1; [74 43 75, 05, 05]
 
-169D4; [77 DE 7C, 05, 05]
+169C2; [74 43 7D, 05, 05]
 
-169D5; [77 DE 84, 05, 05]
+169C3; [74 43 85, 05, 05]
 
-169D6; [77 DE 8C, 05, 05]
+169C4; [74 43 8D, 05, 05]
 
-169D7; [77 DE 94, 05, 05]
+169C5; [74 43 95, 05, 05]
 
-169D8; [77 DE 9C, 05, 05]
+169C6; [74 43 9D, 05, 05]
 
-169D9; [77 DE A4, 05, 05]
+169C7; [74 43 A5, 05, 05]
 
-169DA; [77 DE AC, 05, 05]
+169C8; [74 43 AD, 05, 05]
 
-169DB; [77 DE B4, 05, 05]
+169C9; [74 43 B5, 05, 05]
 
-169DC; [77 DE BC, 05, 05]
+169CA; [74 43 BD, 05, 05]
 
-169DD; [77 DE C4, 05, 05]
+169CB; [74 43 C5, 05, 05]
 
-169DE; [77 DE CC, 05, 05]
+169CC; [74 43 CD, 05, 05]
 
-169DF; [77 DE D4, 05, 05]
+169CD; [74 43 D5, 05, 05]
 
-169E0; [77 DE DC, 05, 05]
+169CE; [74 43 DD, 05, 05]
 
-169E1; [77 DE E4, 05, 05]
+169CF; [74 43 E5, 05, 05]
 
-169E2; [77 DE EC, 05, 05]
+169D0; [74 43 ED, 05, 05]
 
-169E3; [77 DE F4, 05, 05]
+169D1; [74 43 F5, 05, 05]
 
-169E4; [77 DE FC, 05, 05]
+169D2; [74 43 FD, 05, 05]
 
-169E5; [77 DF 0A, 05, 05]
+169D3; [74 44 07, 05, 05]
 
-169E6; [77 DF 12, 05, 05]
+169D4; [74 44 0F, 05, 05]
 
-169E7; [77 DF 1A, 05, 05]
+169D5; [74 44 17, 05, 05]
 
-169E8; [77 DF 22, 05, 05]
+169D6; [74 44 1F, 05, 05]
 
-169E9; [77 DF 2A, 05, 05]
+169D7; [74 44 27, 05, 05]
 
-169EA; [77 DF 32, 05, 05]
+169D8; [74 44 2F, 05, 05]
 
-169EB; [77 DF 3A, 05, 05]
+169D9; [74 44 37, 05, 05]
 
-169EC; [77 DF 42, 05, 05]
+169DA; [74 44 3F, 05, 05]
 
-169ED; [77 DF 4A, 05, 05]
+169DB; [74 44 47, 05, 05]
 
-169EE; [77 DF 52, 05, 05]
+169DC; [74 44 4F, 05, 05]
 
-169EF; [77 DF 5A, 05, 05]
+169DD; [74 44 57, 05, 05]
 
-169F0; [77 DF 62, 05, 05]
+169DE; [74 44 5F, 05, 05]
 
-169F1; [77 DF 6A, 05, 05]
+169DF; [74 44 67, 05, 05]
 
-169F2; [77 DF 72, 05, 05]
+169E0; [74 44 6F, 05, 05]
 
-169F3; [77 DF 7A, 05, 05]
+169E1; [74 44 77, 05, 05]
 
-169F4; [77 DF 82, 05, 05]
+169E2; [74 44 7F, 05, 05]
 
-169F5; [77 DF 8A, 05, 05]
+169E3; [74 44 87, 05, 05]
 
-169F6; [77 DF 92, 05, 05]
+169E4; [74 44 8F, 05, 05]
 
-169F7; [77 DF 9A, 05, 05]
+169E5; [74 44 97, 05, 05]
 
-169F8; [77 DF A2, 05, 05]
+169E6; [74 44 9F, 05, 05]
 
-169F9; [77 DF AA, 05, 05]
+169E7; [74 44 A7, 05, 05]
 
-169FA; [77 DF B2, 05, 05]
+169E8; [74 44 AF, 05, 05]
 
-169FB; [77 DF BA, 05, 05]
+169E9; [74 44 B7, 05, 05]
 
-169FC; [77 DF C2, 05, 05]
+169EA; [74 44 BF, 05, 05]
 
-169FD; [77 DF CA, 05, 05]
+169EB; [74 44 C7, 05, 05]
 
-169FE; [77 DF D2, 05, 05]
+169EC; [74 44 CF, 05, 05]
 
-169FF; [77 DF DA, 05, 05]
+169ED; [74 44 D7, 05, 05]
 
-16A00; [77 DF E2, 05, 05]
+169EE; [74 44 DF, 05, 05]
 
-16A01; [77 DF EA, 05, 05]
+169EF; [74 44 E7, 05, 05]
 
-16A02; [77 DF F2, 05, 05]
+169F0; [74 44 EF, 05, 05]
 
-16A03; [77 DF FA, 05, 05]
+169F1; [74 44 F7, 05, 05]
 
-16A04; [77 E0 08, 05, 05]
+169F2; [74 44 FF, 05, 05]
 
-16A05; [77 E0 10, 05, 05]
+169F3; [74 45 09, 05, 05]
 
-16A06; [77 E0 18, 05, 05]
+169F4; [74 45 11, 05, 05]
 
-16A07; [77 E0 20, 05, 05]
+169F5; [74 45 19, 05, 05]
 
-16A08; [77 E0 28, 05, 05]
+169F6; [74 45 21, 05, 05]
 
-16A09; [77 E0 30, 05, 05]
+169F7; [74 45 29, 05, 05]
 
-16A0A; [77 E0 38, 05, 05]
+169F8; [74 45 31, 05, 05]
 
-16A0B; [77 E0 40, 05, 05]
+169F9; [74 45 39, 05, 05]
 
-16A0C; [77 E0 48, 05, 05]
+169FA; [74 45 41, 05, 05]
 
-16A0D; [77 E0 50, 05, 05]
+169FB; [74 45 49, 05, 05]
 
-16A0E; [77 E0 58, 05, 05]
+169FC; [74 45 51, 05, 05]
 
-16A0F; [77 E0 60, 05, 05]
+169FD; [74 45 59, 05, 05]
 
-16A10; [77 E0 68, 05, 05]
+169FE; [74 45 61, 05, 05]
 
-16A11; [77 E0 70, 05, 05]
+169FF; [74 45 69, 05, 05]
 
-16A12; [77 E0 78, 05, 05]
+16A00; [74 45 71, 05, 05]
 
-16A13; [77 E0 80, 05, 05]
+16A01; [74 45 79, 05, 05]
 
-16A14; [77 E0 88, 05, 05]
+16A02; [74 45 81, 05, 05]
 
-16A15; [77 E0 90, 05, 05]
+16A03; [74 45 89, 05, 05]
 
-16A16; [77 E0 98, 05, 05]
+16A04; [74 45 91, 05, 05]
 
-16A17; [77 E0 A0, 05, 05]
+16A05; [74 45 99, 05, 05]
 
-16A18; [77 E0 A8, 05, 05]
+16A06; [74 45 A1, 05, 05]
 
-16A19; [77 E0 B0, 05, 05]
+16A07; [74 45 A9, 05, 05]
 
-16A1A; [77 E0 B8, 05, 05]
+16A08; [74 45 B1, 05, 05]
 
-16A1B; [77 E0 C0, 05, 05]
+16A09; [74 45 B9, 05, 05]
 
-16A1C; [77 E0 C8, 05, 05]
+16A0A; [74 45 C1, 05, 05]
 
-16A1D; [77 E0 D0, 05, 05]
+16A0B; [74 45 C9, 05, 05]
 
-16A1E; [77 E0 D8, 05, 05]
+16A0C; [74 45 D1, 05, 05]
 
-16A1F; [77 E0 E0, 05, 05]
+16A0D; [74 45 D9, 05, 05]
 
-16A20; [77 E0 E8, 05, 05]
+16A0E; [74 45 E1, 05, 05]
 
-16A21; [77 E0 F0, 05, 05]
+16A0F; [74 45 E9, 05, 05]
 
-16A22; [77 E0 F8, 05, 05]
+16A10; [74 45 F1, 05, 05]
 
-16A23; [77 E1 06, 05, 05]
+16A11; [74 45 F9, 05, 05]
 
-16A24; [77 E1 0E, 05, 05]
+16A12; [74 46 03, 05, 05]
 
-16A25; [77 E1 16, 05, 05]
+16A13; [74 46 0B, 05, 05]
 
-16A26; [77 E1 1E, 05, 05]
+16A14; [74 46 13, 05, 05]
 
-16A27; [77 E1 26, 05, 05]
+16A15; [74 46 1B, 05, 05]
 
-16A28; [77 E1 2E, 05, 05]
+16A16; [74 46 23, 05, 05]
 
-16A29; [77 E1 36, 05, 05]
+16A17; [74 46 2B, 05, 05]
 
-16A2A; [77 E1 3E, 05, 05]
+16A18; [74 46 33, 05, 05]
 
-16A2B; [77 E1 46, 05, 05]
+16A19; [74 46 3B, 05, 05]
 
-16A2C; [77 E1 4E, 05, 05]
+16A1A; [74 46 43, 05, 05]
 
-16A2D; [77 E1 56, 05, 05]
+16A1B; [74 46 4B, 05, 05]
 
-16A2E; [77 E1 5E, 05, 05]
+16A1C; [74 46 53, 05, 05]
 
-16A2F; [77 E1 66, 05, 05]
+16A1D; [74 46 5B, 05, 05]
 
-16A30; [77 E1 6E, 05, 05]
+16A1E; [74 46 63, 05, 05]
 
-16A31; [77 E1 76, 05, 05]
+16A1F; [74 46 6B, 05, 05]
 
-16A32; [77 E1 7E, 05, 05]
+16A20; [74 46 73, 05, 05]
 
-16A33; [77 E1 86, 05, 05]
+16A21; [74 46 7B, 05, 05]
 
-16A34; [77 E1 8E, 05, 05]
+16A22; [74 46 83, 05, 05]
 
-16A35; [77 E1 96, 05, 05]
+16A23; [74 46 8B, 05, 05]
 
-16A36; [77 E1 9E, 05, 05]
+16A24; [74 46 93, 05, 05]
 
-16A37; [77 E1 A6, 05, 05]
+16A25; [74 46 9B, 05, 05]
 
-16A38; [77 E1 AE, 05, 05]
+16A26; [74 46 A3, 05, 05]
 
-1100; [78 0A, 05, 05]
-3131; [78 0A, 05, 09]
-3260; [78 0A, 05, 0D]
-FFA1; [78 0A, 05, A3]
-326E; [78 0A, 05, 0D][78 34, 05, 0D]
+16A27; [74 46 AB, 05, 05]
 
-1101; [78 0C, 05, 05]
-3132; [78 0C, 05, 09]
-FFA2; [78 0C, 05, A3]
+16A28; [74 46 B3, 05, 05]
 
-1102; [78 0E, 05, 05]
-3134; [78 0E, 05, 09]
-3261; [78 0E, 05, 0D]
-FFA4; [78 0E, 05, A3]
-326F; [78 0E, 05, 0D][78 34, 05, 0D]
+16A29; [74 46 BB, 05, 05]
 
-1103; [78 10, 05, 05]
-3137; [78 10, 05, 09]
-3262; [78 10, 05, 0D]
-FFA7; [78 10, 05, A3]
-3270; [78 10, 05, 0D][78 34, 05, 0D]
+16A2A; [74 46 C3, 05, 05]
 
-1104; [78 12, 05, 05]
-3138; [78 12, 05, 09]
-FFA8; [78 12, 05, A3]
+16A2B; [74 46 CB, 05, 05]
 
-1105; [78 14, 05, 05]
-3139; [78 14, 05, 09]
-3263; [78 14, 05, 0D]
-FFA9; [78 14, 05, A3]
-3271; [78 14, 05, 0D][78 34, 05, 0D]
+16A2C; [74 46 D3, 05, 05]
 
-1106; [78 16, 05, 05]
-3141; [78 16, 05, 09]
-3264; [78 16, 05, 0D]
-FFB1; [78 16, 05, A3]
-3272; [78 16, 05, 0D][78 34, 05, 0D]
+16A2D; [74 46 DB, 05, 05]
 
-1107; [78 18, 05, 05]
-3142; [78 18, 05, 09]
-3265; [78 18, 05, 0D]
-FFB2; [78 18, 05, A3]
-3273; [78 18, 05, 0D][78 34, 05, 0D]
+16A2E; [74 46 E3, 05, 05]
 
-1108; [78 1A, 05, 05]
-3143; [78 1A, 05, 09]
-FFB3; [78 1A, 05, A3]
+16A2F; [74 46 EB, 05, 05]
 
-1109; [78 1C, 05, 05]
-3145; [78 1C, 05, 09]
-3266; [78 1C, 05, 0D]
-FFB5; [78 1C, 05, A3]
-3274; [78 1C, 05, 0D][78 34, 05, 0D]
+16A30; [74 46 F3, 05, 05]
 
-110A; [78 1E, 05, 05]
-3146; [78 1E, 05, 09]
-FFB6; [78 1E, 05, A3]
+16A31; [74 46 FB, 05, 05]
 
-110B; [78 20, 05, 05]
-3147; [78 20, 05, 09]
-3267; [78 20, 05, 0D]
-FFB7; [78 20, 05, A3]
-3275; [78 20, 05, 0D][78 34, 05, 0D]
-327E; [78 20, 05, 0D][78 4E, 05, 0D]
+16A32; [74 47 05, 05, 05]
 
-110C; [78 22, 05, 05]
-3148; [78 22, 05, 09]
-3268; [78 22, 05, 0D]
-FFB8; [78 22, 05, A3]
-3276; [78 22, 05, 0D][78 34, 05, 0D]
-327D; [78 22, 05, 0D][78 4E, 05, 0D][78 20, 05, 0D][78 5A, 05, 0D]
+16A33; [74 47 0D, 05, 05]
 
-110D; [78 24, 05, 05]
-3149; [78 24, 05, 09]
-FFB9; [78 24, 05, A3]
+16A34; [74 47 15, 05, 05]
 
-110E; [78 26, 05, 05]
-314A; [78 26, 05, 09]
-3269; [78 26, 05, 0D]
-FFBA; [78 26, 05, A3]
-3277; [78 26, 05, 0D][78 34, 05, 0D]
-327C; [78 26, 05, 0D][78 34, 05, 0D][78 7F, 05, 0D][78 0A, 05, 0D][78 44, 05, 0D]
+16A35; [74 47 1D, 05, 05]
 
-110F; [78 28, 05, 05]
-314B; [78 28, 05, 09]
-326A; [78 28, 05, 0D]
-FFBB; [78 28, 05, A3]
-3278; [78 28, 05, 0D][78 34, 05, 0D]
+16A36; [74 47 25, 05, 05]
 
-1110; [78 2A, 05, 05]
-314C; [78 2A, 05, 09]
-326B; [78 2A, 05, 0D]
-FFBC; [78 2A, 05, A3]
-3279; [78 2A, 05, 0D][78 34, 05, 0D]
+16A37; [74 47 2D, 05, 05]
 
-1111; [78 2C, 05, 05]
-314D; [78 2C, 05, 09]
-326C; [78 2C, 05, 0D]
-FFBD; [78 2C, 05, A3]
-327A; [78 2C, 05, 0D][78 34, 05, 0D]
+16A38; [74 47 35, 05, 05]
 
-1112; [78 2E, 05, 05]
-314E; [78 2E, 05, 09]
-326D; [78 2E, 05, 0D]
-FFBE; [78 2E, 05, A3]
-327B; [78 2E, 05, 0D][78 34, 05, 0D]
+FDD1 AC00;     [75 04 02, 05, 05]      # HANGUL first primary starts reordering group (compressible)
 
-1113; [78 30 04, 05, 05]
+1100; [75 09, 05, 05]
+3131; [75 09, 05, 10]
+3260; [75 09, 05, 1E]
+FFA1; [75 09, 05, AC]
+326E; [75 09, 05, 1E][75 34, 05, 1E]
 
-1114; [78 30 0C, 05, 05]
-3165; [78 30 0C, 05, 09]
+1101; [75 0B, 05, 05]
+3132; [75 0B, 05, 20]
+FFA2; [75 0B, 05, AE]
 
-1115; [78 30 14, 05, 05]
-3166; [78 30 14, 05, 09]
+1102; [75 0D, 05, 05]
+3134; [75 0D, 05, 10]
+3261; [75 0D, 05, 1E]
+FFA4; [75 0D, 05, AC]
+326F; [75 0D, 05, 1E][75 34, 05, 1E]
 
-1116; [78 30 1C, 05, 05]
+1103; [75 0F, 05, 05]
+3137; [75 0F, 05, 10]
+3262; [75 0F, 05, 1E]
+FFA7; [75 0F, 05, AC]
+3270; [75 0F, 05, 1E][75 34, 05, 1E]
 
-1117; [78 30 24, 05, 05]
+1104; [75 11, 05, 05]
+3138; [75 11, 05, 20]
+FFA8; [75 11, 05, AE]
 
-1118; [78 30 2C, 05, 05]
+1105; [75 13, 05, 05]
+3139; [75 13, 05, 10]
+3263; [75 13, 05, 1E]
+FFA9; [75 13, 05, AC]
+3271; [75 13, 05, 1E][75 34, 05, 1E]
 
-1119; [78 30 34, 05, 05]
+1106; [75 15, 05, 05]
+3141; [75 15, 05, 10]
+3264; [75 15, 05, 1E]
+FFB1; [75 15, 05, AC]
+3272; [75 15, 05, 1E][75 34, 05, 1E]
 
-111A; [78 30 3C, 05, 05]
-3140; [78 30 3C, 05, 09]
-FFB0; [78 30 3C, 05, A3]
+1107; [75 17, 05, 05]
+3142; [75 17, 05, 10]
+3265; [75 17, 05, 1E]
+FFB2; [75 17, 05, AC]
+3273; [75 17, 05, 1E][75 34, 05, 1E]
 
-111B; [78 30 44, 05, 05]
+1108; [75 19, 05, 05]
+3143; [75 19, 05, 20]
+FFB3; [75 19, 05, AE]
 
-111C; [78 30 4C, 05, 05]
-316E; [78 30 4C, 05, 09]
+1109; [75 1B, 05, 05]
+3145; [75 1B, 05, 10]
+3266; [75 1B, 05, 1E]
+FFB5; [75 1B, 05, AC]
+3274; [75 1B, 05, 1E][75 34, 05, 1E]
 
-111D; [78 30 54, 05, 05]
-3171; [78 30 54, 05, 09]
+110A; [75 1D, 05, 05]
+3146; [75 1D, 05, 20]
+FFB6; [75 1D, 05, AE]
 
-111E; [78 30 5C, 05, 05]
-3172; [78 30 5C, 05, 09]
+110B; [75 1F, 05, 05]
+3147; [75 1F, 05, 10]
+3267; [75 1F, 05, 1E]
+FFB7; [75 1F, 05, AC]
+3275; [75 1F, 05, 1E][75 34, 05, 1E]
+327E; [75 1F, 05, 1E][75 4E, 05, 1E]
 
-111F; [78 30 64, 05, 05]
+110C; [75 21, 05, 05]
+3148; [75 21, 05, 10]
+3268; [75 21, 05, 1E]
+FFB8; [75 21, 05, AC]
+3276; [75 21, 05, 1E][75 34, 05, 1E]
+327D; [75 21, 05, 1E][75 4E, 05, 1E][75 1F, 05, 1E][75 5A, 05, 1E]
 
-1120; [78 30 6C, 05, 05]
-3173; [78 30 6C, 05, 09]
+110D; [75 23, 05, 05]
+3149; [75 23, 05, 20]
+FFB9; [75 23, 05, AE]
 
-1121; [78 30 74, 05, 05]
-3144; [78 30 74, 05, 09]
-FFB4; [78 30 74, 05, A3]
+110E; [75 25, 05, 05]
+314A; [75 25, 05, 10]
+3269; [75 25, 05, 1E]
+FFBA; [75 25, 05, AC]
+3277; [75 25, 05, 1E][75 34, 05, 1E]
+327C; [75 25, 05, 1E][75 34, 05, 1E][75 80, 05, 20][75 09, 05, 1E][75 44, 05, 1E]
 
-1122; [78 30 7C, 05, 05]
-3174; [78 30 7C, 05, 09]
+110F; [75 27, 05, 05]
+314B; [75 27, 05, 10]
+326A; [75 27, 05, 1E]
+FFBB; [75 27, 05, AC]
+3278; [75 27, 05, 1E][75 34, 05, 1E]
 
-1123; [78 30 84, 05, 05]
-3175; [78 30 84, 05, 09]
+1110; [75 29, 05, 05]
+314C; [75 29, 05, 10]
+326B; [75 29, 05, 1E]
+FFBC; [75 29, 05, AC]
+3279; [75 29, 05, 1E][75 34, 05, 1E]
 
-1124; [78 30 8C, 05, 05]
+1111; [75 2B, 05, 05]
+314D; [75 2B, 05, 10]
+326C; [75 2B, 05, 1E]
+FFBD; [75 2B, 05, AC]
+327A; [75 2B, 05, 1E][75 34, 05, 1E]
 
-1125; [78 30 94, 05, 05]
+1112; [75 2D, 05, 05]
+314E; [75 2D, 05, 10]
+326D; [75 2D, 05, 1E]
+FFBE; [75 2D, 05, AC]
+327B; [75 2D, 05, 1E][75 34, 05, 1E]
 
-1126; [78 30 9C, 05, 05]
+1113; [75 2F 02, 05, 05]
 
-1127; [78 30 A4, 05, 05]
-3176; [78 30 A4, 05, 09]
+1114; [75 2F 0A, 05, 05]
+3165; [75 2F 0A, 05, 20]
 
-1128; [78 30 AC, 05, 05]
+1115; [75 2F 12, 05, 05]
+3166; [75 2F 12, 05, 20]
 
-1129; [78 30 B4, 05, 05]
-3177; [78 30 B4, 05, 09]
+1116; [75 2F 1A, 05, 05]
 
-112A; [78 30 BC, 05, 05]
+1117; [75 2F 22, 05, 05]
 
-112B; [78 30 C4, 05, 05]
-3178; [78 30 C4, 05, 09]
+1118; [75 2F 2A, 05, 05]
 
-112C; [78 30 CC, 05, 05]
-3179; [78 30 CC, 05, 09]
+1119; [75 2F 32, 05, 05]
 
-112D; [78 30 D4, 05, 05]
-317A; [78 30 D4, 05, 09]
+111A; [75 2F 3A, 05, 05]
+3140; [75 2F 3A, 05, 20]
+FFB0; [75 2F 3A, 05, AE]
 
-112E; [78 30 DC, 05, 05]
-317B; [78 30 DC, 05, 09]
+111B; [75 2F 42, 05, 05]
 
-112F; [78 30 E4, 05, 05]
-317C; [78 30 E4, 05, 09]
+111C; [75 2F 4A, 05, 05]
+316E; [75 2F 4A, 05, 20]
 
-1130; [78 30 EC, 05, 05]
+111D; [75 2F 52, 05, 05]
+3171; [75 2F 52, 05, 20]
 
-1131; [78 30 F4, 05, 05]
+111E; [75 2F 5A, 05, 05]
+3172; [75 2F 5A, 05, 20]
 
-1132; [78 30 FC, 05, 05]
-317D; [78 30 FC, 05, 09]
+111F; [75 2F 62, 05, 05]
 
-1133; [78 31 0A, 05, 05]
+1120; [75 2F 6A, 05, 05]
+3173; [75 2F 6A, 05, 20]
 
-1134; [78 31 12, 05, 05]
+1121; [75 2F 72, 05, 05]
+3144; [75 2F 72, 05, 20]
+FFB4; [75 2F 72, 05, AE]
 
-1135; [78 31 1A, 05, 05]
+1122; [75 2F 7A, 05, 05]
+3174; [75 2F 7A, 05, 20]
 
-1136; [78 31 22, 05, 05]
-317E; [78 31 22, 05, 09]
+1123; [75 2F 82, 05, 05]
+3175; [75 2F 82, 05, 20]
 
-1137; [78 31 2A, 05, 05]
+1124; [75 2F 8A, 05, 05]
 
-1138; [78 31 32, 05, 05]
+1125; [75 2F 92, 05, 05]
 
-1139; [78 31 3A, 05, 05]
+1126; [75 2F 9A, 05, 05]
 
-113A; [78 31 42, 05, 05]
+1127; [75 2F A2, 05, 05]
+3176; [75 2F A2, 05, 20]
 
-113B; [78 31 4A, 05, 05]
+1128; [75 2F AA, 05, 05]
 
-113C; [78 31 52, 05, 05]
+1129; [75 2F B2, 05, 05]
+3177; [75 2F B2, 05, 20]
 
-113D; [78 31 5A, 05, 05]
+112A; [75 2F BA, 05, 05]
 
-113E; [78 31 62, 05, 05]
+112B; [75 2F C2, 05, 05]
+3178; [75 2F C2, 05, 20]
 
-113F; [78 31 6A, 05, 05]
+112C; [75 2F CA, 05, 05]
+3179; [75 2F CA, 05, 20]
 
-1140; [78 31 72, 05, 05]
-317F; [78 31 72, 05, 09]
+112D; [75 2F D2, 05, 05]
+317A; [75 2F D2, 05, 20]
 
-1141; [78 31 7A, 05, 05]
+112E; [75 2F DA, 05, 05]
+317B; [75 2F DA, 05, 20]
 
-1142; [78 31 82, 05, 05]
+112F; [75 2F E2, 05, 05]
+317C; [75 2F E2, 05, 20]
 
-1143; [78 31 8A, 05, 05]
+1130; [75 2F EA, 05, 05]
 
-1144; [78 31 92, 05, 05]
+1131; [75 2F F2, 05, 05]
 
-1145; [78 31 9A, 05, 05]
+1132; [75 2F FA, 05, 05]
+317D; [75 2F FA, 05, 20]
 
-1146; [78 31 A2, 05, 05]
+1133; [75 30 04, 05, 05]
 
-1147; [78 31 AA, 05, 05]
-3180; [78 31 AA, 05, 09]
+1134; [75 30 0C, 05, 05]
 
-1148; [78 31 B2, 05, 05]
+1135; [75 30 14, 05, 05]
 
-1149; [78 31 BA, 05, 05]
+1136; [75 30 1C, 05, 05]
+317E; [75 30 1C, 05, 20]
 
-114A; [78 31 C2, 05, 05]
+1137; [75 30 24, 05, 05]
 
-114B; [78 31 CA, 05, 05]
+1138; [75 30 2C, 05, 05]
 
-114C; [78 31 D2, 05, 05]
-3181; [78 31 D2, 05, 09]
+1139; [75 30 34, 05, 05]
 
-114D; [78 31 DA, 05, 05]
+113A; [75 30 3C, 05, 05]
 
-114E; [78 31 E2, 05, 05]
+113B; [75 30 44, 05, 05]
 
-114F; [78 31 EA, 05, 05]
+113C; [75 30 4C, 05, 05]
 
-1150; [78 31 F2, 05, 05]
+113D; [75 30 54, 05, 05]
 
-1151; [78 31 FA, 05, 05]
+113E; [75 30 5C, 05, 05]
 
-1152; [78 32 08, 05, 05]
+113F; [75 30 64, 05, 05]
 
-1153; [78 32 10, 05, 05]
+1140; [75 30 6C, 05, 05]
+317F; [75 30 6C, 05, 20]
 
-1154; [78 32 18, 05, 05]
+1141; [75 30 74, 05, 05]
 
-1155; [78 32 20, 05, 05]
+1142; [75 30 7C, 05, 05]
 
-1156; [78 32 28, 05, 05]
+1143; [75 30 84, 05, 05]
 
-1157; [78 32 30, 05, 05]
-3184; [78 32 30, 05, 09]
+1144; [75 30 8C, 05, 05]
 
-1158; [78 32 38, 05, 05]
-3185; [78 32 38, 05, 09]
+1145; [75 30 94, 05, 05]
 
-1159; [78 32 40, 05, 05]
-3186; [78 32 40, 05, 09]
+1146; [75 30 9C, 05, 05]
 
-115A; [78 32 48, 05, 05]
+1147; [75 30 A4, 05, 05]
+3180; [75 30 A4, 05, 20]
 
-115B; [78 32 50, 05, 05]
+1148; [75 30 AC, 05, 05]
 
-115C; [78 32 58, 05, 05]
+1149; [75 30 B4, 05, 05]
 
-115D; [78 32 60, 05, 05]
+114A; [75 30 BC, 05, 05]
 
-115E; [78 32 68, 05, 05]
+114B; [75 30 C4, 05, 05]
 
-A960; [78 32 70, 05, 05]
+114C; [75 30 CC, 05, 05]
+3181; [75 30 CC, 05, 20]
 
-A961; [78 32 78, 05, 05]
+114D; [75 30 D4, 05, 05]
 
-A962; [78 32 80, 05, 05]
+114E; [75 30 DC, 05, 05]
 
-A963; [78 32 88, 05, 05]
+114F; [75 30 E4, 05, 05]
 
-A964; [78 32 90, 05, 05]
+1150; [75 30 EC, 05, 05]
 
-A965; [78 32 98, 05, 05]
+1151; [75 30 F4, 05, 05]
 
-A966; [78 32 A0, 05, 05]
+1152; [75 30 FC, 05, 05]
 
-A967; [78 32 A8, 05, 05]
+1153; [75 31 06, 05, 05]
 
-A968; [78 32 B0, 05, 05]
+1154; [75 31 0E, 05, 05]
 
-A969; [78 32 B8, 05, 05]
+1155; [75 31 16, 05, 05]
 
-A96A; [78 32 C0, 05, 05]
+1156; [75 31 1E, 05, 05]
 
-A96B; [78 32 C8, 05, 05]
+1157; [75 31 26, 05, 05]
+3184; [75 31 26, 05, 20]
 
-A96C; [78 32 D0, 05, 05]
+1158; [75 31 2E, 05, 05]
+3185; [75 31 2E, 05, 20]
 
-A96D; [78 32 D8, 05, 05]
+1159; [75 31 36, 05, 05]
+3186; [75 31 36, 05, 20]
 
-A96E; [78 32 E0, 05, 05]
+115A; [75 31 3E, 05, 05]
 
-A96F; [78 32 E8, 05, 05]
+115B; [75 31 46, 05, 05]
 
-A970; [78 32 F0, 05, 05]
+115C; [75 31 4E, 05, 05]
 
-A971; [78 32 F8, 05, 05]
+115D; [75 31 56, 05, 05]
 
-A972; [78 33 06, 05, 05]
+115E; [75 31 5E, 05, 05]
 
-A973; [78 33 0E, 05, 05]
+A960; [75 31 66, 05, 05]
 
-A974; [78 33 16, 05, 05]
+A961; [75 31 6E, 05, 05]
 
-A975; [78 33 1E, 05, 05]
+A962; [75 31 76, 05, 05]
 
-A976; [78 33 26, 05, 05]
+A963; [75 31 7E, 05, 05]
 
-A977; [78 33 2E, 05, 05]
+A964; [75 31 86, 05, 05]
 
-A978; [78 33 36, 05, 05]
+A965; [75 31 8E, 05, 05]
 
-A979; [78 33 3E, 05, 05]
+A966; [75 31 96, 05, 05]
 
-A97A; [78 33 46, 05, 05]
+A967; [75 31 9E, 05, 05]
 
-A97B; [78 33 4E, 05, 05]
+A968; [75 31 A6, 05, 05]
 
-A97C; [78 33 56, 05, 05]
+A969; [75 31 AE, 05, 05]
 
-115F; [78 33 5E, 05, 05]
+A96A; [75 31 B6, 05, 05]
 
-1160; [78 33 66, 05, 05]
-3164; [78 33 66, 05, 09]
-FFA0; [78 33 66, 05, A3]
+A96B; [75 31 BE, 05, 05]
 
-1161; [78 34, 05, 05]
-314F; [78 34, 05, 09]
-FFC2; [78 34, 05, A3]
+A96C; [75 31 C6, 05, 05]
 
-1162; [78 36, 05, 05]
-3150; [78 36, 05, 09]
-FFC3; [78 36, 05, A3]
+A96D; [75 31 CE, 05, 05]
 
-1163; [78 38, 05, 05]
-3151; [78 38, 05, 09]
-FFC4; [78 38, 05, A3]
+A96E; [75 31 D6, 05, 05]
 
-1164; [78 3A, 05, 05]
-3152; [78 3A, 05, 09]
-FFC5; [78 3A, 05, A3]
+A96F; [75 31 DE, 05, 05]
 
-1165; [78 3C, 05, 05]
-3153; [78 3C, 05, 09]
-FFC6; [78 3C, 05, A3]
+A970; [75 31 E6, 05, 05]
 
-1166; [78 3E, 05, 05]
-3154; [78 3E, 05, 09]
-FFC7; [78 3E, 05, A3]
+A971; [75 31 EE, 05, 05]
 
-1167; [78 40, 05, 05]
-3155; [78 40, 05, 09]
-FFCA; [78 40, 05, A3]
+A972; [75 31 F6, 05, 05]
 
-1168; [78 42, 05, 05]
-3156; [78 42, 05, 09]
-FFCB; [78 42, 05, A3]
+A973; [75 31 FE, 05, 05]
 
-1169; [78 44, 05, 05]
-3157; [78 44, 05, 09]
-FFCC; [78 44, 05, A3]
+A974; [75 32 08, 05, 05]
 
-116A; [78 46, 05, 05]
-3158; [78 46, 05, 09]
-FFCD; [78 46, 05, A3]
+A975; [75 32 10, 05, 05]
 
-116B; [78 48, 05, 05]
-3159; [78 48, 05, 09]
-FFCE; [78 48, 05, A3]
+A976; [75 32 18, 05, 05]
 
-116C; [78 4A, 05, 05]
-315A; [78 4A, 05, 09]
-FFCF; [78 4A, 05, A3]
+A977; [75 32 20, 05, 05]
 
-116D; [78 4C, 05, 05]
-315B; [78 4C, 05, 09]
-FFD2; [78 4C, 05, A3]
+A978; [75 32 28, 05, 05]
 
-116E; [78 4E, 05, 05]
-315C; [78 4E, 05, 09]
-FFD3; [78 4E, 05, A3]
+A979; [75 32 30, 05, 05]
 
-116F; [78 50, 05, 05]
-315D; [78 50, 05, 09]
-FFD4; [78 50, 05, A3]
+A97A; [75 32 38, 05, 05]
 
-1170; [78 52, 05, 05]
-315E; [78 52, 05, 09]
-FFD5; [78 52, 05, A3]
+A97B; [75 32 40, 05, 05]
 
-1171; [78 54, 05, 05]
-315F; [78 54, 05, 09]
-FFD6; [78 54, 05, A3]
+A97C; [75 32 48, 05, 05]
 
-1172; [78 56, 05, 05]
-3160; [78 56, 05, 09]
-FFD7; [78 56, 05, A3]
+115F; [75 32 50, 05, 05]
 
-1173; [78 58, 05, 05]
-3161; [78 58, 05, 09]
-FFDA; [78 58, 05, A3]
+1160; [75 32 58, 05, 05]
+3164; [75 32 58, 05, 20]
+FFA0; [75 32 58, 05, AE]
 
-1174; [78 5A, 05, 05]
-3162; [78 5A, 05, 09]
-FFDB; [78 5A, 05, A3]
+1161; [75 34, 05, 05]
+314F; [75 34, 05, 10]
+FFC2; [75 34, 05, AC]
 
-1175; [78 5C, 05, 05]
-3163; [78 5C, 05, 09]
-FFDC; [78 5C, 05, A3]
+1162; [75 36, 05, 05]
+3150; [75 36, 05, 20]
+FFC3; [75 36, 05, AE]
 
-1176; [78 5E 04, 05, 05]
+1163; [75 38, 05, 05]
+3151; [75 38, 05, 20]
+FFC4; [75 38, 05, AE]
 
-1177; [78 5E 0C, 05, 05]
+1164; [75 3A, 05, 05]
+3152; [75 3A, 05, 20]
+FFC5; [75 3A, 05, AE]
 
-1178; [78 5E 14, 05, 05]
+1165; [75 3C, 05, 05]
+3153; [75 3C, 05, 20]
+FFC6; [75 3C, 05, AE]
 
-1179; [78 5E 1C, 05, 05]
+1166; [75 3E, 05, 05]
+3154; [75 3E, 05, 20]
+FFC7; [75 3E, 05, AE]
 
-117A; [78 5E 24, 05, 05]
+1167; [75 40, 05, 05]
+3155; [75 40, 05, 20]
+FFCA; [75 40, 05, AE]
 
-117B; [78 5E 2C, 05, 05]
+1168; [75 42, 05, 05]
+3156; [75 42, 05, 20]
+FFCB; [75 42, 05, AE]
 
-117C; [78 5E 34, 05, 05]
+1169; [75 44, 05, 05]
+3157; [75 44, 05, 10]
+FFCC; [75 44, 05, AC]
 
-117D; [78 5E 3C, 05, 05]
+116A; [75 46, 05, 05]
+3158; [75 46, 05, 20]
+FFCD; [75 46, 05, AE]
 
-117E; [78 5E 44, 05, 05]
+116B; [75 48, 05, 05]
+3159; [75 48, 05, 20]
+FFCE; [75 48, 05, AE]
 
-117F; [78 5E 4C, 05, 05]
+116C; [75 4A, 05, 05]
+315A; [75 4A, 05, 20]
+FFCF; [75 4A, 05, AE]
 
-1180; [78 5E 54, 05, 05]
+116D; [75 4C, 05, 05]
+315B; [75 4C, 05, 20]
+FFD2; [75 4C, 05, AE]
 
-1181; [78 5E 5C, 05, 05]
+116E; [75 4E, 05, 05]
+315C; [75 4E, 05, 10]
+FFD3; [75 4E, 05, AC]
 
-1182; [78 5E 64, 05, 05]
+116F; [75 50, 05, 05]
+315D; [75 50, 05, 20]
+FFD4; [75 50, 05, AE]
 
-1183; [78 5E 6C, 05, 05]
+1170; [75 52, 05, 05]
+315E; [75 52, 05, 20]
+FFD5; [75 52, 05, AE]
 
-1184; [78 5E 74, 05, 05]
-3187; [78 5E 74, 05, 09]
+1171; [75 54, 05, 05]
+315F; [75 54, 05, 20]
+FFD6; [75 54, 05, AE]
 
-1185; [78 5E 7C, 05, 05]
-3188; [78 5E 7C, 05, 09]
+1172; [75 56, 05, 05]
+3160; [75 56, 05, 20]
+FFD7; [75 56, 05, AE]
 
-1186; [78 5E 84, 05, 05]
+1173; [75 58, 05, 05]
+3161; [75 58, 05, 20]
+FFDA; [75 58, 05, AE]
 
-1187; [78 5E 8C, 05, 05]
+1174; [75 5A, 05, 05]
+3162; [75 5A, 05, 10]
+FFDB; [75 5A, 05, AC]
 
-1188; [78 5E 94, 05, 05]
-3189; [78 5E 94, 05, 09]
+1175; [75 5C, 05, 05]
+3163; [75 5C, 05, 20]
+FFDC; [75 5C, 05, AE]
 
-1189; [78 5E 9C, 05, 05]
+1176; [75 5E 02, 05, 05]
 
-118A; [78 5E A4, 05, 05]
+1177; [75 5E 0A, 05, 05]
 
-118B; [78 5E AC, 05, 05]
+1178; [75 5E 12, 05, 05]
 
-118C; [78 5E B4, 05, 05]
+1179; [75 5E 1A, 05, 05]
 
-118D; [78 5E BC, 05, 05]
+117A; [75 5E 22, 05, 05]
 
-118E; [78 5E C4, 05, 05]
+117B; [75 5E 2A, 05, 05]
 
-118F; [78 5E CC, 05, 05]
+117C; [75 5E 32, 05, 05]
 
-1190; [78 5E D4, 05, 05]
+117D; [75 5E 3A, 05, 05]
 
-1191; [78 5E DC, 05, 05]
-318A; [78 5E DC, 05, 09]
+117E; [75 5E 42, 05, 05]
 
-1192; [78 5E E4, 05, 05]
-318B; [78 5E E4, 05, 09]
+117F; [75 5E 4A, 05, 05]
 
-1193; [78 5E EC, 05, 05]
+1180; [75 5E 52, 05, 05]
 
-1194; [78 5E F4, 05, 05]
-318C; [78 5E F4, 05, 09]
+1181; [75 5E 5A, 05, 05]
 
-1195; [78 5E FC, 05, 05]
+1182; [75 5E 62, 05, 05]
 
-1196; [78 5F 0A, 05, 05]
+1183; [75 5E 6A, 05, 05]
 
-1197; [78 5F 12, 05, 05]
+1184; [75 5E 72, 05, 05]
+3187; [75 5E 72, 05, 20]
 
-1198; [78 5F 1A, 05, 05]
+1185; [75 5E 7A, 05, 05]
+3188; [75 5E 7A, 05, 20]
 
-1199; [78 5F 22, 05, 05]
+1186; [75 5E 82, 05, 05]
 
-119A; [78 5F 2A, 05, 05]
+1187; [75 5E 8A, 05, 05]
 
-119B; [78 5F 32, 05, 05]
+1188; [75 5E 92, 05, 05]
+3189; [75 5E 92, 05, 20]
 
-119C; [78 5F 3A, 05, 05]
+1189; [75 5E 9A, 05, 05]
 
-119D; [78 5F 42, 05, 05]
+118A; [75 5E A2, 05, 05]
 
-119E; [78 5F 4A, 05, 05]
-318D; [78 5F 4A, 05, 09]
+118B; [75 5E AA, 05, 05]
 
-119F; [78 5F 52, 05, 05]
+118C; [75 5E B2, 05, 05]
 
-11A0; [78 5F 5A, 05, 05]
+118D; [75 5E BA, 05, 05]
 
-11A1; [78 5F 62, 05, 05]
-318E; [78 5F 62, 05, 09]
+118E; [75 5E C2, 05, 05]
 
-11A2; [78 5F 6A, 05, 05]
+118F; [75 5E CA, 05, 05]
 
-11A3; [78 5F 72, 05, 05]
+1190; [75 5E D2, 05, 05]
 
-11A4; [78 5F 7A, 05, 05]
+1191; [75 5E DA, 05, 05]
+318A; [75 5E DA, 05, 20]
 
-11A5; [78 5F 82, 05, 05]
+1192; [75 5E E2, 05, 05]
+318B; [75 5E E2, 05, 20]
 
-11A6; [78 5F 8A, 05, 05]
+1193; [75 5E EA, 05, 05]
 
-11A7; [78 5F 92, 05, 05]
+1194; [75 5E F2, 05, 05]
+318C; [75 5E F2, 05, 20]
 
-D7B0; [78 5F 9A, 05, 05]
+1195; [75 5E FA, 05, 05]
 
-D7B1; [78 5F A2, 05, 05]
+1196; [75 5F 04, 05, 05]
 
-D7B2; [78 5F AA, 05, 05]
+1197; [75 5F 0C, 05, 05]
 
-D7B3; [78 5F B2, 05, 05]
+1198; [75 5F 14, 05, 05]
 
-D7B4; [78 5F BA, 05, 05]
+1199; [75 5F 1C, 05, 05]
 
-D7B5; [78 5F C2, 05, 05]
+119A; [75 5F 24, 05, 05]
 
-D7B6; [78 5F CA, 05, 05]
+119B; [75 5F 2C, 05, 05]
 
-D7B7; [78 5F D2, 05, 05]
+119C; [75 5F 34, 05, 05]
 
-D7B8; [78 5F DA, 05, 05]
+119D; [75 5F 3C, 05, 05]
 
-D7B9; [78 5F E2, 05, 05]
+119E; [75 5F 44, 05, 05]
+318D; [75 5F 44, 05, 20]
 
-D7BA; [78 5F EA, 05, 05]
+119F; [75 5F 4C, 05, 05]
 
-D7BB; [78 5F F2, 05, 05]
+11A0; [75 5F 54, 05, 05]
 
-D7BC; [78 5F FA, 05, 05]
+11A1; [75 5F 5C, 05, 05]
+318E; [75 5F 5C, 05, 20]
 
-D7BD; [78 60 08, 05, 05]
+11A2; [75 5F 64, 05, 05]
 
-D7BE; [78 60 10, 05, 05]
+11A3; [75 5F 6C, 05, 05]
 
-D7BF; [78 60 18, 05, 05]
+11A4; [75 5F 74, 05, 05]
 
-D7C0; [78 60 20, 05, 05]
+11A5; [75 5F 7C, 05, 05]
 
-D7C1; [78 60 28, 05, 05]
+11A6; [75 5F 84, 05, 05]
 
-D7C2; [78 60 30, 05, 05]
+11A7; [75 5F 8C, 05, 05]
 
-D7C3; [78 60 38, 05, 05]
+D7B0; [75 5F 94, 05, 05]
 
-D7C4; [78 60 40, 05, 05]
+D7B1; [75 5F 9C, 05, 05]
 
-D7C5; [78 60 48, 05, 05]
+D7B2; [75 5F A4, 05, 05]
 
-D7C6; [78 60 50, 05, 05]
+D7B3; [75 5F AC, 05, 05]
 
-11A8; [78 61, 05, 05]
+D7B4; [75 5F B4, 05, 05]
 
-11A9; [78 63, 05, 05]
+D7B5; [75 5F BC, 05, 05]
 
-11AA; [78 65, 05, 05]
-3133; [78 65, 05, 09]
-FFA3; [78 65, 05, A3]
+D7B6; [75 5F C4, 05, 05]
 
-11AB; [78 67, 05, 05]
+D7B7; [75 5F CC, 05, 05]
 
-11AC; [78 69, 05, 05]
-3135; [78 69, 05, 09]
-FFA5; [78 69, 05, A3]
+D7B8; [75 5F D4, 05, 05]
 
-11AD; [78 6B, 05, 05]
-3136; [78 6B, 05, 09]
-FFA6; [78 6B, 05, A3]
+D7B9; [75 5F DC, 05, 05]
 
-11AE; [78 6D, 05, 05]
+D7BA; [75 5F E4, 05, 05]
 
-11AF; [78 6F, 05, 05]
+D7BB; [75 5F EC, 05, 05]
 
-11B0; [78 71, 05, 05]
-313A; [78 71, 05, 09]
-FFAA; [78 71, 05, A3]
+D7BC; [75 5F F4, 05, 05]
 
-11B1; [78 73, 05, 05]
-313B; [78 73, 05, 09]
-FFAB; [78 73, 05, A3]
+D7BD; [75 5F FC, 05, 05]
 
-11B2; [78 75, 05, 05]
-313C; [78 75, 05, 09]
-FFAC; [78 75, 05, A3]
+D7BE; [75 60 06, 05, 05]
 
-11B3; [78 77, 05, 05]
-313D; [78 77, 05, 09]
-FFAD; [78 77, 05, A3]
+D7BF; [75 60 0E, 05, 05]
 
-11B4; [78 79, 05, 05]
-313E; [78 79, 05, 09]
-FFAE; [78 79, 05, A3]
+D7C0; [75 60 16, 05, 05]
 
-11B5; [78 7B, 05, 05]
-313F; [78 7B, 05, 09]
-FFAF; [78 7B, 05, A3]
+D7C1; [75 60 1E, 05, 05]
 
-11B6; [78 7D, 05, 05]
+D7C2; [75 60 26, 05, 05]
 
-11B7; [78 7F, 05, 05]
+D7C3; [75 60 2E, 05, 05]
 
-11B8; [78 81, 05, 05]
+D7C4; [75 60 36, 05, 05]
 
-11B9; [78 83, 05, 05]
+D7C5; [75 60 3E, 05, 05]
 
-11BA; [78 85, 05, 05]
+D7C6; [75 60 46, 05, 05]
 
-11BB; [78 87, 05, 05]
+11A8; [75 62, 05, 05]
 
-11BC; [78 89, 05, 05]
+11A9; [75 64, 05, 05]
 
-11BD; [78 8B, 05, 05]
+11AA; [75 66, 05, 05]
+3133; [75 66, 05, 20]
+FFA3; [75 66, 05, AE]
 
-11BE; [78 8D, 05, 05]
+11AB; [75 68, 05, 05]
 
-11BF; [78 8F, 05, 05]
+11AC; [75 6A, 05, 05]
+3135; [75 6A, 05, 20]
+FFA5; [75 6A, 05, AE]
 
-11C0; [78 91, 05, 05]
+11AD; [75 6C, 05, 05]
+3136; [75 6C, 05, 20]
+FFA6; [75 6C, 05, AE]
 
-11C1; [78 93, 05, 05]
+11AE; [75 6E, 05, 05]
 
-11C2; [78 95, 05, 05]
+11AF; [75 70, 05, 05]
 
-11C3; [78 97 04, 05, 05]
+11B0; [75 72, 05, 05]
+313A; [75 72, 05, 20]
+FFAA; [75 72, 05, AE]
 
-11C4; [78 97 0C, 05, 05]
+11B1; [75 74, 05, 05]
+313B; [75 74, 05, 20]
+FFAB; [75 74, 05, AE]
 
-11C5; [78 97 14, 05, 05]
+11B2; [75 76, 05, 05]
+313C; [75 76, 05, 20]
+FFAC; [75 76, 05, AE]
 
-11C6; [78 97 1C, 05, 05]
+11B3; [75 78, 05, 05]
+313D; [75 78, 05, 20]
+FFAD; [75 78, 05, AE]
 
-11C7; [78 97 24, 05, 05]
-3167; [78 97 24, 05, 09]
+11B4; [75 7A, 05, 05]
+313E; [75 7A, 05, 20]
+FFAE; [75 7A, 05, AE]
 
-11C8; [78 97 2C, 05, 05]
-3168; [78 97 2C, 05, 09]
+11B5; [75 7C, 05, 05]
+313F; [75 7C, 05, 20]
+FFAF; [75 7C, 05, AE]
 
-11C9; [78 97 34, 05, 05]
+11B6; [75 7E, 05, 05]
 
-11CA; [78 97 3C, 05, 05]
+11B7; [75 80, 05, 05]
 
-11CB; [78 97 44, 05, 05]
+11B8; [75 82, 05, 05]
 
-11CC; [78 97 4C, 05, 05]
-3169; [78 97 4C, 05, 09]
+11B9; [75 84, 05, 05]
 
-11CD; [78 97 54, 05, 05]
+11BA; [75 86, 05, 05]
 
-11CE; [78 97 5C, 05, 05]
-316A; [78 97 5C, 05, 09]
+11BB; [75 88, 05, 05]
 
-11CF; [78 97 64, 05, 05]
+11BC; [75 8A, 05, 05]
 
-11D0; [78 97 6C, 05, 05]
+11BD; [75 8C, 05, 05]
 
-11D1; [78 97 74, 05, 05]
+11BE; [75 8E, 05, 05]
 
-11D2; [78 97 7C, 05, 05]
+11BF; [75 90, 05, 05]
 
-11D3; [78 97 84, 05, 05]
-316B; [78 97 84, 05, 09]
+11C0; [75 92, 05, 05]
 
-11D4; [78 97 8C, 05, 05]
+11C1; [75 94, 05, 05]
 
-11D5; [78 97 94, 05, 05]
+11C2; [75 96, 05, 05]
 
-11D6; [78 97 9C, 05, 05]
+11C3; [75 98 02, 05, 05]
 
-11D7; [78 97 A4, 05, 05]
-316C; [78 97 A4, 05, 09]
+11C4; [75 98 0A, 05, 05]
 
-11D8; [78 97 AC, 05, 05]
+11C5; [75 98 12, 05, 05]
 
-11D9; [78 97 B4, 05, 05]
-316D; [78 97 B4, 05, 09]
+11C6; [75 98 1A, 05, 05]
 
-11DA; [78 97 BC, 05, 05]
+11C7; [75 98 22, 05, 05]
+3167; [75 98 22, 05, 20]
 
-11DB; [78 97 C4, 05, 05]
+11C8; [75 98 2A, 05, 05]
+3168; [75 98 2A, 05, 20]
 
-11DC; [78 97 CC, 05, 05]
+11C9; [75 98 32, 05, 05]
 
-11DD; [78 97 D4, 05, 05]
-316F; [78 97 D4, 05, 09]
+11CA; [75 98 3A, 05, 05]
 
-11DE; [78 97 DC, 05, 05]
+11CB; [75 98 42, 05, 05]
 
-11DF; [78 97 E4, 05, 05]
-3170; [78 97 E4, 05, 09]
+11CC; [75 98 4A, 05, 05]
+3169; [75 98 4A, 05, 20]
 
-11E0; [78 97 EC, 05, 05]
+11CD; [75 98 52, 05, 05]
 
-11E1; [78 97 F4, 05, 05]
+11CE; [75 98 5A, 05, 05]
+316A; [75 98 5A, 05, 20]
 
-11E2; [78 97 FC, 05, 05]
+11CF; [75 98 62, 05, 05]
 
-11E3; [78 98 0A, 05, 05]
+11D0; [75 98 6A, 05, 05]
 
-11E4; [78 98 12, 05, 05]
+11D1; [75 98 72, 05, 05]
 
-11E5; [78 98 1A, 05, 05]
+11D2; [75 98 7A, 05, 05]
 
-11E6; [78 98 22, 05, 05]
+11D3; [75 98 82, 05, 05]
+316B; [75 98 82, 05, 20]
 
-11E7; [78 98 2A, 05, 05]
+11D4; [75 98 8A, 05, 05]
 
-11E8; [78 98 32, 05, 05]
+11D5; [75 98 92, 05, 05]
 
-11E9; [78 98 3A, 05, 05]
+11D6; [75 98 9A, 05, 05]
 
-11EA; [78 98 42, 05, 05]
+11D7; [75 98 A2, 05, 05]
+316C; [75 98 A2, 05, 20]
 
-11EB; [78 98 4A, 05, 05]
+11D8; [75 98 AA, 05, 05]
 
-11EC; [78 98 52, 05, 05]
+11D9; [75 98 B2, 05, 05]
+316D; [75 98 B2, 05, 20]
 
-11ED; [78 98 5A, 05, 05]
+11DA; [75 98 BA, 05, 05]
 
-11EE; [78 98 62, 05, 05]
+11DB; [75 98 C2, 05, 05]
 
-11EF; [78 98 6A, 05, 05]
+11DC; [75 98 CA, 05, 05]
 
-11F0; [78 98 72, 05, 05]
+11DD; [75 98 D2, 05, 05]
+316F; [75 98 D2, 05, 20]
 
-11F1; [78 98 7A, 05, 05]
-3182; [78 98 7A, 05, 09]
+11DE; [75 98 DA, 05, 05]
 
-11F2; [78 98 82, 05, 05]
-3183; [78 98 82, 05, 09]
+11DF; [75 98 E2, 05, 05]
+3170; [75 98 E2, 05, 20]
 
-11F3; [78 98 8A, 05, 05]
+11E0; [75 98 EA, 05, 05]
 
-11F4; [78 98 92, 05, 05]
+11E1; [75 98 F2, 05, 05]
 
-11F5; [78 98 9A, 05, 05]
+11E2; [75 98 FA, 05, 05]
 
-11F6; [78 98 A2, 05, 05]
+11E3; [75 99 04, 05, 05]
 
-11F7; [78 98 AA, 05, 05]
+11E4; [75 99 0C, 05, 05]
 
-11F8; [78 98 B2, 05, 05]
+11E5; [75 99 14, 05, 05]
 
-11F9; [78 98 BA, 05, 05]
+11E6; [75 99 1C, 05, 05]
 
-11FA; [78 98 C2, 05, 05]
+11E7; [75 99 24, 05, 05]
 
-11FB; [78 98 CA, 05, 05]
+11E8; [75 99 2C, 05, 05]
 
-11FC; [78 98 D2, 05, 05]
+11E9; [75 99 34, 05, 05]
 
-11FD; [78 98 DA, 05, 05]
+11EA; [75 99 3C, 05, 05]
 
-11FE; [78 98 E2, 05, 05]
+11EB; [75 99 44, 05, 05]
 
-11FF; [78 98 EA, 05, 05]
+11EC; [75 99 4C, 05, 05]
 
-D7CB; [78 98 F2, 05, 05]
+11ED; [75 99 54, 05, 05]
 
-D7CC; [78 98 FA, 05, 05]
+11EE; [75 99 5C, 05, 05]
 
-D7CD; [78 99 08, 05, 05]
+11EF; [75 99 64, 05, 05]
 
-D7CE; [78 99 10, 05, 05]
+11F0; [75 99 6C, 05, 05]
 
-D7CF; [78 99 18, 05, 05]
+11F1; [75 99 74, 05, 05]
+3182; [75 99 74, 05, 20]
 
-D7D0; [78 99 20, 05, 05]
+11F2; [75 99 7C, 05, 05]
+3183; [75 99 7C, 05, 20]
 
-D7D1; [78 99 28, 05, 05]
+11F3; [75 99 84, 05, 05]
 
-D7D2; [78 99 30, 05, 05]
+11F4; [75 99 8C, 05, 05]
 
-D7D3; [78 99 38, 05, 05]
+11F5; [75 99 94, 05, 05]
 
-D7D4; [78 99 40, 05, 05]
+11F6; [75 99 9C, 05, 05]
 
-D7D5; [78 99 48, 05, 05]
+11F7; [75 99 A4, 05, 05]
 
-D7D6; [78 99 50, 05, 05]
+11F8; [75 99 AC, 05, 05]
 
-D7D7; [78 99 58, 05, 05]
+11F9; [75 99 B4, 05, 05]
 
-D7D8; [78 99 60, 05, 05]
+11FA; [75 99 BC, 05, 05]
 
-D7D9; [78 99 68, 05, 05]
+11FB; [75 99 C4, 05, 05]
 
-D7DA; [78 99 70, 05, 05]
+11FC; [75 99 CC, 05, 05]
 
-D7DB; [78 99 78, 05, 05]
+11FD; [75 99 D4, 05, 05]
 
-D7DC; [78 99 80, 05, 05]
+11FE; [75 99 DC, 05, 05]
 
-D7DD; [78 99 88, 05, 05]
+11FF; [75 99 E4, 05, 05]
 
-D7DE; [78 99 90, 05, 05]
+D7CB; [75 99 EC, 05, 05]
 
-D7DF; [78 99 98, 05, 05]
+D7CC; [75 99 F4, 05, 05]
 
-D7E0; [78 99 A0, 05, 05]
+D7CD; [75 99 FC, 05, 05]
 
-D7E1; [78 99 A8, 05, 05]
+D7CE; [75 9A 06, 05, 05]
 
-D7E2; [78 99 B0, 05, 05]
+D7CF; [75 9A 0E, 05, 05]
 
-D7E3; [78 99 B8, 05, 05]
+D7D0; [75 9A 16, 05, 05]
 
-D7E4; [78 99 C0, 05, 05]
+D7D1; [75 9A 1E, 05, 05]
 
-D7E5; [78 99 C8, 05, 05]
+D7D2; [75 9A 26, 05, 05]
 
-D7E6; [78 99 D0, 05, 05]
+D7D3; [75 9A 2E, 05, 05]
 
-D7E7; [78 99 D8, 05, 05]
+D7D4; [75 9A 36, 05, 05]
 
-D7E8; [78 99 E0, 05, 05]
+D7D5; [75 9A 3E, 05, 05]
 
-D7E9; [78 99 E8, 05, 05]
+D7D6; [75 9A 46, 05, 05]
 
-D7EA; [78 99 F0, 05, 05]
+D7D7; [75 9A 4E, 05, 05]
 
-D7EB; [78 99 F8, 05, 05]
+D7D8; [75 9A 56, 05, 05]
 
-D7EC; [78 9A 06, 05, 05]
+D7D9; [75 9A 5E, 05, 05]
 
-D7ED; [78 9A 0E, 05, 05]
+D7DA; [75 9A 66, 05, 05]
 
-D7EE; [78 9A 16, 05, 05]
+D7DB; [75 9A 6E, 05, 05]
 
-D7EF; [78 9A 1E, 05, 05]
+D7DC; [75 9A 76, 05, 05]
 
-D7F0; [78 9A 26, 05, 05]
+D7DD; [75 9A 7E, 05, 05]
 
-D7F1; [78 9A 2E, 05, 05]
+D7DE; [75 9A 86, 05, 05]
 
-D7F2; [78 9A 36, 05, 05]
+D7DF; [75 9A 8E, 05, 05]
 
-D7F3; [78 9A 3E, 05, 05]
+D7E0; [75 9A 96, 05, 05]
 
-D7F4; [78 9A 46, 05, 05]
+D7E1; [75 9A 9E, 05, 05]
 
-D7F5; [78 9A 4E, 05, 05]
+D7E2; [75 9A A6, 05, 05]
 
-D7F6; [78 9A 56, 05, 05]
+D7E3; [75 9A AE, 05, 05]
 
-D7F7; [78 9A 5E, 05, 05]
+D7E4; [75 9A B6, 05, 05]
 
-D7F8; [78 9A 66, 05, 05]
+D7E5; [75 9A BE, 05, 05]
 
-D7F9; [78 9A 6E, 05, 05]
+D7E6; [75 9A C6, 05, 05]
 
-D7FA; [78 9A 76, 05, 05]
+D7E7; [75 9A CE, 05, 05]
 
-D7FB; [78 9A 7E, 05, 05]
+D7E8; [75 9A D6, 05, 05]
 
-3041; [79 0A, 05, 19]
-3042; [79 0A, 05, 9B]
-30A1; [79 0A, 05, 1D]
-FF67; [79 0A, 05, 1F]
-30A2; [79 0A, 05, A1]
-FF71; [79 0A, 05, A3]
-32D0; [79 0A, 05, 25]
-3303; [79 0A, 05, 37][0E 27, 05, 37][79 5E, 05, 37]
-3300; [79 0A, 05, 37][79 3E, 05, 37][, DA A5, 37][0E 27, 05, 37][79 32, 05, 37]
-3301; [79 0A, 05, 37][79 5E, 05, 37][79 42, 05, 37][79 0A, 05, 37]
-3302; [79 0A, 05, 37][79 6C, 05, 37][79 44, 05, 37][, DA A5, 37][79 0A, 05, 37]
+D7E9; [75 9A DE, 05, 05]
 
-3043; [79 0C, 05, 19]
-3044; [79 0C, 05, 9B]
-30A3; [79 0C, 05, 1D]
-FF68; [79 0C, 05, 1F]
-30A4; [79 0C, 05, A1]
-FF72; [79 0C, 05, A3]
-32D1; [79 0C, 05, 25]
-3304; [79 0C, 05, 37][79 36, 05, 37][79 6C, 05, 37][79 1A, 05, 37][, DA 95, 37]
-3305; [79 0C, 05, 37][79 6C, 05, 37][79 2C, 05, 37]
+D7EA; [75 9A E6, 05, 05]
 
-3045; [79 0E, 05, 19]
-3046; [79 0E, 05, 9B]
-30A5; [79 0E, 05, 1D]
-FF69; [79 0E, 05, 1F]
-30A6; [79 0E, 05, A1]
-FF73; [79 0E, 05, A3]
-32D2; [79 0E, 05, 25]
-3094; [79 0E, 05, 9B][, DA 95, 05]
-30F4; [79 0E, 05, A1][, DA 95, 05]
-3306; [79 0E, 05, 37][79 14, 05, 37][79 6C, 05, 37]
-
-1B000; [79 10, 05, A1]
-
-3047; [79 12, 05, 19]
-3048; [79 12, 05, 9B]
-30A7; [79 12, 05, 1D]
-FF6A; [79 12, 05, 1F]
-30A8; [79 12, 05, A1]
-FF74; [79 12, 05, A3]
-32D3; [79 12, 05, 25]
-3308; [79 12, 05, 37][0E 27, 05, 37][79 16, 05, 37][0E 27, 05, 37]
-3307; [79 12, 05, 37][79 24, 05, 37][79 1A, 05, 37][0E 27, 05, 37][79 32, 05, 37][, DA 95, 37]
-
-3049; [79 14, 05, 19]
-304A; [79 14, 05, 9B]
-30A9; [79 14, 05, 1D]
-FF6B; [79 14, 05, 1F]
-30AA; [79 14, 05, A1]
-FF75; [79 14, 05, A3]
-32D4; [79 14, 05, 25]
-330A; [79 14, 05, 37][0E 27, 05, 37][79 4C, 05, 37]
-3309; [79 14, 05, 37][79 6C, 05, 37][79 24, 05, 37]
-
-3095; [79 16, 05, 19]
-304B; [79 16, 05, 9B]
-30F5; [79 16, 05, 1D]
-30AB; [79 16, 05, A1]
-FF76; [79 16, 05, A3]
-32D5; [79 16, 05, 25]
-304C; [79 16, 05, 9B][, DA 95, 05]
-30AC; [79 16, 05, A1][, DA 95, 05]
-330B; [79 16, 05, 37][79 0C, 05, 37][79 5C, 05, 37]
-330C; [79 16, 05, 37][79 5A, 05, 37][79 2E, 05, 37][79 32, 05, 37]
-330D; [79 16, 05, 37][79 62, 05, 37][79 5C, 05, 37][0E 27, 05, 37]
-330E; [79 16, 05, 37][, DA 95, 37][79 62, 05, 37][79 6C, 05, 37]
-330F; [79 16, 05, 37][, DA 95, 37][79 6C, 05, 37][79 48, 05, 37]
-
-304D; [79 18, 05, 9B]
-30AD; [79 18, 05, A1]
-FF77; [79 18, 05, A3]
-32D6; [79 18, 05, 25]
-304E; [79 18, 05, 9B][, DA 95, 05]
-30AE; [79 18, 05, A1][, DA 95, 05]
-3310; [79 18, 05, 37][, DA 95, 37][79 16, 05, 37][, DA 95, 37]
-3311; [79 18, 05, 37][, DA 95, 37][79 36, 05, 37][0E 27, 05, 37]
-3312; [79 18, 05, 37][79 54, 05, 37][79 5C, 05, 37][0E 27, 05, 37]
-3313; [79 18, 05, 37][, DA 95, 37][79 5E, 05, 37][79 2A, 05, 37][, DA 95, 37][0E 27, 05, 37]
-3314; [79 18, 05, 37][79 62, 05, 37]
-3315; [79 18, 05, 37][79 62, 05, 37][79 1A, 05, 37][, DA 95, 37][79 5A, 05, 37][79 4C, 05, 37]
-3316; [79 18, 05, 37][79 62, 05, 37][79 4E, 05, 37][0E 27, 05, 37][79 32, 05, 37][79 5E, 05, 37]
-3317; [79 18, 05, 37][79 62, 05, 37][79 64, 05, 37][79 2E, 05, 37][79 32, 05, 37]
-
-304F; [79 1A, 05, 9B]
-31F0; [79 1A, 05, 1D]
-30AF; [79 1A, 05, A1]
-FF78; [79 1A, 05, A3]
-32D7; [79 1A, 05, 25]
-3050; [79 1A, 05, 9B][, DA 95, 05]
-30B0; [79 1A, 05, A1][, DA 95, 05]
-3318; [79 1A, 05, 37][, DA 95, 37][79 5A, 05, 37][79 4C, 05, 37]
-3319; [79 1A, 05, 37][, DA 95, 37][79 5A, 05, 37][79 4C, 05, 37][79 32, 05, 37][79 6C, 05, 37]
-331A; [79 1A, 05, 37][79 5E, 05, 37][79 26, 05, 37][, DA 95, 37][79 0C, 05, 37][79 62, 05, 37]
-331B; [79 1A, 05, 37][79 62, 05, 37][0E 27, 05, 37][79 3A, 05, 37]
-
-3096; [79 1C, 05, 19]
-3051; [79 1C, 05, 9B]
-30F6; [79 1C, 05, 1D]
-30B1; [79 1C, 05, A1]
-FF79; [79 1C, 05, A3]
-32D8; [79 1C, 05, 25]
-3052; [79 1C, 05, 9B][, DA 95, 05]
-30B2; [79 1C, 05, A1][, DA 95, 05]
-331C; [79 1C, 05, 37][0E 27, 05, 37][79 24, 05, 37]
-
-3053; [79 1E, 05, 9B]
-30B3; [79 1E, 05, A1]
-FF7A; [79 1E, 05, A3]
-32D9; [79 1E, 05, 25]
-3054; [79 1E, 05, 9B][, DA 95, 05]
-30B4; [79 1E, 05, A1][, DA 95, 05]
-331E; [79 1E, 05, 37][0E 27, 05, 37][79 46, 05, 37][, DA A5, 37]
-1F201; [79 1E, 05, 37][79 1E, 05, 37]
-30FF; [79 1E, 05, 2B][79 32, 05, 2B]
-331D; [79 1E, 05, 37][79 5E, 05, 37][79 34, 05, 37]
-
-3055; [79 20, 05, 9B]
-30B5; [79 20, 05, A1]
-FF7B; [79 20, 05, A3]
-32DA; [79 20, 05, 25]
-1F202; [79 20, 05, 37]
-3056; [79 20, 05, 9B][, DA 95, 05]
-30B6; [79 20, 05, A1][, DA 95, 05]
-331F; [79 20, 05, 37][79 0C, 05, 37][79 1A, 05, 37][79 5E, 05, 37]
-3320; [79 20, 05, 37][79 6C, 05, 37][79 2C, 05, 37][0E 27, 05, 37][79 4C, 05, 37]
-
-3057; [79 22, 05, 9B]
-31F1; [79 22, 05, 1D]
-30B7; [79 22, 05, A1]
-FF7C; [79 22, 05, A3]
-32DB; [79 22, 05, 25]
-3058; [79 22, 05, 9B][, DA 95, 05]
-30B8; [79 22, 05, A1][, DA 95, 05]
-3006; [79 22, 05, 09][79 4E, 05, 09]
-3321; [79 22, 05, 37][79 5C, 05, 37][79 6C, 05, 37][79 1A, 05, 37][, DA 95, 37]
-
-3059; [79 24, 05, 9B]
-31F2; [79 24, 05, 1D]
-30B9; [79 24, 05, A1]
-FF7D; [79 24, 05, A3]
-32DC; [79 24, 05, 25]
-305A; [79 24, 05, 9B][, DA 95, 05]
-30BA; [79 24, 05, A1][, DA 95, 05]
-
-305B; [79 26, 05, 9B]
-30BB; [79 26, 05, A1]
-FF7E; [79 26, 05, A3]
-32DD; [79 26, 05, 25]
-305C; [79 26, 05, 9B][, DA 95, 05]
-30BC; [79 26, 05, A1][, DA 95, 05]
-3322; [79 26, 05, 37][79 6C, 05, 37][79 2C, 05, 37]
-3323; [79 26, 05, 37][79 6C, 05, 37][79 32, 05, 37]
-
-305D; [79 28, 05, 9B]
-30BD; [79 28, 05, A1]
-FF7F; [79 28, 05, A3]
-32DE; [79 28, 05, 25]
-305E; [79 28, 05, 9B][, DA 95, 05]
-30BE; [79 28, 05, A1][, DA 95, 05]
-
-305F; [79 2A, 05, 9B]
-30BF; [79 2A, 05, A1]
-FF80; [79 2A, 05, A3]
-32DF; [79 2A, 05, 25]
-3060; [79 2A, 05, 9B][, DA 95, 05]
-30C0; [79 2A, 05, A1][, DA 95, 05]
-3324; [79 2A, 05, 37][, DA 95, 37][0E 27, 05, 37][79 24, 05, 37]
-
-3061; [79 2C, 05, 9B]
-30C1; [79 2C, 05, A1]
-FF81; [79 2C, 05, A3]
-32E0; [79 2C, 05, 25]
-3062; [79 2C, 05, 9B][, DA 95, 05]
-30C2; [79 2C, 05, A1][, DA 95, 05]
-
-3063; [79 2E, 05, 19]
-3064; [79 2E, 05, 9B]
-30C3; [79 2E, 05, 1D]
-FF6F; [79 2E, 05, 1F]
-30C4; [79 2E, 05, A1]
-FF82; [79 2E, 05, A3]
-32E1; [79 2E, 05, 25]
-3065; [79 2E, 05, 9B][, DA 95, 05]
-30C5; [79 2E, 05, A1][, DA 95, 05]
-
-3066; [79 30, 05, 9B]
-30C6; [79 30, 05, A1]
-FF83; [79 30, 05, A3]
-32E2; [79 30, 05, 25]
-3067; [79 30, 05, 9B][, DA 95, 05]
-30C7; [79 30, 05, A1][, DA 95, 05]
-1F213; [79 30, 05, 37][, DA 95, 37]
-3325; [79 30, 05, 37][, DA 95, 37][79 22, 05, 37]
-
-3068; [79 32, 05, 9B]
-31F3; [79 32, 05, 1D]
-30C8; [79 32, 05, A1]
-FF84; [79 32, 05, A3]
-32E3; [79 32, 05, 25]
-3069; [79 32, 05, 9B][, DA 95, 05]
-30C9; [79 32, 05, A1][, DA 95, 05]
-3326; [79 32, 05, 37][, DA 95, 37][79 5E, 05, 37]
-3327; [79 32, 05, 37][79 6C, 05, 37]
-
-306A; [79 34, 05, 9B]
-30CA; [79 34, 05, A1]
-FF85; [79 34, 05, A3]
-32E4; [79 34, 05, 25]
-3328; [79 34, 05, 37][79 3C, 05, 37]
-
-306B; [79 36, 05, 9B]
-30CB; [79 36, 05, A1]
-FF86; [79 36, 05, A3]
-32E5; [79 36, 05, 25]
-
-306C; [79 38, 05, 9B]
-31F4; [79 38, 05, 1D]
-30CC; [79 38, 05, A1]
-FF87; [79 38, 05, A3]
-32E6; [79 38, 05, 25]
-
-306D; [79 3A, 05, 9B]
-30CD; [79 3A, 05, A1]
-FF88; [79 3A, 05, A3]
-32E7; [79 3A, 05, 25]
-
-306E; [79 3C, 05, 9B]
-30CE; [79 3C, 05, A1]
-FF89; [79 3C, 05, A3]
-32E8; [79 3C, 05, 25]
-3329; [79 3C, 05, 37][79 2E, 05, 37][79 32, 05, 37]
-
-306F; [79 3E, 05, 9B]
-31F5; [79 3E, 05, 1D]
-30CF; [79 3E, 05, A1]
-FF8A; [79 3E, 05, A3]
-32E9; [79 3E, 05, 25]
-3070; [79 3E, 05, 9B][, DA 95, 05]
-30D0; [79 3E, 05, A1][, DA 95, 05]
-3071; [79 3E, 05, 9B][, DA A5, 05]
-30D1; [79 3E, 05, A1][, DA A5, 05]
-332B; [79 3E, 05, 37][, DA A5, 37][0E 27, 05, 37][79 26, 05, 37][79 6C, 05, 37][79 32, 05, 37]
-332C; [79 3E, 05, 37][, DA A5, 37][0E 27, 05, 37][79 2E, 05, 37]
-332D; [79 3E, 05, 37][, DA 95, 37][0E 27, 05, 37][79 60, 05, 37][79 5E, 05, 37]
-332A; [79 3E, 05, 37][79 0C, 05, 37][79 2E, 05, 37]
-
-3072; [79 40, 05, 9B]
-31F6; [79 40, 05, 1D]
-30D2; [79 40, 05, A1]
-FF8B; [79 40, 05, A3]
-32EA; [79 40, 05, 25]
-3073; [79 40, 05, 9B][, DA 95, 05]
-30D3; [79 40, 05, A1][, DA 95, 05]
-3074; [79 40, 05, 9B][, DA A5, 05]
-30D4; [79 40, 05, A1][, DA A5, 05]
-332E; [79 40, 05, 37][, DA A5, 37][79 0A, 05, 37][79 24, 05, 37][79 32, 05, 37][79 5E, 05, 37]
-332F; [79 40, 05, 37][, DA A5, 37][79 1A, 05, 37][79 5E, 05, 37]
-3330; [79 40, 05, 37][, DA A5, 37][79 1E, 05, 37]
-3331; [79 40, 05, 37][, DA 95, 37][79 5E, 05, 37]
-
-3075; [79 42, 05, 9B]
-31F7; [79 42, 05, 1D]
-30D5; [79 42, 05, A1]
-FF8C; [79 42, 05, A3]
-32EB; [79 42, 05, 25]
-3076; [79 42, 05, 9B][, DA 95, 05]
-30D6; [79 42, 05, A1][, DA 95, 05]
-3077; [79 42, 05, 9B][, DA A5, 05]
-30D7; [79 42, 05, A1][, DA A5, 05]
-3332; [79 42, 05, 37][79 0A, 05, 37][79 5A, 05, 37][79 2E, 05, 37][79 32, 05, 37][, DA 95, 37]
-3333; [79 42, 05, 37][79 0C, 05, 37][0E 27, 05, 37][79 32, 05, 37]
-3334; [79 42, 05, 37][, DA 95, 37][79 2E, 05, 37][79 22, 05, 37][79 12, 05, 37][79 5E, 05, 37]
-3335; [79 42, 05, 37][79 5A, 05, 37][79 6C, 05, 37]
-
-3078; [79 44, 05, 9B]
-31F8; [79 44, 05, 1D]
-30D8; [79 44, 05, A1]
-FF8D; [79 44, 05, A3]
-32EC; [79 44, 05, 25]
-3079; [79 44, 05, 9B][, DA 95, 05]
-30D9; [79 44, 05, A1][, DA 95, 05]
-307A; [79 44, 05, 9B][, DA A5, 05]
-30DA; [79 44, 05, A1][, DA A5, 05]
-333B; [79 44, 05, 37][, DA A5, 37][0E 27, 05, 37][79 22, 05, 37][, DA 95, 37]
-333C; [79 44, 05, 37][, DA 95, 37][0E 27, 05, 37][79 2A, 05, 37]
-3336; [79 44, 05, 37][79 1A, 05, 37][79 2A, 05, 37][0E 27, 05, 37][79 5E, 05, 37]
-3337; [79 44, 05, 37][, DA A5, 37][79 28, 05, 37]
-3338; [79 44, 05, 37][, DA A5, 37][79 36, 05, 37][79 40, 05, 37]
-3339; [79 44, 05, 37][79 5E, 05, 37][79 2E, 05, 37]
-333A; [79 44, 05, 37][, DA A5, 37][79 6C, 05, 37][79 24, 05, 37]
-
-307B; [79 46, 05, 9B]
-31F9; [79 46, 05, 1D]
-30DB; [79 46, 05, A1]
-FF8E; [79 46, 05, A3]
-32ED; [79 46, 05, 25]
-307C; [79 46, 05, 9B][, DA 95, 05]
-30DC; [79 46, 05, A1][, DA 95, 05]
-307D; [79 46, 05, 9B][, DA A5, 05]
-30DD; [79 46, 05, A1][, DA A5, 05]
-3341; [79 46, 05, 37][0E 27, 05, 37][79 5E, 05, 37]
-3342; [79 46, 05, 37][0E 27, 05, 37][79 6C, 05, 37]
-333D; [79 46, 05, 37][, DA A5, 37][79 0C, 05, 37][79 6C, 05, 37][79 32, 05, 37]
-1F200; [79 46, 05, 37][79 16, 05, 37]
-333E; [79 46, 05, 37][, DA 95, 37][79 5E, 05, 37][79 32, 05, 37]
-333F; [79 46, 05, 37][79 6C, 05, 37]
-3340; [79 46, 05, 37][, DA A5, 37][79 6C, 05, 37][79 32, 05, 37][, DA 95, 37]
-
-307E; [79 48, 05, 9B]
-30DE; [79 48, 05, A1]
-FF8F; [79 48, 05, A3]
-32EE; [79 48, 05, 25]
-3343; [79 48, 05, 37][79 0C, 05, 37][79 1A, 05, 37][79 62, 05, 37]
-3344; [79 48, 05, 37][79 0C, 05, 37][79 5E, 05, 37]
-303C; [79 48, 05, 09][79 24, 05, 09]
-3345; [79 48, 05, 37][79 2E, 05, 37][79 3E, 05, 37]
-3346; [79 48, 05, 37][79 5E, 05, 37][79 1A, 05, 37]
-3347; [79 48, 05, 37][79 6C, 05, 37][79 22, 05, 37][79 58, 05, 37][79 6C, 05, 37]
-
-307F; [79 4A, 05, 9B]
-30DF; [79 4A, 05, A1]
-FF90; [79 4A, 05, A3]
-32EF; [79 4A, 05, 25]
-3348; [79 4A, 05, 37][79 1A, 05, 37][79 62, 05, 37][79 6C, 05, 37]
-3349; [79 4A, 05, 37][79 5C, 05, 37]
-334A; [79 4A, 05, 37][79 5C, 05, 37][79 3E, 05, 37][, DA 95, 37][0E 27, 05, 37][79 5E, 05, 37]
-
-3080; [79 4C, 05, 9B]
-31FA; [79 4C, 05, 1D]
-30E0; [79 4C, 05, A1]
-FF91; [79 4C, 05, A3]
-32F0; [79 4C, 05, 25]
-
-3081; [79 4E, 05, 9B]
-30E1; [79 4E, 05, A1]
-FF92; [79 4E, 05, A3]
-32F1; [79 4E, 05, 25]
-334D; [79 4E, 05, 37][0E 27, 05, 37][79 32, 05, 37][79 5E, 05, 37]
-334B; [79 4E, 05, 37][79 16, 05, 37][, DA 95, 37]
-334C; [79 4E, 05, 37][79 16, 05, 37][, DA 95, 37][79 32, 05, 37][79 6C, 05, 37]
-
-3082; [79 50, 05, 9B]
-30E2; [79 50, 05, A1]
-FF93; [79 50, 05, A3]
-32F2; [79 50, 05, 25]
-
-3083; [79 52, 05, 19]
-3084; [79 52, 05, 9B]
-30E3; [79 52, 05, 1D]
-FF6C; [79 52, 05, 1F]
-30E4; [79 52, 05, A1]
-FF94; [79 52, 05, A3]
-32F3; [79 52, 05, 25]
-334E; [79 52, 05, 37][0E 27, 05, 37][79 32, 05, 37][, DA 95, 37]
-334F; [79 52, 05, 37][0E 27, 05, 37][79 5E, 05, 37]
-
-3085; [79 54, 05, 19]
-3086; [79 54, 05, 9B]
-30E5; [79 54, 05, 1D]
-FF6D; [79 54, 05, 1F]
-30E6; [79 54, 05, A1]
-FF95; [79 54, 05, A3]
-32F4; [79 54, 05, 25]
-3350; [79 54, 05, 37][79 0A, 05, 37][79 6C, 05, 37]
-
-1B001; [79 56, 05, 9B]
-
-3087; [79 58, 05, 19]
-3088; [79 58, 05, 9B]
-30E7; [79 58, 05, 1D]
-FF6E; [79 58, 05, 1F]
-30E8; [79 58, 05, A1]
-FF96; [79 58, 05, A3]
-32F5; [79 58, 05, 25]
-309F; [79 58, 05, 2B][79 5C, 05, 2B]
-
-3089; [79 5A, 05, 9B]
-31FB; [79 5A, 05, 1D]
-30E9; [79 5A, 05, A1]
-FF97; [79 5A, 05, A3]
-32F6; [79 5A, 05, 25]
-
-308A; [79 5C, 05, 9B]
-31FC; [79 5C, 05, 1D]
-30EA; [79 5C, 05, A1]
-FF98; [79 5C, 05, A3]
-32F7; [79 5C, 05, 25]
-3351; [79 5C, 05, 37][79 2E, 05, 37][79 32, 05, 37][79 5E, 05, 37]
-3352; [79 5C, 05, 37][79 5A, 05, 37]
-
-308B; [79 5E, 05, 9B]
-31FD; [79 5E, 05, 1D]
-30EB; [79 5E, 05, A1]
-FF99; [79 5E, 05, A3]
-32F8; [79 5E, 05, 25]
-3354; [79 5E, 05, 37][0E 27, 05, 37][79 42, 05, 37][, DA 95, 37][79 5E, 05, 37]
-3353; [79 5E, 05, 37][79 40, 05, 37][, DA A5, 37][0E 27, 05, 37]
-
-308C; [79 60, 05, 9B]
-31FE; [79 60, 05, 1D]
-30EC; [79 60, 05, A1]
-FF9A; [79 60, 05, A3]
-32F9; [79 60, 05, 25]
-3355; [79 60, 05, 37][79 4C, 05, 37]
-3356; [79 60, 05, 37][79 6C, 05, 37][79 32, 05, 37][79 1C, 05, 37][, DA 95, 37][79 6C, 05, 37]
-
-308D; [79 62, 05, 9B]
-31FF; [79 62, 05, 1D]
-30ED; [79 62, 05, A1]
-FF9B; [79 62, 05, A3]
-32FA; [79 62, 05, 25]
-
-308E; [79 64, 05, 19]
-308F; [79 64, 05, 9B]
-30EE; [79 64, 05, 1D]
-30EF; [79 64, 05, A1]
-FF9C; [79 64, 05, A3]
-32FB; [79 64, 05, 25]
-30F7; [79 64, 05, A1][, DA 95, 05]
-3357; [79 64, 05, 37][79 2E, 05, 37][79 32, 05, 37]
+D7EB; [75 9A EE, 05, 05]
 
-3090; [79 66, 05, 9B]
-30F0; [79 66, 05, A1]
-32FC; [79 66, 05, 25]
-30F8; [79 66, 05, A1][, DA 95, 05]
+D7EC; [75 9A F6, 05, 05]
 
-3091; [79 68, 05, 9B]
-30F1; [79 68, 05, A1]
-32FD; [79 68, 05, 25]
-30F9; [79 68, 05, A1][, DA 95, 05]
+D7ED; [75 9A FE, 05, 05]
 
-3092; [79 6A, 05, 9B]
-30F2; [79 6A, 05, A1]
-FF66; [79 6A, 05, A3]
-32FE; [79 6A, 05, 25]
-30FA; [79 6A, 05, A1][, DA 95, 05]
+D7EE; [75 9B 08, 05, 05]
 
-3093; [79 6C, 05, 9B]
-30F3; [79 6C, 05, A1]
-FF9D; [79 6C, 05, A3]
+D7EF; [75 9B 10, 05, 05]
 
-3105; [7A 0A, 05, 05]
-31A0; [7A 0A, 05, 09][, DB B9, 09]
+D7F0; [75 9B 18, 05, 05]
 
-3106; [7A 0C, 05, 05]
-31B4; [7A 0C, 05, 31]
+D7F1; [75 9B 20, 05, 05]
 
-3107; [7A 0E, 05, 05]
+D7F2; [75 9B 28, 05, 05]
 
-3108; [7A 10, 05, 05]
+D7F3; [75 9B 30, 05, 05]
 
-312A; [7A 12, 05, 05]
+D7F4; [75 9B 38, 05, 05]
 
-3109; [7A 14, 05, 05]
+D7F5; [75 9B 40, 05, 05]
 
-310A; [7A 16, 05, 05]
-31B5; [7A 16, 05, 31]
+D7F6; [75 9B 48, 05, 05]
 
-310B; [7A 18, 05, 05]
+D7F7; [75 9B 50, 05, 05]
 
-310C; [7A 1A, 05, 05]
+D7F8; [75 9B 58, 05, 05]
 
-310D; [7A 1C, 05, 05]
-31A3; [7A 1C, 05, 09][, DB B9, 09]
+D7F9; [75 9B 60, 05, 05]
 
-310E; [7A 1E, 05, 05]
-31B6; [7A 1E, 05, 31]
+D7FA; [75 9B 68, 05, 05]
 
-312B; [7A 20, 05, 05]
+D7FB; [75 9B 70, 05, 05]
 
-31AD; [7A 22, 05, 05]
+FDD1 304B;     [76 04 02, 05, 05]      # HIRAGANA first primary starts reordering group (compressible)
 
-310F; [7A 24, 05, 05]
-31B7; [7A 24, 05, 31]
+FDD1 30AB;     [76 04 02, 05, 05]      # KATAKANA first primary
 
-3110; [7A 26, 05, 05]
-31A2; [7A 26, 05, 09][, DB B9, 09]
+3041; [76 09, 05, 10]
+3042; [76 09, 05, 95]
+30A1; [76 09, 05, 1A]
+FF67; [76 09, 05, 1F]
+30A2; [76 09, 05, A4]
+FF71; [76 09, 05, A9]
+32D0; [76 09, 05, 2E]
+3303; [76 09, 05, 33][0E 1C, 05, 2E][76 5D, 05, 33]
+3300; [76 09, 05, 33][76 3D, 05, 33][, B0, 2E][0E 1C, 05, 2E][76 31, 05, 34]
+3301; [76 09, 05, 33][76 5D, 05, 33][76 41, 05, 33][76 09, 05, 33]
+3302; [76 09, 05, 33][76 6B, 05, 31][76 43, 05, 33][, B0, 2E][76 09, 05, 33]
 
-3111; [7A 28, 05, 05]
+3043; [76 0B, 05, 10]
+3044; [76 0B, 05, 95]
+30A3; [76 0B, 05, 1A]
+FF68; [76 0B, 05, 1F]
+30A4; [76 0B, 05, A4]
+FF72; [76 0B, 05, A9]
+32D1; [76 0B, 05, 2E]
+3304; [76 0B, 05, 33][76 35, 05, 30][76 6B, 05, 31][76 19, 05, 33][, AE, 2E]
+3305; [76 0B, 05, 33][76 6B, 05, 31][76 2B, 05, 30]
 
-3112; [7A 2A, 05, 05]
+3045; [76 0D, 05, 10]
+3046; [76 0D, 05, 95]
+30A5; [76 0D, 05, 1A]
+FF69; [76 0D, 05, 1F]
+30A6; [76 0D, 05, A4]
+FF73; [76 0D, 05, A9]
+32D2; [76 0D, 05, 2E]
+3094; [76 0D, 05, 95][, AE, 05]
+30F4; [76 0D, 05, A4][, AE, 05]
+3306; [76 0D, 05, 33][76 13, 05, 33][76 6B, 05, 31]
+
+1B000; [76 0F, 05, A0]
+
+3047; [76 11, 05, 10]
+3048; [76 11, 05, 95]
+30A7; [76 11, 05, 1A]
+FF6A; [76 11, 05, 1F]
+30A8; [76 11, 05, A4]
+FF74; [76 11, 05, A9]
+32D3; [76 11, 05, 2E]
+3308; [76 11, 05, 33][0E 1C, 05, 2E][76 15, 05, 34][0E 1C, 05, 2E]
+3307; [76 11, 05, 33][76 23, 05, 34][76 19, 05, 33][0E 1C, 05, 2E][76 31, 05, 34][, AE, 2E]
+
+3049; [76 13, 05, 10]
+304A; [76 13, 05, 95]
+30A9; [76 13, 05, 1A]
+FF6B; [76 13, 05, 1F]
+30AA; [76 13, 05, A4]
+FF75; [76 13, 05, A9]
+32D4; [76 13, 05, 2E]
+330A; [76 13, 05, 33][0E 1C, 05, 2E][76 4B, 05, 33]
+3309; [76 13, 05, 33][76 6B, 05, 31][76 23, 05, 34]
+
+3095; [76 15, 05, 10]
+304B; [76 15, 05, 96]
+30F5; [76 15, 05, 1C]
+30AB; [76 15, 05, A2]
+FF76; [76 15, 05, A8]
+32D5; [76 15, 05, 2E]
+304C; [76 15, 05, 96][, AE, 05]
+30AC; [76 15, 05, A2][, AE, 05]
+330B; [76 15, 05, 34][76 0B, 05, 33][76 5B, 05, 34]
+330C; [76 15, 05, 34][76 59, 05, 33][76 2D, 05, 33][76 31, 05, 34]
+330D; [76 15, 05, 34][76 61, 05, 33][76 5B, 05, 34][0E 1C, 05, 2E]
+330E; [76 15, 05, 34][, AE, 2E][76 61, 05, 33][76 6B, 05, 31]
+330F; [76 15, 05, 34][, AE, 2E][76 6B, 05, 31][76 47, 05, 33]
+
+304D; [76 17, 05, 90]
+30AD; [76 17, 05, 98]
+FF77; [76 17, 05, A0]
+32D6; [76 17, 05, 28]
+304E; [76 17, 05, 90][, AE, 05]
+30AE; [76 17, 05, 98][, AE, 05]
+3310; [76 17, 05, 30][, AE, 2E][76 15, 05, 34][, AE, 2E]
+3311; [76 17, 05, 30][, AE, 2E][76 35, 05, 30][0E 1C, 05, 2E]
+3312; [76 17, 05, 30][76 53, 05, 33][76 5B, 05, 34][0E 1C, 05, 2E]
+3313; [76 17, 05, 30][, AE, 2E][76 5D, 05, 33][76 29, 05, 30][, AE, 2E][0E 1C, 05, 2E]
+3314; [76 17, 05, 30][76 61, 05, 33]
+3315; [76 17, 05, 30][76 61, 05, 33][76 19, 05, 33][, AE, 2E][76 59, 05, 33][76 4B, 05, 33]
+3316; [76 17, 05, 30][76 61, 05, 33][76 4D, 05, 33][0E 1C, 05, 2E][76 31, 05, 34][76 5D, 05, 33]
+3317; [76 17, 05, 30][76 61, 05, 33][76 63, 05, 34][76 2D, 05, 33][76 31, 05, 34]
+
+304F; [76 19, 05, 90]
+31F0; [76 19, 05, 17]
+30AF; [76 19, 05, 9E]
+FF78; [76 19, 05, A5]
+32D7; [76 19, 05, 2C]
+3050; [76 19, 05, 90][, AE, 05]
+30B0; [76 19, 05, 9E][, AE, 05]
+3318; [76 19, 05, 33][, AE, 2E][76 59, 05, 33][76 4B, 05, 33]
+3319; [76 19, 05, 33][, AE, 2E][76 59, 05, 33][76 4B, 05, 33][76 31, 05, 34][76 6B, 05, 31]
+331A; [76 19, 05, 33][76 5D, 05, 33][76 25, 05, 30][, AE, 2E][76 0B, 05, 33][76 61, 05, 33]
+331B; [76 19, 05, 33][76 61, 05, 33][0E 1C, 05, 2E][76 39, 05, 30]
+
+3096; [76 1B, 05, 10]
+3051; [76 1B, 05, 96]
+30F6; [76 1B, 05, 1C]
+30B1; [76 1B, 05, A2]
+FF79; [76 1B, 05, A8]
+32D8; [76 1B, 05, 2E]
+3052; [76 1B, 05, 96][, AE, 05]
+30B2; [76 1B, 05, A2][, AE, 05]
+331C; [76 1B, 05, 34][0E 1C, 05, 2E][76 23, 05, 34]
+
+3053; [76 1D, 05, 90]
+30B3; [76 1D, 05, 97]
+FF7A; [76 1D, 05, 9E]
+32D9; [76 1D, 05, 25]
+3054; [76 1D, 05, 90][, AE, 05]
+30B4; [76 1D, 05, 97][, AE, 05]
+331E; [76 1D, 05, 33][0E 1C, 05, 2E][76 45, 05, 33][, B0, 2E]
+1F201; [76 1D, 05, 33][76 1D, 05, 33]
+30FF; [76 1D, 05, 2C][76 31, 05, 2E]
+331D; [76 1D, 05, 33][76 5D, 05, 33][76 33, 05, 30]
+
+3055; [76 1F, 05, 90]
+30B5; [76 1F, 05, 98]
+FF7B; [76 1F, 05, A0]
+32DA; [76 1F, 05, 28]
+1F202; [76 1F, 05, 30]
+3056; [76 1F, 05, 90][, AE, 05]
+30B6; [76 1F, 05, 98][, AE, 05]
+331F; [76 1F, 05, 30][76 0B, 05, 33][76 19, 05, 33][76 5D, 05, 33]
+3320; [76 1F, 05, 30][76 6B, 05, 31][76 2B, 05, 30][0E 1C, 05, 2E][76 4B, 05, 33]
+
+3057; [76 21, 05, 96]
+31F1; [76 21, 05, 1C]
+30B7; [76 21, 05, A2]
+FF7C; [76 21, 05, A8]
+32DB; [76 21, 05, 2E]
+3058; [76 21, 05, 96][, AE, 05]
+30B8; [76 21, 05, A2][, AE, 05]
+3006; [76 21, 05, 10][76 4D, 05, 10]
+3321; [76 21, 05, 34][76 5B, 05, 34][76 6B, 05, 31][76 19, 05, 33][, AE, 2E]
+
+3059; [76 23, 05, 96]
+31F2; [76 23, 05, 1C]
+30B9; [76 23, 05, A2]
+FF7D; [76 23, 05, A8]
+32DC; [76 23, 05, 2E]
+305A; [76 23, 05, 96][, AE, 05]
+30BA; [76 23, 05, A2][, AE, 05]
+
+305B; [76 25, 05, 90]
+30BB; [76 25, 05, 98]
+FF7E; [76 25, 05, A0]
+32DD; [76 25, 05, 28]
+305C; [76 25, 05, 90][, AE, 05]
+30BC; [76 25, 05, 98][, AE, 05]
+3322; [76 25, 05, 30][76 6B, 05, 31][76 2B, 05, 30]
+3323; [76 25, 05, 30][76 6B, 05, 31][76 31, 05, 34]
+
+305D; [76 27, 05, 90]
+30BD; [76 27, 05, 98]
+FF7F; [76 27, 05, A0]
+32DE; [76 27, 05, 28]
+305E; [76 27, 05, 90][, AE, 05]
+30BE; [76 27, 05, 98][, AE, 05]
+
+305F; [76 29, 05, 90]
+30BF; [76 29, 05, 98]
+FF80; [76 29, 05, A0]
+32DF; [76 29, 05, 28]
+3060; [76 29, 05, 90][, AE, 05]
+30C0; [76 29, 05, 98][, AE, 05]
+3324; [76 29, 05, 30][, AE, 2E][0E 1C, 05, 2E][76 23, 05, 34]
+
+3061; [76 2B, 05, 90]
+30C1; [76 2B, 05, 98]
+FF81; [76 2B, 05, A0]
+32E0; [76 2B, 05, 28]
+3062; [76 2B, 05, 90][, AE, 05]
+30C2; [76 2B, 05, 98][, AE, 05]
+
+3063; [76 2D, 05, 10]
+3064; [76 2D, 05, 95]
+30C3; [76 2D, 05, 1A]
+FF6F; [76 2D, 05, 1F]
+30C4; [76 2D, 05, A4]
+FF82; [76 2D, 05, A9]
+32E1; [76 2D, 05, 2E]
+3065; [76 2D, 05, 95][, AE, 05]
+30C5; [76 2D, 05, A4][, AE, 05]
+
+3066; [76 2F, 05, 90]
+30C6; [76 2F, 05, 98]
+FF83; [76 2F, 05, A0]
+32E2; [76 2F, 05, 28]
+3067; [76 2F, 05, 90][, AE, 05]
+30C7; [76 2F, 05, 98][, AE, 05]
+1F213; [76 2F, 05, 30][, AE, 2E]
+3325; [76 2F, 05, 30][, AE, 2E][76 21, 05, 34]
+
+3068; [76 31, 05, 90]
+31F3; [76 31, 05, 16]
+30C8; [76 31, 05, 9C]
+FF84; [76 31, 05, A2]
+32E3; [76 31, 05, 28]
+3069; [76 31, 05, 90][, AE, 05]
+30C9; [76 31, 05, 9C][, AE, 05]
+3326; [76 31, 05, 34][, AE, 2E][76 5D, 05, 33]
+3327; [76 31, 05, 34][76 6B, 05, 31]
+
+306A; [76 33, 05, 90]
+30CA; [76 33, 05, 98]
+FF85; [76 33, 05, A0]
+32E4; [76 33, 05, 28]
+3328; [76 33, 05, 30][76 3B, 05, 30]
+
+306B; [76 35, 05, 90]
+30CB; [76 35, 05, 98]
+FF86; [76 35, 05, A0]
+32E5; [76 35, 05, 28]
+
+306C; [76 37, 05, 90]
+31F4; [76 37, 05, 18]
+30CC; [76 37, 05, A0]
+FF87; [76 37, 05, A8]
+32E6; [76 37, 05, 30]
+
+306D; [76 39, 05, 90]
+30CD; [76 39, 05, 98]
+FF88; [76 39, 05, A0]
+32E7; [76 39, 05, 28]
+
+306E; [76 3B, 05, 90]
+30CE; [76 3B, 05, 98]
+FF89; [76 3B, 05, A0]
+32E8; [76 3B, 05, 28]
+3329; [76 3B, 05, 30][76 2D, 05, 33][76 31, 05, 34]
+
+306F; [76 3D, 05, 90]
+31F5; [76 3D, 05, 17]
+30CF; [76 3D, 05, 9E]
+FF8A; [76 3D, 05, A5]
+32E9; [76 3D, 05, 2C]
+3070; [76 3D, 05, 90][, AE, 05]
+30D0; [76 3D, 05, 9E][, AE, 05]
+3071; [76 3D, 05, 90][, B0, 05]
+30D1; [76 3D, 05, 9E][, B0, 05]
+332B; [76 3D, 05, 33][, B0, 2E][0E 1C, 05, 2E][76 25, 05, 30][76 6B, 05, 31][76 31, 05, 34]
+332C; [76 3D, 05, 33][, B0, 2E][0E 1C, 05, 2E][76 2D, 05, 33]
+332D; [76 3D, 05, 33][, AE, 2E][0E 1C, 05, 2E][76 5F, 05, 33][76 5D, 05, 33]
+332A; [76 3D, 05, 33][76 0B, 05, 33][76 2D, 05, 33]
+
+3072; [76 3F, 05, 90]
+31F6; [76 3F, 05, 17]
+30D2; [76 3F, 05, 9E]
+FF8B; [76 3F, 05, A5]
+32EA; [76 3F, 05, 2C]
+3073; [76 3F, 05, 90][, AE, 05]
+30D3; [76 3F, 05, 9E][, AE, 05]
+3074; [76 3F, 05, 90][, B0, 05]
+30D4; [76 3F, 05, 9E][, B0, 05]
+332E; [76 3F, 05, 33][, B0, 2E][76 09, 05, 33][76 23, 05, 34][76 31, 05, 34][76 5D, 05, 33]
+332F; [76 3F, 05, 33][, B0, 2E][76 19, 05, 33][76 5D, 05, 33]
+3330; [76 3F, 05, 33][, B0, 2E][76 1D, 05, 33]
+3331; [76 3F, 05, 33][, AE, 2E][76 5D, 05, 33]
+
+3075; [76 41, 05, 90]
+31F7; [76 41, 05, 17]
+30D5; [76 41, 05, 9E]
+FF8C; [76 41, 05, A5]
+32EB; [76 41, 05, 2C]
+3076; [76 41, 05, 90][, AE, 05]
+30D6; [76 41, 05, 9E][, AE, 05]
+3077; [76 41, 05, 90][, B0, 05]
+30D7; [76 41, 05, 9E][, B0, 05]
+3332; [76 41, 05, 33][76 09, 05, 33][76 59, 05, 33][76 2D, 05, 33][76 31, 05, 34][, AE, 2E]
+3333; [76 41, 05, 33][76 0B, 05, 33][0E 1C, 05, 2E][76 31, 05, 34]
+3334; [76 41, 05, 33][, AE, 2E][76 2D, 05, 33][76 21, 05, 34][76 11, 05, 33][76 5D, 05, 33]
+3335; [76 41, 05, 33][76 59, 05, 33][76 6B, 05, 31]
+
+3078; [76 43, 05, 90]
+31F8; [76 43, 05, 17]
+30D8; [76 43, 05, 9E]
+FF8D; [76 43, 05, A5]
+32EC; [76 43, 05, 2C]
+3079; [76 43, 05, 90][, AE, 05]
+30D9; [76 43, 05, 9E][, AE, 05]
+307A; [76 43, 05, 90][, B0, 05]
+30DA; [76 43, 05, 9E][, B0, 05]
+333B; [76 43, 05, 33][, B0, 2E][0E 1C, 05, 2E][76 21, 05, 34][, AE, 2E]
+333C; [76 43, 05, 33][, AE, 2E][0E 1C, 05, 2E][76 29, 05, 30]
+3336; [76 43, 05, 33][76 19, 05, 33][76 29, 05, 30][0E 1C, 05, 2E][76 5D, 05, 33]
+3337; [76 43, 05, 33][, B0, 2E][76 27, 05, 30]
+3338; [76 43, 05, 33][, B0, 2E][76 35, 05, 30][76 3F, 05, 33]
+3339; [76 43, 05, 33][76 5D, 05, 33][76 2D, 05, 33]
+333A; [76 43, 05, 33][, B0, 2E][76 6B, 05, 31][76 23, 05, 34]
+
+307B; [76 45, 05, 90]
+31F9; [76 45, 05, 17]
+30DB; [76 45, 05, 9E]
+FF8E; [76 45, 05, A5]
+32ED; [76 45, 05, 2C]
+307C; [76 45, 05, 90][, AE, 05]
+30DC; [76 45, 05, 9E][, AE, 05]
+307D; [76 45, 05, 90][, B0, 05]
+30DD; [76 45, 05, 9E][, B0, 05]
+3341; [76 45, 05, 33][0E 1C, 05, 2E][76 5D, 05, 33]
+3342; [76 45, 05, 33][0E 1C, 05, 2E][76 6B, 05, 31]
+333D; [76 45, 05, 33][, B0, 2E][76 0B, 05, 33][76 6B, 05, 31][76 31, 05, 34]
+1F200; [76 45, 05, 33][76 15, 05, 34]
+333E; [76 45, 05, 33][, AE, 2E][76 5D, 05, 33][76 31, 05, 34]
+333F; [76 45, 05, 33][76 6B, 05, 31]
+3340; [76 45, 05, 33][, B0, 2E][76 6B, 05, 31][76 31, 05, 34][, AE, 2E]
+
+307E; [76 47, 05, 97]
+30DE; [76 47, 05, 9E]
+FF8F; [76 47, 05, A5]
+32EE; [76 47, 05, 2C]
+3343; [76 47, 05, 33][76 0B, 05, 33][76 19, 05, 33][76 61, 05, 33]
+3344; [76 47, 05, 33][76 0B, 05, 33][76 5D, 05, 33]
+303C; [76 47, 05, 10][76 23, 05, 10]
+3345; [76 47, 05, 33][76 2D, 05, 33][76 3D, 05, 33]
+3346; [76 47, 05, 33][76 5D, 05, 33][76 19, 05, 33]
+3347; [76 47, 05, 33][76 6B, 05, 31][76 21, 05, 34][76 57, 05, 30][76 6B, 05, 31]
+
+307F; [76 49, 05, 90]
+30DF; [76 49, 05, 98]
+FF90; [76 49, 05, A0]
+32EF; [76 49, 05, 28]
+3348; [76 49, 05, 30][76 19, 05, 33][76 61, 05, 33][76 6B, 05, 31]
+3349; [76 49, 05, 30][76 5B, 05, 34]
+334A; [76 49, 05, 30][76 5B, 05, 34][76 3D, 05, 33][, AE, 2E][0E 1C, 05, 2E][76 5D, 05, 33]
+
+3080; [76 4B, 05, 90]
+31FA; [76 4B, 05, 17]
+30E0; [76 4B, 05, 9E]
+FF91; [76 4B, 05, A5]
+32F0; [76 4B, 05, 2C]
+
+3081; [76 4D, 05, 97]
+30E1; [76 4D, 05, 9E]
+FF92; [76 4D, 05, A5]
+32F1; [76 4D, 05, 2C]
+334D; [76 4D, 05, 33][0E 1C, 05, 2E][76 31, 05, 34][76 5D, 05, 33]
+334B; [76 4D, 05, 33][76 15, 05, 34][, AE, 2E]
+334C; [76 4D, 05, 33][76 15, 05, 34][, AE, 2E][76 31, 05, 34][76 6B, 05, 31]
+
+3082; [76 4F, 05, 90]
+30E2; [76 4F, 05, 9B]
+FF93; [76 4F, 05, A6]
+32F2; [76 4F, 05, 31]
+
+3083; [76 51, 05, 10]
+3084; [76 51, 05, 95]
+30E3; [76 51, 05, 1A]
+FF6C; [76 51, 05, 1F]
+30E4; [76 51, 05, A4]
+FF94; [76 51, 05, A9]
+32F3; [76 51, 05, 2E]
+334E; [76 51, 05, 33][0E 1C, 05, 2E][76 31, 05, 34][, AE, 2E]
+334F; [76 51, 05, 33][0E 1C, 05, 2E][76 5D, 05, 33]
+
+3085; [76 53, 05, 10]
+3086; [76 53, 05, 95]
+30E5; [76 53, 05, 1A]
+FF6D; [76 53, 05, 1F]
+30E6; [76 53, 05, A4]
+FF95; [76 53, 05, A9]
+32F4; [76 53, 05, 2E]
+3350; [76 53, 05, 33][76 09, 05, 33][76 6B, 05, 31]
+
+1B001; [76 55, 05, A0]
+
+3087; [76 57, 05, 10]
+3088; [76 57, 05, 94]
+30E7; [76 57, 05, 18]
+FF6E; [76 57, 05, 1C]
+30E8; [76 57, 05, A0]
+FF96; [76 57, 05, A4]
+32F5; [76 57, 05, 28]
+309F; [76 57, 05, 2C][76 5B, 05, 2E]
+
+3089; [76 59, 05, 90]
+31FB; [76 59, 05, 17]
+30E9; [76 59, 05, 9E]
+FF97; [76 59, 05, A5]
+32F6; [76 59, 05, 2C]
+
+308A; [76 5B, 05, 90]
+31FC; [76 5B, 05, 16]
+30EA; [76 5B, 05, 9C]
+FF98; [76 5B, 05, A2]
+32F7; [76 5B, 05, 28]
+3351; [76 5B, 05, 34][76 2D, 05, 33][76 31, 05, 34][76 5D, 05, 33]
+3352; [76 5B, 05, 34][76 59, 05, 33]
+
+308B; [76 5D, 05, 90]
+31FD; [76 5D, 05, 17]
+30EB; [76 5D, 05, 9E]
+FF99; [76 5D, 05, A5]
+32F8; [76 5D, 05, 2C]
+3354; [76 5D, 05, 33][0E 1C, 05, 2E][76 41, 05, 33][, AE, 2E][76 5D, 05, 33]
+3353; [76 5D, 05, 33][76 3F, 05, 33][, B0, 2E][0E 1C, 05, 2E]
+
+308C; [76 5F, 05, 90]
+31FE; [76 5F, 05, 17]
+30EC; [76 5F, 05, 9E]
+FF9A; [76 5F, 05, A5]
+32F9; [76 5F, 05, 2C]
+3355; [76 5F, 05, 33][76 4B, 05, 33]
+3356; [76 5F, 05, 33][76 6B, 05, 31][76 31, 05, 34][76 1B, 05, 34][, AE, 2E][76 6B, 05, 31]
+
+308D; [76 61, 05, 90]
+31FF; [76 61, 05, 17]
+30ED; [76 61, 05, 9E]
+FF9B; [76 61, 05, A5]
+32FA; [76 61, 05, 2C]
+
+308E; [76 63, 05, 10]
+308F; [76 63, 05, 96]
+30EE; [76 63, 05, 1C]
+30EF; [76 63, 05, A2]
+FF9C; [76 63, 05, A8]
+32FB; [76 63, 05, 2E]
+30F7; [76 63, 05, A2][, AE, 05]
+3357; [76 63, 05, 34][76 2D, 05, 33][76 31, 05, 34]
 
-312C; [7A 2C, 05, 05]
+3090; [76 65, 05, 90]
+30F0; [76 65, 05, 9E]
+32FC; [76 65, 05, 2C]
+30F8; [76 65, 05, 9E][, AE, 05]
 
-3113; [7A 2E, 05, 05]
+3091; [76 67, 05, 90]
+30F1; [76 67, 05, 9E]
+32FD; [76 67, 05, 2C]
+30F9; [76 67, 05, 9E][, AE, 05]
 
-3114; [7A 30, 05, 05]
+3092; [76 69, 05, 90]
+30F2; [76 69, 05, 9B]
+FF66; [76 69, 05, A6]
+32FE; [76 69, 05, 31]
+30FA; [76 69, 05, 9B][, AE, 05]
 
-3115; [7A 32, 05, 05]
+3093; [76 6B, 05, 90]
+30F3; [76 6B, 05, 9B]
+FF9D; [76 6B, 05, A6]
 
-3116; [7A 34, 05, 05]
+FDD1 3105;     [77 04 02, 05, 05]      # BOPOMOFO first primary starts reordering group (compressible)
 
-3117; [7A 36, 05, 05]
-31A1; [7A 36, 05, 09][, DB B9, 09]
+3105; [77 09, 05, 05]
+31A0; [77 09, 70, 20]
 
-3118; [7A 38, 05, 05]
+3106; [77 0B, 05, 05]
+31B4; [77 0B, 05, 20]
 
-3119; [7A 3A, 05, 05]
+3107; [77 0D, 05, 05]
 
-31B8; [7A 3C, 05, 05]
+3108; [77 0F, 05, 05]
 
-31B9; [7A 3E, 05, 05]
+312A; [77 11, 05, 05]
 
-31BA; [7A 40, 05, 05]
+3109; [77 13, 05, 05]
 
-311A; [7A 42, 05, 05]
-31A9; [7A 42, 05, 09][, DB B9, 09]
+310A; [77 15, 05, 05]
+31B5; [77 15, 05, 20]
 
-311B; [7A 44, 05, 05]
-31A7; [7A 44, 05, 09][, DB B9, 09]
+310B; [77 17, 05, 05]
 
-31A6; [7A 46, 05, 05]
+310C; [77 19, 05, 05]
 
-311C; [7A 48, 05, 05]
+310D; [77 1B, 05, 05]
+31A3; [77 1B, 70, 20]
 
-311D; [7A 4A, 05, 05]
+310E; [77 1D, 05, 05]
+31B6; [77 1D, 05, 20]
 
-31A4; [7A 4C, 05, 05]
-31A5; [7A 4C, 05, 09][, DB B9, 09]
+312B; [77 1F, 05, 05]
 
-311E; [7A 4E, 05, 05]
-31AE; [7A 4E, 05, 09][, DB B9, 09]
+31AD; [77 21, 05, 05]
 
-311F; [7A 50, 05, 05]
+310F; [77 23, 05, 05]
+31B7; [77 23, 05, 20]
 
-3120; [7A 52, 05, 05]
-31AF; [7A 52, 05, 09][, DB B9, 09]
+3110; [77 25, 05, 05]
+31A2; [77 25, 70, 20]
 
-3121; [7A 54, 05, 05]
+3111; [77 27, 05, 05]
 
-3122; [7A 56, 05, 05]
+3112; [77 29, 05, 05]
 
-3123; [7A 58, 05, 05]
+312C; [77 2B, 05, 05]
 
-3124; [7A 5A, 05, 05]
+3113; [77 2D, 05, 05]
 
-31B2; [7A 5C, 05, 05]
+3114; [77 2F, 05, 05]
 
-3125; [7A 5E, 05, 05]
+3115; [77 31, 05, 05]
 
-31B0; [7A 60, 05, 05]
+3116; [77 33, 05, 05]
 
-31B1; [7A 62, 05, 05]
+3117; [77 35, 05, 05]
+31A1; [77 35, 70, 20]
 
-31AC; [7A 64, 05, 05]
+3118; [77 37, 05, 05]
 
-3126; [7A 66, 05, 05]
+3119; [77 39, 05, 05]
 
-3127; [7A 68, 05, 05]
-31AA; [7A 68, 05, 09][, DB B9, 09]
-31B3; [7A 68, 05, 2B][, DB B9, 2B]
+31B8; [77 3B, 05, 05]
 
-3128; [7A 6A, 05, 05]
-31AB; [7A 6A, 05, 09][, DB B9, 09]
-31A8; [7A 6A, 05, 09][, DB C9, 09]
+31B9; [77 3D, 05, 05]
 
-3129; [7A 6C, 05, 05]
+31BA; [77 3F, 05, 05]
 
-312D; [7A 6E, 05, 05]
+311A; [77 41, 05, 05]
+31A9; [77 41, 70, 20]
 
-A000; [7A 70 04, 05, 05]
+311B; [77 43, 05, 05]
+31A7; [77 43, 70, 20]
 
-A001; [7A 70 0C, 05, 05]
+31A6; [77 45, 05, 05]
 
-A002; [7A 70 14, 05, 05]
+311C; [77 47, 05, 05]
 
-A003; [7A 70 1C, 05, 05]
+311D; [77 49, 05, 05]
 
-A004; [7A 70 24, 05, 05]
+31A4; [77 4B, 05, 05]
+31A5; [77 4B, 70, 20]
 
-A005; [7A 70 2C, 05, 05]
+311E; [77 4D, 05, 05]
+31AE; [77 4D, 70, 20]
 
-A006; [7A 70 34, 05, 05]
+311F; [77 4F, 05, 05]
 
-A007; [7A 70 3C, 05, 05]
+3120; [77 51, 05, 05]
+31AF; [77 51, 70, 20]
 
-A008; [7A 70 44, 05, 05]
+3121; [77 53, 05, 05]
 
-A009; [7A 70 4C, 05, 05]
+3122; [77 55, 05, 05]
 
-A00A; [7A 70 54, 05, 05]
+3123; [77 57, 05, 05]
 
-A00B; [7A 70 5C, 05, 05]
+3124; [77 59, 05, 05]
 
-A00C; [7A 70 64, 05, 05]
+31B2; [77 5B, 05, 05]
 
-A00D; [7A 70 6C, 05, 05]
+3125; [77 5D, 05, 05]
 
-A00E; [7A 70 74, 05, 05]
+31B0; [77 5F, 05, 05]
 
-A00F; [7A 70 7C, 05, 05]
+31B1; [77 61, 05, 05]
 
-A010; [7A 70 84, 05, 05]
+31AC; [77 63, 05, 05]
 
-A011; [7A 70 8C, 05, 05]
+3126; [77 65, 05, 05]
 
-A012; [7A 70 94, 05, 05]
+3127; [77 67, 05, 05]
+31AA; [77 67, 70, 20]
+31B3; [77 67, 70, 2E]
 
-A013; [7A 70 9C, 05, 05]
+3128; [77 69, 05, 05]
+31AB; [77 69, 70, 20]
+31A8; [77 69, 78, 20]
 
-A014; [7A 70 A4, 05, 05]
+3129; [77 6B, 05, 05]
 
-A015; [7A 70 AC, 05, 05]
+312D; [77 6D, 05, 05]
 
-A016; [7A 70 B4, 05, 05]
+FDD1 A288;     [77 72 02, 05, 05]      # YI first primary
 
-A017; [7A 70 BC, 05, 05]
+A000; [77 72 2B, 05, 05]
 
-A018; [7A 70 C4, 05, 05]
+A001; [77 72 33, 05, 05]
 
-A019; [7A 70 CC, 05, 05]
+A002; [77 72 3B, 05, 05]
 
-A01A; [7A 70 D4, 05, 05]
+A003; [77 72 43, 05, 05]
 
-A01B; [7A 70 DC, 05, 05]
+A004; [77 72 4B, 05, 05]
 
-A01C; [7A 70 E4, 05, 05]
+A005; [77 72 53, 05, 05]
 
-A01D; [7A 70 EC, 05, 05]
+A006; [77 72 5B, 05, 05]
 
-A01E; [7A 70 F4, 05, 05]
+A007; [77 72 63, 05, 05]
 
-A01F; [7A 70 FC, 05, 05]
+A008; [77 72 6B, 05, 05]
 
-A020; [7A 71 0A, 05, 05]
+A009; [77 72 73, 05, 05]
 
-A021; [7A 71 12, 05, 05]
+A00A; [77 72 7B, 05, 05]
 
-A022; [7A 71 1A, 05, 05]
+A00B; [77 72 83, 05, 05]
 
-A023; [7A 71 22, 05, 05]
+A00C; [77 72 8B, 05, 05]
 
-A024; [7A 71 2A, 05, 05]
+A00D; [77 72 93, 05, 05]
 
-A025; [7A 71 32, 05, 05]
+A00E; [77 72 9B, 05, 05]
 
-A026; [7A 71 3A, 05, 05]
+A00F; [77 72 A3, 05, 05]
 
-A027; [7A 71 42, 05, 05]
+A010; [77 72 AB, 05, 05]
 
-A028; [7A 71 4A, 05, 05]
+A011; [77 72 B3, 05, 05]
 
-A029; [7A 71 52, 05, 05]
+A012; [77 72 BB, 05, 05]
 
-A02A; [7A 71 5A, 05, 05]
+A013; [77 72 C3, 05, 05]
 
-A02B; [7A 71 62, 05, 05]
+A014; [77 72 CB, 05, 05]
 
-A02C; [7A 71 6A, 05, 05]
+A015; [77 72 D3, 05, 05]
 
-A02D; [7A 71 72, 05, 05]
+A016; [77 72 DB, 05, 05]
 
-A02E; [7A 71 7A, 05, 05]
+A017; [77 72 E3, 05, 05]
 
-A02F; [7A 71 82, 05, 05]
+A018; [77 72 EB, 05, 05]
 
-A030; [7A 71 8A, 05, 05]
+A019; [77 72 F3, 05, 05]
 
-A031; [7A 71 92, 05, 05]
+A01A; [77 72 FB, 05, 05]
 
-A032; [7A 71 9A, 05, 05]
+A01B; [77 73 05, 05, 05]
 
-A033; [7A 71 A2, 05, 05]
+A01C; [77 73 0D, 05, 05]
 
-A034; [7A 71 AA, 05, 05]
+A01D; [77 73 15, 05, 05]
 
-A035; [7A 71 B2, 05, 05]
+A01E; [77 73 1D, 05, 05]
 
-A036; [7A 71 BA, 05, 05]
+A01F; [77 73 25, 05, 05]
 
-A037; [7A 71 C2, 05, 05]
+A020; [77 73 2D, 05, 05]
 
-A038; [7A 71 CA, 05, 05]
+A021; [77 73 35, 05, 05]
 
-A039; [7A 71 D2, 05, 05]
+A022; [77 73 3D, 05, 05]
 
-A03A; [7A 71 DA, 05, 05]
+A023; [77 73 45, 05, 05]
 
-A03B; [7A 71 E2, 05, 05]
+A024; [77 73 4D, 05, 05]
 
-A03C; [7A 71 EA, 05, 05]
+A025; [77 73 55, 05, 05]
 
-A03D; [7A 71 F2, 05, 05]
+A026; [77 73 5D, 05, 05]
 
-A03E; [7A 71 FA, 05, 05]
+A027; [77 73 65, 05, 05]
 
-A03F; [7A 72 08, 05, 05]
+A028; [77 73 6D, 05, 05]
 
-A040; [7A 72 10, 05, 05]
+A029; [77 73 75, 05, 05]
 
-A041; [7A 72 18, 05, 05]
+A02A; [77 73 7D, 05, 05]
 
-A042; [7A 72 20, 05, 05]
+A02B; [77 73 85, 05, 05]
 
-A043; [7A 72 28, 05, 05]
+A02C; [77 73 8D, 05, 05]
 
-A044; [7A 72 30, 05, 05]
+A02D; [77 73 95, 05, 05]
 
-A045; [7A 72 38, 05, 05]
+A02E; [77 73 9D, 05, 05]
 
-A046; [7A 72 40, 05, 05]
+A02F; [77 73 A5, 05, 05]
 
-A047; [7A 72 48, 05, 05]
+A030; [77 73 AD, 05, 05]
 
-A048; [7A 72 50, 05, 05]
+A031; [77 73 B5, 05, 05]
 
-A049; [7A 72 58, 05, 05]
+A032; [77 73 BD, 05, 05]
 
-A04A; [7A 72 60, 05, 05]
+A033; [77 73 C5, 05, 05]
 
-A04B; [7A 72 68, 05, 05]
+A034; [77 73 CD, 05, 05]
 
-A04C; [7A 72 70, 05, 05]
+A035; [77 73 D5, 05, 05]
 
-A04D; [7A 72 78, 05, 05]
+A036; [77 73 DD, 05, 05]
 
-A04E; [7A 72 80, 05, 05]
+A037; [77 73 E5, 05, 05]
 
-A04F; [7A 72 88, 05, 05]
+A038; [77 73 ED, 05, 05]
 
-A050; [7A 72 90, 05, 05]
+A039; [77 73 F5, 05, 05]
 
-A051; [7A 72 98, 05, 05]
+A03A; [77 73 FD, 05, 05]
 
-A052; [7A 72 A0, 05, 05]
+A03B; [77 74 07, 05, 05]
 
-A053; [7A 72 A8, 05, 05]
+A03C; [77 74 0F, 05, 05]
 
-A054; [7A 72 B0, 05, 05]
+A03D; [77 74 17, 05, 05]
 
-A055; [7A 72 B8, 05, 05]
+A03E; [77 74 1F, 05, 05]
 
-A056; [7A 72 C0, 05, 05]
+A03F; [77 74 27, 05, 05]
 
-A057; [7A 72 C8, 05, 05]
+A040; [77 74 2F, 05, 05]
 
-A058; [7A 72 D0, 05, 05]
+A041; [77 74 37, 05, 05]
 
-A059; [7A 72 D8, 05, 05]
+A042; [77 74 3F, 05, 05]
 
-A05A; [7A 72 E0, 05, 05]
+A043; [77 74 47, 05, 05]
 
-A05B; [7A 72 E8, 05, 05]
+A044; [77 74 4F, 05, 05]
 
-A05C; [7A 72 F0, 05, 05]
+A045; [77 74 57, 05, 05]
 
-A05D; [7A 72 F8, 05, 05]
+A046; [77 74 5F, 05, 05]
 
-A05E; [7A 73 06, 05, 05]
+A047; [77 74 67, 05, 05]
 
-A05F; [7A 73 0E, 05, 05]
+A048; [77 74 6F, 05, 05]
 
-A060; [7A 73 16, 05, 05]
+A049; [77 74 77, 05, 05]
 
-A061; [7A 73 1E, 05, 05]
+A04A; [77 74 7F, 05, 05]
 
-A062; [7A 73 26, 05, 05]
+A04B; [77 74 87, 05, 05]
 
-A063; [7A 73 2E, 05, 05]
+A04C; [77 74 8F, 05, 05]
 
-A064; [7A 73 36, 05, 05]
+A04D; [77 74 97, 05, 05]
 
-A065; [7A 73 3E, 05, 05]
+A04E; [77 74 9F, 05, 05]
 
-A066; [7A 73 46, 05, 05]
+A04F; [77 74 A7, 05, 05]
 
-A067; [7A 73 4E, 05, 05]
+A050; [77 74 AF, 05, 05]
 
-A068; [7A 73 56, 05, 05]
+A051; [77 74 B7, 05, 05]
 
-A069; [7A 73 5E, 05, 05]
+A052; [77 74 BF, 05, 05]
 
-A06A; [7A 73 66, 05, 05]
+A053; [77 74 C7, 05, 05]
 
-A06B; [7A 73 6E, 05, 05]
+A054; [77 74 CF, 05, 05]
 
-A06C; [7A 73 76, 05, 05]
+A055; [77 74 D7, 05, 05]
 
-A06D; [7A 73 7E, 05, 05]
+A056; [77 74 DF, 05, 05]
 
-A06E; [7A 73 86, 05, 05]
+A057; [77 74 E7, 05, 05]
 
-A06F; [7A 73 8E, 05, 05]
+A058; [77 74 EF, 05, 05]
 
-A070; [7A 73 96, 05, 05]
+A059; [77 74 F7, 05, 05]
 
-A071; [7A 73 9E, 05, 05]
+A05A; [77 74 FF, 05, 05]
 
-A072; [7A 73 A6, 05, 05]
+A05B; [77 75 09, 05, 05]
 
-A073; [7A 73 AE, 05, 05]
+A05C; [77 75 11, 05, 05]
 
-A074; [7A 73 B6, 05, 05]
+A05D; [77 75 19, 05, 05]
 
-A075; [7A 73 BE, 05, 05]
+A05E; [77 75 21, 05, 05]
 
-A076; [7A 73 C6, 05, 05]
+A05F; [77 75 29, 05, 05]
 
-A077; [7A 73 CE, 05, 05]
+A060; [77 75 31, 05, 05]
 
-A078; [7A 73 D6, 05, 05]
+A061; [77 75 39, 05, 05]
 
-A079; [7A 73 DE, 05, 05]
+A062; [77 75 41, 05, 05]
 
-A07A; [7A 73 E6, 05, 05]
+A063; [77 75 49, 05, 05]
 
-A07B; [7A 73 EE, 05, 05]
+A064; [77 75 51, 05, 05]
 
-A07C; [7A 73 F6, 05, 05]
+A065; [77 75 59, 05, 05]
 
-A07D; [7A 74 04, 05, 05]
+A066; [77 75 61, 05, 05]
 
-A07E; [7A 74 0C, 05, 05]
+A067; [77 75 69, 05, 05]
 
-A07F; [7A 74 14, 05, 05]
+A068; [77 75 71, 05, 05]
 
-A080; [7A 74 1C, 05, 05]
+A069; [77 75 79, 05, 05]
 
-A081; [7A 74 24, 05, 05]
+A06A; [77 75 81, 05, 05]
 
-A082; [7A 74 2C, 05, 05]
+A06B; [77 75 89, 05, 05]
 
-A083; [7A 74 34, 05, 05]
+A06C; [77 75 91, 05, 05]
 
-A084; [7A 74 3C, 05, 05]
+A06D; [77 75 99, 05, 05]
 
-A085; [7A 74 44, 05, 05]
+A06E; [77 75 A1, 05, 05]
 
-A086; [7A 74 4C, 05, 05]
+A06F; [77 75 A9, 05, 05]
 
-A087; [7A 74 54, 05, 05]
+A070; [77 75 B1, 05, 05]
 
-A088; [7A 74 5C, 05, 05]
+A071; [77 75 B9, 05, 05]
 
-A089; [7A 74 64, 05, 05]
+A072; [77 75 C1, 05, 05]
 
-A08A; [7A 74 6C, 05, 05]
+A073; [77 75 C9, 05, 05]
 
-A08B; [7A 74 74, 05, 05]
+A074; [77 75 D1, 05, 05]
 
-A08C; [7A 74 7C, 05, 05]
+A075; [77 75 D9, 05, 05]
 
-A08D; [7A 74 84, 05, 05]
+A076; [77 75 E1, 05, 05]
 
-A08E; [7A 74 8C, 05, 05]
+A077; [77 75 E9, 05, 05]
 
-A08F; [7A 74 94, 05, 05]
+A078; [77 75 F1, 05, 05]
 
-A090; [7A 74 9C, 05, 05]
+A079; [77 75 F9, 05, 05]
 
-A091; [7A 74 A4, 05, 05]
+A07A; [77 76 03, 05, 05]
 
-A092; [7A 74 AC, 05, 05]
+A07B; [77 76 0B, 05, 05]
 
-A093; [7A 74 B4, 05, 05]
+A07C; [77 76 13, 05, 05]
 
-A094; [7A 74 BC, 05, 05]
+A07D; [77 76 1B, 05, 05]
 
-A095; [7A 74 C4, 05, 05]
+A07E; [77 76 23, 05, 05]
 
-A096; [7A 74 CC, 05, 05]
+A07F; [77 76 2B, 05, 05]
 
-A097; [7A 74 D4, 05, 05]
+A080; [77 76 33, 05, 05]
 
-A098; [7A 74 DC, 05, 05]
+A081; [77 76 3B, 05, 05]
 
-A099; [7A 74 E4, 05, 05]
+A082; [77 76 43, 05, 05]
 
-A09A; [7A 74 EC, 05, 05]
+A083; [77 76 4B, 05, 05]
 
-A09B; [7A 74 F4, 05, 05]
+A084; [77 76 53, 05, 05]
 
-A09C; [7A 74 FC, 05, 05]
+A085; [77 76 5B, 05, 05]
 
-A09D; [7A 75 0A, 05, 05]
+A086; [77 76 63, 05, 05]
 
-A09E; [7A 75 12, 05, 05]
+A087; [77 76 6B, 05, 05]
 
-A09F; [7A 75 1A, 05, 05]
+A088; [77 76 73, 05, 05]
 
-A0A0; [7A 75 22, 05, 05]
+A089; [77 76 7B, 05, 05]
 
-A0A1; [7A 75 2A, 05, 05]
+A08A; [77 76 83, 05, 05]
 
-A0A2; [7A 75 32, 05, 05]
+A08B; [77 76 8B, 05, 05]
 
-A0A3; [7A 75 3A, 05, 05]
+A08C; [77 76 93, 05, 05]
 
-A0A4; [7A 75 42, 05, 05]
+A08D; [77 76 9B, 05, 05]
 
-A0A5; [7A 75 4A, 05, 05]
+A08E; [77 76 A3, 05, 05]
 
-A0A6; [7A 75 52, 05, 05]
+A08F; [77 76 AB, 05, 05]
 
-A0A7; [7A 75 5A, 05, 05]
+A090; [77 76 B3, 05, 05]
 
-A0A8; [7A 75 62, 05, 05]
+A091; [77 76 BB, 05, 05]
 
-A0A9; [7A 75 6A, 05, 05]
+A092; [77 76 C3, 05, 05]
 
-A0AA; [7A 75 72, 05, 05]
+A093; [77 76 CB, 05, 05]
 
-A0AB; [7A 75 7A, 05, 05]
+A094; [77 76 D3, 05, 05]
 
-A0AC; [7A 75 82, 05, 05]
+A095; [77 76 DB, 05, 05]
 
-A0AD; [7A 75 8A, 05, 05]
+A096; [77 76 E3, 05, 05]
 
-A0AE; [7A 75 92, 05, 05]
+A097; [77 76 EB, 05, 05]
 
-A0AF; [7A 75 9A, 05, 05]
+A098; [77 76 F3, 05, 05]
 
-A0B0; [7A 75 A2, 05, 05]
+A099; [77 76 FB, 05, 05]
 
-A0B1; [7A 75 AA, 05, 05]
+A09A; [77 77 05, 05, 05]
 
-A0B2; [7A 75 B2, 05, 05]
+A09B; [77 77 0D, 05, 05]
 
-A0B3; [7A 75 BA, 05, 05]
+A09C; [77 77 15, 05, 05]
 
-A0B4; [7A 75 C2, 05, 05]
+A09D; [77 77 1D, 05, 05]
 
-A0B5; [7A 75 CA, 05, 05]
+A09E; [77 77 25, 05, 05]
 
-A0B6; [7A 75 D2, 05, 05]
+A09F; [77 77 2D, 05, 05]
 
-A0B7; [7A 75 DA, 05, 05]
+A0A0; [77 77 35, 05, 05]
 
-A0B8; [7A 75 E2, 05, 05]
+A0A1; [77 77 3D, 05, 05]
 
-A0B9; [7A 75 EA, 05, 05]
+A0A2; [77 77 45, 05, 05]
 
-A0BA; [7A 75 F2, 05, 05]
+A0A3; [77 77 4D, 05, 05]
 
-A0BB; [7A 75 FA, 05, 05]
+A0A4; [77 77 55, 05, 05]
 
-A0BC; [7A 76 08, 05, 05]
+A0A5; [77 77 5D, 05, 05]
 
-A0BD; [7A 76 10, 05, 05]
+A0A6; [77 77 65, 05, 05]
 
-A0BE; [7A 76 18, 05, 05]
+A0A7; [77 77 6D, 05, 05]
 
-A0BF; [7A 76 20, 05, 05]
+A0A8; [77 77 75, 05, 05]
 
-A0C0; [7A 76 28, 05, 05]
+A0A9; [77 77 7D, 05, 05]
 
-A0C1; [7A 76 30, 05, 05]
+A0AA; [77 77 85, 05, 05]
 
-A0C2; [7A 76 38, 05, 05]
+A0AB; [77 77 8D, 05, 05]
 
-A0C3; [7A 76 40, 05, 05]
+A0AC; [77 77 95, 05, 05]
 
-A0C4; [7A 76 48, 05, 05]
+A0AD; [77 77 9D, 05, 05]
 
-A0C5; [7A 76 50, 05, 05]
+A0AE; [77 77 A5, 05, 05]
 
-A0C6; [7A 76 58, 05, 05]
+A0AF; [77 77 AD, 05, 05]
 
-A0C7; [7A 76 60, 05, 05]
+A0B0; [77 77 B5, 05, 05]
 
-A0C8; [7A 76 68, 05, 05]
+A0B1; [77 77 BD, 05, 05]
 
-A0C9; [7A 76 70, 05, 05]
+A0B2; [77 77 C5, 05, 05]
 
-A0CA; [7A 76 78, 05, 05]
+A0B3; [77 77 CD, 05, 05]
 
-A0CB; [7A 76 80, 05, 05]
+A0B4; [77 77 D5, 05, 05]
 
-A0CC; [7A 76 88, 05, 05]
+A0B5; [77 77 DD, 05, 05]
 
-A0CD; [7A 76 90, 05, 05]
+A0B6; [77 77 E5, 05, 05]
 
-A0CE; [7A 76 98, 05, 05]
+A0B7; [77 77 ED, 05, 05]
 
-A0CF; [7A 76 A0, 05, 05]
+A0B8; [77 77 F5, 05, 05]
 
-A0D0; [7A 76 A8, 05, 05]
+A0B9; [77 77 FD, 05, 05]
 
-A0D1; [7A 76 B0, 05, 05]
+A0BA; [77 78 07, 05, 05]
 
-A0D2; [7A 76 B8, 05, 05]
+A0BB; [77 78 0F, 05, 05]
 
-A0D3; [7A 76 C0, 05, 05]
+A0BC; [77 78 17, 05, 05]
 
-A0D4; [7A 76 C8, 05, 05]
+A0BD; [77 78 1F, 05, 05]
 
-A0D5; [7A 76 D0, 05, 05]
+A0BE; [77 78 27, 05, 05]
 
-A0D6; [7A 76 D8, 05, 05]
+A0BF; [77 78 2F, 05, 05]
 
-A0D7; [7A 76 E0, 05, 05]
+A0C0; [77 78 37, 05, 05]
 
-A0D8; [7A 76 E8, 05, 05]
+A0C1; [77 78 3F, 05, 05]
 
-A0D9; [7A 76 F0, 05, 05]
+A0C2; [77 78 47, 05, 05]
 
-A0DA; [7A 76 F8, 05, 05]
+A0C3; [77 78 4F, 05, 05]
 
-A0DB; [7A 77 06, 05, 05]
+A0C4; [77 78 57, 05, 05]
 
-A0DC; [7A 77 0E, 05, 05]
+A0C5; [77 78 5F, 05, 05]
 
-A0DD; [7A 77 16, 05, 05]
+A0C6; [77 78 67, 05, 05]
 
-A0DE; [7A 77 1E, 05, 05]
+A0C7; [77 78 6F, 05, 05]
 
-A0DF; [7A 77 26, 05, 05]
+A0C8; [77 78 77, 05, 05]
 
-A0E0; [7A 77 2E, 05, 05]
+A0C9; [77 78 7F, 05, 05]
 
-A0E1; [7A 77 36, 05, 05]
+A0CA; [77 78 87, 05, 05]
 
-A0E2; [7A 77 3E, 05, 05]
+A0CB; [77 78 8F, 05, 05]
 
-A0E3; [7A 77 46, 05, 05]
+A0CC; [77 78 97, 05, 05]
 
-A0E4; [7A 77 4E, 05, 05]
+A0CD; [77 78 9F, 05, 05]
 
-A0E5; [7A 77 56, 05, 05]
+A0CE; [77 78 A7, 05, 05]
 
-A0E6; [7A 77 5E, 05, 05]
+A0CF; [77 78 AF, 05, 05]
 
-A0E7; [7A 77 66, 05, 05]
+A0D0; [77 78 B7, 05, 05]
 
-A0E8; [7A 77 6E, 05, 05]
+A0D1; [77 78 BF, 05, 05]
 
-A0E9; [7A 77 76, 05, 05]
+A0D2; [77 78 C7, 05, 05]
 
-A0EA; [7A 77 7E, 05, 05]
+A0D3; [77 78 CF, 05, 05]
 
-A0EB; [7A 77 86, 05, 05]
+A0D4; [77 78 D7, 05, 05]
 
-A0EC; [7A 77 8E, 05, 05]
+A0D5; [77 78 DF, 05, 05]
 
-A0ED; [7A 77 96, 05, 05]
+A0D6; [77 78 E7, 05, 05]
 
-A0EE; [7A 77 9E, 05, 05]
+A0D7; [77 78 EF, 05, 05]
 
-A0EF; [7A 77 A6, 05, 05]
+A0D8; [77 78 F7, 05, 05]
 
-A0F0; [7A 77 AE, 05, 05]
+A0D9; [77 78 FF, 05, 05]
 
-A0F1; [7A 77 B6, 05, 05]
+A0DA; [77 79 09, 05, 05]
 
-A0F2; [7A 77 BE, 05, 05]
+A0DB; [77 79 11, 05, 05]
 
-A0F3; [7A 77 C6, 05, 05]
+A0DC; [77 79 19, 05, 05]
 
-A0F4; [7A 77 CE, 05, 05]
+A0DD; [77 79 21, 05, 05]
 
-A0F5; [7A 77 D6, 05, 05]
+A0DE; [77 79 29, 05, 05]
 
-A0F6; [7A 77 DE, 05, 05]
+A0DF; [77 79 31, 05, 05]
 
-A0F7; [7A 77 E6, 05, 05]
+A0E0; [77 79 39, 05, 05]
 
-A0F8; [7A 77 EE, 05, 05]
+A0E1; [77 79 41, 05, 05]
 
-A0F9; [7A 77 F6, 05, 05]
+A0E2; [77 79 49, 05, 05]
 
-A0FA; [7A 78 04, 05, 05]
+A0E3; [77 79 51, 05, 05]
 
-A0FB; [7A 78 0C, 05, 05]
+A0E4; [77 79 59, 05, 05]
 
-A0FC; [7A 78 14, 05, 05]
+A0E5; [77 79 61, 05, 05]
 
-A0FD; [7A 78 1C, 05, 05]
+A0E6; [77 79 69, 05, 05]
 
-A0FE; [7A 78 24, 05, 05]
+A0E7; [77 79 71, 05, 05]
 
-A0FF; [7A 78 2C, 05, 05]
+A0E8; [77 79 79, 05, 05]
 
-A100; [7A 78 34, 05, 05]
+A0E9; [77 79 81, 05, 05]
 
-A101; [7A 78 3C, 05, 05]
+A0EA; [77 79 89, 05, 05]
 
-A102; [7A 78 44, 05, 05]
+A0EB; [77 79 91, 05, 05]
 
-A103; [7A 78 4C, 05, 05]
+A0EC; [77 79 99, 05, 05]
 
-A104; [7A 78 54, 05, 05]
+A0ED; [77 79 A1, 05, 05]
 
-A105; [7A 78 5C, 05, 05]
+A0EE; [77 79 A9, 05, 05]
 
-A106; [7A 78 64, 05, 05]
+A0EF; [77 79 B1, 05, 05]
 
-A107; [7A 78 6C, 05, 05]
+A0F0; [77 79 B9, 05, 05]
 
-A108; [7A 78 74, 05, 05]
+A0F1; [77 79 C1, 05, 05]
 
-A109; [7A 78 7C, 05, 05]
+A0F2; [77 79 C9, 05, 05]
 
-A10A; [7A 78 84, 05, 05]
+A0F3; [77 79 D1, 05, 05]
 
-A10B; [7A 78 8C, 05, 05]
+A0F4; [77 79 D9, 05, 05]
 
-A10C; [7A 78 94, 05, 05]
+A0F5; [77 79 E1, 05, 05]
 
-A10D; [7A 78 9C, 05, 05]
+A0F6; [77 79 E9, 05, 05]
 
-A10E; [7A 78 A4, 05, 05]
+A0F7; [77 79 F1, 05, 05]
 
-A10F; [7A 78 AC, 05, 05]
+A0F8; [77 79 F9, 05, 05]
 
-A110; [7A 78 B4, 05, 05]
+A0F9; [77 7A 03, 05, 05]
 
-A111; [7A 78 BC, 05, 05]
+A0FA; [77 7A 0B, 05, 05]
 
-A112; [7A 78 C4, 05, 05]
+A0FB; [77 7A 13, 05, 05]
 
-A113; [7A 78 CC, 05, 05]
+A0FC; [77 7A 1B, 05, 05]
 
-A114; [7A 78 D4, 05, 05]
+A0FD; [77 7A 23, 05, 05]
 
-A115; [7A 78 DC, 05, 05]
+A0FE; [77 7A 2B, 05, 05]
 
-A116; [7A 78 E4, 05, 05]
+A0FF; [77 7A 33, 05, 05]
 
-A117; [7A 78 EC, 05, 05]
+A100; [77 7A 3B, 05, 05]
 
-A118; [7A 78 F4, 05, 05]
+A101; [77 7A 43, 05, 05]
 
-A119; [7A 78 FC, 05, 05]
+A102; [77 7A 4B, 05, 05]
 
-A11A; [7A 79 0A, 05, 05]
+A103; [77 7A 53, 05, 05]
 
-A11B; [7A 79 12, 05, 05]
+A104; [77 7A 5B, 05, 05]
 
-A11C; [7A 79 1A, 05, 05]
+A105; [77 7A 63, 05, 05]
 
-A11D; [7A 79 22, 05, 05]
+A106; [77 7A 6B, 05, 05]
 
-A11E; [7A 79 2A, 05, 05]
+A107; [77 7A 73, 05, 05]
 
-A11F; [7A 79 32, 05, 05]
+A108; [77 7A 7B, 05, 05]
 
-A120; [7A 79 3A, 05, 05]
+A109; [77 7A 83, 05, 05]
 
-A121; [7A 79 42, 05, 05]
+A10A; [77 7A 8B, 05, 05]
 
-A122; [7A 79 4A, 05, 05]
+A10B; [77 7A 93, 05, 05]
 
-A123; [7A 79 52, 05, 05]
+A10C; [77 7A 9B, 05, 05]
 
-A124; [7A 79 5A, 05, 05]
+A10D; [77 7A A3, 05, 05]
 
-A125; [7A 79 62, 05, 05]
+A10E; [77 7A AB, 05, 05]
 
-A126; [7A 79 6A, 05, 05]
+A10F; [77 7A B3, 05, 05]
 
-A127; [7A 79 72, 05, 05]
+A110; [77 7A BB, 05, 05]
 
-A128; [7A 79 7A, 05, 05]
+A111; [77 7A C3, 05, 05]
 
-A129; [7A 79 82, 05, 05]
+A112; [77 7A CB, 05, 05]
 
-A12A; [7A 79 8A, 05, 05]
+A113; [77 7A D3, 05, 05]
 
-A12B; [7A 79 92, 05, 05]
+A114; [77 7A DB, 05, 05]
 
-A12C; [7A 79 9A, 05, 05]
+A115; [77 7A E3, 05, 05]
 
-A12D; [7A 79 A2, 05, 05]
+A116; [77 7A EB, 05, 05]
 
-A12E; [7A 79 AA, 05, 05]
+A117; [77 7A F3, 05, 05]
 
-A12F; [7A 79 B2, 05, 05]
+A118; [77 7A FB, 05, 05]
 
-A130; [7A 79 BA, 05, 05]
+A119; [77 7B 05, 05, 05]
 
-A131; [7A 79 C2, 05, 05]
+A11A; [77 7B 0D, 05, 05]
 
-A132; [7A 79 CA, 05, 05]
+A11B; [77 7B 15, 05, 05]
 
-A133; [7A 79 D2, 05, 05]
+A11C; [77 7B 1D, 05, 05]
 
-A134; [7A 79 DA, 05, 05]
+A11D; [77 7B 25, 05, 05]
 
-A135; [7A 79 E2, 05, 05]
+A11E; [77 7B 2D, 05, 05]
 
-A136; [7A 79 EA, 05, 05]
+A11F; [77 7B 35, 05, 05]
 
-A137; [7A 79 F2, 05, 05]
+A120; [77 7B 3D, 05, 05]
 
-A138; [7A 79 FA, 05, 05]
+A121; [77 7B 45, 05, 05]
 
-A139; [7A 7A 08, 05, 05]
+A122; [77 7B 4D, 05, 05]
 
-A13A; [7A 7A 10, 05, 05]
+A123; [77 7B 55, 05, 05]
 
-A13B; [7A 7A 18, 05, 05]
+A124; [77 7B 5D, 05, 05]
 
-A13C; [7A 7A 20, 05, 05]
+A125; [77 7B 65, 05, 05]
 
-A13D; [7A 7A 28, 05, 05]
+A126; [77 7B 6D, 05, 05]
 
-A13E; [7A 7A 30, 05, 05]
+A127; [77 7B 75, 05, 05]
 
-A13F; [7A 7A 38, 05, 05]
+A128; [77 7B 7D, 05, 05]
 
-A140; [7A 7A 40, 05, 05]
+A129; [77 7B 85, 05, 05]
 
-A141; [7A 7A 48, 05, 05]
+A12A; [77 7B 8D, 05, 05]
 
-A142; [7A 7A 50, 05, 05]
+A12B; [77 7B 95, 05, 05]
 
-A143; [7A 7A 58, 05, 05]
+A12C; [77 7B 9D, 05, 05]
 
-A144; [7A 7A 60, 05, 05]
+A12D; [77 7B A5, 05, 05]
 
-A145; [7A 7A 68, 05, 05]
+A12E; [77 7B AD, 05, 05]
 
-A146; [7A 7A 70, 05, 05]
+A12F; [77 7B B5, 05, 05]
 
-A147; [7A 7A 78, 05, 05]
+A130; [77 7B BD, 05, 05]
 
-A148; [7A 7A 80, 05, 05]
+A131; [77 7B C5, 05, 05]
 
-A149; [7A 7A 88, 05, 05]
+A132; [77 7B CD, 05, 05]
 
-A14A; [7A 7A 90, 05, 05]
+A133; [77 7B D5, 05, 05]
 
-A14B; [7A 7A 98, 05, 05]
+A134; [77 7B DD, 05, 05]
 
-A14C; [7A 7A A0, 05, 05]
+A135; [77 7B E5, 05, 05]
 
-A14D; [7A 7A A8, 05, 05]
+A136; [77 7B ED, 05, 05]
 
-A14E; [7A 7A B0, 05, 05]
+A137; [77 7B F5, 05, 05]
 
-A14F; [7A 7A B8, 05, 05]
+A138; [77 7B FD, 05, 05]
 
-A150; [7A 7A C0, 05, 05]
+A139; [77 7C 07, 05, 05]
 
-A151; [7A 7A C8, 05, 05]
+A13A; [77 7C 0F, 05, 05]
 
-A152; [7A 7A D0, 05, 05]
+A13B; [77 7C 17, 05, 05]
 
-A153; [7A 7A D8, 05, 05]
+A13C; [77 7C 1F, 05, 05]
 
-A154; [7A 7A E0, 05, 05]
+A13D; [77 7C 27, 05, 05]
 
-A155; [7A 7A E8, 05, 05]
+A13E; [77 7C 2F, 05, 05]
 
-A156; [7A 7A F0, 05, 05]
+A13F; [77 7C 37, 05, 05]
 
-A157; [7A 7A F8, 05, 05]
+A140; [77 7C 3F, 05, 05]
 
-A158; [7A 7B 06, 05, 05]
+A141; [77 7C 47, 05, 05]
 
-A159; [7A 7B 0E, 05, 05]
+A142; [77 7C 4F, 05, 05]
 
-A15A; [7A 7B 16, 05, 05]
+A143; [77 7C 57, 05, 05]
 
-A15B; [7A 7B 1E, 05, 05]
+A144; [77 7C 5F, 05, 05]
 
-A15C; [7A 7B 26, 05, 05]
+A145; [77 7C 67, 05, 05]
 
-A15D; [7A 7B 2E, 05, 05]
+A146; [77 7C 6F, 05, 05]
 
-A15E; [7A 7B 36, 05, 05]
+A147; [77 7C 77, 05, 05]
 
-A15F; [7A 7B 3E, 05, 05]
+A148; [77 7C 7F, 05, 05]
 
-A160; [7A 7B 46, 05, 05]
+A149; [77 7C 87, 05, 05]
 
-A161; [7A 7B 4E, 05, 05]
+A14A; [77 7C 8F, 05, 05]
 
-A162; [7A 7B 56, 05, 05]
+A14B; [77 7C 97, 05, 05]
 
-A163; [7A 7B 5E, 05, 05]
+A14C; [77 7C 9F, 05, 05]
 
-A164; [7A 7B 66, 05, 05]
+A14D; [77 7C A7, 05, 05]
 
-A165; [7A 7B 6E, 05, 05]
+A14E; [77 7C AF, 05, 05]
 
-A166; [7A 7B 76, 05, 05]
+A14F; [77 7C B7, 05, 05]
 
-A167; [7A 7B 7E, 05, 05]
+A150; [77 7C BF, 05, 05]
 
-A168; [7A 7B 86, 05, 05]
+A151; [77 7C C7, 05, 05]
 
-A169; [7A 7B 8E, 05, 05]
+A152; [77 7C CF, 05, 05]
 
-A16A; [7A 7B 96, 05, 05]
+A153; [77 7C D7, 05, 05]
 
-A16B; [7A 7B 9E, 05, 05]
+A154; [77 7C DF, 05, 05]
 
-A16C; [7A 7B A6, 05, 05]
+A155; [77 7C E7, 05, 05]
 
-A16D; [7A 7B AE, 05, 05]
+A156; [77 7C EF, 05, 05]
 
-A16E; [7A 7B B6, 05, 05]
+A157; [77 7C F7, 05, 05]
 
-A16F; [7A 7B BE, 05, 05]
+A158; [77 7C FF, 05, 05]
 
-A170; [7A 7B C6, 05, 05]
+A159; [77 7D 09, 05, 05]
 
-A171; [7A 7B CE, 05, 05]
+A15A; [77 7D 11, 05, 05]
 
-A172; [7A 7B D6, 05, 05]
+A15B; [77 7D 19, 05, 05]
 
-A173; [7A 7B DE, 05, 05]
+A15C; [77 7D 21, 05, 05]
 
-A174; [7A 7B E6, 05, 05]
+A15D; [77 7D 29, 05, 05]
 
-A175; [7A 7B EE, 05, 05]
+A15E; [77 7D 31, 05, 05]
 
-A176; [7A 7B F6, 05, 05]
+A15F; [77 7D 39, 05, 05]
 
-A177; [7A 7C 04, 05, 05]
+A160; [77 7D 41, 05, 05]
 
-A178; [7A 7C 0C, 05, 05]
+A161; [77 7D 49, 05, 05]
 
-A179; [7A 7C 14, 05, 05]
+A162; [77 7D 51, 05, 05]
 
-A17A; [7A 7C 1C, 05, 05]
+A163; [77 7D 59, 05, 05]
 
-A17B; [7A 7C 24, 05, 05]
+A164; [77 7D 61, 05, 05]
 
-A17C; [7A 7C 2C, 05, 05]
+A165; [77 7D 69, 05, 05]
 
-A17D; [7A 7C 34, 05, 05]
+A166; [77 7D 71, 05, 05]
 
-A17E; [7A 7C 3C, 05, 05]
+A167; [77 7D 79, 05, 05]
 
-A17F; [7A 7C 44, 05, 05]
+A168; [77 7D 81, 05, 05]
 
-A180; [7A 7C 4C, 05, 05]
+A169; [77 7D 89, 05, 05]
 
-A181; [7A 7C 54, 05, 05]
+A16A; [77 7D 91, 05, 05]
 
-A182; [7A 7C 5C, 05, 05]
+A16B; [77 7D 99, 05, 05]
 
-A183; [7A 7C 64, 05, 05]
+A16C; [77 7D A1, 05, 05]
 
-A184; [7A 7C 6C, 05, 05]
+A16D; [77 7D A9, 05, 05]
 
-A185; [7A 7C 74, 05, 05]
+A16E; [77 7D B1, 05, 05]
 
-A186; [7A 7C 7C, 05, 05]
+A16F; [77 7D B9, 05, 05]
 
-A187; [7A 7C 84, 05, 05]
+A170; [77 7D C1, 05, 05]
 
-A188; [7A 7C 8C, 05, 05]
+A171; [77 7D C9, 05, 05]
 
-A189; [7A 7C 94, 05, 05]
+A172; [77 7D D1, 05, 05]
 
-A18A; [7A 7C 9C, 05, 05]
+A173; [77 7D D9, 05, 05]
 
-A18B; [7A 7C A4, 05, 05]
+A174; [77 7D E1, 05, 05]
 
-A18C; [7A 7C AC, 05, 05]
+A175; [77 7D E9, 05, 05]
 
-A18D; [7A 7C B4, 05, 05]
+A176; [77 7D F1, 05, 05]
 
-A18E; [7A 7C BC, 05, 05]
+A177; [77 7D F9, 05, 05]
 
-A18F; [7A 7C C4, 05, 05]
+A178; [77 7E 03, 05, 05]
 
-A190; [7A 7C CC, 05, 05]
+A179; [77 7E 0B, 05, 05]
 
-A191; [7A 7C D4, 05, 05]
+A17A; [77 7E 13, 05, 05]
 
-A192; [7A 7C DC, 05, 05]
+A17B; [77 7E 1B, 05, 05]
 
-A193; [7A 7C E4, 05, 05]
+A17C; [77 7E 23, 05, 05]
 
-A194; [7A 7C EC, 05, 05]
+A17D; [77 7E 2B, 05, 05]
 
-A195; [7A 7C F4, 05, 05]
+A17E; [77 7E 33, 05, 05]
 
-A196; [7A 7C FC, 05, 05]
+A17F; [77 7E 3B, 05, 05]
 
-A197; [7A 7D 0A, 05, 05]
+A180; [77 7E 43, 05, 05]
 
-A198; [7A 7D 12, 05, 05]
+A181; [77 7E 4B, 05, 05]
 
-A199; [7A 7D 1A, 05, 05]
+A182; [77 7E 53, 05, 05]
 
-A19A; [7A 7D 22, 05, 05]
+A183; [77 7E 5B, 05, 05]
 
-A19B; [7A 7D 2A, 05, 05]
+A184; [77 7E 63, 05, 05]
 
-A19C; [7A 7D 32, 05, 05]
+A185; [77 7E 6B, 05, 05]
 
-A19D; [7A 7D 3A, 05, 05]
+A186; [77 7E 73, 05, 05]
 
-A19E; [7A 7D 42, 05, 05]
+A187; [77 7E 7B, 05, 05]
 
-A19F; [7A 7D 4A, 05, 05]
+A188; [77 7E 83, 05, 05]
 
-A1A0; [7A 7D 52, 05, 05]
+A189; [77 7E 8B, 05, 05]
 
-A1A1; [7A 7D 5A, 05, 05]
+A18A; [77 7E 93, 05, 05]
 
-A1A2; [7A 7D 62, 05, 05]
+A18B; [77 7E 9B, 05, 05]
 
-A1A3; [7A 7D 6A, 05, 05]
+A18C; [77 7E A3, 05, 05]
 
-A1A4; [7A 7D 72, 05, 05]
+A18D; [77 7E AB, 05, 05]
 
-A1A5; [7A 7D 7A, 05, 05]
+A18E; [77 7E B3, 05, 05]
 
-A1A6; [7A 7D 82, 05, 05]
+A18F; [77 7E BB, 05, 05]
 
-A1A7; [7A 7D 8A, 05, 05]
+A190; [77 7E C3, 05, 05]
 
-A1A8; [7A 7D 92, 05, 05]
+A191; [77 7E CB, 05, 05]
 
-A1A9; [7A 7D 9A, 05, 05]
+A192; [77 7E D3, 05, 05]
 
-A1AA; [7A 7D A2, 05, 05]
+A193; [77 7E DB, 05, 05]
 
-A1AB; [7A 7D AA, 05, 05]
+A194; [77 7E E3, 05, 05]
 
-A1AC; [7A 7D B2, 05, 05]
+A195; [77 7E EB, 05, 05]
 
-A1AD; [7A 7D BA, 05, 05]
+A196; [77 7E F3, 05, 05]
 
-A1AE; [7A 7D C2, 05, 05]
+A197; [77 7E FB, 05, 05]
 
-A1AF; [7A 7D CA, 05, 05]
+A198; [77 7F 05, 05, 05]
 
-A1B0; [7A 7D D2, 05, 05]
+A199; [77 7F 0D, 05, 05]
 
-A1B1; [7A 7D DA, 05, 05]
+A19A; [77 7F 15, 05, 05]
 
-A1B2; [7A 7D E2, 05, 05]
+A19B; [77 7F 1D, 05, 05]
 
-A1B3; [7A 7D EA, 05, 05]
+A19C; [77 7F 25, 05, 05]
 
-A1B4; [7A 7D F2, 05, 05]
+A19D; [77 7F 2D, 05, 05]
 
-A1B5; [7A 7D FA, 05, 05]
+A19E; [77 7F 35, 05, 05]
 
-A1B6; [7A 7E 08, 05, 05]
+A19F; [77 7F 3D, 05, 05]
 
-A1B7; [7A 7E 10, 05, 05]
+A1A0; [77 7F 45, 05, 05]
 
-A1B8; [7A 7E 18, 05, 05]
+A1A1; [77 7F 4D, 05, 05]
 
-A1B9; [7A 7E 20, 05, 05]
+A1A2; [77 7F 55, 05, 05]
 
-A1BA; [7A 7E 28, 05, 05]
+A1A3; [77 7F 5D, 05, 05]
 
-A1BB; [7A 7E 30, 05, 05]
+A1A4; [77 7F 65, 05, 05]
 
-A1BC; [7A 7E 38, 05, 05]
+A1A5; [77 7F 6D, 05, 05]
 
-A1BD; [7A 7E 40, 05, 05]
+A1A6; [77 7F 75, 05, 05]
 
-A1BE; [7A 7E 48, 05, 05]
+A1A7; [77 7F 7D, 05, 05]
 
-A1BF; [7A 7E 50, 05, 05]
+A1A8; [77 7F 85, 05, 05]
 
-A1C0; [7A 7E 58, 05, 05]
+A1A9; [77 7F 8D, 05, 05]
 
-A1C1; [7A 7E 60, 05, 05]
+A1AA; [77 7F 95, 05, 05]
 
-A1C2; [7A 7E 68, 05, 05]
+A1AB; [77 7F 9D, 05, 05]
 
-A1C3; [7A 7E 70, 05, 05]
+A1AC; [77 7F A5, 05, 05]
 
-A1C4; [7A 7E 78, 05, 05]
+A1AD; [77 7F AD, 05, 05]
 
-A1C5; [7A 7E 80, 05, 05]
+A1AE; [77 7F B5, 05, 05]
 
-A1C6; [7A 7E 88, 05, 05]
+A1AF; [77 7F BD, 05, 05]
 
-A1C7; [7A 7E 90, 05, 05]
+A1B0; [77 7F C5, 05, 05]
 
-A1C8; [7A 7E 98, 05, 05]
+A1B1; [77 7F CD, 05, 05]
 
-A1C9; [7A 7E A0, 05, 05]
+A1B2; [77 7F D5, 05, 05]
 
-A1CA; [7A 7E A8, 05, 05]
+A1B3; [77 7F DD, 05, 05]
 
-A1CB; [7A 7E B0, 05, 05]
+A1B4; [77 7F E5, 05, 05]
 
-A1CC; [7A 7E B8, 05, 05]
+A1B5; [77 7F ED, 05, 05]
 
-A1CD; [7A 7E C0, 05, 05]
+A1B6; [77 7F F5, 05, 05]
 
-A1CE; [7A 7E C8, 05, 05]
+A1B7; [77 7F FD, 05, 05]
 
-A1CF; [7A 7E D0, 05, 05]
+A1B8; [77 80 07, 05, 05]
 
-A1D0; [7A 7E D8, 05, 05]
+A1B9; [77 80 0F, 05, 05]
 
-A1D1; [7A 7E E0, 05, 05]
+A1BA; [77 80 17, 05, 05]
 
-A1D2; [7A 7E E8, 05, 05]
+A1BB; [77 80 1F, 05, 05]
 
-A1D3; [7A 7E F0, 05, 05]
+A1BC; [77 80 27, 05, 05]
 
-A1D4; [7A 7E F8, 05, 05]
+A1BD; [77 80 2F, 05, 05]
 
-A1D5; [7A 7F 06, 05, 05]
+A1BE; [77 80 37, 05, 05]
 
-A1D6; [7A 7F 0E, 05, 05]
+A1BF; [77 80 3F, 05, 05]
 
-A1D7; [7A 7F 16, 05, 05]
+A1C0; [77 80 47, 05, 05]
 
-A1D8; [7A 7F 1E, 05, 05]
+A1C1; [77 80 4F, 05, 05]
 
-A1D9; [7A 7F 26, 05, 05]
+A1C2; [77 80 57, 05, 05]
 
-A1DA; [7A 7F 2E, 05, 05]
+A1C3; [77 80 5F, 05, 05]
 
-A1DB; [7A 7F 36, 05, 05]
+A1C4; [77 80 67, 05, 05]
 
-A1DC; [7A 7F 3E, 05, 05]
+A1C5; [77 80 6F, 05, 05]
 
-A1DD; [7A 7F 46, 05, 05]
+A1C6; [77 80 77, 05, 05]
 
-A1DE; [7A 7F 4E, 05, 05]
+A1C7; [77 80 7F, 05, 05]
 
-A1DF; [7A 7F 56, 05, 05]
+A1C8; [77 80 87, 05, 05]
 
-A1E0; [7A 7F 5E, 05, 05]
+A1C9; [77 80 8F, 05, 05]
 
-A1E1; [7A 7F 66, 05, 05]
+A1CA; [77 80 97, 05, 05]
 
-A1E2; [7A 7F 6E, 05, 05]
+A1CB; [77 80 9F, 05, 05]
 
-A1E3; [7A 7F 76, 05, 05]
+A1CC; [77 80 A7, 05, 05]
 
-A1E4; [7A 7F 7E, 05, 05]
+A1CD; [77 80 AF, 05, 05]
 
-A1E5; [7A 7F 86, 05, 05]
+A1CE; [77 80 B7, 05, 05]
 
-A1E6; [7A 7F 8E, 05, 05]
+A1CF; [77 80 BF, 05, 05]
 
-A1E7; [7A 7F 96, 05, 05]
+A1D0; [77 80 C7, 05, 05]
 
-A1E8; [7A 7F 9E, 05, 05]
+A1D1; [77 80 CF, 05, 05]
 
-A1E9; [7A 7F A6, 05, 05]
+A1D2; [77 80 D7, 05, 05]
 
-A1EA; [7A 7F AE, 05, 05]
+A1D3; [77 80 DF, 05, 05]
 
-A1EB; [7A 7F B6, 05, 05]
+A1D4; [77 80 E7, 05, 05]
 
-A1EC; [7A 7F BE, 05, 05]
+A1D5; [77 80 EF, 05, 05]
 
-A1ED; [7A 7F C6, 05, 05]
+A1D6; [77 80 F7, 05, 05]
 
-A1EE; [7A 7F CE, 05, 05]
+A1D7; [77 80 FF, 05, 05]
 
-A1EF; [7A 7F D6, 05, 05]
+A1D8; [77 81 09, 05, 05]
 
-A1F0; [7A 7F DE, 05, 05]
+A1D9; [77 81 11, 05, 05]
 
-A1F1; [7A 7F E6, 05, 05]
+A1DA; [77 81 19, 05, 05]
 
-A1F2; [7A 7F EE, 05, 05]
+A1DB; [77 81 21, 05, 05]
 
-A1F3; [7A 7F F6, 05, 05]
+A1DC; [77 81 29, 05, 05]
 
-A1F4; [7A 80 04, 05, 05]
+A1DD; [77 81 31, 05, 05]
 
-A1F5; [7A 80 0C, 05, 05]
+A1DE; [77 81 39, 05, 05]
 
-A1F6; [7A 80 14, 05, 05]
+A1DF; [77 81 41, 05, 05]
 
-A1F7; [7A 80 1C, 05, 05]
+A1E0; [77 81 49, 05, 05]
 
-A1F8; [7A 80 24, 05, 05]
+A1E1; [77 81 51, 05, 05]
 
-A1F9; [7A 80 2C, 05, 05]
+A1E2; [77 81 59, 05, 05]
 
-A1FA; [7A 80 34, 05, 05]
+A1E3; [77 81 61, 05, 05]
 
-A1FB; [7A 80 3C, 05, 05]
+A1E4; [77 81 69, 05, 05]
 
-A1FC; [7A 80 44, 05, 05]
+A1E5; [77 81 71, 05, 05]
 
-A1FD; [7A 80 4C, 05, 05]
+A1E6; [77 81 79, 05, 05]
 
-A1FE; [7A 80 54, 05, 05]
+A1E7; [77 81 81, 05, 05]
 
-A1FF; [7A 80 5C, 05, 05]
+A1E8; [77 81 89, 05, 05]
 
-A200; [7A 80 64, 05, 05]
+A1E9; [77 81 91, 05, 05]
 
-A201; [7A 80 6C, 05, 05]
+A1EA; [77 81 99, 05, 05]
 
-A202; [7A 80 74, 05, 05]
+A1EB; [77 81 A1, 05, 05]
 
-A203; [7A 80 7C, 05, 05]
+A1EC; [77 81 A9, 05, 05]
 
-A204; [7A 80 84, 05, 05]
+A1ED; [77 81 B1, 05, 05]
 
-A205; [7A 80 8C, 05, 05]
+A1EE; [77 81 B9, 05, 05]
 
-A206; [7A 80 94, 05, 05]
+A1EF; [77 81 C1, 05, 05]
 
-A207; [7A 80 9C, 05, 05]
+A1F0; [77 81 C9, 05, 05]
 
-A208; [7A 80 A4, 05, 05]
+A1F1; [77 81 D1, 05, 05]
 
-A209; [7A 80 AC, 05, 05]
+A1F2; [77 81 D9, 05, 05]
 
-A20A; [7A 80 B4, 05, 05]
+A1F3; [77 81 E1, 05, 05]
 
-A20B; [7A 80 BC, 05, 05]
+A1F4; [77 81 E9, 05, 05]
 
-A20C; [7A 80 C4, 05, 05]
+A1F5; [77 81 F1, 05, 05]
 
-A20D; [7A 80 CC, 05, 05]
+A1F6; [77 81 F9, 05, 05]
 
-A20E; [7A 80 D4, 05, 05]
+A1F7; [77 82 03, 05, 05]
 
-A20F; [7A 80 DC, 05, 05]
+A1F8; [77 82 0B, 05, 05]
 
-A210; [7A 80 E4, 05, 05]
+A1F9; [77 82 13, 05, 05]
 
-A211; [7A 80 EC, 05, 05]
+A1FA; [77 82 1B, 05, 05]
 
-A212; [7A 80 F4, 05, 05]
+A1FB; [77 82 23, 05, 05]
 
-A213; [7A 80 FC, 05, 05]
+A1FC; [77 82 2B, 05, 05]
 
-A214; [7A 81 0A, 05, 05]
+A1FD; [77 82 33, 05, 05]
 
-A215; [7A 81 12, 05, 05]
+A1FE; [77 82 3B, 05, 05]
 
-A216; [7A 81 1A, 05, 05]
+A1FF; [77 82 43, 05, 05]
 
-A217; [7A 81 22, 05, 05]
+A200; [77 82 4B, 05, 05]
 
-A218; [7A 81 2A, 05, 05]
+A201; [77 82 53, 05, 05]
 
-A219; [7A 81 32, 05, 05]
+A202; [77 82 5B, 05, 05]
 
-A21A; [7A 81 3A, 05, 05]
+A203; [77 82 63, 05, 05]
 
-A21B; [7A 81 42, 05, 05]
+A204; [77 82 6B, 05, 05]
 
-A21C; [7A 81 4A, 05, 05]
+A205; [77 82 73, 05, 05]
 
-A21D; [7A 81 52, 05, 05]
+A206; [77 82 7B, 05, 05]
 
-A21E; [7A 81 5A, 05, 05]
+A207; [77 82 83, 05, 05]
 
-A21F; [7A 81 62, 05, 05]
+A208; [77 82 8B, 05, 05]
 
-A220; [7A 81 6A, 05, 05]
+A209; [77 82 93, 05, 05]
 
-A221; [7A 81 72, 05, 05]
+A20A; [77 82 9B, 05, 05]
 
-A222; [7A 81 7A, 05, 05]
+A20B; [77 82 A3, 05, 05]
 
-A223; [7A 81 82, 05, 05]
+A20C; [77 82 AB, 05, 05]
 
-A224; [7A 81 8A, 05, 05]
+A20D; [77 82 B3, 05, 05]
 
-A225; [7A 81 92, 05, 05]
+A20E; [77 82 BB, 05, 05]
 
-A226; [7A 81 9A, 05, 05]
+A20F; [77 82 C3, 05, 05]
 
-A227; [7A 81 A2, 05, 05]
+A210; [77 82 CB, 05, 05]
 
-A228; [7A 81 AA, 05, 05]
+A211; [77 82 D3, 05, 05]
 
-A229; [7A 81 B2, 05, 05]
+A212; [77 82 DB, 05, 05]
 
-A22A; [7A 81 BA, 05, 05]
+A213; [77 82 E3, 05, 05]
 
-A22B; [7A 81 C2, 05, 05]
+A214; [77 82 EB, 05, 05]
 
-A22C; [7A 81 CA, 05, 05]
+A215; [77 82 F3, 05, 05]
 
-A22D; [7A 81 D2, 05, 05]
+A216; [77 82 FB, 05, 05]
 
-A22E; [7A 81 DA, 05, 05]
+A217; [77 83 05, 05, 05]
 
-A22F; [7A 81 E2, 05, 05]
+A218; [77 83 0D, 05, 05]
 
-A230; [7A 81 EA, 05, 05]
+A219; [77 83 15, 05, 05]
 
-A231; [7A 81 F2, 05, 05]
+A21A; [77 83 1D, 05, 05]
 
-A232; [7A 81 FA, 05, 05]
+A21B; [77 83 25, 05, 05]
 
-A233; [7A 82 08, 05, 05]
+A21C; [77 83 2D, 05, 05]
 
-A234; [7A 82 10, 05, 05]
+A21D; [77 83 35, 05, 05]
 
-A235; [7A 82 18, 05, 05]
+A21E; [77 83 3D, 05, 05]
 
-A236; [7A 82 20, 05, 05]
+A21F; [77 83 45, 05, 05]
 
-A237; [7A 82 28, 05, 05]
+A220; [77 83 4D, 05, 05]
 
-A238; [7A 82 30, 05, 05]
+A221; [77 83 55, 05, 05]
 
-A239; [7A 82 38, 05, 05]
+A222; [77 83 5D, 05, 05]
 
-A23A; [7A 82 40, 05, 05]
+A223; [77 83 65, 05, 05]
 
-A23B; [7A 82 48, 05, 05]
+A224; [77 83 6D, 05, 05]
 
-A23C; [7A 82 50, 05, 05]
+A225; [77 83 75, 05, 05]
 
-A23D; [7A 82 58, 05, 05]
+A226; [77 83 7D, 05, 05]
 
-A23E; [7A 82 60, 05, 05]
+A227; [77 83 85, 05, 05]
 
-A23F; [7A 82 68, 05, 05]
+A228; [77 83 8D, 05, 05]
 
-A240; [7A 82 70, 05, 05]
+A229; [77 83 95, 05, 05]
 
-A241; [7A 82 78, 05, 05]
+A22A; [77 83 9D, 05, 05]
 
-A242; [7A 82 80, 05, 05]
+A22B; [77 83 A5, 05, 05]
 
-A243; [7A 82 88, 05, 05]
+A22C; [77 83 AD, 05, 05]
 
-A244; [7A 82 90, 05, 05]
+A22D; [77 83 B5, 05, 05]
 
-A245; [7A 82 98, 05, 05]
+A22E; [77 83 BD, 05, 05]
 
-A246; [7A 82 A0, 05, 05]
+A22F; [77 83 C5, 05, 05]
 
-A247; [7A 82 A8, 05, 05]
+A230; [77 83 CD, 05, 05]
 
-A248; [7A 82 B0, 05, 05]
+A231; [77 83 D5, 05, 05]
 
-A249; [7A 82 B8, 05, 05]
+A232; [77 83 DD, 05, 05]
 
-A24A; [7A 82 C0, 05, 05]
+A233; [77 83 E5, 05, 05]
 
-A24B; [7A 82 C8, 05, 05]
+A234; [77 83 ED, 05, 05]
 
-A24C; [7A 82 D0, 05, 05]
+A235; [77 83 F5, 05, 05]
 
-A24D; [7A 82 D8, 05, 05]
+A236; [77 83 FD, 05, 05]
 
-A24E; [7A 82 E0, 05, 05]
+A237; [77 84 07, 05, 05]
 
-A24F; [7A 82 E8, 05, 05]
+A238; [77 84 0F, 05, 05]
 
-A250; [7A 82 F0, 05, 05]
+A239; [77 84 17, 05, 05]
 
-A251; [7A 82 F8, 05, 05]
+A23A; [77 84 1F, 05, 05]
 
-A252; [7A 83 06, 05, 05]
+A23B; [77 84 27, 05, 05]
 
-A253; [7A 83 0E, 05, 05]
+A23C; [77 84 2F, 05, 05]
 
-A254; [7A 83 16, 05, 05]
+A23D; [77 84 37, 05, 05]
 
-A255; [7A 83 1E, 05, 05]
+A23E; [77 84 3F, 05, 05]
 
-A256; [7A 83 26, 05, 05]
+A23F; [77 84 47, 05, 05]
 
-A257; [7A 83 2E, 05, 05]
+A240; [77 84 4F, 05, 05]
 
-A258; [7A 83 36, 05, 05]
+A241; [77 84 57, 05, 05]
 
-A259; [7A 83 3E, 05, 05]
+A242; [77 84 5F, 05, 05]
 
-A25A; [7A 83 46, 05, 05]
+A243; [77 84 67, 05, 05]
 
-A25B; [7A 83 4E, 05, 05]
+A244; [77 84 6F, 05, 05]
 
-A25C; [7A 83 56, 05, 05]
+A245; [77 84 77, 05, 05]
 
-A25D; [7A 83 5E, 05, 05]
+A246; [77 84 7F, 05, 05]
 
-A25E; [7A 83 66, 05, 05]
+A247; [77 84 87, 05, 05]
 
-A25F; [7A 83 6E, 05, 05]
+A248; [77 84 8F, 05, 05]
 
-A260; [7A 83 76, 05, 05]
+A249; [77 84 97, 05, 05]
 
-A261; [7A 83 7E, 05, 05]
+A24A; [77 84 9F, 05, 05]
 
-A262; [7A 83 86, 05, 05]
+A24B; [77 84 A7, 05, 05]
 
-A263; [7A 83 8E, 05, 05]
+A24C; [77 84 AF, 05, 05]
 
-A264; [7A 83 96, 05, 05]
+A24D; [77 84 B7, 05, 05]
 
-A265; [7A 83 9E, 05, 05]
+A24E; [77 84 BF, 05, 05]
 
-A266; [7A 83 A6, 05, 05]
+A24F; [77 84 C7, 05, 05]
 
-A267; [7A 83 AE, 05, 05]
+A250; [77 84 CF, 05, 05]
 
-A268; [7A 83 B6, 05, 05]
+A251; [77 84 D7, 05, 05]
 
-A269; [7A 83 BE, 05, 05]
+A252; [77 84 DF, 05, 05]
 
-A26A; [7A 83 C6, 05, 05]
+A253; [77 84 E7, 05, 05]
 
-A26B; [7A 83 CE, 05, 05]
+A254; [77 84 EF, 05, 05]
 
-A26C; [7A 83 D6, 05, 05]
+A255; [77 84 F7, 05, 05]
 
-A26D; [7A 83 DE, 05, 05]
+A256; [77 84 FF, 05, 05]
 
-A26E; [7A 83 E6, 05, 05]
+A257; [77 85 09, 05, 05]
 
-A26F; [7A 83 EE, 05, 05]
+A258; [77 85 11, 05, 05]
 
-A270; [7A 83 F6, 05, 05]
+A259; [77 85 19, 05, 05]
 
-A271; [7A 84 04, 05, 05]
+A25A; [77 85 21, 05, 05]
 
-A272; [7A 84 0C, 05, 05]
+A25B; [77 85 29, 05, 05]
 
-A273; [7A 84 14, 05, 05]
+A25C; [77 85 31, 05, 05]
 
-A274; [7A 84 1C, 05, 05]
+A25D; [77 85 39, 05, 05]
 
-A275; [7A 84 24, 05, 05]
+A25E; [77 85 41, 05, 05]
 
-A276; [7A 84 2C, 05, 05]
+A25F; [77 85 49, 05, 05]
 
-A277; [7A 84 34, 05, 05]
+A260; [77 85 51, 05, 05]
 
-A278; [7A 84 3C, 05, 05]
+A261; [77 85 59, 05, 05]
 
-A279; [7A 84 44, 05, 05]
+A262; [77 85 61, 05, 05]
 
-A27A; [7A 84 4C, 05, 05]
+A263; [77 85 69, 05, 05]
 
-A27B; [7A 84 54, 05, 05]
+A264; [77 85 71, 05, 05]
 
-A27C; [7A 84 5C, 05, 05]
+A265; [77 85 79, 05, 05]
 
-A27D; [7A 84 64, 05, 05]
+A266; [77 85 81, 05, 05]
 
-A27E; [7A 84 6C, 05, 05]
+A267; [77 85 89, 05, 05]
 
-A27F; [7A 84 74, 05, 05]
+A268; [77 85 91, 05, 05]
 
-A280; [7A 84 7C, 05, 05]
+A269; [77 85 99, 05, 05]
 
-A281; [7A 84 84, 05, 05]
+A26A; [77 85 A1, 05, 05]
 
-A282; [7A 84 8C, 05, 05]
+A26B; [77 85 A9, 05, 05]
 
-A283; [7A 84 94, 05, 05]
+A26C; [77 85 B1, 05, 05]
 
-A284; [7A 84 9C, 05, 05]
+A26D; [77 85 B9, 05, 05]
 
-A285; [7A 84 A4, 05, 05]
+A26E; [77 85 C1, 05, 05]
 
-A286; [7A 84 AC, 05, 05]
+A26F; [77 85 C9, 05, 05]
 
-A287; [7A 84 B4, 05, 05]
+A270; [77 85 D1, 05, 05]
 
-A288; [7A 84 BC, 05, 05]
+A271; [77 85 D9, 05, 05]
 
-A289; [7A 84 C4, 05, 05]
+A272; [77 85 E1, 05, 05]
 
-A28A; [7A 84 CC, 05, 05]
+A273; [77 85 E9, 05, 05]
 
-A28B; [7A 84 D4, 05, 05]
+A274; [77 85 F1, 05, 05]
 
-A28C; [7A 84 DC, 05, 05]
+A275; [77 85 F9, 05, 05]
 
-A28D; [7A 84 E4, 05, 05]
+A276; [77 86 03, 05, 05]
 
-A28E; [7A 84 EC, 05, 05]
+A277; [77 86 0B, 05, 05]
 
-A28F; [7A 84 F4, 05, 05]
+A278; [77 86 13, 05, 05]
 
-A290; [7A 84 FC, 05, 05]
+A279; [77 86 1B, 05, 05]
 
-A291; [7A 85 0A, 05, 05]
+A27A; [77 86 23, 05, 05]
 
-A292; [7A 85 12, 05, 05]
+A27B; [77 86 2B, 05, 05]
 
-A293; [7A 85 1A, 05, 05]
+A27C; [77 86 33, 05, 05]
 
-A294; [7A 85 22, 05, 05]
+A27D; [77 86 3B, 05, 05]
 
-A295; [7A 85 2A, 05, 05]
+A27E; [77 86 43, 05, 05]
 
-A296; [7A 85 32, 05, 05]
+A27F; [77 86 4B, 05, 05]
 
-A297; [7A 85 3A, 05, 05]
+A280; [77 86 53, 05, 05]
 
-A298; [7A 85 42, 05, 05]
+A281; [77 86 5B, 05, 05]
 
-A299; [7A 85 4A, 05, 05]
+A282; [77 86 63, 05, 05]
 
-A29A; [7A 85 52, 05, 05]
+A283; [77 86 6B, 05, 05]
 
-A29B; [7A 85 5A, 05, 05]
+A284; [77 86 73, 05, 05]
 
-A29C; [7A 85 62, 05, 05]
+A285; [77 86 7B, 05, 05]
 
-A29D; [7A 85 6A, 05, 05]
+A286; [77 86 83, 05, 05]
 
-A29E; [7A 85 72, 05, 05]
+A287; [77 86 8B, 05, 05]
 
-A29F; [7A 85 7A, 05, 05]
+A288; [77 86 93, 05, 05]
 
-A2A0; [7A 85 82, 05, 05]
+A289; [77 86 9B, 05, 05]
 
-A2A1; [7A 85 8A, 05, 05]
+A28A; [77 86 A3, 05, 05]
 
-A2A2; [7A 85 92, 05, 05]
+A28B; [77 86 AB, 05, 05]
 
-A2A3; [7A 85 9A, 05, 05]
+A28C; [77 86 B3, 05, 05]
 
-A2A4; [7A 85 A2, 05, 05]
+A28D; [77 86 BB, 05, 05]
 
-A2A5; [7A 85 AA, 05, 05]
+A28E; [77 86 C3, 05, 05]
 
-A2A6; [7A 85 B2, 05, 05]
+A28F; [77 86 CB, 05, 05]
 
-A2A7; [7A 85 BA, 05, 05]
+A290; [77 86 D3, 05, 05]
 
-A2A8; [7A 85 C2, 05, 05]
+A291; [77 86 DB, 05, 05]
 
-A2A9; [7A 85 CA, 05, 05]
+A292; [77 86 E3, 05, 05]
 
-A2AA; [7A 85 D2, 05, 05]
+A293; [77 86 EB, 05, 05]
 
-A2AB; [7A 85 DA, 05, 05]
+A294; [77 86 F3, 05, 05]
 
-A2AC; [7A 85 E2, 05, 05]
+A295; [77 86 FB, 05, 05]
 
-A2AD; [7A 85 EA, 05, 05]
+A296; [77 87 05, 05, 05]
 
-A2AE; [7A 85 F2, 05, 05]
+A297; [77 87 0D, 05, 05]
 
-A2AF; [7A 85 FA, 05, 05]
+A298; [77 87 15, 05, 05]
 
-A2B0; [7A 86 08, 05, 05]
+A299; [77 87 1D, 05, 05]
 
-A2B1; [7A 86 10, 05, 05]
+A29A; [77 87 25, 05, 05]
 
-A2B2; [7A 86 18, 05, 05]
+A29B; [77 87 2D, 05, 05]
 
-A2B3; [7A 86 20, 05, 05]
+A29C; [77 87 35, 05, 05]
 
-A2B4; [7A 86 28, 05, 05]
+A29D; [77 87 3D, 05, 05]
 
-A2B5; [7A 86 30, 05, 05]
+A29E; [77 87 45, 05, 05]
 
-A2B6; [7A 86 38, 05, 05]
+A29F; [77 87 4D, 05, 05]
 
-A2B7; [7A 86 40, 05, 05]
+A2A0; [77 87 55, 05, 05]
 
-A2B8; [7A 86 48, 05, 05]
+A2A1; [77 87 5D, 05, 05]
 
-A2B9; [7A 86 50, 05, 05]
+A2A2; [77 87 65, 05, 05]
 
-A2BA; [7A 86 58, 05, 05]
+A2A3; [77 87 6D, 05, 05]
 
-A2BB; [7A 86 60, 05, 05]
+A2A4; [77 87 75, 05, 05]
 
-A2BC; [7A 86 68, 05, 05]
+A2A5; [77 87 7D, 05, 05]
 
-A2BD; [7A 86 70, 05, 05]
+A2A6; [77 87 85, 05, 05]
 
-A2BE; [7A 86 78, 05, 05]
+A2A7; [77 87 8D, 05, 05]
 
-A2BF; [7A 86 80, 05, 05]
+A2A8; [77 87 95, 05, 05]
 
-A2C0; [7A 86 88, 05, 05]
+A2A9; [77 87 9D, 05, 05]
 
-A2C1; [7A 86 90, 05, 05]
+A2AA; [77 87 A5, 05, 05]
 
-A2C2; [7A 86 98, 05, 05]
+A2AB; [77 87 AD, 05, 05]
 
-A2C3; [7A 86 A0, 05, 05]
+A2AC; [77 87 B5, 05, 05]
 
-A2C4; [7A 86 A8, 05, 05]
+A2AD; [77 87 BD, 05, 05]
 
-A2C5; [7A 86 B0, 05, 05]
+A2AE; [77 87 C5, 05, 05]
 
-A2C6; [7A 86 B8, 05, 05]
+A2AF; [77 87 CD, 05, 05]
 
-A2C7; [7A 86 C0, 05, 05]
+A2B0; [77 87 D5, 05, 05]
 
-A2C8; [7A 86 C8, 05, 05]
+A2B1; [77 87 DD, 05, 05]
 
-A2C9; [7A 86 D0, 05, 05]
+A2B2; [77 87 E5, 05, 05]
 
-A2CA; [7A 86 D8, 05, 05]
+A2B3; [77 87 ED, 05, 05]
 
-A2CB; [7A 86 E0, 05, 05]
+A2B4; [77 87 F5, 05, 05]
 
-A2CC; [7A 86 E8, 05, 05]
+A2B5; [77 87 FD, 05, 05]
 
-A2CD; [7A 86 F0, 05, 05]
+A2B6; [77 88 07, 05, 05]
 
-A2CE; [7A 86 F8, 05, 05]
+A2B7; [77 88 0F, 05, 05]
 
-A2CF; [7A 87 06, 05, 05]
+A2B8; [77 88 17, 05, 05]
 
-A2D0; [7A 87 0E, 05, 05]
+A2B9; [77 88 1F, 05, 05]
 
-A2D1; [7A 87 16, 05, 05]
+A2BA; [77 88 27, 05, 05]
 
-A2D2; [7A 87 1E, 05, 05]
+A2BB; [77 88 2F, 05, 05]
 
-A2D3; [7A 87 26, 05, 05]
+A2BC; [77 88 37, 05, 05]
 
-A2D4; [7A 87 2E, 05, 05]
+A2BD; [77 88 3F, 05, 05]
 
-A2D5; [7A 87 36, 05, 05]
+A2BE; [77 88 47, 05, 05]
 
-A2D6; [7A 87 3E, 05, 05]
+A2BF; [77 88 4F, 05, 05]
 
-A2D7; [7A 87 46, 05, 05]
+A2C0; [77 88 57, 05, 05]
 
-A2D8; [7A 87 4E, 05, 05]
+A2C1; [77 88 5F, 05, 05]
 
-A2D9; [7A 87 56, 05, 05]
+A2C2; [77 88 67, 05, 05]
 
-A2DA; [7A 87 5E, 05, 05]
+A2C3; [77 88 6F, 05, 05]
 
-A2DB; [7A 87 66, 05, 05]
+A2C4; [77 88 77, 05, 05]
 
-A2DC; [7A 87 6E, 05, 05]
+A2C5; [77 88 7F, 05, 05]
 
-A2DD; [7A 87 76, 05, 05]
+A2C6; [77 88 87, 05, 05]
 
-A2DE; [7A 87 7E, 05, 05]
+A2C7; [77 88 8F, 05, 05]
 
-A2DF; [7A 87 86, 05, 05]
+A2C8; [77 88 97, 05, 05]
 
-A2E0; [7A 87 8E, 05, 05]
+A2C9; [77 88 9F, 05, 05]
 
-A2E1; [7A 87 96, 05, 05]
+A2CA; [77 88 A7, 05, 05]
 
-A2E2; [7A 87 9E, 05, 05]
+A2CB; [77 88 AF, 05, 05]
 
-A2E3; [7A 87 A6, 05, 05]
+A2CC; [77 88 B7, 05, 05]
 
-A2E4; [7A 87 AE, 05, 05]
+A2CD; [77 88 BF, 05, 05]
 
-A2E5; [7A 87 B6, 05, 05]
+A2CE; [77 88 C7, 05, 05]
 
-A2E6; [7A 87 BE, 05, 05]
+A2CF; [77 88 CF, 05, 05]
 
-A2E7; [7A 87 C6, 05, 05]
+A2D0; [77 88 D7, 05, 05]
 
-A2E8; [7A 87 CE, 05, 05]
+A2D1; [77 88 DF, 05, 05]
 
-A2E9; [7A 87 D6, 05, 05]
+A2D2; [77 88 E7, 05, 05]
 
-A2EA; [7A 87 DE, 05, 05]
+A2D3; [77 88 EF, 05, 05]
 
-A2EB; [7A 87 E6, 05, 05]
+A2D4; [77 88 F7, 05, 05]
 
-A2EC; [7A 87 EE, 05, 05]
+A2D5; [77 88 FF, 05, 05]
 
-A2ED; [7A 87 F6, 05, 05]
+A2D6; [77 89 09, 05, 05]
 
-A2EE; [7A 88 04, 05, 05]
+A2D7; [77 89 11, 05, 05]
 
-A2EF; [7A 88 0C, 05, 05]
+A2D8; [77 89 19, 05, 05]
 
-A2F0; [7A 88 14, 05, 05]
+A2D9; [77 89 21, 05, 05]
 
-A2F1; [7A 88 1C, 05, 05]
+A2DA; [77 89 29, 05, 05]
 
-A2F2; [7A 88 24, 05, 05]
+A2DB; [77 89 31, 05, 05]
 
-A2F3; [7A 88 2C, 05, 05]
+A2DC; [77 89 39, 05, 05]
 
-A2F4; [7A 88 34, 05, 05]
+A2DD; [77 89 41, 05, 05]
 
-A2F5; [7A 88 3C, 05, 05]
+A2DE; [77 89 49, 05, 05]
 
-A2F6; [7A 88 44, 05, 05]
+A2DF; [77 89 51, 05, 05]
 
-A2F7; [7A 88 4C, 05, 05]
+A2E0; [77 89 59, 05, 05]
 
-A2F8; [7A 88 54, 05, 05]
+A2E1; [77 89 61, 05, 05]
 
-A2F9; [7A 88 5C, 05, 05]
+A2E2; [77 89 69, 05, 05]
 
-A2FA; [7A 88 64, 05, 05]
+A2E3; [77 89 71, 05, 05]
 
-A2FB; [7A 88 6C, 05, 05]
+A2E4; [77 89 79, 05, 05]
 
-A2FC; [7A 88 74, 05, 05]
+A2E5; [77 89 81, 05, 05]
 
-A2FD; [7A 88 7C, 05, 05]
+A2E6; [77 89 89, 05, 05]
 
-A2FE; [7A 88 84, 05, 05]
+A2E7; [77 89 91, 05, 05]
 
-A2FF; [7A 88 8C, 05, 05]
+A2E8; [77 89 99, 05, 05]
 
-A300; [7A 88 94, 05, 05]
+A2E9; [77 89 A1, 05, 05]
 
-A301; [7A 88 9C, 05, 05]
+A2EA; [77 89 A9, 05, 05]
 
-A302; [7A 88 A4, 05, 05]
+A2EB; [77 89 B1, 05, 05]
 
-A303; [7A 88 AC, 05, 05]
+A2EC; [77 89 B9, 05, 05]
 
-A304; [7A 88 B4, 05, 05]
+A2ED; [77 89 C1, 05, 05]
 
-A305; [7A 88 BC, 05, 05]
+A2EE; [77 89 C9, 05, 05]
 
-A306; [7A 88 C4, 05, 05]
+A2EF; [77 89 D1, 05, 05]
 
-A307; [7A 88 CC, 05, 05]
+A2F0; [77 89 D9, 05, 05]
 
-A308; [7A 88 D4, 05, 05]
+A2F1; [77 89 E1, 05, 05]
 
-A309; [7A 88 DC, 05, 05]
+A2F2; [77 89 E9, 05, 05]
 
-A30A; [7A 88 E4, 05, 05]
+A2F3; [77 89 F1, 05, 05]
 
-A30B; [7A 88 EC, 05, 05]
+A2F4; [77 89 F9, 05, 05]
 
-A30C; [7A 88 F4, 05, 05]
+A2F5; [77 8A 03, 05, 05]
 
-A30D; [7A 88 FC, 05, 05]
+A2F6; [77 8A 0B, 05, 05]
 
-A30E; [7A 89 0A, 05, 05]
+A2F7; [77 8A 13, 05, 05]
 
-A30F; [7A 89 12, 05, 05]
+A2F8; [77 8A 1B, 05, 05]
 
-A310; [7A 89 1A, 05, 05]
+A2F9; [77 8A 23, 05, 05]
 
-A311; [7A 89 22, 05, 05]
+A2FA; [77 8A 2B, 05, 05]
 
-A312; [7A 89 2A, 05, 05]
+A2FB; [77 8A 33, 05, 05]
 
-A313; [7A 89 32, 05, 05]
+A2FC; [77 8A 3B, 05, 05]
 
-A314; [7A 89 3A, 05, 05]
+A2FD; [77 8A 43, 05, 05]
 
-A315; [7A 89 42, 05, 05]
+A2FE; [77 8A 4B, 05, 05]
 
-A316; [7A 89 4A, 05, 05]
+A2FF; [77 8A 53, 05, 05]
 
-A317; [7A 89 52, 05, 05]
+A300; [77 8A 5B, 05, 05]
 
-A318; [7A 89 5A, 05, 05]
+A301; [77 8A 63, 05, 05]
 
-A319; [7A 89 62, 05, 05]
+A302; [77 8A 6B, 05, 05]
 
-A31A; [7A 89 6A, 05, 05]
+A303; [77 8A 73, 05, 05]
 
-A31B; [7A 89 72, 05, 05]
+A304; [77 8A 7B, 05, 05]
 
-A31C; [7A 89 7A, 05, 05]
+A305; [77 8A 83, 05, 05]
 
-A31D; [7A 89 82, 05, 05]
+A306; [77 8A 8B, 05, 05]
 
-A31E; [7A 89 8A, 05, 05]
+A307; [77 8A 93, 05, 05]
 
-A31F; [7A 89 92, 05, 05]
+A308; [77 8A 9B, 05, 05]
 
-A320; [7A 89 9A, 05, 05]
+A309; [77 8A A3, 05, 05]
 
-A321; [7A 89 A2, 05, 05]
+A30A; [77 8A AB, 05, 05]
 
-A322; [7A 89 AA, 05, 05]
+A30B; [77 8A B3, 05, 05]
 
-A323; [7A 89 B2, 05, 05]
+A30C; [77 8A BB, 05, 05]
 
-A324; [7A 89 BA, 05, 05]
+A30D; [77 8A C3, 05, 05]
 
-A325; [7A 89 C2, 05, 05]
+A30E; [77 8A CB, 05, 05]
 
-A326; [7A 89 CA, 05, 05]
+A30F; [77 8A D3, 05, 05]
 
-A327; [7A 89 D2, 05, 05]
+A310; [77 8A DB, 05, 05]
 
-A328; [7A 89 DA, 05, 05]
+A311; [77 8A E3, 05, 05]
 
-A329; [7A 89 E2, 05, 05]
+A312; [77 8A EB, 05, 05]
 
-A32A; [7A 89 EA, 05, 05]
+A313; [77 8A F3, 05, 05]
 
-A32B; [7A 89 F2, 05, 05]
+A314; [77 8A FB, 05, 05]
 
-A32C; [7A 89 FA, 05, 05]
+A315; [77 8B 05, 05, 05]
 
-A32D; [7A 8A 08, 05, 05]
+A316; [77 8B 0D, 05, 05]
 
-A32E; [7A 8A 10, 05, 05]
+A317; [77 8B 15, 05, 05]
 
-A32F; [7A 8A 18, 05, 05]
+A318; [77 8B 1D, 05, 05]
 
-A330; [7A 8A 20, 05, 05]
+A319; [77 8B 25, 05, 05]
 
-A331; [7A 8A 28, 05, 05]
+A31A; [77 8B 2D, 05, 05]
 
-A332; [7A 8A 30, 05, 05]
+A31B; [77 8B 35, 05, 05]
 
-A333; [7A 8A 38, 05, 05]
+A31C; [77 8B 3D, 05, 05]
 
-A334; [7A 8A 40, 05, 05]
+A31D; [77 8B 45, 05, 05]
 
-A335; [7A 8A 48, 05, 05]
+A31E; [77 8B 4D, 05, 05]
 
-A336; [7A 8A 50, 05, 05]
+A31F; [77 8B 55, 05, 05]
 
-A337; [7A 8A 58, 05, 05]
+A320; [77 8B 5D, 05, 05]
 
-A338; [7A 8A 60, 05, 05]
+A321; [77 8B 65, 05, 05]
 
-A339; [7A 8A 68, 05, 05]
+A322; [77 8B 6D, 05, 05]
 
-A33A; [7A 8A 70, 05, 05]
+A323; [77 8B 75, 05, 05]
 
-A33B; [7A 8A 78, 05, 05]
+A324; [77 8B 7D, 05, 05]
 
-A33C; [7A 8A 80, 05, 05]
+A325; [77 8B 85, 05, 05]
 
-A33D; [7A 8A 88, 05, 05]
+A326; [77 8B 8D, 05, 05]
 
-A33E; [7A 8A 90, 05, 05]
+A327; [77 8B 95, 05, 05]
 
-A33F; [7A 8A 98, 05, 05]
+A328; [77 8B 9D, 05, 05]
 
-A340; [7A 8A A0, 05, 05]
+A329; [77 8B A5, 05, 05]
 
-A341; [7A 8A A8, 05, 05]
+A32A; [77 8B AD, 05, 05]
 
-A342; [7A 8A B0, 05, 05]
+A32B; [77 8B B5, 05, 05]
 
-A343; [7A 8A B8, 05, 05]
+A32C; [77 8B BD, 05, 05]
 
-A344; [7A 8A C0, 05, 05]
+A32D; [77 8B C5, 05, 05]
 
-A345; [7A 8A C8, 05, 05]
+A32E; [77 8B CD, 05, 05]
 
-A346; [7A 8A D0, 05, 05]
+A32F; [77 8B D5, 05, 05]
 
-A347; [7A 8A D8, 05, 05]
+A330; [77 8B DD, 05, 05]
 
-A348; [7A 8A E0, 05, 05]
+A331; [77 8B E5, 05, 05]
 
-A349; [7A 8A E8, 05, 05]
+A332; [77 8B ED, 05, 05]
 
-A34A; [7A 8A F0, 05, 05]
+A333; [77 8B F5, 05, 05]
 
-A34B; [7A 8A F8, 05, 05]
+A334; [77 8B FD, 05, 05]
 
-A34C; [7A 8B 06, 05, 05]
+A335; [77 8C 07, 05, 05]
 
-A34D; [7A 8B 0E, 05, 05]
+A336; [77 8C 0F, 05, 05]
 
-A34E; [7A 8B 16, 05, 05]
+A337; [77 8C 17, 05, 05]
 
-A34F; [7A 8B 1E, 05, 05]
+A338; [77 8C 1F, 05, 05]
 
-A350; [7A 8B 26, 05, 05]
+A339; [77 8C 27, 05, 05]
 
-A351; [7A 8B 2E, 05, 05]
+A33A; [77 8C 2F, 05, 05]
 
-A352; [7A 8B 36, 05, 05]
+A33B; [77 8C 37, 05, 05]
 
-A353; [7A 8B 3E, 05, 05]
+A33C; [77 8C 3F, 05, 05]
 
-A354; [7A 8B 46, 05, 05]
+A33D; [77 8C 47, 05, 05]
 
-A355; [7A 8B 4E, 05, 05]
+A33E; [77 8C 4F, 05, 05]
 
-A356; [7A 8B 56, 05, 05]
+A33F; [77 8C 57, 05, 05]
 
-A357; [7A 8B 5E, 05, 05]
+A340; [77 8C 5F, 05, 05]
 
-A358; [7A 8B 66, 05, 05]
+A341; [77 8C 67, 05, 05]
 
-A359; [7A 8B 6E, 05, 05]
+A342; [77 8C 6F, 05, 05]
 
-A35A; [7A 8B 76, 05, 05]
+A343; [77 8C 77, 05, 05]
 
-A35B; [7A 8B 7E, 05, 05]
+A344; [77 8C 7F, 05, 05]
 
-A35C; [7A 8B 86, 05, 05]
+A345; [77 8C 87, 05, 05]
 
-A35D; [7A 8B 8E, 05, 05]
+A346; [77 8C 8F, 05, 05]
 
-A35E; [7A 8B 96, 05, 05]
+A347; [77 8C 97, 05, 05]
 
-A35F; [7A 8B 9E, 05, 05]
+A348; [77 8C 9F, 05, 05]
 
-A360; [7A 8B A6, 05, 05]
+A349; [77 8C A7, 05, 05]
 
-A361; [7A 8B AE, 05, 05]
+A34A; [77 8C AF, 05, 05]
 
-A362; [7A 8B B6, 05, 05]
+A34B; [77 8C B7, 05, 05]
 
-A363; [7A 8B BE, 05, 05]
+A34C; [77 8C BF, 05, 05]
 
-A364; [7A 8B C6, 05, 05]
+A34D; [77 8C C7, 05, 05]
 
-A365; [7A 8B CE, 05, 05]
+A34E; [77 8C CF, 05, 05]
 
-A366; [7A 8B D6, 05, 05]
+A34F; [77 8C D7, 05, 05]
 
-A367; [7A 8B DE, 05, 05]
+A350; [77 8C DF, 05, 05]
 
-A368; [7A 8B E6, 05, 05]
+A351; [77 8C E7, 05, 05]
 
-A369; [7A 8B EE, 05, 05]
+A352; [77 8C EF, 05, 05]
 
-A36A; [7A 8B F6, 05, 05]
+A353; [77 8C F7, 05, 05]
 
-A36B; [7A 8C 04, 05, 05]
+A354; [77 8C FF, 05, 05]
 
-A36C; [7A 8C 0C, 05, 05]
+A355; [77 8D 09, 05, 05]
 
-A36D; [7A 8C 14, 05, 05]
+A356; [77 8D 11, 05, 05]
 
-A36E; [7A 8C 1C, 05, 05]
+A357; [77 8D 19, 05, 05]
 
-A36F; [7A 8C 24, 05, 05]
+A358; [77 8D 21, 05, 05]
 
-A370; [7A 8C 2C, 05, 05]
+A359; [77 8D 29, 05, 05]
 
-A371; [7A 8C 34, 05, 05]
+A35A; [77 8D 31, 05, 05]
 
-A372; [7A 8C 3C, 05, 05]
+A35B; [77 8D 39, 05, 05]
 
-A373; [7A 8C 44, 05, 05]
+A35C; [77 8D 41, 05, 05]
 
-A374; [7A 8C 4C, 05, 05]
+A35D; [77 8D 49, 05, 05]
 
-A375; [7A 8C 54, 05, 05]
+A35E; [77 8D 51, 05, 05]
 
-A376; [7A 8C 5C, 05, 05]
+A35F; [77 8D 59, 05, 05]
 
-A377; [7A 8C 64, 05, 05]
+A360; [77 8D 61, 05, 05]
 
-A378; [7A 8C 6C, 05, 05]
+A361; [77 8D 69, 05, 05]
 
-A379; [7A 8C 74, 05, 05]
+A362; [77 8D 71, 05, 05]
 
-A37A; [7A 8C 7C, 05, 05]
+A363; [77 8D 79, 05, 05]
 
-A37B; [7A 8C 84, 05, 05]
+A364; [77 8D 81, 05, 05]
 
-A37C; [7A 8C 8C, 05, 05]
+A365; [77 8D 89, 05, 05]
 
-A37D; [7A 8C 94, 05, 05]
+A366; [77 8D 91, 05, 05]
 
-A37E; [7A 8C 9C, 05, 05]
+A367; [77 8D 99, 05, 05]
 
-A37F; [7A 8C A4, 05, 05]
+A368; [77 8D A1, 05, 05]
 
-A380; [7A 8C AC, 05, 05]
+A369; [77 8D A9, 05, 05]
 
-A381; [7A 8C B4, 05, 05]
+A36A; [77 8D B1, 05, 05]
 
-A382; [7A 8C BC, 05, 05]
+A36B; [77 8D B9, 05, 05]
 
-A383; [7A 8C C4, 05, 05]
+A36C; [77 8D C1, 05, 05]
 
-A384; [7A 8C CC, 05, 05]
+A36D; [77 8D C9, 05, 05]
 
-A385; [7A 8C D4, 05, 05]
+A36E; [77 8D D1, 05, 05]
 
-A386; [7A 8C DC, 05, 05]
+A36F; [77 8D D9, 05, 05]
 
-A387; [7A 8C E4, 05, 05]
+A370; [77 8D E1, 05, 05]
 
-A388; [7A 8C EC, 05, 05]
+A371; [77 8D E9, 05, 05]
 
-A389; [7A 8C F4, 05, 05]
+A372; [77 8D F1, 05, 05]
 
-A38A; [7A 8C FC, 05, 05]
+A373; [77 8D F9, 05, 05]
 
-A38B; [7A 8D 0A, 05, 05]
+A374; [77 8E 03, 05, 05]
 
-A38C; [7A 8D 12, 05, 05]
+A375; [77 8E 0B, 05, 05]
 
-A38D; [7A 8D 1A, 05, 05]
+A376; [77 8E 13, 05, 05]
 
-A38E; [7A 8D 22, 05, 05]
+A377; [77 8E 1B, 05, 05]
 
-A38F; [7A 8D 2A, 05, 05]
+A378; [77 8E 23, 05, 05]
 
-A390; [7A 8D 32, 05, 05]
+A379; [77 8E 2B, 05, 05]
 
-A391; [7A 8D 3A, 05, 05]
+A37A; [77 8E 33, 05, 05]
 
-A392; [7A 8D 42, 05, 05]
+A37B; [77 8E 3B, 05, 05]
 
-A393; [7A 8D 4A, 05, 05]
+A37C; [77 8E 43, 05, 05]
 
-A394; [7A 8D 52, 05, 05]
+A37D; [77 8E 4B, 05, 05]
 
-A395; [7A 8D 5A, 05, 05]
+A37E; [77 8E 53, 05, 05]
 
-A396; [7A 8D 62, 05, 05]
+A37F; [77 8E 5B, 05, 05]
 
-A397; [7A 8D 6A, 05, 05]
+A380; [77 8E 63, 05, 05]
 
-A398; [7A 8D 72, 05, 05]
+A381; [77 8E 6B, 05, 05]
 
-A399; [7A 8D 7A, 05, 05]
+A382; [77 8E 73, 05, 05]
 
-A39A; [7A 8D 82, 05, 05]
+A383; [77 8E 7B, 05, 05]
 
-A39B; [7A 8D 8A, 05, 05]
+A384; [77 8E 83, 05, 05]
 
-A39C; [7A 8D 92, 05, 05]
+A385; [77 8E 8B, 05, 05]
 
-A39D; [7A 8D 9A, 05, 05]
+A386; [77 8E 93, 05, 05]
 
-A39E; [7A 8D A2, 05, 05]
+A387; [77 8E 9B, 05, 05]
 
-A39F; [7A 8D AA, 05, 05]
+A388; [77 8E A3, 05, 05]
 
-A3A0; [7A 8D B2, 05, 05]
+A389; [77 8E AB, 05, 05]
 
-A3A1; [7A 8D BA, 05, 05]
+A38A; [77 8E B3, 05, 05]
 
-A3A2; [7A 8D C2, 05, 05]
+A38B; [77 8E BB, 05, 05]
 
-A3A3; [7A 8D CA, 05, 05]
+A38C; [77 8E C3, 05, 05]
 
-A3A4; [7A 8D D2, 05, 05]
+A38D; [77 8E CB, 05, 05]
 
-A3A5; [7A 8D DA, 05, 05]
+A38E; [77 8E D3, 05, 05]
 
-A3A6; [7A 8D E2, 05, 05]
+A38F; [77 8E DB, 05, 05]
 
-A3A7; [7A 8D EA, 05, 05]
+A390; [77 8E E3, 05, 05]
 
-A3A8; [7A 8D F2, 05, 05]
+A391; [77 8E EB, 05, 05]
 
-A3A9; [7A 8D FA, 05, 05]
+A392; [77 8E F3, 05, 05]
 
-A3AA; [7A 8E 08, 05, 05]
+A393; [77 8E FB, 05, 05]
 
-A3AB; [7A 8E 10, 05, 05]
+A394; [77 8F 05, 05, 05]
 
-A3AC; [7A 8E 18, 05, 05]
+A395; [77 8F 0D, 05, 05]
 
-A3AD; [7A 8E 20, 05, 05]
+A396; [77 8F 15, 05, 05]
 
-A3AE; [7A 8E 28, 05, 05]
+A397; [77 8F 1D, 05, 05]
 
-A3AF; [7A 8E 30, 05, 05]
+A398; [77 8F 25, 05, 05]
 
-A3B0; [7A 8E 38, 05, 05]
+A399; [77 8F 2D, 05, 05]
 
-A3B1; [7A 8E 40, 05, 05]
+A39A; [77 8F 35, 05, 05]
 
-A3B2; [7A 8E 48, 05, 05]
+A39B; [77 8F 3D, 05, 05]
 
-A3B3; [7A 8E 50, 05, 05]
+A39C; [77 8F 45, 05, 05]
 
-A3B4; [7A 8E 58, 05, 05]
+A39D; [77 8F 4D, 05, 05]
 
-A3B5; [7A 8E 60, 05, 05]
+A39E; [77 8F 55, 05, 05]
 
-A3B6; [7A 8E 68, 05, 05]
+A39F; [77 8F 5D, 05, 05]
 
-A3B7; [7A 8E 70, 05, 05]
+A3A0; [77 8F 65, 05, 05]
 
-A3B8; [7A 8E 78, 05, 05]
+A3A1; [77 8F 6D, 05, 05]
 
-A3B9; [7A 8E 80, 05, 05]
+A3A2; [77 8F 75, 05, 05]
 
-A3BA; [7A 8E 88, 05, 05]
+A3A3; [77 8F 7D, 05, 05]
 
-A3BB; [7A 8E 90, 05, 05]
+A3A4; [77 8F 85, 05, 05]
 
-A3BC; [7A 8E 98, 05, 05]
+A3A5; [77 8F 8D, 05, 05]
 
-A3BD; [7A 8E A0, 05, 05]
+A3A6; [77 8F 95, 05, 05]
 
-A3BE; [7A 8E A8, 05, 05]
+A3A7; [77 8F 9D, 05, 05]
 
-A3BF; [7A 8E B0, 05, 05]
+A3A8; [77 8F A5, 05, 05]
 
-A3C0; [7A 8E B8, 05, 05]
+A3A9; [77 8F AD, 05, 05]
 
-A3C1; [7A 8E C0, 05, 05]
+A3AA; [77 8F B5, 05, 05]
 
-A3C2; [7A 8E C8, 05, 05]
+A3AB; [77 8F BD, 05, 05]
 
-A3C3; [7A 8E D0, 05, 05]
+A3AC; [77 8F C5, 05, 05]
 
-A3C4; [7A 8E D8, 05, 05]
+A3AD; [77 8F CD, 05, 05]
 
-A3C5; [7A 8E E0, 05, 05]
+A3AE; [77 8F D5, 05, 05]
 
-A3C6; [7A 8E E8, 05, 05]
+A3AF; [77 8F DD, 05, 05]
 
-A3C7; [7A 8E F0, 05, 05]
+A3B0; [77 8F E5, 05, 05]
 
-A3C8; [7A 8E F8, 05, 05]
+A3B1; [77 8F ED, 05, 05]
 
-A3C9; [7A 8F 06, 05, 05]
+A3B2; [77 8F F5, 05, 05]
 
-A3CA; [7A 8F 0E, 05, 05]
+A3B3; [77 8F FD, 05, 05]
 
-A3CB; [7A 8F 16, 05, 05]
+A3B4; [77 90 07, 05, 05]
 
-A3CC; [7A 8F 1E, 05, 05]
+A3B5; [77 90 0F, 05, 05]
 
-A3CD; [7A 8F 26, 05, 05]
+A3B6; [77 90 17, 05, 05]
 
-A3CE; [7A 8F 2E, 05, 05]
+A3B7; [77 90 1F, 05, 05]
 
-A3CF; [7A 8F 36, 05, 05]
+A3B8; [77 90 27, 05, 05]
 
-A3D0; [7A 8F 3E, 05, 05]
+A3B9; [77 90 2F, 05, 05]
 
-A3D1; [7A 8F 46, 05, 05]
+A3BA; [77 90 37, 05, 05]
 
-A3D2; [7A 8F 4E, 05, 05]
+A3BB; [77 90 3F, 05, 05]
 
-A3D3; [7A 8F 56, 05, 05]
+A3BC; [77 90 47, 05, 05]
 
-A3D4; [7A 8F 5E, 05, 05]
+A3BD; [77 90 4F, 05, 05]
 
-A3D5; [7A 8F 66, 05, 05]
+A3BE; [77 90 57, 05, 05]
 
-A3D6; [7A 8F 6E, 05, 05]
+A3BF; [77 90 5F, 05, 05]
 
-A3D7; [7A 8F 76, 05, 05]
+A3C0; [77 90 67, 05, 05]
 
-A3D8; [7A 8F 7E, 05, 05]
+A3C1; [77 90 6F, 05, 05]
 
-A3D9; [7A 8F 86, 05, 05]
+A3C2; [77 90 77, 05, 05]
 
-A3DA; [7A 8F 8E, 05, 05]
+A3C3; [77 90 7F, 05, 05]
 
-A3DB; [7A 8F 96, 05, 05]
+A3C4; [77 90 87, 05, 05]
 
-A3DC; [7A 8F 9E, 05, 05]
+A3C5; [77 90 8F, 05, 05]
 
-A3DD; [7A 8F A6, 05, 05]
+A3C6; [77 90 97, 05, 05]
 
-A3DE; [7A 8F AE, 05, 05]
+A3C7; [77 90 9F, 05, 05]
 
-A3DF; [7A 8F B6, 05, 05]
+A3C8; [77 90 A7, 05, 05]
 
-A3E0; [7A 8F BE, 05, 05]
+A3C9; [77 90 AF, 05, 05]
 
-A3E1; [7A 8F C6, 05, 05]
+A3CA; [77 90 B7, 05, 05]
 
-A3E2; [7A 8F CE, 05, 05]
+A3CB; [77 90 BF, 05, 05]
 
-A3E3; [7A 8F D6, 05, 05]
+A3CC; [77 90 C7, 05, 05]
 
-A3E4; [7A 8F DE, 05, 05]
+A3CD; [77 90 CF, 05, 05]
 
-A3E5; [7A 8F E6, 05, 05]
+A3CE; [77 90 D7, 05, 05]
 
-A3E6; [7A 8F EE, 05, 05]
+A3CF; [77 90 DF, 05, 05]
 
-A3E7; [7A 8F F6, 05, 05]
+A3D0; [77 90 E7, 05, 05]
 
-A3E8; [7A 90 04, 05, 05]
+A3D1; [77 90 EF, 05, 05]
 
-A3E9; [7A 90 0C, 05, 05]
+A3D2; [77 90 F7, 05, 05]
 
-A3EA; [7A 90 14, 05, 05]
+A3D3; [77 90 FF, 05, 05]
 
-A3EB; [7A 90 1C, 05, 05]
+A3D4; [77 91 09, 05, 05]
 
-A3EC; [7A 90 24, 05, 05]
+A3D5; [77 91 11, 05, 05]
 
-A3ED; [7A 90 2C, 05, 05]
+A3D6; [77 91 19, 05, 05]
 
-A3EE; [7A 90 34, 05, 05]
+A3D7; [77 91 21, 05, 05]
 
-A3EF; [7A 90 3C, 05, 05]
+A3D8; [77 91 29, 05, 05]
 
-A3F0; [7A 90 44, 05, 05]
+A3D9; [77 91 31, 05, 05]
 
-A3F1; [7A 90 4C, 05, 05]
+A3DA; [77 91 39, 05, 05]
 
-A3F2; [7A 90 54, 05, 05]
+A3DB; [77 91 41, 05, 05]
 
-A3F3; [7A 90 5C, 05, 05]
+A3DC; [77 91 49, 05, 05]
 
-A3F4; [7A 90 64, 05, 05]
+A3DD; [77 91 51, 05, 05]
 
-A3F5; [7A 90 6C, 05, 05]
+A3DE; [77 91 59, 05, 05]
 
-A3F6; [7A 90 74, 05, 05]
+A3DF; [77 91 61, 05, 05]
 
-A3F7; [7A 90 7C, 05, 05]
+A3E0; [77 91 69, 05, 05]
 
-A3F8; [7A 90 84, 05, 05]
+A3E1; [77 91 71, 05, 05]
 
-A3F9; [7A 90 8C, 05, 05]
+A3E2; [77 91 79, 05, 05]
 
-A3FA; [7A 90 94, 05, 05]
+A3E3; [77 91 81, 05, 05]
 
-A3FB; [7A 90 9C, 05, 05]
+A3E4; [77 91 89, 05, 05]
 
-A3FC; [7A 90 A4, 05, 05]
+A3E5; [77 91 91, 05, 05]
 
-A3FD; [7A 90 AC, 05, 05]
+A3E6; [77 91 99, 05, 05]
 
-A3FE; [7A 90 B4, 05, 05]
+A3E7; [77 91 A1, 05, 05]
 
-A3FF; [7A 90 BC, 05, 05]
+A3E8; [77 91 A9, 05, 05]
 
-A400; [7A 90 C4, 05, 05]
+A3E9; [77 91 B1, 05, 05]
 
-A401; [7A 90 CC, 05, 05]
+A3EA; [77 91 B9, 05, 05]
 
-A402; [7A 90 D4, 05, 05]
+A3EB; [77 91 C1, 05, 05]
 
-A403; [7A 90 DC, 05, 05]
+A3EC; [77 91 C9, 05, 05]
 
-A404; [7A 90 E4, 05, 05]
+A3ED; [77 91 D1, 05, 05]
 
-A405; [7A 90 EC, 05, 05]
+A3EE; [77 91 D9, 05, 05]
 
-A406; [7A 90 F4, 05, 05]
+A3EF; [77 91 E1, 05, 05]
 
-A407; [7A 90 FC, 05, 05]
+A3F0; [77 91 E9, 05, 05]
 
-A408; [7A 91 0A, 05, 05]
+A3F1; [77 91 F1, 05, 05]
 
-A409; [7A 91 12, 05, 05]
+A3F2; [77 91 F9, 05, 05]
 
-A40A; [7A 91 1A, 05, 05]
+A3F3; [77 92 03, 05, 05]
 
-A40B; [7A 91 22, 05, 05]
+A3F4; [77 92 0B, 05, 05]
 
-A40C; [7A 91 2A, 05, 05]
+A3F5; [77 92 13, 05, 05]
 
-A40D; [7A 91 32, 05, 05]
+A3F6; [77 92 1B, 05, 05]
 
-A40E; [7A 91 3A, 05, 05]
+A3F7; [77 92 23, 05, 05]
 
-A40F; [7A 91 42, 05, 05]
+A3F8; [77 92 2B, 05, 05]
 
-A410; [7A 91 4A, 05, 05]
+A3F9; [77 92 33, 05, 05]
 
-A411; [7A 91 52, 05, 05]
+A3FA; [77 92 3B, 05, 05]
 
-A412; [7A 91 5A, 05, 05]
+A3FB; [77 92 43, 05, 05]
 
-A413; [7A 91 62, 05, 05]
+A3FC; [77 92 4B, 05, 05]
 
-A414; [7A 91 6A, 05, 05]
+A3FD; [77 92 53, 05, 05]
 
-A415; [7A 91 72, 05, 05]
+A3FE; [77 92 5B, 05, 05]
 
-A416; [7A 91 7A, 05, 05]
+A3FF; [77 92 63, 05, 05]
 
-A417; [7A 91 82, 05, 05]
+A400; [77 92 6B, 05, 05]
 
-A418; [7A 91 8A, 05, 05]
+A401; [77 92 73, 05, 05]
 
-A419; [7A 91 92, 05, 05]
+A402; [77 92 7B, 05, 05]
 
-A41A; [7A 91 9A, 05, 05]
+A403; [77 92 83, 05, 05]
 
-A41B; [7A 91 A2, 05, 05]
+A404; [77 92 8B, 05, 05]
 
-A41C; [7A 91 AA, 05, 05]
+A405; [77 92 93, 05, 05]
 
-A41D; [7A 91 B2, 05, 05]
+A406; [77 92 9B, 05, 05]
 
-A41E; [7A 91 BA, 05, 05]
+A407; [77 92 A3, 05, 05]
 
-A41F; [7A 91 C2, 05, 05]
+A408; [77 92 AB, 05, 05]
 
-A420; [7A 91 CA, 05, 05]
+A409; [77 92 B3, 05, 05]
 
-A421; [7A 91 D2, 05, 05]
+A40A; [77 92 BB, 05, 05]
 
-A422; [7A 91 DA, 05, 05]
+A40B; [77 92 C3, 05, 05]
 
-A423; [7A 91 E2, 05, 05]
+A40C; [77 92 CB, 05, 05]
 
-A424; [7A 91 EA, 05, 05]
+A40D; [77 92 D3, 05, 05]
 
-A425; [7A 91 F2, 05, 05]
+A40E; [77 92 DB, 05, 05]
 
-A426; [7A 91 FA, 05, 05]
+A40F; [77 92 E3, 05, 05]
 
-A427; [7A 92 08, 05, 05]
+A410; [77 92 EB, 05, 05]
 
-A428; [7A 92 10, 05, 05]
+A411; [77 92 F3, 05, 05]
 
-A429; [7A 92 18, 05, 05]
+A412; [77 92 FB, 05, 05]
 
-A42A; [7A 92 20, 05, 05]
+A413; [77 93 05, 05, 05]
 
-A42B; [7A 92 28, 05, 05]
+A414; [77 93 0D, 05, 05]
 
-A42C; [7A 92 30, 05, 05]
+A415; [77 93 15, 05, 05]
 
-A42D; [7A 92 38, 05, 05]
+A416; [77 93 1D, 05, 05]
 
-A42E; [7A 92 40, 05, 05]
+A417; [77 93 25, 05, 05]
 
-A42F; [7A 92 48, 05, 05]
+A418; [77 93 2D, 05, 05]
 
-A430; [7A 92 50, 05, 05]
+A419; [77 93 35, 05, 05]
 
-A431; [7A 92 58, 05, 05]
+A41A; [77 93 3D, 05, 05]
 
-A432; [7A 92 60, 05, 05]
+A41B; [77 93 45, 05, 05]
 
-A433; [7A 92 68, 05, 05]
+A41C; [77 93 4D, 05, 05]
 
-A434; [7A 92 70, 05, 05]
+A41D; [77 93 55, 05, 05]
 
-A435; [7A 92 78, 05, 05]
+A41E; [77 93 5D, 05, 05]
 
-A436; [7A 92 80, 05, 05]
+A41F; [77 93 65, 05, 05]
 
-A437; [7A 92 88, 05, 05]
+A420; [77 93 6D, 05, 05]
 
-A438; [7A 92 90, 05, 05]
+A421; [77 93 75, 05, 05]
 
-A439; [7A 92 98, 05, 05]
+A422; [77 93 7D, 05, 05]
 
-A43A; [7A 92 A0, 05, 05]
+A423; [77 93 85, 05, 05]
 
-A43B; [7A 92 A8, 05, 05]
+A424; [77 93 8D, 05, 05]
 
-A43C; [7A 92 B0, 05, 05]
+A425; [77 93 95, 05, 05]
 
-A43D; [7A 92 B8, 05, 05]
+A426; [77 93 9D, 05, 05]
 
-A43E; [7A 92 C0, 05, 05]
+A427; [77 93 A5, 05, 05]
 
-A43F; [7A 92 C8, 05, 05]
+A428; [77 93 AD, 05, 05]
 
-A440; [7A 92 D0, 05, 05]
+A429; [77 93 B5, 05, 05]
 
-A441; [7A 92 D8, 05, 05]
+A42A; [77 93 BD, 05, 05]
 
-A442; [7A 92 E0, 05, 05]
+A42B; [77 93 C5, 05, 05]
 
-A443; [7A 92 E8, 05, 05]
+A42C; [77 93 CD, 05, 05]
 
-A444; [7A 92 F0, 05, 05]
+A42D; [77 93 D5, 05, 05]
 
-A445; [7A 92 F8, 05, 05]
+A42E; [77 93 DD, 05, 05]
 
-A446; [7A 93 06, 05, 05]
+A42F; [77 93 E5, 05, 05]
 
-A447; [7A 93 0E, 05, 05]
+A430; [77 93 ED, 05, 05]
 
-A448; [7A 93 16, 05, 05]
+A431; [77 93 F5, 05, 05]
 
-A449; [7A 93 1E, 05, 05]
+A432; [77 93 FD, 05, 05]
 
-A44A; [7A 93 26, 05, 05]
+A433; [77 94 07, 05, 05]
 
-A44B; [7A 93 2E, 05, 05]
+A434; [77 94 0F, 05, 05]
 
-A44C; [7A 93 36, 05, 05]
+A435; [77 94 17, 05, 05]
 
-A44D; [7A 93 3E, 05, 05]
+A436; [77 94 1F, 05, 05]
 
-A44E; [7A 93 46, 05, 05]
+A437; [77 94 27, 05, 05]
 
-A44F; [7A 93 4E, 05, 05]
+A438; [77 94 2F, 05, 05]
 
-A450; [7A 93 56, 05, 05]
+A439; [77 94 37, 05, 05]
 
-A451; [7A 93 5E, 05, 05]
+A43A; [77 94 3F, 05, 05]
 
-A452; [7A 93 66, 05, 05]
+A43B; [77 94 47, 05, 05]
 
-A453; [7A 93 6E, 05, 05]
+A43C; [77 94 4F, 05, 05]
 
-A454; [7A 93 76, 05, 05]
+A43D; [77 94 57, 05, 05]
 
-A455; [7A 93 7E, 05, 05]
+A43E; [77 94 5F, 05, 05]
 
-A456; [7A 93 86, 05, 05]
+A43F; [77 94 67, 05, 05]
 
-A457; [7A 93 8E, 05, 05]
+A440; [77 94 6F, 05, 05]
 
-A458; [7A 93 96, 05, 05]
+A441; [77 94 77, 05, 05]
 
-A459; [7A 93 9E, 05, 05]
+A442; [77 94 7F, 05, 05]
 
-A45A; [7A 93 A6, 05, 05]
+A443; [77 94 87, 05, 05]
 
-A45B; [7A 93 AE, 05, 05]
+A444; [77 94 8F, 05, 05]
 
-A45C; [7A 93 B6, 05, 05]
+A445; [77 94 97, 05, 05]
 
-A45D; [7A 93 BE, 05, 05]
+A446; [77 94 9F, 05, 05]
 
-A45E; [7A 93 C6, 05, 05]
+A447; [77 94 A7, 05, 05]
 
-A45F; [7A 93 CE, 05, 05]
+A448; [77 94 AF, 05, 05]
 
-A460; [7A 93 D6, 05, 05]
+A449; [77 94 B7, 05, 05]
 
-A461; [7A 93 DE, 05, 05]
+A44A; [77 94 BF, 05, 05]
 
-A462; [7A 93 E6, 05, 05]
+A44B; [77 94 C7, 05, 05]
 
-A463; [7A 93 EE, 05, 05]
+A44C; [77 94 CF, 05, 05]
 
-A464; [7A 93 F6, 05, 05]
+A44D; [77 94 D7, 05, 05]
 
-A465; [7A 94 04, 05, 05]
+A44E; [77 94 DF, 05, 05]
 
-A466; [7A 94 0C, 05, 05]
+A44F; [77 94 E7, 05, 05]
 
-A467; [7A 94 14, 05, 05]
+A450; [77 94 EF, 05, 05]
 
-A468; [7A 94 1C, 05, 05]
+A451; [77 94 F7, 05, 05]
 
-A469; [7A 94 24, 05, 05]
+A452; [77 94 FF, 05, 05]
 
-A46A; [7A 94 2C, 05, 05]
+A453; [77 95 09, 05, 05]
 
-A46B; [7A 94 34, 05, 05]
+A454; [77 95 11, 05, 05]
 
-A46C; [7A 94 3C, 05, 05]
+A455; [77 95 19, 05, 05]
 
-A46D; [7A 94 44, 05, 05]
+A456; [77 95 21, 05, 05]
 
-A46E; [7A 94 4C, 05, 05]
+A457; [77 95 29, 05, 05]
 
-A46F; [7A 94 54, 05, 05]
+A458; [77 95 31, 05, 05]
 
-A470; [7A 94 5C, 05, 05]
+A459; [77 95 39, 05, 05]
 
-A471; [7A 94 64, 05, 05]
+A45A; [77 95 41, 05, 05]
 
-A472; [7A 94 6C, 05, 05]
+A45B; [77 95 49, 05, 05]
 
-A473; [7A 94 74, 05, 05]
+A45C; [77 95 51, 05, 05]
 
-A474; [7A 94 7C, 05, 05]
+A45D; [77 95 59, 05, 05]
 
-A475; [7A 94 84, 05, 05]
+A45E; [77 95 61, 05, 05]
 
-A476; [7A 94 8C, 05, 05]
+A45F; [77 95 69, 05, 05]
 
-A477; [7A 94 94, 05, 05]
+A460; [77 95 71, 05, 05]
 
-A478; [7A 94 9C, 05, 05]
+A461; [77 95 79, 05, 05]
 
-A479; [7A 94 A4, 05, 05]
+A462; [77 95 81, 05, 05]
 
-A47A; [7A 94 AC, 05, 05]
+A463; [77 95 89, 05, 05]
 
-A47B; [7A 94 B4, 05, 05]
+A464; [77 95 91, 05, 05]
 
-A47C; [7A 94 BC, 05, 05]
+A465; [77 95 99, 05, 05]
 
-A47D; [7A 94 C4, 05, 05]
+A466; [77 95 A1, 05, 05]
 
-A47E; [7A 94 CC, 05, 05]
+A467; [77 95 A9, 05, 05]
 
-A47F; [7A 94 D4, 05, 05]
+A468; [77 95 B1, 05, 05]
 
-A480; [7A 94 DC, 05, 05]
+A469; [77 95 B9, 05, 05]
 
-A481; [7A 94 E4, 05, 05]
+A46A; [77 95 C1, 05, 05]
 
-A482; [7A 94 EC, 05, 05]
+A46B; [77 95 C9, 05, 05]
 
-A483; [7A 94 F4, 05, 05]
+A46C; [77 95 D1, 05, 05]
 
-A484; [7A 94 FC, 05, 05]
+A46D; [77 95 D9, 05, 05]
 
-A485; [7A 95 0A, 05, 05]
+A46E; [77 95 E1, 05, 05]
 
-A486; [7A 95 12, 05, 05]
+A46F; [77 95 E9, 05, 05]
 
-A487; [7A 95 1A, 05, 05]
+A470; [77 95 F1, 05, 05]
 
-A488; [7A 95 22, 05, 05]
+A471; [77 95 F9, 05, 05]
 
-A489; [7A 95 2A, 05, 05]
+A472; [77 96 03, 05, 05]
 
-A48A; [7A 95 32, 05, 05]
+A473; [77 96 0B, 05, 05]
 
-A48B; [7A 95 3A, 05, 05]
+A474; [77 96 13, 05, 05]
 
-A48C; [7A 95 42, 05, 05]
+A475; [77 96 1B, 05, 05]
 
-A4F8; [7A 95 4A, 05, 05]
+A476; [77 96 23, 05, 05]
 
-A4F9; [7A 95 52, 05, 05]
+A477; [77 96 2B, 05, 05]
 
-A4FA; [7A 95 5A, 05, 05]
+A478; [77 96 33, 05, 05]
 
-A4FB; [7A 95 62, 05, 05]
+A479; [77 96 3B, 05, 05]
 
-A4FD; [7A 95 6A, 05, 05]
+A47A; [77 96 43, 05, 05]
 
-A4FC; [7A 95 72, 05, 05]
+A47B; [77 96 4B, 05, 05]
 
-A4D0; [7A 95 7A, 05, 05]
+A47C; [77 96 53, 05, 05]
 
-A4D1; [7A 95 82, 05, 05]
+A47D; [77 96 5B, 05, 05]
 
-A4D2; [7A 95 8A, 05, 05]
+A47E; [77 96 63, 05, 05]
 
-A4D3; [7A 95 92, 05, 05]
+A47F; [77 96 6B, 05, 05]
 
-A4D4; [7A 95 9A, 05, 05]
+A480; [77 96 73, 05, 05]
 
-A4D5; [7A 95 A2, 05, 05]
+A481; [77 96 7B, 05, 05]
 
-A4D6; [7A 95 AA, 05, 05]
+A482; [77 96 83, 05, 05]
 
-A4D7; [7A 95 B2, 05, 05]
+A483; [77 96 8B, 05, 05]
 
-A4D8; [7A 95 BA, 05, 05]
+A484; [77 96 93, 05, 05]
 
-A4D9; [7A 95 C2, 05, 05]
+A485; [77 96 9B, 05, 05]
 
-A4DA; [7A 95 CA, 05, 05]
+A486; [77 96 A3, 05, 05]
 
-A4DB; [7A 95 D2, 05, 05]
+A487; [77 96 AB, 05, 05]
 
-A4DC; [7A 95 DA, 05, 05]
+A488; [77 96 B3, 05, 05]
 
-A4DD; [7A 95 E2, 05, 05]
+A489; [77 96 BB, 05, 05]
 
-A4DE; [7A 95 EA, 05, 05]
+A48A; [77 96 C3, 05, 05]
 
-A4DF; [7A 95 F2, 05, 05]
+A48B; [77 96 CB, 05, 05]
 
-A4E0; [7A 95 FA, 05, 05]
+A48C; [77 96 D3, 05, 05]
 
-A4E1; [7A 96 08, 05, 05]
+FDD1 A4D0;     [77 96 FC, 05, 05]      # Lisu first primary
 
-A4E2; [7A 96 10, 05, 05]
+A4F8; [77 97 27, 05, 05]
 
-A4E3; [7A 96 18, 05, 05]
+A4F9; [77 97 2F, 05, 05]
 
-A4E4; [7A 96 20, 05, 05]
+A4FA; [77 97 37, 05, 05]
 
-A4E5; [7A 96 28, 05, 05]
+A4FB; [77 97 3F, 05, 05]
 
-A4E6; [7A 96 30, 05, 05]
+A4FD; [77 97 47, 05, 05]
 
-A4E7; [7A 96 38, 05, 05]
+A4FC; [77 97 4F, 05, 05]
 
-A4E8; [7A 96 40, 05, 05]
+A4D0; [77 97 57, 05, 05]
 
-A4E9; [7A 96 48, 05, 05]
+A4D1; [77 97 5F, 05, 05]
 
-A4EB; [7A 96 50, 05, 05]
+A4D2; [77 97 67, 05, 05]
 
-A4ED; [7A 96 58, 05, 05]
+A4D3; [77 97 6F, 05, 05]
 
-A4EA; [7A 96 60, 05, 05]
+A4D4; [77 97 77, 05, 05]
 
-A4EC; [7A 96 68, 05, 05]
+A4D5; [77 97 7F, 05, 05]
 
-A4EE; [7A 96 70, 05, 05]
+A4D6; [77 97 87, 05, 05]
 
-A4EF; [7A 96 78, 05, 05]
+A4D7; [77 97 8F, 05, 05]
 
-A4F0; [7A 96 80, 05, 05]
+A4D8; [77 97 97, 05, 05]
 
-A4F1; [7A 96 88, 05, 05]
+A4D9; [77 97 9F, 05, 05]
 
-A4F2; [7A 96 90, 05, 05]
+A4DA; [77 97 A7, 05, 05]
 
-A4F3; [7A 96 98, 05, 05]
+A4DB; [77 97 AF, 05, 05]
 
-A4F4; [7A 96 A0, 05, 05]
+A4DC; [77 97 B7, 05, 05]
 
-A4F5; [7A 96 A8, 05, 05]
+A4DD; [77 97 BF, 05, 05]
 
-A4F6; [7A 96 B0, 05, 05]
+A4DE; [77 97 C7, 05, 05]
 
-A4F7; [7A 96 B8, 05, 05]
+A4DF; [77 97 CF, 05, 05]
 
-16F00; [7A 96 C0, 05, 05]
+A4E0; [77 97 D7, 05, 05]
 
-16F01; [7A 96 C8, 05, 05]
+A4E1; [77 97 DF, 05, 05]
 
-16F02; [7A 96 D0, 05, 05]
+A4E2; [77 97 E7, 05, 05]
 
-16F03; [7A 96 D8, 05, 05]
+A4E3; [77 97 EF, 05, 05]
 
-16F04; [7A 96 E0, 05, 05]
-16F06; [7A 96 E0, 05, 09]
+A4E4; [77 97 F7, 05, 05]
 
-16F05; [7A 96 E8, 05, 05]
+A4E5; [77 97 FF, 05, 05]
 
-16F07; [7A 96 F0, 05, 05]
+A4E6; [77 98 09, 05, 05]
 
-16F08; [7A 96 F8, 05, 05]
+A4E7; [77 98 11, 05, 05]
 
-16F09; [7A 97 06, 05, 05]
+A4E8; [77 98 19, 05, 05]
 
-16F0A; [7A 97 0E, 05, 05]
+A4E9; [77 98 21, 05, 05]
 
-16F0B; [7A 97 16, 05, 05]
+A4EB; [77 98 29, 05, 05]
 
-16F0C; [7A 97 1E, 05, 05]
+A4ED; [77 98 31, 05, 05]
 
-16F0D; [7A 97 26, 05, 05]
+A4EA; [77 98 39, 05, 05]
 
-16F0E; [7A 97 2E, 05, 05]
+A4EC; [77 98 41, 05, 05]
 
-16F0F; [7A 97 36, 05, 05]
+A4EE; [77 98 49, 05, 05]
 
-16F10; [7A 97 3E, 05, 05]
-16F13; [7A 97 3E, 05, 09]
+A4EF; [77 98 51, 05, 05]
 
-16F11; [7A 97 46, 05, 05]
+A4F0; [77 98 59, 05, 05]
 
-16F12; [7A 97 4E, 05, 05]
+A4F1; [77 98 61, 05, 05]
 
-16F14; [7A 97 56, 05, 05]
+A4F2; [77 98 69, 05, 05]
 
-16F15; [7A 97 5E, 05, 05]
+A4F3; [77 98 71, 05, 05]
 
-16F16; [7A 97 66, 05, 05]
+A4F4; [77 98 79, 05, 05]
 
-16F17; [7A 97 6E, 05, 05]
+A4F5; [77 98 81, 05, 05]
 
-16F18; [7A 97 76, 05, 05]
+A4F6; [77 98 89, 05, 05]
 
-16F19; [7A 97 7E, 05, 05]
+A4F7; [77 98 91, 05, 05]
 
-16F1A; [7A 97 86, 05, 05]
+FDD1 16F00;    [77 98 BA, 05, 05]      # Miao first primary
 
-16F1B; [7A 97 8E, 05, 05]
+16F00; [77 98 E3, 05, 05]
 
-16F1C; [7A 97 96, 05, 05]
+16F01; [77 98 EB, 05, 05]
 
-16F1D; [7A 97 9E, 05, 05]
+16F02; [77 98 F3, 05, 05]
 
-16F1E; [7A 97 A6, 05, 05]
+16F03; [77 98 FB, 05, 05]
 
-16F1F; [7A 97 AE, 05, 05]
+16F04; [77 99 05, 05, 05]
+16F06; [77 99 05, 05, 20]
 
-16F20; [7A 97 B6, 05, 05]
+16F05; [77 99 0D, 05, 05]
 
-16F21; [7A 97 BE, 05, 05]
+16F07; [77 99 15, 05, 05]
 
-16F22; [7A 97 C6, 05, 05]
+16F08; [77 99 1D, 05, 05]
 
-16F23; [7A 97 CE, 05, 05]
-16F25; [7A 97 CE, 05, 09]
+16F09; [77 99 25, 05, 05]
 
-16F24; [7A 97 D6, 05, 05]
+16F0A; [77 99 2D, 05, 05]
 
-16F26; [7A 97 DE, 05, 05]
+16F0B; [77 99 35, 05, 05]
 
-16F27; [7A 97 E6, 05, 05]
+16F0C; [77 99 3D, 05, 05]
 
-16F28; [7A 97 EE, 05, 05]
+16F0D; [77 99 45, 05, 05]
 
-16F29; [7A 97 F6, 05, 05]
+16F0E; [77 99 4D, 05, 05]
 
-16F2A; [7A 98 04, 05, 05]
+16F0F; [77 99 55, 05, 05]
 
-16F2B; [7A 98 0C, 05, 05]
+16F10; [77 99 5D, 05, 05]
+16F13; [77 99 5D, 05, 20]
 
-16F2C; [7A 98 14, 05, 05]
+16F11; [77 99 65, 05, 05]
 
-16F2D; [7A 98 1C, 05, 05]
+16F12; [77 99 6D, 05, 05]
 
-16F2E; [7A 98 24, 05, 05]
+16F14; [77 99 75, 05, 05]
 
-16F2F; [7A 98 2C, 05, 05]
+16F15; [77 99 7D, 05, 05]
 
-16F30; [7A 98 34, 05, 05]
+16F16; [77 99 85, 05, 05]
 
-16F31; [7A 98 3C, 05, 05]
+16F17; [77 99 8D, 05, 05]
 
-16F32; [7A 98 44, 05, 05]
+16F18; [77 99 95, 05, 05]
 
-16F33; [7A 98 4C, 05, 05]
+16F19; [77 99 9D, 05, 05]
 
-16F34; [7A 98 54, 05, 05]
+16F1A; [77 99 A5, 05, 05]
 
-16F35; [7A 98 5C, 05, 05]
+16F1B; [77 99 AD, 05, 05]
 
-16F36; [7A 98 64, 05, 05]
+16F1C; [77 99 B5, 05, 05]
 
-16F37; [7A 98 6C, 05, 05]
+16F1D; [77 99 BD, 05, 05]
 
-16F38; [7A 98 74, 05, 05]
+16F1E; [77 99 C5, 05, 05]
 
-16F39; [7A 98 7C, 05, 05]
+16F1F; [77 99 CD, 05, 05]
 
-16F3A; [7A 98 84, 05, 05]
+16F20; [77 99 D5, 05, 05]
 
-16F3B; [7A 98 8C, 05, 05]
+16F21; [77 99 DD, 05, 05]
 
-16F3C; [7A 98 94, 05, 05]
+16F22; [77 99 E5, 05, 05]
 
-16F3D; [7A 98 9C, 05, 05]
-16F3F; [7A 98 9C, 05, 09]
+16F23; [77 99 ED, 05, 05]
+16F25; [77 99 ED, 05, 20]
 
-16F3E; [7A 98 A4, 05, 05]
+16F24; [77 99 F5, 05, 05]
 
-16F40; [7A 98 AC, 05, 05]
+16F26; [77 99 FD, 05, 05]
 
-16F41; [7A 98 B4, 05, 05]
+16F27; [77 9A 07, 05, 05]
 
-16F42; [7A 98 BC, 05, 05]
+16F28; [77 9A 0F, 05, 05]
 
-16F43; [7A 98 C4, 05, 05]
+16F29; [77 9A 17, 05, 05]
 
-16F44; [7A 98 CC, 05, 05]
+16F2A; [77 9A 1F, 05, 05]
 
-16F50; [7A 98 D4, 05, 05]
+16F2B; [77 9A 27, 05, 05]
 
-16F51; [7A 98 DC, 05, 05]
+16F2C; [77 9A 2F, 05, 05]
 
-16F52; [7A 98 E4, 05, 05]
+16F2D; [77 9A 37, 05, 05]
 
-16F53; [7A 98 EC, 05, 05]
+16F2E; [77 9A 3F, 05, 05]
 
-16F54; [7A 98 F4, 05, 05]
+16F2F; [77 9A 47, 05, 05]
 
-16F55; [7A 98 FC, 05, 05]
+16F30; [77 9A 4F, 05, 05]
 
-16F56; [7A 99 0A, 05, 05]
+16F31; [77 9A 57, 05, 05]
 
-16F57; [7A 99 12, 05, 05]
+16F32; [77 9A 5F, 05, 05]
 
-16F58; [7A 99 1A, 05, 05]
+16F33; [77 9A 67, 05, 05]
 
-16F59; [7A 99 22, 05, 05]
+16F34; [77 9A 6F, 05, 05]
 
-16F5A; [7A 99 2A, 05, 05]
+16F35; [77 9A 77, 05, 05]
 
-16F5B; [7A 99 32, 05, 05]
+16F36; [77 9A 7F, 05, 05]
 
-16F5C; [7A 99 3A, 05, 05]
+16F37; [77 9A 87, 05, 05]
 
-16F5D; [7A 99 42, 05, 05]
+16F38; [77 9A 8F, 05, 05]
 
-16F5E; [7A 99 4A, 05, 05]
+16F39; [77 9A 97, 05, 05]
 
-16F5F; [7A 99 52, 05, 05]
+16F3A; [77 9A 9F, 05, 05]
 
-16F60; [7A 99 5A, 05, 05]
+16F3B; [77 9A A7, 05, 05]
 
-16F61; [7A 99 62, 05, 05]
+16F3C; [77 9A AF, 05, 05]
 
-16F62; [7A 99 6A, 05, 05]
+16F3D; [77 9A B7, 05, 05]
+16F3F; [77 9A B7, 05, 20]
 
-16F63; [7A 99 72, 05, 05]
+16F3E; [77 9A BF, 05, 05]
 
-16F64; [7A 99 7A, 05, 05]
+16F40; [77 9A C7, 05, 05]
 
-16F65; [7A 99 82, 05, 05]
+16F41; [77 9A CF, 05, 05]
 
-16F66; [7A 99 8A, 05, 05]
+16F42; [77 9A D7, 05, 05]
 
-16F67; [7A 99 92, 05, 05]
+16F43; [77 9A DF, 05, 05]
 
-16F68; [7A 99 9A, 05, 05]
+16F44; [77 9A E7, 05, 05]
 
-16F69; [7A 99 A2, 05, 05]
+16F50; [77 9A EF, 05, 05]
 
-16F6A; [7A 99 AA, 05, 05]
+16F51; [77 9A F7, 05, 05]
 
-16F6B; [7A 99 B2, 05, 05]
+16F52; [77 9A FF, 05, 05]
 
-16F6C; [7A 99 BA, 05, 05]
+16F53; [77 9B 09, 05, 05]
 
-16F6D; [7A 99 C2, 05, 05]
+16F54; [77 9B 11, 05, 05]
 
-16F6E; [7A 99 CA, 05, 05]
+16F55; [77 9B 19, 05, 05]
 
-16F6F; [7A 99 D2, 05, 05]
+16F56; [77 9B 21, 05, 05]
 
-16F70; [7A 99 DA, 05, 05]
+16F57; [77 9B 29, 05, 05]
 
-16F71; [7A 99 E2, 05, 05]
+16F58; [77 9B 31, 05, 05]
 
-16F72; [7A 99 EA, 05, 05]
+16F59; [77 9B 39, 05, 05]
 
-16F73; [7A 99 F2, 05, 05]
+16F5A; [77 9B 41, 05, 05]
 
-16F74; [7A 99 FA, 05, 05]
+16F5B; [77 9B 49, 05, 05]
 
-16F75; [7A 9A 08, 05, 05]
+16F5C; [77 9B 51, 05, 05]
 
-16F76; [7A 9A 10, 05, 05]
+16F5D; [77 9B 59, 05, 05]
 
-16F77; [7A 9A 18, 05, 05]
+16F5E; [77 9B 61, 05, 05]
 
-16F78; [7A 9A 20, 05, 05]
+16F5F; [77 9B 69, 05, 05]
 
-16F79; [7A 9A 28, 05, 05]
+16F60; [77 9B 71, 05, 05]
 
-16F7A; [7A 9A 30, 05, 05]
+16F61; [77 9B 79, 05, 05]
 
-16F7B; [7A 9A 38, 05, 05]
+16F62; [77 9B 81, 05, 05]
 
-16F7C; [7A 9A 40, 05, 05]
+16F63; [77 9B 89, 05, 05]
 
-16F7D; [7A 9A 48, 05, 05]
+16F64; [77 9B 91, 05, 05]
 
-16F7E; [7A 9A 50, 05, 05]
+16F65; [77 9B 99, 05, 05]
 
-16F8F; [7A 9A 58, 05, 05]
+16F66; [77 9B A1, 05, 05]
 
-16F90; [7A 9A 60, 05, 05]
+16F67; [77 9B A9, 05, 05]
 
-16F91; [7A 9A 68, 05, 05]
+16F68; [77 9B B1, 05, 05]
 
-16F92; [7A 9A 70, 05, 05]
+16F69; [77 9B B9, 05, 05]
 
-16F93; [7A 9A 78, 05, 05]
+16F6A; [77 9B C1, 05, 05]
 
-16F94; [7A 9A 80, 05, 05]
+16F6B; [77 9B C9, 05, 05]
 
-16F95; [7A 9A 88, 05, 05]
+16F6C; [77 9B D1, 05, 05]
 
-16F96; [7A 9A 90, 05, 05]
+16F6D; [77 9B D9, 05, 05]
 
-16F97; [7A 9A 98, 05, 05]
+16F6E; [77 9B E1, 05, 05]
 
-16F98; [7A 9A A0, 05, 05]
+16F6F; [77 9B E9, 05, 05]
 
-16F99; [7A 9A A8, 05, 05]
+16F70; [77 9B F1, 05, 05]
 
-16F9A; [7A 9A B0, 05, 05]
+16F71; [77 9B F9, 05, 05]
 
-16F9B; [7A 9A B8, 05, 05]
+16F72; [77 9C 03, 05, 05]
 
-16F9C; [7A 9A C0, 05, 05]
+16F73; [77 9C 0B, 05, 05]
 
-16F9D; [7A 9A C8, 05, 05]
+16F74; [77 9C 13, 05, 05]
 
-16F9E; [7A 9A D0, 05, 05]
+16F75; [77 9C 1B, 05, 05]
 
-16F9F; [7A 9A D8, 05, 05]
+16F76; [77 9C 23, 05, 05]
 
-10280; [7A 9A E0, 05, 05]
+16F77; [77 9C 2B, 05, 05]
 
-10281; [7A 9A E8, 05, 05]
+16F78; [77 9C 33, 05, 05]
 
-10282; [7A 9A F0, 05, 05]
+16F79; [77 9C 3B, 05, 05]
 
-10283; [7A 9A F8, 05, 05]
+16F7A; [77 9C 43, 05, 05]
 
-10284; [7A 9B 06, 05, 05]
+16F7B; [77 9C 4B, 05, 05]
 
-10285; [7A 9B 0E, 05, 05]
+16F7C; [77 9C 53, 05, 05]
 
-10286; [7A 9B 16, 05, 05]
+16F7D; [77 9C 5B, 05, 05]
 
-10287; [7A 9B 1E, 05, 05]
+16F7E; [77 9C 63, 05, 05]
 
-10288; [7A 9B 26, 05, 05]
+16F8F; [77 9C 6B, 05, 05]
 
-10289; [7A 9B 2E, 05, 05]
+16F90; [77 9C 73, 05, 05]
 
-1028A; [7A 9B 36, 05, 05]
+16F91; [77 9C 7B, 05, 05]
 
-1028B; [7A 9B 3E, 05, 05]
+16F92; [77 9C 83, 05, 05]
 
-1028C; [7A 9B 46, 05, 05]
+16F93; [77 9C 8B, 05, 05]
 
-1028D; [7A 9B 4E, 05, 05]
+16F94; [77 9C 93, 05, 05]
 
-1028E; [7A 9B 56, 05, 05]
+16F95; [77 9C 9B, 05, 05]
 
-1028F; [7A 9B 5E, 05, 05]
+16F96; [77 9C A3, 05, 05]
 
-10290; [7A 9B 66, 05, 05]
+16F97; [77 9C AB, 05, 05]
 
-10291; [7A 9B 6E, 05, 05]
+16F98; [77 9C B3, 05, 05]
 
-10292; [7A 9B 76, 05, 05]
+16F99; [77 9C BB, 05, 05]
 
-10293; [7A 9B 7E, 05, 05]
+16F9A; [77 9C C3, 05, 05]
 
-10294; [7A 9B 86, 05, 05]
+16F9B; [77 9C CB, 05, 05]
 
-10295; [7A 9B 8E, 05, 05]
+16F9C; [77 9C D3, 05, 05]
 
-10296; [7A 9B 96, 05, 05]
+16F9D; [77 9C DB, 05, 05]
 
-10297; [7A 9B 9E, 05, 05]
+16F9E; [77 9C E3, 05, 05]
 
-10298; [7A 9B A6, 05, 05]
+16F9F; [77 9C EB, 05, 05]
 
-10299; [7A 9B AE, 05, 05]
+FDD1 10280;    [77 9D 16, 05, 05]      # Lycian first primary
 
-1029A; [7A 9B B6, 05, 05]
+10280; [77 9D 3F, 05, 05]
 
-1029B; [7A 9B BE, 05, 05]
+10281; [77 9D 47, 05, 05]
 
-1029C; [7A 9B C6, 05, 05]
+10282; [77 9D 4F, 05, 05]
 
-102A0; [7A 9B CE, 05, 05]
+10283; [77 9D 57, 05, 05]
 
-102A1; [7A 9B D6, 05, 05]
+10284; [77 9D 5F, 05, 05]
 
-102A2; [7A 9B DE, 05, 05]
+10285; [77 9D 67, 05, 05]
 
-102A3; [7A 9B E6, 05, 05]
+10286; [77 9D 6F, 05, 05]
 
-102A4; [7A 9B EE, 05, 05]
+10287; [77 9D 77, 05, 05]
 
-102A5; [7A 9B F6, 05, 05]
+10288; [77 9D 7F, 05, 05]
 
-102A6; [7A 9C 04, 05, 05]
+10289; [77 9D 87, 05, 05]
 
-102A7; [7A 9C 0C, 05, 05]
+1028A; [77 9D 8F, 05, 05]
 
-102A8; [7A 9C 14, 05, 05]
+1028B; [77 9D 97, 05, 05]
 
-102A9; [7A 9C 1C, 05, 05]
+1028C; [77 9D 9F, 05, 05]
 
-102AA; [7A 9C 24, 05, 05]
+1028D; [77 9D A7, 05, 05]
 
-102AB; [7A 9C 2C, 05, 05]
+1028E; [77 9D AF, 05, 05]
 
-102AC; [7A 9C 34, 05, 05]
+1028F; [77 9D B7, 05, 05]
 
-102AD; [7A 9C 3C, 05, 05]
+10290; [77 9D BF, 05, 05]
 
-102AE; [7A 9C 44, 05, 05]
+10291; [77 9D C7, 05, 05]
 
-102AF; [7A 9C 4C, 05, 05]
+10292; [77 9D CF, 05, 05]
 
-102B0; [7A 9C 54, 05, 05]
+10293; [77 9D D7, 05, 05]
 
-102B1; [7A 9C 5C, 05, 05]
+10294; [77 9D DF, 05, 05]
 
-102B2; [7A 9C 64, 05, 05]
+10295; [77 9D E7, 05, 05]
 
-102B3; [7A 9C 6C, 05, 05]
+10296; [77 9D EF, 05, 05]
 
-102B4; [7A 9C 74, 05, 05]
+10297; [77 9D F7, 05, 05]
 
-102B5; [7A 9C 7C, 05, 05]
+10298; [77 9D FF, 05, 05]
 
-102B6; [7A 9C 84, 05, 05]
+10299; [77 9E 09, 05, 05]
 
-102B7; [7A 9C 8C, 05, 05]
+1029A; [77 9E 11, 05, 05]
 
-102B8; [7A 9C 94, 05, 05]
+1029B; [77 9E 19, 05, 05]
 
-102B9; [7A 9C 9C, 05, 05]
+1029C; [77 9E 21, 05, 05]
 
-102BA; [7A 9C A4, 05, 05]
+FDD1 102A0;    [77 9E 4A, 05, 05]      # Carian first primary
 
-102BB; [7A 9C AC, 05, 05]
+102A0; [77 9E 73, 05, 05]
 
-102BC; [7A 9C B4, 05, 05]
+102A1; [77 9E 7B, 05, 05]
 
-102BD; [7A 9C BC, 05, 05]
+102A2; [77 9E 83, 05, 05]
 
-102BE; [7A 9C C4, 05, 05]
+102A3; [77 9E 8B, 05, 05]
 
-102BF; [7A 9C CC, 05, 05]
+102A4; [77 9E 93, 05, 05]
 
-102C0; [7A 9C D4, 05, 05]
+102A5; [77 9E 9B, 05, 05]
 
-102C1; [7A 9C DC, 05, 05]
+102A6; [77 9E A3, 05, 05]
 
-102C2; [7A 9C E4, 05, 05]
+102A7; [77 9E AB, 05, 05]
 
-102C3; [7A 9C EC, 05, 05]
+102A8; [77 9E B3, 05, 05]
 
-102C4; [7A 9C F4, 05, 05]
+102A9; [77 9E BB, 05, 05]
 
-102C5; [7A 9C FC, 05, 05]
+102AA; [77 9E C3, 05, 05]
 
-102C6; [7A 9D 0A, 05, 05]
+102AB; [77 9E CB, 05, 05]
 
-102C7; [7A 9D 12, 05, 05]
+102AC; [77 9E D3, 05, 05]
 
-102C8; [7A 9D 1A, 05, 05]
+102AD; [77 9E DB, 05, 05]
 
-102C9; [7A 9D 22, 05, 05]
+102AE; [77 9E E3, 05, 05]
 
-102CA; [7A 9D 2A, 05, 05]
+102AF; [77 9E EB, 05, 05]
 
-102CB; [7A 9D 32, 05, 05]
+102B0; [77 9E F3, 05, 05]
 
-102CC; [7A 9D 3A, 05, 05]
+102B1; [77 9E FB, 05, 05]
 
-102CD; [7A 9D 42, 05, 05]
+102B2; [77 9F 05, 05, 05]
 
-102CE; [7A 9D 4A, 05, 05]
+102B3; [77 9F 0D, 05, 05]
 
-102CF; [7A 9D 52, 05, 05]
+102B4; [77 9F 15, 05, 05]
 
-102D0; [7A 9D 5A, 05, 05]
+102B5; [77 9F 1D, 05, 05]
 
-10920; [7A 9D 62, 05, 05]
+102B6; [77 9F 25, 05, 05]
 
-10921; [7A 9D 6A, 05, 05]
+102B7; [77 9F 2D, 05, 05]
 
-10922; [7A 9D 72, 05, 05]
+102B8; [77 9F 35, 05, 05]
 
-10923; [7A 9D 7A, 05, 05]
+102B9; [77 9F 3D, 05, 05]
 
-10924; [7A 9D 82, 05, 05]
+102BA; [77 9F 45, 05, 05]
 
-10925; [7A 9D 8A, 05, 05]
+102BB; [77 9F 4D, 05, 05]
 
-10926; [7A 9D 92, 05, 05]
+102BC; [77 9F 55, 05, 05]
 
-10927; [7A 9D 9A, 05, 05]
+102BD; [77 9F 5D, 05, 05]
 
-10928; [7A 9D A2, 05, 05]
+102BE; [77 9F 65, 05, 05]
 
-10929; [7A 9D AA, 05, 05]
+102BF; [77 9F 6D, 05, 05]
 
-1092A; [7A 9D B2, 05, 05]
+102C0; [77 9F 75, 05, 05]
 
-1092B; [7A 9D BA, 05, 05]
+102C1; [77 9F 7D, 05, 05]
 
-1092C; [7A 9D C2, 05, 05]
+102C2; [77 9F 85, 05, 05]
 
-1092D; [7A 9D CA, 05, 05]
+102C3; [77 9F 8D, 05, 05]
 
-1092E; [7A 9D D2, 05, 05]
+102C4; [77 9F 95, 05, 05]
 
-1092F; [7A 9D DA, 05, 05]
+102C5; [77 9F 9D, 05, 05]
 
-10930; [7A 9D E2, 05, 05]
+102C6; [77 9F A5, 05, 05]
 
-10931; [7A 9D EA, 05, 05]
+102C7; [77 9F AD, 05, 05]
 
-10932; [7A 9D F2, 05, 05]
+102C8; [77 9F B5, 05, 05]
 
-10933; [7A 9D FA, 05, 05]
+102C9; [77 9F BD, 05, 05]
 
-10934; [7A 9E 08, 05, 05]
+102CA; [77 9F C5, 05, 05]
 
-10935; [7A 9E 10, 05, 05]
+102CB; [77 9F CD, 05, 05]
 
-10936; [7A 9E 18, 05, 05]
+102CC; [77 9F D5, 05, 05]
 
-10937; [7A 9E 20, 05, 05]
+102CD; [77 9F DD, 05, 05]
 
-10938; [7A 9E 28, 05, 05]
+102CE; [77 9F E5, 05, 05]
 
-10939; [7A 9E 30, 05, 05]
+102CF; [77 9F ED, 05, 05]
 
-10300; [7A 9E 38, 05, 05]
+102D0; [77 9F F5, 05, 05]
 
-10301; [7A 9E 40, 05, 05]
+FDD1 10920;    [77 A0 20, 05, 05]      # Lydian first primary
 
-10302; [7A 9E 48, 05, 05]
+10920; [77 A0 49, 05, 05]
 
-10303; [7A 9E 50, 05, 05]
+10921; [77 A0 51, 05, 05]
 
-10304; [7A 9E 58, 05, 05]
+10922; [77 A0 59, 05, 05]
 
-10305; [7A 9E 60, 05, 05]
+10923; [77 A0 61, 05, 05]
 
-10306; [7A 9E 68, 05, 05]
+10924; [77 A0 69, 05, 05]
 
-10307; [7A 9E 70, 05, 05]
+10925; [77 A0 71, 05, 05]
 
-10308; [7A 9E 78, 05, 05]
+10926; [77 A0 79, 05, 05]
 
-10309; [7A 9E 80, 05, 05]
+10927; [77 A0 81, 05, 05]
 
-1030A; [7A 9E 88, 05, 05]
+10928; [77 A0 89, 05, 05]
 
-1030B; [7A 9E 90, 05, 05]
+10929; [77 A0 91, 05, 05]
 
-1030C; [7A 9E 98, 05, 05]
+1092A; [77 A0 99, 05, 05]
 
-1030D; [7A 9E A0, 05, 05]
+1092B; [77 A0 A1, 05, 05]
 
-1030E; [7A 9E A8, 05, 05]
+1092C; [77 A0 A9, 05, 05]
 
-1030F; [7A 9E B0, 05, 05]
+1092D; [77 A0 B1, 05, 05]
 
-10310; [7A 9E B8, 05, 05]
+1092E; [77 A0 B9, 05, 05]
 
-10311; [7A 9E C0, 05, 05]
+1092F; [77 A0 C1, 05, 05]
 
-10312; [7A 9E C8, 05, 05]
+10930; [77 A0 C9, 05, 05]
 
-10313; [7A 9E D0, 05, 05]
+10931; [77 A0 D1, 05, 05]
 
-10314; [7A 9E D8, 05, 05]
+10932; [77 A0 D9, 05, 05]
 
-10315; [7A 9E E0, 05, 05]
+10933; [77 A0 E1, 05, 05]
 
-10316; [7A 9E E8, 05, 05]
+10934; [77 A0 E9, 05, 05]
 
-10317; [7A 9E F0, 05, 05]
+10935; [77 A0 F1, 05, 05]
 
-10318; [7A 9E F8, 05, 05]
+10936; [77 A0 F9, 05, 05]
 
-10319; [7A 9F 06, 05, 05]
+10937; [77 A1 03, 05, 05]
 
-1031A; [7A 9F 0E, 05, 05]
+10938; [77 A1 0B, 05, 05]
 
-1031B; [7A 9F 16, 05, 05]
+10939; [77 A1 13, 05, 05]
 
-1031C; [7A 9F 1E, 05, 05]
+FDD1 10300;    [77 A1 3C, 05, 05]      # OLD_ITALIC first primary
 
-1031D; [7A 9F 26, 05, 05]
+10300; [77 A1 65, 05, 05]
 
-1031E; [7A 9F 2E, 05, 05]
+10301; [77 A1 6D, 05, 05]
 
-10330; [7A 9F 36, 05, 05]
+10302; [77 A1 75, 05, 05]
 
-10331; [7A 9F 3E, 05, 05]
+10303; [77 A1 7D, 05, 05]
 
-10332; [7A 9F 46, 05, 05]
+10304; [77 A1 85, 05, 05]
 
-10333; [7A 9F 4E, 05, 05]
+10305; [77 A1 8D, 05, 05]
 
-10334; [7A 9F 56, 05, 05]
+10306; [77 A1 95, 05, 05]
 
-10335; [7A 9F 5E, 05, 05]
+10307; [77 A1 9D, 05, 05]
 
-10336; [7A 9F 66, 05, 05]
+10308; [77 A1 A5, 05, 05]
 
-10337; [7A 9F 6E, 05, 05]
+10309; [77 A1 AD, 05, 05]
 
-10338; [7A 9F 76, 05, 05]
+1030A; [77 A1 B5, 05, 05]
 
-10339; [7A 9F 7E, 05, 05]
+1030B; [77 A1 BD, 05, 05]
 
-1033A; [7A 9F 86, 05, 05]
+1030C; [77 A1 C5, 05, 05]
 
-1033B; [7A 9F 8E, 05, 05]
+1030D; [77 A1 CD, 05, 05]
 
-1033C; [7A 9F 96, 05, 05]
+1030E; [77 A1 D5, 05, 05]
 
-1033D; [7A 9F 9E, 05, 05]
+1030F; [77 A1 DD, 05, 05]
 
-1033E; [7A 9F A6, 05, 05]
+10310; [77 A1 E5, 05, 05]
 
-1033F; [7A 9F AE, 05, 05]
+10311; [77 A1 ED, 05, 05]
 
-10340; [7A 9F B6, 05, 05]
+10312; [77 A1 F5, 05, 05]
 
-10341; [7A 9F BE, 05, 05]
+10313; [77 A1 FD, 05, 05]
 
-10342; [7A 9F C6, 05, 05]
+10314; [77 A2 07, 05, 05]
 
-10343; [7A 9F CE, 05, 05]
+10315; [77 A2 0F, 05, 05]
 
-10344; [7A 9F D6, 05, 05]
+10316; [77 A2 17, 05, 05]
 
-10345; [7A 9F DE, 05, 05]
+10317; [77 A2 1F, 05, 05]
 
-10346; [7A 9F E6, 05, 05]
+10318; [77 A2 27, 05, 05]
 
-10347; [7A 9F EE, 05, 05]
+10319; [77 A2 2F, 05, 05]
 
-10348; [7A 9F F6, 05, 05]
+1031A; [77 A2 37, 05, 05]
 
-10349; [7A A0 04, 05, 05]
+1031B; [77 A2 3F, 05, 05]
 
-1034A; [7A A0 0C, 05, 05]
+1031C; [77 A2 47, 05, 05]
 
-10428; [7A A0 14, 05, 05]
-10400; [7A A0 14, 05, 8F]
+1031D; [77 A2 4F, 05, 05]
 
-10429; [7A A0 1C, 05, 05]
-10401; [7A A0 1C, 05, 8F]
+1031E; [77 A2 57, 05, 05]
 
-1042A; [7A A0 24, 05, 05]
-10402; [7A A0 24, 05, 8F]
+FDD1 10330;    [77 A2 80, 05, 05]      # GOTHIC first primary
 
-1042B; [7A A0 2C, 05, 05]
-10403; [7A A0 2C, 05, 8F]
+10330; [77 A2 A9, 05, 05]
 
-1042C; [7A A0 34, 05, 05]
-10404; [7A A0 34, 05, 8F]
+10331; [77 A2 B1, 05, 05]
 
-1042D; [7A A0 3C, 05, 05]
-10405; [7A A0 3C, 05, 8F]
+10332; [77 A2 B9, 05, 05]
 
-1042E; [7A A0 44, 05, 05]
-10406; [7A A0 44, 05, 8F]
+10333; [77 A2 C1, 05, 05]
 
-1042F; [7A A0 4C, 05, 05]
-10407; [7A A0 4C, 05, 8F]
+10334; [77 A2 C9, 05, 05]
 
-10430; [7A A0 54, 05, 05]
-10408; [7A A0 54, 05, 8F]
+10335; [77 A2 D1, 05, 05]
 
-10431; [7A A0 5C, 05, 05]
-10409; [7A A0 5C, 05, 8F]
+10336; [77 A2 D9, 05, 05]
 
-10432; [7A A0 64, 05, 05]
-1040A; [7A A0 64, 05, 8F]
+10337; [77 A2 E1, 05, 05]
 
-10433; [7A A0 6C, 05, 05]
-1040B; [7A A0 6C, 05, 8F]
+10338; [77 A2 E9, 05, 05]
 
-10434; [7A A0 74, 05, 05]
-1040C; [7A A0 74, 05, 8F]
+10339; [77 A2 F1, 05, 05]
 
-10435; [7A A0 7C, 05, 05]
-1040D; [7A A0 7C, 05, 8F]
+1033A; [77 A2 F9, 05, 05]
 
-10436; [7A A0 84, 05, 05]
-1040E; [7A A0 84, 05, 8F]
+1033B; [77 A3 03, 05, 05]
 
-10437; [7A A0 8C, 05, 05]
-1040F; [7A A0 8C, 05, 8F]
+1033C; [77 A3 0B, 05, 05]
 
-10438; [7A A0 94, 05, 05]
-10410; [7A A0 94, 05, 8F]
+1033D; [77 A3 13, 05, 05]
 
-10439; [7A A0 9C, 05, 05]
-10411; [7A A0 9C, 05, 8F]
+1033E; [77 A3 1B, 05, 05]
 
-1043A; [7A A0 A4, 05, 05]
-10412; [7A A0 A4, 05, 8F]
+1033F; [77 A3 23, 05, 05]
 
-1043B; [7A A0 AC, 05, 05]
-10413; [7A A0 AC, 05, 8F]
+10340; [77 A3 2B, 05, 05]
 
-1043C; [7A A0 B4, 05, 05]
-10414; [7A A0 B4, 05, 8F]
+10341; [77 A3 33, 05, 05]
 
-1043D; [7A A0 BC, 05, 05]
-10415; [7A A0 BC, 05, 8F]
+10342; [77 A3 3B, 05, 05]
 
-1043E; [7A A0 C4, 05, 05]
-10416; [7A A0 C4, 05, 8F]
+10343; [77 A3 43, 05, 05]
 
-1043F; [7A A0 CC, 05, 05]
-10417; [7A A0 CC, 05, 8F]
+10344; [77 A3 4B, 05, 05]
 
-10440; [7A A0 D4, 05, 05]
-10418; [7A A0 D4, 05, 8F]
+10345; [77 A3 53, 05, 05]
 
-10441; [7A A0 DC, 05, 05]
-10419; [7A A0 DC, 05, 8F]
+10346; [77 A3 5B, 05, 05]
 
-10442; [7A A0 E4, 05, 05]
-1041A; [7A A0 E4, 05, 8F]
+10347; [77 A3 63, 05, 05]
 
-10443; [7A A0 EC, 05, 05]
-1041B; [7A A0 EC, 05, 8F]
+10348; [77 A3 6B, 05, 05]
 
-10444; [7A A0 F4, 05, 05]
-1041C; [7A A0 F4, 05, 8F]
+10349; [77 A3 73, 05, 05]
 
-10445; [7A A0 FC, 05, 05]
-1041D; [7A A0 FC, 05, 8F]
+1034A; [77 A3 7B, 05, 05]
 
-10446; [7A A1 0A, 05, 05]
-1041E; [7A A1 0A, 05, 8F]
+FDD1 10414;    [77 A3 A4, 05, 05]      # DESERET first primary
 
-10447; [7A A1 12, 05, 05]
-1041F; [7A A1 12, 05, 8F]
+10428; [77 A3 CD, 05, 05]
+10400; [77 A3 CD, 05, A0]
 
-10448; [7A A1 1A, 05, 05]
-10420; [7A A1 1A, 05, 8F]
+10429; [77 A3 D5, 05, 05]
+10401; [77 A3 D5, 05, A0]
 
-10449; [7A A1 22, 05, 05]
-10421; [7A A1 22, 05, 8F]
+1042A; [77 A3 DD, 05, 05]
+10402; [77 A3 DD, 05, A0]
 
-1044A; [7A A1 2A, 05, 05]
-10422; [7A A1 2A, 05, 8F]
+1042B; [77 A3 E5, 05, 05]
+10403; [77 A3 E5, 05, A0]
 
-1044B; [7A A1 32, 05, 05]
-10423; [7A A1 32, 05, 8F]
+1042C; [77 A3 ED, 05, 05]
+10404; [77 A3 ED, 05, A0]
 
-1044C; [7A A1 3A, 05, 05]
-10424; [7A A1 3A, 05, 8F]
+1042D; [77 A3 F5, 05, 05]
+10405; [77 A3 F5, 05, A0]
 
-1044D; [7A A1 42, 05, 05]
-10425; [7A A1 42, 05, 8F]
+1042E; [77 A3 FD, 05, 05]
+10406; [77 A3 FD, 05, A0]
 
-1044E; [7A A1 4A, 05, 05]
-10426; [7A A1 4A, 05, 8F]
+1042F; [77 A4 07, 05, 05]
+10407; [77 A4 07, 05, A0]
 
-1044F; [7A A1 52, 05, 05]
-10427; [7A A1 52, 05, 8F]
+10430; [77 A4 0F, 05, 05]
+10408; [77 A4 0F, 05, A0]
 
-10450; [7A A1 5A, 05, 05]
+10431; [77 A4 17, 05, 05]
+10409; [77 A4 17, 05, A0]
 
-10451; [7A A1 62, 05, 05]
+10432; [77 A4 1F, 05, 05]
+1040A; [77 A4 1F, 05, A0]
 
-10452; [7A A1 6A, 05, 05]
+10433; [77 A4 27, 05, 05]
+1040B; [77 A4 27, 05, A0]
 
-10453; [7A A1 72, 05, 05]
+10434; [77 A4 2F, 05, 05]
+1040C; [77 A4 2F, 05, A0]
 
-10454; [7A A1 7A, 05, 05]
+10435; [77 A4 37, 05, 05]
+1040D; [77 A4 37, 05, A0]
 
-10455; [7A A1 82, 05, 05]
+10436; [77 A4 3F, 05, 05]
+1040E; [77 A4 3F, 05, A0]
 
-10456; [7A A1 8A, 05, 05]
+10437; [77 A4 47, 05, 05]
+1040F; [77 A4 47, 05, A0]
 
-10457; [7A A1 92, 05, 05]
+10438; [77 A4 4F, 05, 05]
+10410; [77 A4 4F, 05, A0]
 
-10458; [7A A1 9A, 05, 05]
+10439; [77 A4 57, 05, 05]
+10411; [77 A4 57, 05, A0]
 
-10459; [7A A1 A2, 05, 05]
+1043A; [77 A4 5F, 05, 05]
+10412; [77 A4 5F, 05, A0]
 
-1045A; [7A A1 AA, 05, 05]
+1043B; [77 A4 67, 05, 05]
+10413; [77 A4 67, 05, A0]
 
-1045B; [7A A1 B2, 05, 05]
+1043C; [77 A4 6F, 05, 05]
+10414; [77 A4 6F, 05, A0]
 
-1045C; [7A A1 BA, 05, 05]
+1043D; [77 A4 77, 05, 05]
+10415; [77 A4 77, 05, A0]
 
-1045D; [7A A1 C2, 05, 05]
+1043E; [77 A4 7F, 05, 05]
+10416; [77 A4 7F, 05, A0]
 
-1045E; [7A A1 CA, 05, 05]
+1043F; [77 A4 87, 05, 05]
+10417; [77 A4 87, 05, A0]
 
-1045F; [7A A1 D2, 05, 05]
+10440; [77 A4 8F, 05, 05]
+10418; [77 A4 8F, 05, A0]
 
-10460; [7A A1 DA, 05, 05]
+10441; [77 A4 97, 05, 05]
+10419; [77 A4 97, 05, A0]
 
-10461; [7A A1 E2, 05, 05]
+10442; [77 A4 9F, 05, 05]
+1041A; [77 A4 9F, 05, A0]
 
-10462; [7A A1 EA, 05, 05]
+10443; [77 A4 A7, 05, 05]
+1041B; [77 A4 A7, 05, A0]
 
-10463; [7A A1 F2, 05, 05]
+10444; [77 A4 AF, 05, 05]
+1041C; [77 A4 AF, 05, A0]
 
-10464; [7A A1 FA, 05, 05]
+10445; [77 A4 B7, 05, 05]
+1041D; [77 A4 B7, 05, A0]
 
-10465; [7A A2 08, 05, 05]
+10446; [77 A4 BF, 05, 05]
+1041E; [77 A4 BF, 05, A0]
 
-10466; [7A A2 10, 05, 05]
+10447; [77 A4 C7, 05, 05]
+1041F; [77 A4 C7, 05, A0]
 
-10467; [7A A2 18, 05, 05]
+10448; [77 A4 CF, 05, 05]
+10420; [77 A4 CF, 05, A0]
 
-10468; [7A A2 20, 05, 05]
+10449; [77 A4 D7, 05, 05]
+10421; [77 A4 D7, 05, A0]
 
-10469; [7A A2 28, 05, 05]
+1044A; [77 A4 DF, 05, 05]
+10422; [77 A4 DF, 05, A0]
 
-1046A; [7A A2 30, 05, 05]
+1044B; [77 A4 E7, 05, 05]
+10423; [77 A4 E7, 05, A0]
 
-1046B; [7A A2 38, 05, 05]
+1044C; [77 A4 EF, 05, 05]
+10424; [77 A4 EF, 05, A0]
 
-1046C; [7A A2 40, 05, 05]
+1044D; [77 A4 F7, 05, 05]
+10425; [77 A4 F7, 05, A0]
 
-1046D; [7A A2 48, 05, 05]
+1044E; [77 A4 FF, 05, 05]
+10426; [77 A4 FF, 05, A0]
 
-1046E; [7A A2 50, 05, 05]
+1044F; [77 A5 09, 05, 05]
+10427; [77 A5 09, 05, A0]
 
-1046F; [7A A2 58, 05, 05]
+FDD1 10450;    [77 A5 32, 05, 05]      # SHAVIAN first primary
 
-10470; [7A A2 60, 05, 05]
+10450; [77 A5 5B, 05, 05]
 
-10471; [7A A2 68, 05, 05]
+10451; [77 A5 63, 05, 05]
 
-10472; [7A A2 70, 05, 05]
+10452; [77 A5 6B, 05, 05]
 
-10473; [7A A2 78, 05, 05]
+10453; [77 A5 73, 05, 05]
 
-10474; [7A A2 80, 05, 05]
+10454; [77 A5 7B, 05, 05]
 
-10475; [7A A2 88, 05, 05]
+10455; [77 A5 83, 05, 05]
 
-10476; [7A A2 90, 05, 05]
+10456; [77 A5 8B, 05, 05]
 
-10477; [7A A2 98, 05, 05]
+10457; [77 A5 93, 05, 05]
 
-10478; [7A A2 A0, 05, 05]
+10458; [77 A5 9B, 05, 05]
 
-10479; [7A A2 A8, 05, 05]
+10459; [77 A5 A3, 05, 05]
 
-1047A; [7A A2 B0, 05, 05]
+1045A; [77 A5 AB, 05, 05]
 
-1047B; [7A A2 B8, 05, 05]
+1045B; [77 A5 B3, 05, 05]
 
-1047C; [7A A2 C0, 05, 05]
+1045C; [77 A5 BB, 05, 05]
 
-1047D; [7A A2 C8, 05, 05]
+1045D; [77 A5 C3, 05, 05]
 
-1047E; [7A A2 D0, 05, 05]
+1045E; [77 A5 CB, 05, 05]
 
-1047F; [7A A2 D8, 05, 05]
+1045F; [77 A5 D3, 05, 05]
 
-10480; [7A A2 E0, 05, 05]
+10460; [77 A5 DB, 05, 05]
 
-10481; [7A A2 E8, 05, 05]
+10461; [77 A5 E3, 05, 05]
 
-10482; [7A A2 F0, 05, 05]
+10462; [77 A5 EB, 05, 05]
 
-10483; [7A A2 F8, 05, 05]
+10463; [77 A5 F3, 05, 05]
 
-10484; [7A A3 06, 05, 05]
+10464; [77 A5 FB, 05, 05]
 
-10485; [7A A3 0E, 05, 05]
+10465; [77 A6 05, 05, 05]
 
-10486; [7A A3 16, 05, 05]
+10466; [77 A6 0D, 05, 05]
 
-10487; [7A A3 1E, 05, 05]
+10467; [77 A6 15, 05, 05]
 
-10488; [7A A3 26, 05, 05]
+10468; [77 A6 1D, 05, 05]
 
-10489; [7A A3 2E, 05, 05]
+10469; [77 A6 25, 05, 05]
 
-1048A; [7A A3 36, 05, 05]
+1046A; [77 A6 2D, 05, 05]
 
-1048B; [7A A3 3E, 05, 05]
+1046B; [77 A6 35, 05, 05]
 
-1048C; [7A A3 46, 05, 05]
+1046C; [77 A6 3D, 05, 05]
 
-1048D; [7A A3 4E, 05, 05]
+1046D; [77 A6 45, 05, 05]
 
-1048E; [7A A3 56, 05, 05]
+1046E; [77 A6 4D, 05, 05]
 
-1048F; [7A A3 5E, 05, 05]
+1046F; [77 A6 55, 05, 05]
 
-10490; [7A A3 66, 05, 05]
+10470; [77 A6 5D, 05, 05]
 
-10491; [7A A3 6E, 05, 05]
+10471; [77 A6 65, 05, 05]
 
-10492; [7A A3 76, 05, 05]
+10472; [77 A6 6D, 05, 05]
 
-10493; [7A A3 7E, 05, 05]
+10473; [77 A6 75, 05, 05]
 
-10494; [7A A3 86, 05, 05]
+10474; [77 A6 7D, 05, 05]
 
-10495; [7A A3 8E, 05, 05]
+10475; [77 A6 85, 05, 05]
 
-10496; [7A A3 96, 05, 05]
+10476; [77 A6 8D, 05, 05]
 
-10497; [7A A3 9E, 05, 05]
+10477; [77 A6 95, 05, 05]
 
-10498; [7A A3 A6, 05, 05]
+10478; [77 A6 9D, 05, 05]
 
-10499; [7A A3 AE, 05, 05]
+10479; [77 A6 A5, 05, 05]
 
-1049A; [7A A3 B6, 05, 05]
+1047A; [77 A6 AD, 05, 05]
 
-1049B; [7A A3 BE, 05, 05]
+1047B; [77 A6 B5, 05, 05]
 
-1049C; [7A A3 C6, 05, 05]
+1047C; [77 A6 BD, 05, 05]
 
-1049D; [7A A3 CE, 05, 05]
+1047D; [77 A6 C5, 05, 05]
 
-110D0; [7A A3 D6, 05, 05]
+1047E; [77 A6 CD, 05, 05]
 
-110D1; [7A A3 DE, 05, 05]
+1047F; [77 A6 D5, 05, 05]
 
-110D2; [7A A3 E6, 05, 05]
+FDD1 10480;    [77 A6 FE, 05, 05]      # OSMANYA first primary
 
-110D3; [7A A3 EE, 05, 05]
+10480; [77 A7 29, 05, 05]
 
-110D4; [7A A3 F6, 05, 05]
+10481; [77 A7 31, 05, 05]
 
-110D5; [7A A4 04, 05, 05]
+10482; [77 A7 39, 05, 05]
 
-110D6; [7A A4 0C, 05, 05]
+10483; [77 A7 41, 05, 05]
 
-110D7; [7A A4 14, 05, 05]
+10484; [77 A7 49, 05, 05]
 
-110D8; [7A A4 1C, 05, 05]
+10485; [77 A7 51, 05, 05]
 
-110D9; [7A A4 24, 05, 05]
+10486; [77 A7 59, 05, 05]
 
-110DA; [7A A4 2C, 05, 05]
+10487; [77 A7 61, 05, 05]
 
-110DB; [7A A4 34, 05, 05]
+10488; [77 A7 69, 05, 05]
 
-110DC; [7A A4 3C, 05, 05]
+10489; [77 A7 71, 05, 05]
 
-110DD; [7A A4 44, 05, 05]
+1048A; [77 A7 79, 05, 05]
 
-110DE; [7A A4 4C, 05, 05]
+1048B; [77 A7 81, 05, 05]
 
-110DF; [7A A4 54, 05, 05]
+1048C; [77 A7 89, 05, 05]
 
-110E0; [7A A4 5C, 05, 05]
+1048D; [77 A7 91, 05, 05]
 
-110E1; [7A A4 64, 05, 05]
+1048E; [77 A7 99, 05, 05]
 
-110E2; [7A A4 6C, 05, 05]
+1048F; [77 A7 A1, 05, 05]
 
-110E3; [7A A4 74, 05, 05]
+10490; [77 A7 A9, 05, 05]
 
-110E4; [7A A4 7C, 05, 05]
+10491; [77 A7 B1, 05, 05]
 
-110E5; [7A A4 84, 05, 05]
+10492; [77 A7 B9, 05, 05]
 
-110E6; [7A A4 8C, 05, 05]
+10493; [77 A7 C1, 05, 05]
 
-110E7; [7A A4 94, 05, 05]
+10494; [77 A7 C9, 05, 05]
 
-110E8; [7A A4 9C, 05, 05]
+10495; [77 A7 D1, 05, 05]
 
-10000; [7A A4 A4, 05, 05]
+10496; [77 A7 D9, 05, 05]
 
-10001; [7A A4 AC, 05, 05]
+10497; [77 A7 E1, 05, 05]
 
-10002; [7A A4 B4, 05, 05]
+10498; [77 A7 E9, 05, 05]
 
-10003; [7A A4 BC, 05, 05]
+10499; [77 A7 F1, 05, 05]
 
-10004; [7A A4 C4, 05, 05]
+1049A; [77 A7 F9, 05, 05]
 
-10005; [7A A4 CC, 05, 05]
+1049B; [77 A8 03, 05, 05]
 
-10006; [7A A4 D4, 05, 05]
+1049C; [77 A8 0B, 05, 05]
 
-10007; [7A A4 DC, 05, 05]
+1049D; [77 A8 13, 05, 05]
 
-10008; [7A A4 E4, 05, 05]
+FDD1 110D0;    [77 A8 3C, 05, 05]      # Sora_Sompeng first primary
 
-10009; [7A A4 EC, 05, 05]
+110D0; [77 A8 65, 05, 05]
 
-1000A; [7A A4 F4, 05, 05]
+110D1; [77 A8 6D, 05, 05]
 
-1000B; [7A A4 FC, 05, 05]
+110D2; [77 A8 75, 05, 05]
 
-1000D; [7A A5 0A, 05, 05]
+110D3; [77 A8 7D, 05, 05]
 
-1000E; [7A A5 12, 05, 05]
+110D4; [77 A8 85, 05, 05]
 
-1000F; [7A A5 1A, 05, 05]
+110D5; [77 A8 8D, 05, 05]
 
-10010; [7A A5 22, 05, 05]
+110D6; [77 A8 95, 05, 05]
 
-10011; [7A A5 2A, 05, 05]
+110D7; [77 A8 9D, 05, 05]
 
-10012; [7A A5 32, 05, 05]
+110D8; [77 A8 A5, 05, 05]
 
-10013; [7A A5 3A, 05, 05]
+110D9; [77 A8 AD, 05, 05]
 
-10014; [7A A5 42, 05, 05]
+110DA; [77 A8 B5, 05, 05]
 
-10015; [7A A5 4A, 05, 05]
+110DB; [77 A8 BD, 05, 05]
 
-10016; [7A A5 52, 05, 05]
+110DC; [77 A8 C5, 05, 05]
 
-10017; [7A A5 5A, 05, 05]
+110DD; [77 A8 CD, 05, 05]
 
-10018; [7A A5 62, 05, 05]
+110DE; [77 A8 D5, 05, 05]
 
-10019; [7A A5 6A, 05, 05]
+110DF; [77 A8 DD, 05, 05]
 
-1001A; [7A A5 72, 05, 05]
+110E0; [77 A8 E5, 05, 05]
 
-1001B; [7A A5 7A, 05, 05]
+110E1; [77 A8 ED, 05, 05]
 
-1001C; [7A A5 82, 05, 05]
+110E2; [77 A8 F5, 05, 05]
 
-1001D; [7A A5 8A, 05, 05]
+110E3; [77 A8 FD, 05, 05]
 
-1001E; [7A A5 92, 05, 05]
+110E4; [77 A9 07, 05, 05]
 
-1001F; [7A A5 9A, 05, 05]
+110E5; [77 A9 0F, 05, 05]
 
-10020; [7A A5 A2, 05, 05]
+110E6; [77 A9 17, 05, 05]
 
-10021; [7A A5 AA, 05, 05]
+110E7; [77 A9 1F, 05, 05]
 
-10022; [7A A5 B2, 05, 05]
+110E8; [77 A9 27, 05, 05]
 
-10023; [7A A5 BA, 05, 05]
+FDD1 10000;    [77 A9 50, 05, 05]      # LINEAR_B first primary
 
-10024; [7A A5 C2, 05, 05]
+10000; [77 A9 79, 05, 05]
 
-10025; [7A A5 CA, 05, 05]
+10001; [77 A9 81, 05, 05]
 
-10026; [7A A5 D2, 05, 05]
+10002; [77 A9 89, 05, 05]
 
-10028; [7A A5 DA, 05, 05]
+10003; [77 A9 91, 05, 05]
 
-10029; [7A A5 E2, 05, 05]
+10004; [77 A9 99, 05, 05]
 
-1002A; [7A A5 EA, 05, 05]
+10005; [77 A9 A1, 05, 05]
 
-1002B; [7A A5 F2, 05, 05]
+10006; [77 A9 A9, 05, 05]
 
-1002C; [7A A5 FA, 05, 05]
+10007; [77 A9 B1, 05, 05]
 
-1002D; [7A A6 08, 05, 05]
+10008; [77 A9 B9, 05, 05]
 
-1002E; [7A A6 10, 05, 05]
+10009; [77 A9 C1, 05, 05]
 
-1002F; [7A A6 18, 05, 05]
+1000A; [77 A9 C9, 05, 05]
 
-10030; [7A A6 20, 05, 05]
+1000B; [77 A9 D1, 05, 05]
 
-10031; [7A A6 28, 05, 05]
+1000D; [77 A9 D9, 05, 05]
 
-10032; [7A A6 30, 05, 05]
+1000E; [77 A9 E1, 05, 05]
 
-10033; [7A A6 38, 05, 05]
+1000F; [77 A9 E9, 05, 05]
 
-10034; [7A A6 40, 05, 05]
+10010; [77 A9 F1, 05, 05]
 
-10035; [7A A6 48, 05, 05]
+10011; [77 A9 F9, 05, 05]
 
-10036; [7A A6 50, 05, 05]
+10012; [77 AA 03, 05, 05]
 
-10037; [7A A6 58, 05, 05]
+10013; [77 AA 0B, 05, 05]
 
-10038; [7A A6 60, 05, 05]
+10014; [77 AA 13, 05, 05]
 
-10039; [7A A6 68, 05, 05]
+10015; [77 AA 1B, 05, 05]
 
-1003A; [7A A6 70, 05, 05]
+10016; [77 AA 23, 05, 05]
 
-1003C; [7A A6 78, 05, 05]
+10017; [77 AA 2B, 05, 05]
 
-1003D; [7A A6 80, 05, 05]
+10018; [77 AA 33, 05, 05]
 
-1003F; [7A A6 88, 05, 05]
+10019; [77 AA 3B, 05, 05]
 
-10040; [7A A6 90, 05, 05]
+1001A; [77 AA 43, 05, 05]
 
-10041; [7A A6 98, 05, 05]
+1001B; [77 AA 4B, 05, 05]
 
-10042; [7A A6 A0, 05, 05]
+1001C; [77 AA 53, 05, 05]
 
-10043; [7A A6 A8, 05, 05]
+1001D; [77 AA 5B, 05, 05]
 
-10044; [7A A6 B0, 05, 05]
+1001E; [77 AA 63, 05, 05]
 
-10045; [7A A6 B8, 05, 05]
+1001F; [77 AA 6B, 05, 05]
 
-10046; [7A A6 C0, 05, 05]
+10020; [77 AA 73, 05, 05]
 
-10047; [7A A6 C8, 05, 05]
+10021; [77 AA 7B, 05, 05]
 
-10048; [7A A6 D0, 05, 05]
+10022; [77 AA 83, 05, 05]
 
-10049; [7A A6 D8, 05, 05]
+10023; [77 AA 8B, 05, 05]
 
-1004A; [7A A6 E0, 05, 05]
+10024; [77 AA 93, 05, 05]
 
-1004B; [7A A6 E8, 05, 05]
+10025; [77 AA 9B, 05, 05]
 
-1004C; [7A A6 F0, 05, 05]
+10026; [77 AA A3, 05, 05]
 
-1004D; [7A A6 F8, 05, 05]
+10028; [77 AA AB, 05, 05]
 
-10050; [7A A7 06, 05, 05]
+10029; [77 AA B3, 05, 05]
 
-10051; [7A A7 0E, 05, 05]
+1002A; [77 AA BB, 05, 05]
 
-10052; [7A A7 16, 05, 05]
+1002B; [77 AA C3, 05, 05]
 
-10053; [7A A7 1E, 05, 05]
+1002C; [77 AA CB, 05, 05]
 
-10054; [7A A7 26, 05, 05]
+1002D; [77 AA D3, 05, 05]
 
-10055; [7A A7 2E, 05, 05]
+1002E; [77 AA DB, 05, 05]
 
-10056; [7A A7 36, 05, 05]
+1002F; [77 AA E3, 05, 05]
 
-10057; [7A A7 3E, 05, 05]
+10030; [77 AA EB, 05, 05]
 
-10058; [7A A7 46, 05, 05]
+10031; [77 AA F3, 05, 05]
 
-10059; [7A A7 4E, 05, 05]
+10032; [77 AA FB, 05, 05]
 
-1005A; [7A A7 56, 05, 05]
+10033; [77 AB 05, 05, 05]
 
-1005B; [7A A7 5E, 05, 05]
+10034; [77 AB 0D, 05, 05]
 
-1005C; [7A A7 66, 05, 05]
+10035; [77 AB 15, 05, 05]
 
-1005D; [7A A7 6E, 05, 05]
+10036; [77 AB 1D, 05, 05]
 
-10080; [7A A7 76, 05, 05]
+10037; [77 AB 25, 05, 05]
 
-10081; [7A A7 7E, 05, 05]
+10038; [77 AB 2D, 05, 05]
 
-10082; [7A A7 86, 05, 05]
+10039; [77 AB 35, 05, 05]
 
-10083; [7A A7 8E, 05, 05]
+1003A; [77 AB 3D, 05, 05]
 
-10084; [7A A7 96, 05, 05]
+1003C; [77 AB 45, 05, 05]
 
-10085; [7A A7 9E, 05, 05]
+1003D; [77 AB 4D, 05, 05]
 
-10086; [7A A7 A6, 05, 05]
+1003F; [77 AB 55, 05, 05]
 
-10087; [7A A7 AE, 05, 05]
+10040; [77 AB 5D, 05, 05]
 
-10088; [7A A7 B6, 05, 05]
+10041; [77 AB 65, 05, 05]
 
-10089; [7A A7 BE, 05, 05]
+10042; [77 AB 6D, 05, 05]
 
-1008A; [7A A7 C6, 05, 05]
+10043; [77 AB 75, 05, 05]
 
-1008B; [7A A7 CE, 05, 05]
+10044; [77 AB 7D, 05, 05]
 
-1008C; [7A A7 D6, 05, 05]
+10045; [77 AB 85, 05, 05]
 
-1008D; [7A A7 DE, 05, 05]
+10046; [77 AB 8D, 05, 05]
 
-1008E; [7A A7 E6, 05, 05]
+10047; [77 AB 95, 05, 05]
 
-1008F; [7A A7 EE, 05, 05]
+10048; [77 AB 9D, 05, 05]
 
-10090; [7A A7 F6, 05, 05]
+10049; [77 AB A5, 05, 05]
 
-10091; [7A A8 04, 05, 05]
+1004A; [77 AB AD, 05, 05]
 
-10092; [7A A8 0C, 05, 05]
+1004B; [77 AB B5, 05, 05]
 
-10093; [7A A8 14, 05, 05]
+1004C; [77 AB BD, 05, 05]
 
-10094; [7A A8 1C, 05, 05]
+1004D; [77 AB C5, 05, 05]
 
-10095; [7A A8 24, 05, 05]
+10050; [77 AB CD, 05, 05]
 
-10096; [7A A8 2C, 05, 05]
+10051; [77 AB D5, 05, 05]
 
-10097; [7A A8 34, 05, 05]
+10052; [77 AB DD, 05, 05]
 
-10098; [7A A8 3C, 05, 05]
+10053; [77 AB E5, 05, 05]
 
-10099; [7A A8 44, 05, 05]
+10054; [77 AB ED, 05, 05]
 
-1009A; [7A A8 4C, 05, 05]
+10055; [77 AB F5, 05, 05]
 
-1009B; [7A A8 54, 05, 05]
+10056; [77 AB FD, 05, 05]
 
-1009C; [7A A8 5C, 05, 05]
+10057; [77 AC 07, 05, 05]
 
-1009D; [7A A8 64, 05, 05]
+10058; [77 AC 0F, 05, 05]
 
-1009E; [7A A8 6C, 05, 05]
+10059; [77 AC 17, 05, 05]
 
-1009F; [7A A8 74, 05, 05]
+1005A; [77 AC 1F, 05, 05]
 
-100A0; [7A A8 7C, 05, 05]
+1005B; [77 AC 27, 05, 05]
 
-100A1; [7A A8 84, 05, 05]
+1005C; [77 AC 2F, 05, 05]
 
-100A2; [7A A8 8C, 05, 05]
+1005D; [77 AC 37, 05, 05]
 
-100A3; [7A A8 94, 05, 05]
+10080; [77 AC 3F, 05, 05]
 
-100A4; [7A A8 9C, 05, 05]
+10081; [77 AC 47, 05, 05]
 
-100A5; [7A A8 A4, 05, 05]
+10082; [77 AC 4F, 05, 05]
 
-100A6; [7A A8 AC, 05, 05]
+10083; [77 AC 57, 05, 05]
 
-100A7; [7A A8 B4, 05, 05]
+10084; [77 AC 5F, 05, 05]
 
-100A8; [7A A8 BC, 05, 05]
+10085; [77 AC 67, 05, 05]
 
-100A9; [7A A8 C4, 05, 05]
+10086; [77 AC 6F, 05, 05]
 
-100AA; [7A A8 CC, 05, 05]
+10087; [77 AC 77, 05, 05]
 
-100AB; [7A A8 D4, 05, 05]
+10088; [77 AC 7F, 05, 05]
 
-100AC; [7A A8 DC, 05, 05]
+10089; [77 AC 87, 05, 05]
 
-100AD; [7A A8 E4, 05, 05]
+1008A; [77 AC 8F, 05, 05]
 
-100AE; [7A A8 EC, 05, 05]
+1008B; [77 AC 97, 05, 05]
 
-100AF; [7A A8 F4, 05, 05]
+1008C; [77 AC 9F, 05, 05]
 
-100B0; [7A A8 FC, 05, 05]
+1008D; [77 AC A7, 05, 05]
 
-100B1; [7A A9 0A, 05, 05]
+1008E; [77 AC AF, 05, 05]
 
-100B2; [7A A9 12, 05, 05]
+1008F; [77 AC B7, 05, 05]
 
-100B3; [7A A9 1A, 05, 05]
+10090; [77 AC BF, 05, 05]
 
-100B4; [7A A9 22, 05, 05]
+10091; [77 AC C7, 05, 05]
 
-100B5; [7A A9 2A, 05, 05]
+10092; [77 AC CF, 05, 05]
 
-100B6; [7A A9 32, 05, 05]
+10093; [77 AC D7, 05, 05]
 
-100B7; [7A A9 3A, 05, 05]
+10094; [77 AC DF, 05, 05]
 
-100B8; [7A A9 42, 05, 05]
+10095; [77 AC E7, 05, 05]
 
-100B9; [7A A9 4A, 05, 05]
+10096; [77 AC EF, 05, 05]
 
-100BA; [7A A9 52, 05, 05]
+10097; [77 AC F7, 05, 05]
 
-100BB; [7A A9 5A, 05, 05]
+10098; [77 AC FF, 05, 05]
 
-100BC; [7A A9 62, 05, 05]
+10099; [77 AD 09, 05, 05]
 
-100BD; [7A A9 6A, 05, 05]
+1009A; [77 AD 11, 05, 05]
 
-100BE; [7A A9 72, 05, 05]
+1009B; [77 AD 19, 05, 05]
 
-100BF; [7A A9 7A, 05, 05]
+1009C; [77 AD 21, 05, 05]
 
-100C0; [7A A9 82, 05, 05]
+1009D; [77 AD 29, 05, 05]
 
-100C1; [7A A9 8A, 05, 05]
+1009E; [77 AD 31, 05, 05]
 
-100C2; [7A A9 92, 05, 05]
+1009F; [77 AD 39, 05, 05]
 
-100C3; [7A A9 9A, 05, 05]
+100A0; [77 AD 41, 05, 05]
 
-100C4; [7A A9 A2, 05, 05]
+100A1; [77 AD 49, 05, 05]
 
-100C5; [7A A9 AA, 05, 05]
+100A2; [77 AD 51, 05, 05]
 
-100C6; [7A A9 B2, 05, 05]
+100A3; [77 AD 59, 05, 05]
 
-100C7; [7A A9 BA, 05, 05]
+100A4; [77 AD 61, 05, 05]
 
-100C8; [7A A9 C2, 05, 05]
+100A5; [77 AD 69, 05, 05]
 
-100C9; [7A A9 CA, 05, 05]
+100A6; [77 AD 71, 05, 05]
 
-100CA; [7A A9 D2, 05, 05]
+100A7; [77 AD 79, 05, 05]
 
-100CB; [7A A9 DA, 05, 05]
+100A8; [77 AD 81, 05, 05]
 
-100CC; [7A A9 E2, 05, 05]
+100A9; [77 AD 89, 05, 05]
 
-100CD; [7A A9 EA, 05, 05]
+100AA; [77 AD 91, 05, 05]
 
-100CE; [7A A9 F2, 05, 05]
+100AB; [77 AD 99, 05, 05]
 
-100CF; [7A A9 FA, 05, 05]
+100AC; [77 AD A1, 05, 05]
 
-100D0; [7A AA 08, 05, 05]
+100AD; [77 AD A9, 05, 05]
 
-100D1; [7A AA 10, 05, 05]
+100AE; [77 AD B1, 05, 05]
 
-100D2; [7A AA 18, 05, 05]
+100AF; [77 AD B9, 05, 05]
 
-100D3; [7A AA 20, 05, 05]
+100B0; [77 AD C1, 05, 05]
 
-100D4; [7A AA 28, 05, 05]
+100B1; [77 AD C9, 05, 05]
 
-100D5; [7A AA 30, 05, 05]
+100B2; [77 AD D1, 05, 05]
 
-100D6; [7A AA 38, 05, 05]
+100B3; [77 AD D9, 05, 05]
 
-100D7; [7A AA 40, 05, 05]
+100B4; [77 AD E1, 05, 05]
 
-100D8; [7A AA 48, 05, 05]
+100B5; [77 AD E9, 05, 05]
 
-100D9; [7A AA 50, 05, 05]
+100B6; [77 AD F1, 05, 05]
 
-100DA; [7A AA 58, 05, 05]
+100B7; [77 AD F9, 05, 05]
 
-100DB; [7A AA 60, 05, 05]
+100B8; [77 AE 03, 05, 05]
 
-100DC; [7A AA 68, 05, 05]
+100B9; [77 AE 0B, 05, 05]
 
-100DD; [7A AA 70, 05, 05]
+100BA; [77 AE 13, 05, 05]
 
-100DE; [7A AA 78, 05, 05]
+100BB; [77 AE 1B, 05, 05]
 
-100DF; [7A AA 80, 05, 05]
+100BC; [77 AE 23, 05, 05]
 
-100E0; [7A AA 88, 05, 05]
+100BD; [77 AE 2B, 05, 05]
 
-100E1; [7A AA 90, 05, 05]
+100BE; [77 AE 33, 05, 05]
 
-100E2; [7A AA 98, 05, 05]
+100BF; [77 AE 3B, 05, 05]
 
-100E3; [7A AA A0, 05, 05]
+100C0; [77 AE 43, 05, 05]
 
-100E4; [7A AA A8, 05, 05]
+100C1; [77 AE 4B, 05, 05]
 
-100E5; [7A AA B0, 05, 05]
+100C2; [77 AE 53, 05, 05]
 
-100E6; [7A AA B8, 05, 05]
+100C3; [77 AE 5B, 05, 05]
 
-100E7; [7A AA C0, 05, 05]
+100C4; [77 AE 63, 05, 05]
 
-100E8; [7A AA C8, 05, 05]
+100C5; [77 AE 6B, 05, 05]
 
-100E9; [7A AA D0, 05, 05]
+100C6; [77 AE 73, 05, 05]
 
-100EA; [7A AA D8, 05, 05]
+100C7; [77 AE 7B, 05, 05]
 
-100EB; [7A AA E0, 05, 05]
+100C8; [77 AE 83, 05, 05]
 
-100EC; [7A AA E8, 05, 05]
+100C9; [77 AE 8B, 05, 05]
 
-100ED; [7A AA F0, 05, 05]
+100CA; [77 AE 93, 05, 05]
 
-100EE; [7A AA F8, 05, 05]
+100CB; [77 AE 9B, 05, 05]
 
-100EF; [7A AB 06, 05, 05]
+100CC; [77 AE A3, 05, 05]
 
-100F0; [7A AB 0E, 05, 05]
+100CD; [77 AE AB, 05, 05]
 
-100F1; [7A AB 16, 05, 05]
+100CE; [77 AE B3, 05, 05]
 
-100F2; [7A AB 1E, 05, 05]
+100CF; [77 AE BB, 05, 05]
 
-100F3; [7A AB 26, 05, 05]
+100D0; [77 AE C3, 05, 05]
 
-100F4; [7A AB 2E, 05, 05]
+100D1; [77 AE CB, 05, 05]
 
-100F5; [7A AB 36, 05, 05]
+100D2; [77 AE D3, 05, 05]
 
-100F6; [7A AB 3E, 05, 05]
+100D3; [77 AE DB, 05, 05]
 
-100F7; [7A AB 46, 05, 05]
+100D4; [77 AE E3, 05, 05]
 
-100F8; [7A AB 4E, 05, 05]
+100D5; [77 AE EB, 05, 05]
 
-100F9; [7A AB 56, 05, 05]
+100D6; [77 AE F3, 05, 05]
 
-100FA; [7A AB 5E, 05, 05]
+100D7; [77 AE FB, 05, 05]
 
-10800; [7A AB 66, 05, 05]
+100D8; [77 AF 05, 05, 05]
 
-10801; [7A AB 6E, 05, 05]
+100D9; [77 AF 0D, 05, 05]
 
-10802; [7A AB 76, 05, 05]
+100DA; [77 AF 15, 05, 05]
 
-10803; [7A AB 7E, 05, 05]
+100DB; [77 AF 1D, 05, 05]
 
-10804; [7A AB 86, 05, 05]
+100DC; [77 AF 25, 05, 05]
 
-10805; [7A AB 8E, 05, 05]
+100DD; [77 AF 2D, 05, 05]
 
-10808; [7A AB 96, 05, 05]
+100DE; [77 AF 35, 05, 05]
 
-1080A; [7A AB 9E, 05, 05]
+100DF; [77 AF 3D, 05, 05]
 
-1080B; [7A AB A6, 05, 05]
+100E0; [77 AF 45, 05, 05]
 
-1080C; [7A AB AE, 05, 05]
+100E1; [77 AF 4D, 05, 05]
 
-1080D; [7A AB B6, 05, 05]
+100E2; [77 AF 55, 05, 05]
 
-1080E; [7A AB BE, 05, 05]
+100E3; [77 AF 5D, 05, 05]
 
-1080F; [7A AB C6, 05, 05]
+100E4; [77 AF 65, 05, 05]
 
-10810; [7A AB CE, 05, 05]
+100E5; [77 AF 6D, 05, 05]
 
-10811; [7A AB D6, 05, 05]
+100E6; [77 AF 75, 05, 05]
 
-10812; [7A AB DE, 05, 05]
+100E7; [77 AF 7D, 05, 05]
 
-10813; [7A AB E6, 05, 05]
+100E8; [77 AF 85, 05, 05]
 
-10814; [7A AB EE, 05, 05]
+100E9; [77 AF 8D, 05, 05]
 
-10815; [7A AB F6, 05, 05]
+100EA; [77 AF 95, 05, 05]
 
-10816; [7A AC 04, 05, 05]
+100EB; [77 AF 9D, 05, 05]
 
-10817; [7A AC 0C, 05, 05]
+100EC; [77 AF A5, 05, 05]
 
-10818; [7A AC 14, 05, 05]
+100ED; [77 AF AD, 05, 05]
 
-10819; [7A AC 1C, 05, 05]
+100EE; [77 AF B5, 05, 05]
 
-1081A; [7A AC 24, 05, 05]
+100EF; [77 AF BD, 05, 05]
 
-1081B; [7A AC 2C, 05, 05]
+100F0; [77 AF C5, 05, 05]
 
-1081C; [7A AC 34, 05, 05]
+100F1; [77 AF CD, 05, 05]
 
-1081D; [7A AC 3C, 05, 05]
+100F2; [77 AF D5, 05, 05]
 
-1081E; [7A AC 44, 05, 05]
+100F3; [77 AF DD, 05, 05]
 
-1081F; [7A AC 4C, 05, 05]
+100F4; [77 AF E5, 05, 05]
 
-10820; [7A AC 54, 05, 05]
+100F5; [77 AF ED, 05, 05]
 
-10821; [7A AC 5C, 05, 05]
+100F6; [77 AF F5, 05, 05]
 
-10822; [7A AC 64, 05, 05]
+100F7; [77 AF FD, 05, 05]
 
-10823; [7A AC 6C, 05, 05]
+100F8; [77 B0 07, 05, 05]
 
-10824; [7A AC 74, 05, 05]
+100F9; [77 B0 0F, 05, 05]
 
-10825; [7A AC 7C, 05, 05]
+100FA; [77 B0 17, 05, 05]
 
-10826; [7A AC 84, 05, 05]
+FDD1 10800;    [77 B0 40, 05, 05]      # CYPRIOT first primary
 
-10827; [7A AC 8C, 05, 05]
+10800; [77 B0 69, 05, 05]
 
-10828; [7A AC 94, 05, 05]
+10801; [77 B0 71, 05, 05]
 
-10829; [7A AC 9C, 05, 05]
+10802; [77 B0 79, 05, 05]
 
-1082A; [7A AC A4, 05, 05]
+10803; [77 B0 81, 05, 05]
 
-1082B; [7A AC AC, 05, 05]
+10804; [77 B0 89, 05, 05]
 
-1082C; [7A AC B4, 05, 05]
+10805; [77 B0 91, 05, 05]
 
-1082D; [7A AC BC, 05, 05]
+10808; [77 B0 99, 05, 05]
 
-1082E; [7A AC C4, 05, 05]
+1080A; [77 B0 A1, 05, 05]
 
-1082F; [7A AC CC, 05, 05]
+1080B; [77 B0 A9, 05, 05]
 
-10830; [7A AC D4, 05, 05]
+1080C; [77 B0 B1, 05, 05]
 
-10831; [7A AC DC, 05, 05]
+1080D; [77 B0 B9, 05, 05]
 
-10832; [7A AC E4, 05, 05]
+1080E; [77 B0 C1, 05, 05]
 
-10833; [7A AC EC, 05, 05]
+1080F; [77 B0 C9, 05, 05]
 
-10834; [7A AC F4, 05, 05]
+10810; [77 B0 D1, 05, 05]
 
-10835; [7A AC FC, 05, 05]
+10811; [77 B0 D9, 05, 05]
 
-10837; [7A AD 0A, 05, 05]
+10812; [77 B0 E1, 05, 05]
 
-10838; [7A AD 12, 05, 05]
+10813; [77 B0 E9, 05, 05]
 
-1083C; [7A AD 1A, 05, 05]
+10814; [77 B0 F1, 05, 05]
 
-1083F; [7A AD 22, 05, 05]
+10815; [77 B0 F9, 05, 05]
 
-10A60; [7A AD 2A, 05, 05]
+10816; [77 B1 03, 05, 05]
 
-10A61; [7A AD 32, 05, 05]
+10817; [77 B1 0B, 05, 05]
 
-10A62; [7A AD 3A, 05, 05]
+10818; [77 B1 13, 05, 05]
 
-10A63; [7A AD 42, 05, 05]
+10819; [77 B1 1B, 05, 05]
 
-10A64; [7A AD 4A, 05, 05]
+1081A; [77 B1 23, 05, 05]
 
-10A65; [7A AD 52, 05, 05]
+1081B; [77 B1 2B, 05, 05]
 
-10A66; [7A AD 5A, 05, 05]
+1081C; [77 B1 33, 05, 05]
 
-10A67; [7A AD 62, 05, 05]
+1081D; [77 B1 3B, 05, 05]
 
-10A68; [7A AD 6A, 05, 05]
+1081E; [77 B1 43, 05, 05]
 
-10A69; [7A AD 72, 05, 05]
+1081F; [77 B1 4B, 05, 05]
 
-10A6A; [7A AD 7A, 05, 05]
+10820; [77 B1 53, 05, 05]
 
-10A6B; [7A AD 82, 05, 05]
+10821; [77 B1 5B, 05, 05]
 
-10A6C; [7A AD 8A, 05, 05]
+10822; [77 B1 63, 05, 05]
 
-10A6D; [7A AD 92, 05, 05]
+10823; [77 B1 6B, 05, 05]
 
-10A6E; [7A AD 9A, 05, 05]
+10824; [77 B1 73, 05, 05]
 
-10A6F; [7A AD A2, 05, 05]
+10825; [77 B1 7B, 05, 05]
 
-10A70; [7A AD AA, 05, 05]
+10826; [77 B1 83, 05, 05]
 
-10A71; [7A AD B2, 05, 05]
+10827; [77 B1 8B, 05, 05]
 
-10A72; [7A AD BA, 05, 05]
+10828; [77 B1 93, 05, 05]
 
-10A73; [7A AD C2, 05, 05]
+10829; [77 B1 9B, 05, 05]
 
-10A74; [7A AD CA, 05, 05]
+1082A; [77 B1 A3, 05, 05]
 
-10A75; [7A AD D2, 05, 05]
+1082B; [77 B1 AB, 05, 05]
 
-10A76; [7A AD DA, 05, 05]
+1082C; [77 B1 B3, 05, 05]
 
-10A77; [7A AD E2, 05, 05]
+1082D; [77 B1 BB, 05, 05]
 
-10A78; [7A AD EA, 05, 05]
+1082E; [77 B1 C3, 05, 05]
 
-10A79; [7A AD F2, 05, 05]
+1082F; [77 B1 CB, 05, 05]
 
-10A7A; [7A AD FA, 05, 05]
+10830; [77 B1 D3, 05, 05]
 
-10A7B; [7A AE 08, 05, 05]
+10831; [77 B1 DB, 05, 05]
 
-10A7C; [7A AE 10, 05, 05]
+10832; [77 B1 E3, 05, 05]
 
-10B00; [7A AE 18, 05, 05]
+10833; [77 B1 EB, 05, 05]
 
-10B01; [7A AE 20, 05, 05]
+10834; [77 B1 F3, 05, 05]
 
-10B02; [7A AE 28, 05, 05]
+10835; [77 B1 FB, 05, 05]
 
-10B03; [7A AE 30, 05, 05]
+10837; [77 B2 05, 05, 05]
 
-10B04; [7A AE 38, 05, 05]
+10838; [77 B2 0D, 05, 05]
 
-10B05; [7A AE 40, 05, 05]
+1083C; [77 B2 15, 05, 05]
 
-10B06; [7A AE 48, 05, 05]
+1083F; [77 B2 1D, 05, 05]
 
-10B07; [7A AE 50, 05, 05]
+FDD1 10A60;    [77 B2 46, 05, 05]      # Old South Arabian first primary
 
-10B08; [7A AE 58, 05, 05]
+10A60; [77 B2 6F, 05, 05]
 
-10B09; [7A AE 60, 05, 05]
+10A61; [77 B2 77, 05, 05]
 
-10B0A; [7A AE 68, 05, 05]
+10A62; [77 B2 7F, 05, 05]
 
-10B0B; [7A AE 70, 05, 05]
+10A63; [77 B2 87, 05, 05]
 
-10B0C; [7A AE 78, 05, 05]
+10A64; [77 B2 8F, 05, 05]
 
-10B0D; [7A AE 80, 05, 05]
+10A65; [77 B2 97, 05, 05]
 
-10B0E; [7A AE 88, 05, 05]
+10A66; [77 B2 9F, 05, 05]
 
-10B0F; [7A AE 90, 05, 05]
+10A67; [77 B2 A7, 05, 05]
 
-10B10; [7A AE 98, 05, 05]
+10A68; [77 B2 AF, 05, 05]
 
-10B11; [7A AE A0, 05, 05]
+10A69; [77 B2 B7, 05, 05]
 
-10B12; [7A AE A8, 05, 05]
+10A6A; [77 B2 BF, 05, 05]
 
-10B13; [7A AE B0, 05, 05]
+10A6B; [77 B2 C7, 05, 05]
 
-10B14; [7A AE B8, 05, 05]
+10A6C; [77 B2 CF, 05, 05]
 
-10B15; [7A AE C0, 05, 05]
+10A6D; [77 B2 D7, 05, 05]
 
-10B16; [7A AE C8, 05, 05]
+10A6E; [77 B2 DF, 05, 05]
 
-10B17; [7A AE D0, 05, 05]
+10A6F; [77 B2 E7, 05, 05]
 
-10B18; [7A AE D8, 05, 05]
+10A70; [77 B2 EF, 05, 05]
 
-10B19; [7A AE E0, 05, 05]
+10A71; [77 B2 F7, 05, 05]
 
-10B1A; [7A AE E8, 05, 05]
+10A72; [77 B2 FF, 05, 05]
 
-10B1B; [7A AE F0, 05, 05]
+10A73; [77 B3 09, 05, 05]
 
-10B1C; [7A AE F8, 05, 05]
+10A74; [77 B3 11, 05, 05]
 
-10B1D; [7A AF 06, 05, 05]
+10A75; [77 B3 19, 05, 05]
 
-10B1E; [7A AF 0E, 05, 05]
+10A76; [77 B3 21, 05, 05]
 
-10B1F; [7A AF 16, 05, 05]
+10A77; [77 B3 29, 05, 05]
 
-10B20; [7A AF 1E, 05, 05]
+10A78; [77 B3 31, 05, 05]
 
-10B21; [7A AF 26, 05, 05]
+10A79; [77 B3 39, 05, 05]
 
-10B22; [7A AF 2E, 05, 05]
+10A7A; [77 B3 41, 05, 05]
 
-10B23; [7A AF 36, 05, 05]
+10A7B; [77 B3 49, 05, 05]
 
-10B24; [7A AF 3E, 05, 05]
+10A7C; [77 B3 51, 05, 05]
 
-10B25; [7A AF 46, 05, 05]
+FDD1 10B00;    [77 B3 7A, 05, 05]      # Avestan first primary
 
-10B26; [7A AF 4E, 05, 05]
+10B00; [77 B3 A3, 05, 05]
 
-10B27; [7A AF 56, 05, 05]
+10B01; [77 B3 AB, 05, 05]
 
-10B28; [7A AF 5E, 05, 05]
+10B02; [77 B3 B3, 05, 05]
 
-10B29; [7A AF 66, 05, 05]
+10B03; [77 B3 BB, 05, 05]
 
-10B2A; [7A AF 6E, 05, 05]
+10B04; [77 B3 C3, 05, 05]
 
-10B2B; [7A AF 76, 05, 05]
+10B05; [77 B3 CB, 05, 05]
 
-10B2C; [7A AF 7E, 05, 05]
+10B06; [77 B3 D3, 05, 05]
 
-10B2D; [7A AF 86, 05, 05]
-10B2E; [7A AF 86, 05, 09][, DB A9, 09]
+10B07; [77 B3 DB, 05, 05]
 
-10B2F; [7A AF 8E, 05, 05]
+10B08; [77 B3 E3, 05, 05]
 
-10B30; [7A AF 96, 05, 05]
+10B09; [77 B3 EB, 05, 05]
 
-10B31; [7A AF 9E, 05, 05]
+10B0A; [77 B3 F3, 05, 05]
 
-10B32; [7A AF A6, 05, 05]
+10B0B; [77 B3 FB, 05, 05]
 
-10B33; [7A AF AE, 05, 05]
+10B0C; [77 B4 05, 05, 05]
 
-10B34; [7A AF B6, 05, 05]
+10B0D; [77 B4 0D, 05, 05]
 
-10B35; [7A AF BE, 05, 05]
+10B0E; [77 B4 15, 05, 05]
 
-10840; [7A AF C6, 05, 05]
+10B0F; [77 B4 1D, 05, 05]
 
-10841; [7A AF CE, 05, 05]
+10B10; [77 B4 25, 05, 05]
 
-10842; [7A AF D6, 05, 05]
+10B11; [77 B4 2D, 05, 05]
 
-10843; [7A AF DE, 05, 05]
+10B12; [77 B4 35, 05, 05]
 
-10844; [7A AF E6, 05, 05]
+10B13; [77 B4 3D, 05, 05]
 
-10845; [7A AF EE, 05, 05]
+10B14; [77 B4 45, 05, 05]
 
-10846; [7A AF F6, 05, 05]
+10B15; [77 B4 4D, 05, 05]
 
-10847; [7A B0 04, 05, 05]
+10B16; [77 B4 55, 05, 05]
 
-10848; [7A B0 0C, 05, 05]
+10B17; [77 B4 5D, 05, 05]
 
-10849; [7A B0 14, 05, 05]
+10B18; [77 B4 65, 05, 05]
 
-1084A; [7A B0 1C, 05, 05]
+10B19; [77 B4 6D, 05, 05]
 
-1084B; [7A B0 24, 05, 05]
+10B1A; [77 B4 75, 05, 05]
 
-1084C; [7A B0 2C, 05, 05]
+10B1B; [77 B4 7D, 05, 05]
 
-1084D; [7A B0 34, 05, 05]
+10B1C; [77 B4 85, 05, 05]
 
-1084E; [7A B0 3C, 05, 05]
+10B1D; [77 B4 8D, 05, 05]
 
-1084F; [7A B0 44, 05, 05]
+10B1E; [77 B4 95, 05, 05]
 
-10850; [7A B0 4C, 05, 05]
+10B1F; [77 B4 9D, 05, 05]
 
-10851; [7A B0 54, 05, 05]
+10B20; [77 B4 A5, 05, 05]
 
-10852; [7A B0 5C, 05, 05]
+10B21; [77 B4 AD, 05, 05]
 
-10853; [7A B0 64, 05, 05]
+10B22; [77 B4 B5, 05, 05]
 
-10854; [7A B0 6C, 05, 05]
+10B23; [77 B4 BD, 05, 05]
 
-10855; [7A B0 74, 05, 05]
+10B24; [77 B4 C5, 05, 05]
 
-10B40; [7A B0 7C, 05, 05]
+10B25; [77 B4 CD, 05, 05]
 
-10B41; [7A B0 84, 05, 05]
+10B26; [77 B4 D5, 05, 05]
 
-10B42; [7A B0 8C, 05, 05]
+10B27; [77 B4 DD, 05, 05]
 
-10B43; [7A B0 94, 05, 05]
+10B28; [77 B4 E5, 05, 05]
 
-10B44; [7A B0 9C, 05, 05]
+10B29; [77 B4 ED, 05, 05]
 
-10B45; [7A B0 A4, 05, 05]
+10B2A; [77 B4 F5, 05, 05]
 
-10B46; [7A B0 AC, 05, 05]
+10B2B; [77 B4 FD, 05, 05]
 
-10B47; [7A B0 B4, 05, 05]
+10B2C; [77 B5 07, 05, 05]
 
-10B48; [7A B0 BC, 05, 05]
+10B2D; [77 B5 0F, 05, 05]
+10B2E; [77 B5 0F, 70, 20]
 
-10B49; [7A B0 C4, 05, 05]
+10B2F; [77 B5 17, 05, 05]
 
-10B4A; [7A B0 CC, 05, 05]
+10B30; [77 B5 1F, 05, 05]
 
-10B4B; [7A B0 D4, 05, 05]
+10B31; [77 B5 27, 05, 05]
 
-10B4C; [7A B0 DC, 05, 05]
+10B32; [77 B5 2F, 05, 05]
 
-10B4D; [7A B0 E4, 05, 05]
+10B33; [77 B5 37, 05, 05]
 
-10B4E; [7A B0 EC, 05, 05]
+10B34; [77 B5 3F, 05, 05]
 
-10B4F; [7A B0 F4, 05, 05]
+10B35; [77 B5 47, 05, 05]
 
-10B50; [7A B0 FC, 05, 05]
+FDD1 10840;    [77 B5 70, 05, 05]      # Imperial Aramaic first primary
 
-10B51; [7A B1 0A, 05, 05]
+10840; [77 B5 99, 05, 05]
 
-10B52; [7A B1 12, 05, 05]
+10841; [77 B5 A1, 05, 05]
 
-10B53; [7A B1 1A, 05, 05]
+10842; [77 B5 A9, 05, 05]
 
-10B54; [7A B1 22, 05, 05]
+10843; [77 B5 B1, 05, 05]
 
-10B55; [7A B1 2A, 05, 05]
+10844; [77 B5 B9, 05, 05]
 
-10B60; [7A B1 32, 05, 05]
+10845; [77 B5 C1, 05, 05]
 
-10B61; [7A B1 3A, 05, 05]
+10846; [77 B5 C9, 05, 05]
 
-10B62; [7A B1 42, 05, 05]
+10847; [77 B5 D1, 05, 05]
 
-10B63; [7A B1 4A, 05, 05]
+10848; [77 B5 D9, 05, 05]
 
-10B64; [7A B1 52, 05, 05]
+10849; [77 B5 E1, 05, 05]
 
-10B65; [7A B1 5A, 05, 05]
+1084A; [77 B5 E9, 05, 05]
 
-10B66; [7A B1 62, 05, 05]
+1084B; [77 B5 F1, 05, 05]
 
-10B67; [7A B1 6A, 05, 05]
+1084C; [77 B5 F9, 05, 05]
 
-10B68; [7A B1 72, 05, 05]
+1084D; [77 B6 03, 05, 05]
 
-10B69; [7A B1 7A, 05, 05]
+1084E; [77 B6 0B, 05, 05]
 
-10B6A; [7A B1 82, 05, 05]
+1084F; [77 B6 13, 05, 05]
 
-10B6B; [7A B1 8A, 05, 05]
+10850; [77 B6 1B, 05, 05]
 
-10B6C; [7A B1 92, 05, 05]
+10851; [77 B6 23, 05, 05]
 
-10B6D; [7A B1 9A, 05, 05]
+10852; [77 B6 2B, 05, 05]
 
-10B6E; [7A B1 A2, 05, 05]
+10853; [77 B6 33, 05, 05]
 
-10B6F; [7A B1 AA, 05, 05]
+10854; [77 B6 3B, 05, 05]
 
-10B70; [7A B1 B2, 05, 05]
+10855; [77 B6 43, 05, 05]
 
-10B71; [7A B1 BA, 05, 05]
+FDD1 10B40;    [77 B6 6C, 05, 05]      # Inscriptional Parthian first primary
 
-10B72; [7A B1 C2, 05, 05]
+10B40; [77 B6 95, 05, 05]
 
-10380; [7A B1 CA, 05, 05]
+10B41; [77 B6 9D, 05, 05]
 
-10381; [7A B1 D2, 05, 05]
+10B42; [77 B6 A5, 05, 05]
 
-10382; [7A B1 DA, 05, 05]
+10B43; [77 B6 AD, 05, 05]
 
-10383; [7A B1 E2, 05, 05]
+10B44; [77 B6 B5, 05, 05]
 
-10384; [7A B1 EA, 05, 05]
+10B45; [77 B6 BD, 05, 05]
 
-10385; [7A B1 F2, 05, 05]
+10B46; [77 B6 C5, 05, 05]
 
-10386; [7A B1 FA, 05, 05]
+10B47; [77 B6 CD, 05, 05]
 
-10387; [7A B2 08, 05, 05]
+10B48; [77 B6 D5, 05, 05]
 
-10388; [7A B2 10, 05, 05]
+10B49; [77 B6 DD, 05, 05]
 
-10389; [7A B2 18, 05, 05]
+10B4A; [77 B6 E5, 05, 05]
 
-1038A; [7A B2 20, 05, 05]
+10B4B; [77 B6 ED, 05, 05]
 
-1038B; [7A B2 28, 05, 05]
+10B4C; [77 B6 F5, 05, 05]
 
-1038C; [7A B2 30, 05, 05]
+10B4D; [77 B6 FD, 05, 05]
 
-1038D; [7A B2 38, 05, 05]
+10B4E; [77 B7 07, 05, 05]
 
-1038E; [7A B2 40, 05, 05]
+10B4F; [77 B7 0F, 05, 05]
 
-1038F; [7A B2 48, 05, 05]
+10B50; [77 B7 17, 05, 05]
 
-10390; [7A B2 50, 05, 05]
+10B51; [77 B7 1F, 05, 05]
 
-10391; [7A B2 58, 05, 05]
+10B52; [77 B7 27, 05, 05]
 
-10392; [7A B2 60, 05, 05]
+10B53; [77 B7 2F, 05, 05]
 
-10393; [7A B2 68, 05, 05]
+10B54; [77 B7 37, 05, 05]
 
-10394; [7A B2 70, 05, 05]
+10B55; [77 B7 3F, 05, 05]
 
-10395; [7A B2 78, 05, 05]
+FDD1 10B60;    [77 B7 68, 05, 05]      # Inscriptional Pahlavi first primary
 
-10396; [7A B2 80, 05, 05]
+10B60; [77 B7 91, 05, 05]
 
-10397; [7A B2 88, 05, 05]
+10B61; [77 B7 99, 05, 05]
 
-10398; [7A B2 90, 05, 05]
+10B62; [77 B7 A1, 05, 05]
 
-10399; [7A B2 98, 05, 05]
+10B63; [77 B7 A9, 05, 05]
 
-1039A; [7A B2 A0, 05, 05]
+10B64; [77 B7 B1, 05, 05]
 
-1039B; [7A B2 A8, 05, 05]
+10B65; [77 B7 B9, 05, 05]
 
-1039C; [7A B2 B0, 05, 05]
+10B66; [77 B7 C1, 05, 05]
 
-1039D; [7A B2 B8, 05, 05]
+10B67; [77 B7 C9, 05, 05]
 
-103A0; [7A B2 C0, 05, 05]
+10B68; [77 B7 D1, 05, 05]
 
-103A1; [7A B2 C8, 05, 05]
+10B69; [77 B7 D9, 05, 05]
 
-103A2; [7A B2 D0, 05, 05]
+10B6A; [77 B7 E1, 05, 05]
 
-103A3; [7A B2 D8, 05, 05]
+10B6B; [77 B7 E9, 05, 05]
 
-103A4; [7A B2 E0, 05, 05]
+10B6C; [77 B7 F1, 05, 05]
 
-103A5; [7A B2 E8, 05, 05]
+10B6D; [77 B7 F9, 05, 05]
 
-103A6; [7A B2 F0, 05, 05]
+10B6E; [77 B8 03, 05, 05]
 
-103A7; [7A B2 F8, 05, 05]
+10B6F; [77 B8 0B, 05, 05]
 
-103A8; [7A B3 06, 05, 05]
+10B70; [77 B8 13, 05, 05]
 
-103A9; [7A B3 0E, 05, 05]
+10B71; [77 B8 1B, 05, 05]
 
-103AA; [7A B3 16, 05, 05]
+10B72; [77 B8 23, 05, 05]
 
-103AB; [7A B3 1E, 05, 05]
+FDD1 10380;    [77 B8 4C, 05, 05]      # UGARITIC first primary
 
-103AC; [7A B3 26, 05, 05]
+10380; [77 B8 75, 05, 05]
 
-103AD; [7A B3 2E, 05, 05]
+10381; [77 B8 7D, 05, 05]
 
-103AE; [7A B3 36, 05, 05]
+10382; [77 B8 85, 05, 05]
 
-103AF; [7A B3 3E, 05, 05]
+10383; [77 B8 8D, 05, 05]
 
-103B0; [7A B3 46, 05, 05]
+10384; [77 B8 95, 05, 05]
 
-103B1; [7A B3 4E, 05, 05]
+10385; [77 B8 9D, 05, 05]
 
-103B2; [7A B3 56, 05, 05]
+10386; [77 B8 A5, 05, 05]
 
-103B3; [7A B3 5E, 05, 05]
+10387; [77 B8 AD, 05, 05]
 
-103B4; [7A B3 66, 05, 05]
+10388; [77 B8 B5, 05, 05]
 
-103B5; [7A B3 6E, 05, 05]
+10389; [77 B8 BD, 05, 05]
 
-103B6; [7A B3 76, 05, 05]
+1038A; [77 B8 C5, 05, 05]
 
-103B7; [7A B3 7E, 05, 05]
+1038B; [77 B8 CD, 05, 05]
 
-103B8; [7A B3 86, 05, 05]
+1038C; [77 B8 D5, 05, 05]
 
-103B9; [7A B3 8E, 05, 05]
+1038D; [77 B8 DD, 05, 05]
 
-103BA; [7A B3 96, 05, 05]
+1038E; [77 B8 E5, 05, 05]
 
-103BB; [7A B3 9E, 05, 05]
+1038F; [77 B8 ED, 05, 05]
 
-103BC; [7A B3 A6, 05, 05]
+10390; [77 B8 F5, 05, 05]
 
-103BD; [7A B3 AE, 05, 05]
+10391; [77 B8 FD, 05, 05]
 
-103BE; [7A B3 B6, 05, 05]
+10392; [77 B9 07, 05, 05]
 
-103BF; [7A B3 BE, 05, 05]
+10393; [77 B9 0F, 05, 05]
 
-103C0; [7A B3 C6, 05, 05]
+10394; [77 B9 17, 05, 05]
 
-103C1; [7A B3 CE, 05, 05]
+10395; [77 B9 1F, 05, 05]
 
-103C2; [7A B3 D6, 05, 05]
+10396; [77 B9 27, 05, 05]
 
-103C3; [7A B3 DE, 05, 05]
+10397; [77 B9 2F, 05, 05]
 
-103C8; [7A B3 E6, 05, 05]
+10398; [77 B9 37, 05, 05]
 
-103C9; [7A B3 EE, 05, 05]
+10399; [77 B9 3F, 05, 05]
 
-103CA; [7A B3 F6, 05, 05]
+1039A; [77 B9 47, 05, 05]
 
-103CB; [7A B4 04, 05, 05]
+1039B; [77 B9 4F, 05, 05]
 
-103CC; [7A B4 0C, 05, 05]
+1039C; [77 B9 57, 05, 05]
 
-103CD; [7A B4 14, 05, 05]
+1039D; [77 B9 5F, 05, 05]
 
-103CE; [7A B4 1C, 05, 05]
+FDD1 103A0;    [77 B9 88, 05, 05]      # OLD_PERSIAN first primary
 
-103CF; [7A B4 24, 05, 05]
+103A0; [77 B9 B1, 05, 05]
 
-12000; [7A B4 2C, 05, 05]
+103A1; [77 B9 B9, 05, 05]
 
-12001; [7A B4 34, 05, 05]
+103A2; [77 B9 C1, 05, 05]
 
-12002; [7A B4 3C, 05, 05]
+103A3; [77 B9 C9, 05, 05]
 
-12003; [7A B4 44, 05, 05]
+103A4; [77 B9 D1, 05, 05]
 
-12004; [7A B4 4C, 05, 05]
+103A5; [77 B9 D9, 05, 05]
 
-12005; [7A B4 54, 05, 05]
+103A6; [77 B9 E1, 05, 05]
 
-12006; [7A B4 5C, 05, 05]
+103A7; [77 B9 E9, 05, 05]
 
-12007; [7A B4 64, 05, 05]
+103A8; [77 B9 F1, 05, 05]
 
-12008; [7A B4 6C, 05, 05]
+103A9; [77 B9 F9, 05, 05]
 
-12009; [7A B4 74, 05, 05]
+103AA; [77 BA 03, 05, 05]
 
-1200A; [7A B4 7C, 05, 05]
+103AB; [77 BA 0B, 05, 05]
 
-1200B; [7A B4 84, 05, 05]
+103AC; [77 BA 13, 05, 05]
 
-1200C; [7A B4 8C, 05, 05]
+103AD; [77 BA 1B, 05, 05]
 
-1200D; [7A B4 94, 05, 05]
+103AE; [77 BA 23, 05, 05]
 
-1200E; [7A B4 9C, 05, 05]
+103AF; [77 BA 2B, 05, 05]
 
-1200F; [7A B4 A4, 05, 05]
+103B0; [77 BA 33, 05, 05]
 
-12010; [7A B4 AC, 05, 05]
+103B1; [77 BA 3B, 05, 05]
 
-12011; [7A B4 B4, 05, 05]
+103B2; [77 BA 43, 05, 05]
 
-12012; [7A B4 BC, 05, 05]
+103B3; [77 BA 4B, 05, 05]
 
-12013; [7A B4 C4, 05, 05]
+103B4; [77 BA 53, 05, 05]
 
-12014; [7A B4 CC, 05, 05]
+103B5; [77 BA 5B, 05, 05]
 
-12015; [7A B4 D4, 05, 05]
+103B6; [77 BA 63, 05, 05]
 
-12016; [7A B4 DC, 05, 05]
+103B7; [77 BA 6B, 05, 05]
 
-12017; [7A B4 E4, 05, 05]
+103B8; [77 BA 73, 05, 05]
 
-12018; [7A B4 EC, 05, 05]
+103B9; [77 BA 7B, 05, 05]
 
-12019; [7A B4 F4, 05, 05]
+103BA; [77 BA 83, 05, 05]
 
-1201A; [7A B4 FC, 05, 05]
+103BB; [77 BA 8B, 05, 05]
 
-1201B; [7A B5 0A, 05, 05]
+103BC; [77 BA 93, 05, 05]
 
-1201C; [7A B5 12, 05, 05]
+103BD; [77 BA 9B, 05, 05]
 
-1201D; [7A B5 1A, 05, 05]
+103BE; [77 BA A3, 05, 05]
 
-1201E; [7A B5 22, 05, 05]
+103BF; [77 BA AB, 05, 05]
 
-1201F; [7A B5 2A, 05, 05]
+103C0; [77 BA B3, 05, 05]
 
-12020; [7A B5 32, 05, 05]
+103C1; [77 BA BB, 05, 05]
 
-12021; [7A B5 3A, 05, 05]
+103C2; [77 BA C3, 05, 05]
 
-12022; [7A B5 42, 05, 05]
+103C3; [77 BA CB, 05, 05]
 
-12023; [7A B5 4A, 05, 05]
+103C8; [77 BA D3, 05, 05]
 
-12024; [7A B5 52, 05, 05]
+103C9; [77 BA DB, 05, 05]
 
-12025; [7A B5 5A, 05, 05]
+103CA; [77 BA E3, 05, 05]
 
-12026; [7A B5 62, 05, 05]
+103CB; [77 BA EB, 05, 05]
 
-12027; [7A B5 6A, 05, 05]
+103CC; [77 BA F3, 05, 05]
 
-12028; [7A B5 72, 05, 05]
+103CD; [77 BA FB, 05, 05]
 
-12029; [7A B5 7A, 05, 05]
+103CE; [77 BB 05, 05, 05]
 
-1202A; [7A B5 82, 05, 05]
+103CF; [77 BB 0D, 05, 05]
 
-1202B; [7A B5 8A, 05, 05]
+FDD1 12000;    [77 BB 36, 05, 05]      # Cuneiform first primary
 
-1202C; [7A B5 92, 05, 05]
+12000; [77 BB 5F, 05, 05]
 
-1202D; [7A B5 9A, 05, 05]
+12001; [77 BB 67, 05, 05]
 
-1202E; [7A B5 A2, 05, 05]
+12002; [77 BB 6F, 05, 05]
 
-1202F; [7A B5 AA, 05, 05]
+12003; [77 BB 77, 05, 05]
 
-12030; [7A B5 B2, 05, 05]
+12004; [77 BB 7F, 05, 05]
 
-12031; [7A B5 BA, 05, 05]
+12005; [77 BB 87, 05, 05]
 
-12032; [7A B5 C2, 05, 05]
+12006; [77 BB 8F, 05, 05]
 
-12033; [7A B5 CA, 05, 05]
+12007; [77 BB 97, 05, 05]
 
-12034; [7A B5 D2, 05, 05]
+12008; [77 BB 9F, 05, 05]
 
-12035; [7A B5 DA, 05, 05]
+12009; [77 BB A7, 05, 05]
 
-12036; [7A B5 E2, 05, 05]
+1200A; [77 BB AF, 05, 05]
 
-12037; [7A B5 EA, 05, 05]
+1200B; [77 BB B7, 05, 05]
 
-12038; [7A B5 F2, 05, 05]
+1200C; [77 BB BF, 05, 05]
 
-12039; [7A B5 FA, 05, 05]
+1200D; [77 BB C7, 05, 05]
 
-1203A; [7A B6 08, 05, 05]
+1200E; [77 BB CF, 05, 05]
 
-1203B; [7A B6 10, 05, 05]
+1200F; [77 BB D7, 05, 05]
 
-1203C; [7A B6 18, 05, 05]
+12010; [77 BB DF, 05, 05]
 
-1203D; [7A B6 20, 05, 05]
+12011; [77 BB E7, 05, 05]
 
-1203E; [7A B6 28, 05, 05]
+12012; [77 BB EF, 05, 05]
 
-1203F; [7A B6 30, 05, 05]
+12013; [77 BB F7, 05, 05]
 
-12040; [7A B6 38, 05, 05]
+12014; [77 BB FF, 05, 05]
 
-12041; [7A B6 40, 05, 05]
+12015; [77 BC 09, 05, 05]
 
-12042; [7A B6 48, 05, 05]
+12016; [77 BC 11, 05, 05]
 
-12043; [7A B6 50, 05, 05]
+12017; [77 BC 19, 05, 05]
 
-12044; [7A B6 58, 05, 05]
+12018; [77 BC 21, 05, 05]
 
-12045; [7A B6 60, 05, 05]
+12019; [77 BC 29, 05, 05]
 
-12046; [7A B6 68, 05, 05]
+1201A; [77 BC 31, 05, 05]
 
-12047; [7A B6 70, 05, 05]
+1201B; [77 BC 39, 05, 05]
 
-12048; [7A B6 78, 05, 05]
+1201C; [77 BC 41, 05, 05]
 
-12049; [7A B6 80, 05, 05]
+1201D; [77 BC 49, 05, 05]
 
-1204A; [7A B6 88, 05, 05]
+1201E; [77 BC 51, 05, 05]
 
-1204B; [7A B6 90, 05, 05]
+1201F; [77 BC 59, 05, 05]
 
-1204C; [7A B6 98, 05, 05]
+12020; [77 BC 61, 05, 05]
 
-1204D; [7A B6 A0, 05, 05]
+12021; [77 BC 69, 05, 05]
 
-1204E; [7A B6 A8, 05, 05]
+12022; [77 BC 71, 05, 05]
 
-1204F; [7A B6 B0, 05, 05]
+12023; [77 BC 79, 05, 05]
 
-12050; [7A B6 B8, 05, 05]
+12024; [77 BC 81, 05, 05]
 
-12051; [7A B6 C0, 05, 05]
+12025; [77 BC 89, 05, 05]
 
-12052; [7A B6 C8, 05, 05]
+12026; [77 BC 91, 05, 05]
 
-12053; [7A B6 D0, 05, 05]
+12027; [77 BC 99, 05, 05]
 
-12054; [7A B6 D8, 05, 05]
+12028; [77 BC A1, 05, 05]
 
-12055; [7A B6 E0, 05, 05]
+12029; [77 BC A9, 05, 05]
 
-12056; [7A B6 E8, 05, 05]
+1202A; [77 BC B1, 05, 05]
 
-12057; [7A B6 F0, 05, 05]
+1202B; [77 BC B9, 05, 05]
 
-12058; [7A B6 F8, 05, 05]
+1202C; [77 BC C1, 05, 05]
 
-12059; [7A B7 06, 05, 05]
+1202D; [77 BC C9, 05, 05]
 
-1205A; [7A B7 0E, 05, 05]
+1202E; [77 BC D1, 05, 05]
 
-1205B; [7A B7 16, 05, 05]
+1202F; [77 BC D9, 05, 05]
 
-1205C; [7A B7 1E, 05, 05]
+12030; [77 BC E1, 05, 05]
 
-1205D; [7A B7 26, 05, 05]
+12031; [77 BC E9, 05, 05]
 
-1205E; [7A B7 2E, 05, 05]
+12032; [77 BC F1, 05, 05]
 
-1205F; [7A B7 36, 05, 05]
+12033; [77 BC F9, 05, 05]
 
-12060; [7A B7 3E, 05, 05]
+12034; [77 BD 03, 05, 05]
 
-12061; [7A B7 46, 05, 05]
+12035; [77 BD 0B, 05, 05]
 
-12062; [7A B7 4E, 05, 05]
+12036; [77 BD 13, 05, 05]
 
-12063; [7A B7 56, 05, 05]
+12037; [77 BD 1B, 05, 05]
 
-12064; [7A B7 5E, 05, 05]
+12038; [77 BD 23, 05, 05]
 
-12065; [7A B7 66, 05, 05]
+12039; [77 BD 2B, 05, 05]
 
-12066; [7A B7 6E, 05, 05]
+1203A; [77 BD 33, 05, 05]
 
-12067; [7A B7 76, 05, 05]
+1203B; [77 BD 3B, 05, 05]
 
-12068; [7A B7 7E, 05, 05]
+1203C; [77 BD 43, 05, 05]
 
-12069; [7A B7 86, 05, 05]
+1203D; [77 BD 4B, 05, 05]
 
-1206A; [7A B7 8E, 05, 05]
+1203E; [77 BD 53, 05, 05]
 
-1206B; [7A B7 96, 05, 05]
+1203F; [77 BD 5B, 05, 05]
 
-1206C; [7A B7 9E, 05, 05]
+12040; [77 BD 63, 05, 05]
 
-1206D; [7A B7 A6, 05, 05]
+12041; [77 BD 6B, 05, 05]
 
-1206E; [7A B7 AE, 05, 05]
+12042; [77 BD 73, 05, 05]
 
-1206F; [7A B7 B6, 05, 05]
+12043; [77 BD 7B, 05, 05]
 
-12070; [7A B7 BE, 05, 05]
+12044; [77 BD 83, 05, 05]
 
-12071; [7A B7 C6, 05, 05]
+12045; [77 BD 8B, 05, 05]
 
-12072; [7A B7 CE, 05, 05]
+12046; [77 BD 93, 05, 05]
 
-12073; [7A B7 D6, 05, 05]
+12047; [77 BD 9B, 05, 05]
 
-12074; [7A B7 DE, 05, 05]
+12048; [77 BD A3, 05, 05]
 
-12075; [7A B7 E6, 05, 05]
+12049; [77 BD AB, 05, 05]
 
-12076; [7A B7 EE, 05, 05]
+1204A; [77 BD B3, 05, 05]
 
-12077; [7A B7 F6, 05, 05]
+1204B; [77 BD BB, 05, 05]
 
-12078; [7A B8 04, 05, 05]
+1204C; [77 BD C3, 05, 05]
 
-12079; [7A B8 0C, 05, 05]
+1204D; [77 BD CB, 05, 05]
 
-1207A; [7A B8 14, 05, 05]
+1204E; [77 BD D3, 05, 05]
 
-1207B; [7A B8 1C, 05, 05]
+1204F; [77 BD DB, 05, 05]
 
-1207C; [7A B8 24, 05, 05]
+12050; [77 BD E3, 05, 05]
 
-1207D; [7A B8 2C, 05, 05]
+12051; [77 BD EB, 05, 05]
 
-1207E; [7A B8 34, 05, 05]
+12052; [77 BD F3, 05, 05]
 
-1207F; [7A B8 3C, 05, 05]
+12053; [77 BD FB, 05, 05]
 
-12080; [7A B8 44, 05, 05]
+12054; [77 BE 05, 05, 05]
 
-12081; [7A B8 4C, 05, 05]
+12055; [77 BE 0D, 05, 05]
 
-12082; [7A B8 54, 05, 05]
+12056; [77 BE 15, 05, 05]
 
-12083; [7A B8 5C, 05, 05]
+12057; [77 BE 1D, 05, 05]
 
-12084; [7A B8 64, 05, 05]
+12058; [77 BE 25, 05, 05]
 
-12085; [7A B8 6C, 05, 05]
+12059; [77 BE 2D, 05, 05]
 
-12086; [7A B8 74, 05, 05]
+1205A; [77 BE 35, 05, 05]
 
-12087; [7A B8 7C, 05, 05]
+1205B; [77 BE 3D, 05, 05]
 
-12088; [7A B8 84, 05, 05]
+1205C; [77 BE 45, 05, 05]
 
-12089; [7A B8 8C, 05, 05]
+1205D; [77 BE 4D, 05, 05]
 
-1208A; [7A B8 94, 05, 05]
+1205E; [77 BE 55, 05, 05]
 
-1208B; [7A B8 9C, 05, 05]
+1205F; [77 BE 5D, 05, 05]
 
-1208C; [7A B8 A4, 05, 05]
+12060; [77 BE 65, 05, 05]
 
-1208D; [7A B8 AC, 05, 05]
+12061; [77 BE 6D, 05, 05]
 
-1208E; [7A B8 B4, 05, 05]
+12062; [77 BE 75, 05, 05]
 
-1208F; [7A B8 BC, 05, 05]
+12063; [77 BE 7D, 05, 05]
 
-12090; [7A B8 C4, 05, 05]
+12064; [77 BE 85, 05, 05]
 
-12091; [7A B8 CC, 05, 05]
+12065; [77 BE 8D, 05, 05]
 
-12092; [7A B8 D4, 05, 05]
+12066; [77 BE 95, 05, 05]
 
-12093; [7A B8 DC, 05, 05]
+12067; [77 BE 9D, 05, 05]
 
-12094; [7A B8 E4, 05, 05]
+12068; [77 BE A5, 05, 05]
 
-12095; [7A B8 EC, 05, 05]
+12069; [77 BE AD, 05, 05]
 
-12096; [7A B8 F4, 05, 05]
+1206A; [77 BE B5, 05, 05]
 
-12097; [7A B8 FC, 05, 05]
+1206B; [77 BE BD, 05, 05]
 
-12098; [7A B9 0A, 05, 05]
+1206C; [77 BE C5, 05, 05]
 
-12099; [7A B9 12, 05, 05]
+1206D; [77 BE CD, 05, 05]
 
-1209A; [7A B9 1A, 05, 05]
+1206E; [77 BE D5, 05, 05]
 
-1209B; [7A B9 22, 05, 05]
+1206F; [77 BE DD, 05, 05]
 
-1209C; [7A B9 2A, 05, 05]
+12070; [77 BE E5, 05, 05]
 
-1209D; [7A B9 32, 05, 05]
+12071; [77 BE ED, 05, 05]
 
-1209E; [7A B9 3A, 05, 05]
+12072; [77 BE F5, 05, 05]
 
-1209F; [7A B9 42, 05, 05]
+12073; [77 BE FD, 05, 05]
 
-120A0; [7A B9 4A, 05, 05]
+12074; [77 BF 07, 05, 05]
 
-120A1; [7A B9 52, 05, 05]
+12075; [77 BF 0F, 05, 05]
 
-120A2; [7A B9 5A, 05, 05]
+12076; [77 BF 17, 05, 05]
 
-120A3; [7A B9 62, 05, 05]
+12077; [77 BF 1F, 05, 05]
 
-120A4; [7A B9 6A, 05, 05]
+12078; [77 BF 27, 05, 05]
 
-120A5; [7A B9 72, 05, 05]
+12079; [77 BF 2F, 05, 05]
 
-120A6; [7A B9 7A, 05, 05]
+1207A; [77 BF 37, 05, 05]
 
-120A7; [7A B9 82, 05, 05]
+1207B; [77 BF 3F, 05, 05]
 
-120A8; [7A B9 8A, 05, 05]
+1207C; [77 BF 47, 05, 05]
 
-120A9; [7A B9 92, 05, 05]
+1207D; [77 BF 4F, 05, 05]
 
-120AA; [7A B9 9A, 05, 05]
+1207E; [77 BF 57, 05, 05]
 
-120AB; [7A B9 A2, 05, 05]
+1207F; [77 BF 5F, 05, 05]
 
-120AC; [7A B9 AA, 05, 05]
+12080; [77 BF 67, 05, 05]
 
-120AD; [7A B9 B2, 05, 05]
+12081; [77 BF 6F, 05, 05]
 
-120AE; [7A B9 BA, 05, 05]
+12082; [77 BF 77, 05, 05]
 
-120AF; [7A B9 C2, 05, 05]
+12083; [77 BF 7F, 05, 05]
 
-120B0; [7A B9 CA, 05, 05]
+12084; [77 BF 87, 05, 05]
 
-120B1; [7A B9 D2, 05, 05]
+12085; [77 BF 8F, 05, 05]
 
-120B2; [7A B9 DA, 05, 05]
+12086; [77 BF 97, 05, 05]
 
-120B3; [7A B9 E2, 05, 05]
+12087; [77 BF 9F, 05, 05]
 
-120B4; [7A B9 EA, 05, 05]
+12088; [77 BF A7, 05, 05]
 
-120B5; [7A B9 F2, 05, 05]
+12089; [77 BF AF, 05, 05]
 
-120B6; [7A B9 FA, 05, 05]
+1208A; [77 BF B7, 05, 05]
 
-120B7; [7A BA 08, 05, 05]
+1208B; [77 BF BF, 05, 05]
 
-120B8; [7A BA 10, 05, 05]
+1208C; [77 BF C7, 05, 05]
 
-120B9; [7A BA 18, 05, 05]
+1208D; [77 BF CF, 05, 05]
 
-120BA; [7A BA 20, 05, 05]
+1208E; [77 BF D7, 05, 05]
 
-120BB; [7A BA 28, 05, 05]
+1208F; [77 BF DF, 05, 05]
 
-120BC; [7A BA 30, 05, 05]
+12090; [77 BF E7, 05, 05]
 
-120BD; [7A BA 38, 05, 05]
+12091; [77 BF EF, 05, 05]
 
-120BE; [7A BA 40, 05, 05]
+12092; [77 BF F7, 05, 05]
 
-120BF; [7A BA 48, 05, 05]
+12093; [77 BF FF, 05, 05]
 
-120C0; [7A BA 50, 05, 05]
+12094; [77 C0 09, 05, 05]
 
-120C1; [7A BA 58, 05, 05]
+12095; [77 C0 11, 05, 05]
 
-120C2; [7A BA 60, 05, 05]
+12096; [77 C0 19, 05, 05]
 
-120C3; [7A BA 68, 05, 05]
+12097; [77 C0 21, 05, 05]
 
-120C4; [7A BA 70, 05, 05]
+12098; [77 C0 29, 05, 05]
 
-120C5; [7A BA 78, 05, 05]
+12099; [77 C0 31, 05, 05]
 
-120C6; [7A BA 80, 05, 05]
+1209A; [77 C0 39, 05, 05]
 
-120C7; [7A BA 88, 05, 05]
+1209B; [77 C0 41, 05, 05]
 
-120C8; [7A BA 90, 05, 05]
+1209C; [77 C0 49, 05, 05]
 
-120C9; [7A BA 98, 05, 05]
+1209D; [77 C0 51, 05, 05]
 
-120CA; [7A BA A0, 05, 05]
+1209E; [77 C0 59, 05, 05]
 
-120CB; [7A BA A8, 05, 05]
+1209F; [77 C0 61, 05, 05]
 
-120CC; [7A BA B0, 05, 05]
+120A0; [77 C0 69, 05, 05]
 
-120CD; [7A BA B8, 05, 05]
+120A1; [77 C0 71, 05, 05]
 
-120CE; [7A BA C0, 05, 05]
+120A2; [77 C0 79, 05, 05]
 
-120CF; [7A BA C8, 05, 05]
+120A3; [77 C0 81, 05, 05]
 
-120D0; [7A BA D0, 05, 05]
+120A4; [77 C0 89, 05, 05]
 
-120D1; [7A BA D8, 05, 05]
+120A5; [77 C0 91, 05, 05]
 
-120D2; [7A BA E0, 05, 05]
+120A6; [77 C0 99, 05, 05]
 
-120D3; [7A BA E8, 05, 05]
+120A7; [77 C0 A1, 05, 05]
 
-120D4; [7A BA F0, 05, 05]
+120A8; [77 C0 A9, 05, 05]
 
-120D5; [7A BA F8, 05, 05]
+120A9; [77 C0 B1, 05, 05]
 
-120D6; [7A BB 06, 05, 05]
+120AA; [77 C0 B9, 05, 05]
 
-120D7; [7A BB 0E, 05, 05]
+120AB; [77 C0 C1, 05, 05]
 
-120D8; [7A BB 16, 05, 05]
+120AC; [77 C0 C9, 05, 05]
 
-120D9; [7A BB 1E, 05, 05]
+120AD; [77 C0 D1, 05, 05]
 
-120DA; [7A BB 26, 05, 05]
+120AE; [77 C0 D9, 05, 05]
 
-120DB; [7A BB 2E, 05, 05]
+120AF; [77 C0 E1, 05, 05]
 
-120DC; [7A BB 36, 05, 05]
+120B0; [77 C0 E9, 05, 05]
 
-120DD; [7A BB 3E, 05, 05]
+120B1; [77 C0 F1, 05, 05]
 
-120DE; [7A BB 46, 05, 05]
+120B2; [77 C0 F9, 05, 05]
 
-120DF; [7A BB 4E, 05, 05]
+120B3; [77 C1 03, 05, 05]
 
-120E0; [7A BB 56, 05, 05]
+120B4; [77 C1 0B, 05, 05]
 
-120E1; [7A BB 5E, 05, 05]
+120B5; [77 C1 13, 05, 05]
 
-120E2; [7A BB 66, 05, 05]
+120B6; [77 C1 1B, 05, 05]
 
-120E3; [7A BB 6E, 05, 05]
+120B7; [77 C1 23, 05, 05]
 
-120E4; [7A BB 76, 05, 05]
+120B8; [77 C1 2B, 05, 05]
 
-120E5; [7A BB 7E, 05, 05]
+120B9; [77 C1 33, 05, 05]
 
-120E6; [7A BB 86, 05, 05]
+120BA; [77 C1 3B, 05, 05]
 
-120E7; [7A BB 8E, 05, 05]
+120BB; [77 C1 43, 05, 05]
 
-120E8; [7A BB 96, 05, 05]
+120BC; [77 C1 4B, 05, 05]
 
-120E9; [7A BB 9E, 05, 05]
+120BD; [77 C1 53, 05, 05]
 
-120EA; [7A BB A6, 05, 05]
+120BE; [77 C1 5B, 05, 05]
 
-120EB; [7A BB AE, 05, 05]
+120BF; [77 C1 63, 05, 05]
 
-120EC; [7A BB B6, 05, 05]
+120C0; [77 C1 6B, 05, 05]
 
-120ED; [7A BB BE, 05, 05]
+120C1; [77 C1 73, 05, 05]
 
-120EE; [7A BB C6, 05, 05]
+120C2; [77 C1 7B, 05, 05]
 
-120EF; [7A BB CE, 05, 05]
+120C3; [77 C1 83, 05, 05]
 
-120F0; [7A BB D6, 05, 05]
+120C4; [77 C1 8B, 05, 05]
 
-120F1; [7A BB DE, 05, 05]
+120C5; [77 C1 93, 05, 05]
 
-120F2; [7A BB E6, 05, 05]
+120C6; [77 C1 9B, 05, 05]
 
-120F3; [7A BB EE, 05, 05]
+120C7; [77 C1 A3, 05, 05]
 
-120F4; [7A BB F6, 05, 05]
+120C8; [77 C1 AB, 05, 05]
 
-120F5; [7A BC 04, 05, 05]
+120C9; [77 C1 B3, 05, 05]
 
-120F6; [7A BC 0C, 05, 05]
+120CA; [77 C1 BB, 05, 05]
 
-120F7; [7A BC 14, 05, 05]
+120CB; [77 C1 C3, 05, 05]
 
-120F8; [7A BC 1C, 05, 05]
+120CC; [77 C1 CB, 05, 05]
 
-120F9; [7A BC 24, 05, 05]
+120CD; [77 C1 D3, 05, 05]
 
-120FA; [7A BC 2C, 05, 05]
+120CE; [77 C1 DB, 05, 05]
 
-120FB; [7A BC 34, 05, 05]
+120CF; [77 C1 E3, 05, 05]
 
-120FC; [7A BC 3C, 05, 05]
+120D0; [77 C1 EB, 05, 05]
 
-120FD; [7A BC 44, 05, 05]
+120D1; [77 C1 F3, 05, 05]
 
-120FE; [7A BC 4C, 05, 05]
+120D2; [77 C1 FB, 05, 05]
 
-120FF; [7A BC 54, 05, 05]
+120D3; [77 C2 05, 05, 05]
 
-12100; [7A BC 5C, 05, 05]
+120D4; [77 C2 0D, 05, 05]
 
-12101; [7A BC 64, 05, 05]
+120D5; [77 C2 15, 05, 05]
 
-12102; [7A BC 6C, 05, 05]
+120D6; [77 C2 1D, 05, 05]
 
-12103; [7A BC 74, 05, 05]
+120D7; [77 C2 25, 05, 05]
 
-12104; [7A BC 7C, 05, 05]
+120D8; [77 C2 2D, 05, 05]
 
-12105; [7A BC 84, 05, 05]
+120D9; [77 C2 35, 05, 05]
 
-12106; [7A BC 8C, 05, 05]
+120DA; [77 C2 3D, 05, 05]
 
-12107; [7A BC 94, 05, 05]
+120DB; [77 C2 45, 05, 05]
 
-12108; [7A BC 9C, 05, 05]
+120DC; [77 C2 4D, 05, 05]
 
-12109; [7A BC A4, 05, 05]
+120DD; [77 C2 55, 05, 05]
 
-1210A; [7A BC AC, 05, 05]
+120DE; [77 C2 5D, 05, 05]
 
-1210B; [7A BC B4, 05, 05]
+120DF; [77 C2 65, 05, 05]
 
-1210C; [7A BC BC, 05, 05]
+120E0; [77 C2 6D, 05, 05]
 
-1210D; [7A BC C4, 05, 05]
+120E1; [77 C2 75, 05, 05]
 
-1210E; [7A BC CC, 05, 05]
+120E2; [77 C2 7D, 05, 05]
 
-1210F; [7A BC D4, 05, 05]
+120E3; [77 C2 85, 05, 05]
 
-12110; [7A BC DC, 05, 05]
+120E4; [77 C2 8D, 05, 05]
 
-12111; [7A BC E4, 05, 05]
+120E5; [77 C2 95, 05, 05]
 
-12112; [7A BC EC, 05, 05]
+120E6; [77 C2 9D, 05, 05]
 
-12113; [7A BC F4, 05, 05]
+120E7; [77 C2 A5, 05, 05]
 
-12114; [7A BC FC, 05, 05]
+120E8; [77 C2 AD, 05, 05]
 
-12115; [7A BD 0A, 05, 05]
+120E9; [77 C2 B5, 05, 05]
 
-12116; [7A BD 12, 05, 05]
+120EA; [77 C2 BD, 05, 05]
 
-12117; [7A BD 1A, 05, 05]
+120EB; [77 C2 C5, 05, 05]
 
-12118; [7A BD 22, 05, 05]
+120EC; [77 C2 CD, 05, 05]
 
-12119; [7A BD 2A, 05, 05]
+120ED; [77 C2 D5, 05, 05]
 
-1211A; [7A BD 32, 05, 05]
+120EE; [77 C2 DD, 05, 05]
 
-1211B; [7A BD 3A, 05, 05]
+120EF; [77 C2 E5, 05, 05]
 
-1211C; [7A BD 42, 05, 05]
+120F0; [77 C2 ED, 05, 05]
 
-1211D; [7A BD 4A, 05, 05]
+120F1; [77 C2 F5, 05, 05]
 
-1211E; [7A BD 52, 05, 05]
+120F2; [77 C2 FD, 05, 05]
 
-1211F; [7A BD 5A, 05, 05]
+120F3; [77 C3 07, 05, 05]
 
-12120; [7A BD 62, 05, 05]
+120F4; [77 C3 0F, 05, 05]
 
-12121; [7A BD 6A, 05, 05]
+120F5; [77 C3 17, 05, 05]
 
-12122; [7A BD 72, 05, 05]
+120F6; [77 C3 1F, 05, 05]
 
-12123; [7A BD 7A, 05, 05]
+120F7; [77 C3 27, 05, 05]
 
-12124; [7A BD 82, 05, 05]
+120F8; [77 C3 2F, 05, 05]
 
-12125; [7A BD 8A, 05, 05]
+120F9; [77 C3 37, 05, 05]
 
-12126; [7A BD 92, 05, 05]
+120FA; [77 C3 3F, 05, 05]
 
-12127; [7A BD 9A, 05, 05]
+120FB; [77 C3 47, 05, 05]
 
-12128; [7A BD A2, 05, 05]
+120FC; [77 C3 4F, 05, 05]
 
-12129; [7A BD AA, 05, 05]
+120FD; [77 C3 57, 05, 05]
 
-1212A; [7A BD B2, 05, 05]
+120FE; [77 C3 5F, 05, 05]
 
-1212B; [7A BD BA, 05, 05]
+120FF; [77 C3 67, 05, 05]
 
-1212C; [7A BD C2, 05, 05]
+12100; [77 C3 6F, 05, 05]
 
-1212D; [7A BD CA, 05, 05]
+12101; [77 C3 77, 05, 05]
 
-1212E; [7A BD D2, 05, 05]
+12102; [77 C3 7F, 05, 05]
 
-1212F; [7A BD DA, 05, 05]
+12103; [77 C3 87, 05, 05]
 
-12130; [7A BD E2, 05, 05]
+12104; [77 C3 8F, 05, 05]
 
-12131; [7A BD EA, 05, 05]
+12105; [77 C3 97, 05, 05]
 
-12132; [7A BD F2, 05, 05]
+12106; [77 C3 9F, 05, 05]
 
-12133; [7A BD FA, 05, 05]
+12107; [77 C3 A7, 05, 05]
 
-12134; [7A BE 08, 05, 05]
+12108; [77 C3 AF, 05, 05]
 
-12135; [7A BE 10, 05, 05]
+12109; [77 C3 B7, 05, 05]
 
-12136; [7A BE 18, 05, 05]
+1210A; [77 C3 BF, 05, 05]
 
-12137; [7A BE 20, 05, 05]
+1210B; [77 C3 C7, 05, 05]
 
-12138; [7A BE 28, 05, 05]
+1210C; [77 C3 CF, 05, 05]
 
-12139; [7A BE 30, 05, 05]
+1210D; [77 C3 D7, 05, 05]
 
-1213A; [7A BE 38, 05, 05]
+1210E; [77 C3 DF, 05, 05]
 
-1213B; [7A BE 40, 05, 05]
+1210F; [77 C3 E7, 05, 05]
 
-1213C; [7A BE 48, 05, 05]
+12110; [77 C3 EF, 05, 05]
 
-1213D; [7A BE 50, 05, 05]
+12111; [77 C3 F7, 05, 05]
 
-1213E; [7A BE 58, 05, 05]
+12112; [77 C3 FF, 05, 05]
 
-1213F; [7A BE 60, 05, 05]
+12113; [77 C4 09, 05, 05]
 
-12140; [7A BE 68, 05, 05]
+12114; [77 C4 11, 05, 05]
 
-12141; [7A BE 70, 05, 05]
+12115; [77 C4 19, 05, 05]
 
-12142; [7A BE 78, 05, 05]
+12116; [77 C4 21, 05, 05]
 
-12143; [7A BE 80, 05, 05]
+12117; [77 C4 29, 05, 05]
 
-12144; [7A BE 88, 05, 05]
+12118; [77 C4 31, 05, 05]
 
-12145; [7A BE 90, 05, 05]
+12119; [77 C4 39, 05, 05]
 
-12146; [7A BE 98, 05, 05]
+1211A; [77 C4 41, 05, 05]
 
-12147; [7A BE A0, 05, 05]
+1211B; [77 C4 49, 05, 05]
 
-12148; [7A BE A8, 05, 05]
+1211C; [77 C4 51, 05, 05]
 
-12149; [7A BE B0, 05, 05]
+1211D; [77 C4 59, 05, 05]
 
-1214A; [7A BE B8, 05, 05]
+1211E; [77 C4 61, 05, 05]
 
-1214B; [7A BE C0, 05, 05]
+1211F; [77 C4 69, 05, 05]
 
-1214C; [7A BE C8, 05, 05]
+12120; [77 C4 71, 05, 05]
 
-1214D; [7A BE D0, 05, 05]
+12121; [77 C4 79, 05, 05]
 
-1214E; [7A BE D8, 05, 05]
+12122; [77 C4 81, 05, 05]
 
-1214F; [7A BE E0, 05, 05]
+12123; [77 C4 89, 05, 05]
 
-12150; [7A BE E8, 05, 05]
+12124; [77 C4 91, 05, 05]
 
-12151; [7A BE F0, 05, 05]
+12125; [77 C4 99, 05, 05]
 
-12152; [7A BE F8, 05, 05]
+12126; [77 C4 A1, 05, 05]
 
-12153; [7A BF 06, 05, 05]
+12127; [77 C4 A9, 05, 05]
 
-12154; [7A BF 0E, 05, 05]
+12128; [77 C4 B1, 05, 05]
 
-12155; [7A BF 16, 05, 05]
+12129; [77 C4 B9, 05, 05]
 
-12156; [7A BF 1E, 05, 05]
+1212A; [77 C4 C1, 05, 05]
 
-12157; [7A BF 26, 05, 05]
+1212B; [77 C4 C9, 05, 05]
 
-12158; [7A BF 2E, 05, 05]
+1212C; [77 C4 D1, 05, 05]
 
-12159; [7A BF 36, 05, 05]
+1212D; [77 C4 D9, 05, 05]
 
-1215A; [7A BF 3E, 05, 05]
+1212E; [77 C4 E1, 05, 05]
 
-1215B; [7A BF 46, 05, 05]
+1212F; [77 C4 E9, 05, 05]
 
-1215C; [7A BF 4E, 05, 05]
+12130; [77 C4 F1, 05, 05]
 
-1215D; [7A BF 56, 05, 05]
+12131; [77 C4 F9, 05, 05]
 
-1215E; [7A BF 5E, 05, 05]
+12132; [77 C5 03, 05, 05]
 
-1215F; [7A BF 66, 05, 05]
+12133; [77 C5 0B, 05, 05]
 
-12160; [7A BF 6E, 05, 05]
+12134; [77 C5 13, 05, 05]
 
-12161; [7A BF 76, 05, 05]
+12135; [77 C5 1B, 05, 05]
 
-12162; [7A BF 7E, 05, 05]
+12136; [77 C5 23, 05, 05]
 
-12163; [7A BF 86, 05, 05]
+12137; [77 C5 2B, 05, 05]
 
-12164; [7A BF 8E, 05, 05]
+12138; [77 C5 33, 05, 05]
 
-12165; [7A BF 96, 05, 05]
+12139; [77 C5 3B, 05, 05]
 
-12166; [7A BF 9E, 05, 05]
+1213A; [77 C5 43, 05, 05]
 
-12167; [7A BF A6, 05, 05]
+1213B; [77 C5 4B, 05, 05]
 
-12168; [7A BF AE, 05, 05]
+1213C; [77 C5 53, 05, 05]
 
-12169; [7A BF B6, 05, 05]
+1213D; [77 C5 5B, 05, 05]
 
-1216A; [7A BF BE, 05, 05]
+1213E; [77 C5 63, 05, 05]
 
-1216B; [7A BF C6, 05, 05]
+1213F; [77 C5 6B, 05, 05]
 
-1216C; [7A BF CE, 05, 05]
+12140; [77 C5 73, 05, 05]
 
-1216D; [7A BF D6, 05, 05]
+12141; [77 C5 7B, 05, 05]
 
-1216E; [7A BF DE, 05, 05]
+12142; [77 C5 83, 05, 05]
 
-1216F; [7A BF E6, 05, 05]
+12143; [77 C5 8B, 05, 05]
 
-12170; [7A BF EE, 05, 05]
+12144; [77 C5 93, 05, 05]
 
-12171; [7A BF F6, 05, 05]
+12145; [77 C5 9B, 05, 05]
 
-12172; [7A C0 04, 05, 05]
+12146; [77 C5 A3, 05, 05]
 
-12173; [7A C0 0C, 05, 05]
+12147; [77 C5 AB, 05, 05]
 
-12174; [7A C0 14, 05, 05]
+12148; [77 C5 B3, 05, 05]
 
-12175; [7A C0 1C, 05, 05]
+12149; [77 C5 BB, 05, 05]
 
-12176; [7A C0 24, 05, 05]
+1214A; [77 C5 C3, 05, 05]
 
-12177; [7A C0 2C, 05, 05]
+1214B; [77 C5 CB, 05, 05]
 
-12178; [7A C0 34, 05, 05]
+1214C; [77 C5 D3, 05, 05]
 
-12179; [7A C0 3C, 05, 05]
+1214D; [77 C5 DB, 05, 05]
 
-1217A; [7A C0 44, 05, 05]
+1214E; [77 C5 E3, 05, 05]
 
-1217B; [7A C0 4C, 05, 05]
+1214F; [77 C5 EB, 05, 05]
 
-1217C; [7A C0 54, 05, 05]
+12150; [77 C5 F3, 05, 05]
 
-1217D; [7A C0 5C, 05, 05]
+12151; [77 C5 FB, 05, 05]
 
-1217E; [7A C0 64, 05, 05]
+12152; [77 C6 05, 05, 05]
 
-1217F; [7A C0 6C, 05, 05]
+12153; [77 C6 0D, 05, 05]
 
-12180; [7A C0 74, 05, 05]
+12154; [77 C6 15, 05, 05]
 
-12181; [7A C0 7C, 05, 05]
+12155; [77 C6 1D, 05, 05]
 
-12182; [7A C0 84, 05, 05]
+12156; [77 C6 25, 05, 05]
 
-12183; [7A C0 8C, 05, 05]
+12157; [77 C6 2D, 05, 05]
 
-12184; [7A C0 94, 05, 05]
+12158; [77 C6 35, 05, 05]
 
-12185; [7A C0 9C, 05, 05]
+12159; [77 C6 3D, 05, 05]
 
-12186; [7A C0 A4, 05, 05]
+1215A; [77 C6 45, 05, 05]
 
-12187; [7A C0 AC, 05, 05]
+1215B; [77 C6 4D, 05, 05]
 
-12188; [7A C0 B4, 05, 05]
+1215C; [77 C6 55, 05, 05]
 
-12189; [7A C0 BC, 05, 05]
+1215D; [77 C6 5D, 05, 05]
 
-1218A; [7A C0 C4, 05, 05]
+1215E; [77 C6 65, 05, 05]
 
-1218B; [7A C0 CC, 05, 05]
+1215F; [77 C6 6D, 05, 05]
 
-1218C; [7A C0 D4, 05, 05]
+12160; [77 C6 75, 05, 05]
 
-1218D; [7A C0 DC, 05, 05]
+12161; [77 C6 7D, 05, 05]
 
-1218E; [7A C0 E4, 05, 05]
+12162; [77 C6 85, 05, 05]
 
-1218F; [7A C0 EC, 05, 05]
+12163; [77 C6 8D, 05, 05]
 
-12190; [7A C0 F4, 05, 05]
+12164; [77 C6 95, 05, 05]
 
-12191; [7A C0 FC, 05, 05]
+12165; [77 C6 9D, 05, 05]
 
-12192; [7A C1 0A, 05, 05]
+12166; [77 C6 A5, 05, 05]
 
-12193; [7A C1 12, 05, 05]
+12167; [77 C6 AD, 05, 05]
 
-12194; [7A C1 1A, 05, 05]
+12168; [77 C6 B5, 05, 05]
 
-12195; [7A C1 22, 05, 05]
+12169; [77 C6 BD, 05, 05]
 
-12196; [7A C1 2A, 05, 05]
+1216A; [77 C6 C5, 05, 05]
 
-12197; [7A C1 32, 05, 05]
+1216B; [77 C6 CD, 05, 05]
 
-12198; [7A C1 3A, 05, 05]
+1216C; [77 C6 D5, 05, 05]
 
-12199; [7A C1 42, 05, 05]
+1216D; [77 C6 DD, 05, 05]
 
-1219A; [7A C1 4A, 05, 05]
+1216E; [77 C6 E5, 05, 05]
 
-1219B; [7A C1 52, 05, 05]
+1216F; [77 C6 ED, 05, 05]
 
-1219C; [7A C1 5A, 05, 05]
+12170; [77 C6 F5, 05, 05]
 
-1219D; [7A C1 62, 05, 05]
+12171; [77 C6 FD, 05, 05]
 
-1219E; [7A C1 6A, 05, 05]
+12172; [77 C7 07, 05, 05]
 
-1219F; [7A C1 72, 05, 05]
+12173; [77 C7 0F, 05, 05]
 
-121A0; [7A C1 7A, 05, 05]
+12174; [77 C7 17, 05, 05]
 
-121A1; [7A C1 82, 05, 05]
+12175; [77 C7 1F, 05, 05]
 
-121A2; [7A C1 8A, 05, 05]
+12176; [77 C7 27, 05, 05]
 
-121A3; [7A C1 92, 05, 05]
+12177; [77 C7 2F, 05, 05]
 
-121A4; [7A C1 9A, 05, 05]
+12178; [77 C7 37, 05, 05]
 
-121A5; [7A C1 A2, 05, 05]
+12179; [77 C7 3F, 05, 05]
 
-121A6; [7A C1 AA, 05, 05]
+1217A; [77 C7 47, 05, 05]
 
-121A7; [7A C1 B2, 05, 05]
+1217B; [77 C7 4F, 05, 05]
 
-121A8; [7A C1 BA, 05, 05]
+1217C; [77 C7 57, 05, 05]
 
-121A9; [7A C1 C2, 05, 05]
+1217D; [77 C7 5F, 05, 05]
 
-121AA; [7A C1 CA, 05, 05]
+1217E; [77 C7 67, 05, 05]
 
-121AB; [7A C1 D2, 05, 05]
+1217F; [77 C7 6F, 05, 05]
 
-121AC; [7A C1 DA, 05, 05]
+12180; [77 C7 77, 05, 05]
 
-121AD; [7A C1 E2, 05, 05]
+12181; [77 C7 7F, 05, 05]
 
-121AE; [7A C1 EA, 05, 05]
+12182; [77 C7 87, 05, 05]
 
-121AF; [7A C1 F2, 05, 05]
+12183; [77 C7 8F, 05, 05]
 
-121B0; [7A C1 FA, 05, 05]
+12184; [77 C7 97, 05, 05]
 
-121B1; [7A C2 08, 05, 05]
+12185; [77 C7 9F, 05, 05]
 
-121B2; [7A C2 10, 05, 05]
+12186; [77 C7 A7, 05, 05]
 
-121B3; [7A C2 18, 05, 05]
+12187; [77 C7 AF, 05, 05]
 
-121B4; [7A C2 20, 05, 05]
+12188; [77 C7 B7, 05, 05]
 
-121B5; [7A C2 28, 05, 05]
+12189; [77 C7 BF, 05, 05]
 
-121B6; [7A C2 30, 05, 05]
+1218A; [77 C7 C7, 05, 05]
 
-121B7; [7A C2 38, 05, 05]
+1218B; [77 C7 CF, 05, 05]
 
-121B8; [7A C2 40, 05, 05]
+1218C; [77 C7 D7, 05, 05]
 
-121B9; [7A C2 48, 05, 05]
+1218D; [77 C7 DF, 05, 05]
 
-121BA; [7A C2 50, 05, 05]
+1218E; [77 C7 E7, 05, 05]
 
-121BB; [7A C2 58, 05, 05]
+1218F; [77 C7 EF, 05, 05]
 
-121BC; [7A C2 60, 05, 05]
+12190; [77 C7 F7, 05, 05]
 
-121BD; [7A C2 68, 05, 05]
+12191; [77 C7 FF, 05, 05]
 
-121BE; [7A C2 70, 05, 05]
+12192; [77 C8 09, 05, 05]
 
-121BF; [7A C2 78, 05, 05]
+12193; [77 C8 11, 05, 05]
 
-121C0; [7A C2 80, 05, 05]
+12194; [77 C8 19, 05, 05]
 
-121C1; [7A C2 88, 05, 05]
+12195; [77 C8 21, 05, 05]
 
-121C2; [7A C2 90, 05, 05]
+12196; [77 C8 29, 05, 05]
 
-121C3; [7A C2 98, 05, 05]
+12197; [77 C8 31, 05, 05]
 
-121C4; [7A C2 A0, 05, 05]
+12198; [77 C8 39, 05, 05]
 
-121C5; [7A C2 A8, 05, 05]
+12199; [77 C8 41, 05, 05]
 
-121C6; [7A C2 B0, 05, 05]
+1219A; [77 C8 49, 05, 05]
 
-121C7; [7A C2 B8, 05, 05]
+1219B; [77 C8 51, 05, 05]
 
-121C8; [7A C2 C0, 05, 05]
+1219C; [77 C8 59, 05, 05]
 
-121C9; [7A C2 C8, 05, 05]
+1219D; [77 C8 61, 05, 05]
 
-121CA; [7A C2 D0, 05, 05]
+1219E; [77 C8 69, 05, 05]
 
-121CB; [7A C2 D8, 05, 05]
+1219F; [77 C8 71, 05, 05]
 
-121CC; [7A C2 E0, 05, 05]
+121A0; [77 C8 79, 05, 05]
 
-121CD; [7A C2 E8, 05, 05]
+121A1; [77 C8 81, 05, 05]
 
-121CE; [7A C2 F0, 05, 05]
+121A2; [77 C8 89, 05, 05]
 
-121CF; [7A C2 F8, 05, 05]
+121A3; [77 C8 91, 05, 05]
 
-121D0; [7A C3 06, 05, 05]
+121A4; [77 C8 99, 05, 05]
 
-121D1; [7A C3 0E, 05, 05]
+121A5; [77 C8 A1, 05, 05]
 
-121D2; [7A C3 16, 05, 05]
+121A6; [77 C8 A9, 05, 05]
 
-121D3; [7A C3 1E, 05, 05]
+121A7; [77 C8 B1, 05, 05]
 
-121D4; [7A C3 26, 05, 05]
+121A8; [77 C8 B9, 05, 05]
 
-121D5; [7A C3 2E, 05, 05]
+121A9; [77 C8 C1, 05, 05]
 
-121D6; [7A C3 36, 05, 05]
+121AA; [77 C8 C9, 05, 05]
 
-121D7; [7A C3 3E, 05, 05]
+121AB; [77 C8 D1, 05, 05]
 
-121D8; [7A C3 46, 05, 05]
+121AC; [77 C8 D9, 05, 05]
 
-121D9; [7A C3 4E, 05, 05]
+121AD; [77 C8 E1, 05, 05]
 
-121DA; [7A C3 56, 05, 05]
+121AE; [77 C8 E9, 05, 05]
 
-121DB; [7A C3 5E, 05, 05]
+121AF; [77 C8 F1, 05, 05]
 
-121DC; [7A C3 66, 05, 05]
+121B0; [77 C8 F9, 05, 05]
 
-121DD; [7A C3 6E, 05, 05]
+121B1; [77 C9 03, 05, 05]
 
-121DE; [7A C3 76, 05, 05]
+121B2; [77 C9 0B, 05, 05]
 
-121DF; [7A C3 7E, 05, 05]
+121B3; [77 C9 13, 05, 05]
 
-121E0; [7A C3 86, 05, 05]
+121B4; [77 C9 1B, 05, 05]
 
-121E1; [7A C3 8E, 05, 05]
+121B5; [77 C9 23, 05, 05]
 
-121E2; [7A C3 96, 05, 05]
+121B6; [77 C9 2B, 05, 05]
 
-121E3; [7A C3 9E, 05, 05]
+121B7; [77 C9 33, 05, 05]
 
-121E4; [7A C3 A6, 05, 05]
+121B8; [77 C9 3B, 05, 05]
 
-121E5; [7A C3 AE, 05, 05]
+121B9; [77 C9 43, 05, 05]
 
-121E6; [7A C3 B6, 05, 05]
+121BA; [77 C9 4B, 05, 05]
 
-121E7; [7A C3 BE, 05, 05]
+121BB; [77 C9 53, 05, 05]
 
-121E8; [7A C3 C6, 05, 05]
+121BC; [77 C9 5B, 05, 05]
 
-121E9; [7A C3 CE, 05, 05]
+121BD; [77 C9 63, 05, 05]
 
-121EA; [7A C3 D6, 05, 05]
+121BE; [77 C9 6B, 05, 05]
 
-121EB; [7A C3 DE, 05, 05]
+121BF; [77 C9 73, 05, 05]
 
-121EC; [7A C3 E6, 05, 05]
+121C0; [77 C9 7B, 05, 05]
 
-121ED; [7A C3 EE, 05, 05]
+121C1; [77 C9 83, 05, 05]
 
-121EE; [7A C3 F6, 05, 05]
+121C2; [77 C9 8B, 05, 05]
 
-121EF; [7A C4 04, 05, 05]
+121C3; [77 C9 93, 05, 05]
 
-121F0; [7A C4 0C, 05, 05]
+121C4; [77 C9 9B, 05, 05]
 
-121F1; [7A C4 14, 05, 05]
+121C5; [77 C9 A3, 05, 05]
 
-121F2; [7A C4 1C, 05, 05]
+121C6; [77 C9 AB, 05, 05]
 
-121F3; [7A C4 24, 05, 05]
+121C7; [77 C9 B3, 05, 05]
 
-121F4; [7A C4 2C, 05, 05]
+121C8; [77 C9 BB, 05, 05]
 
-121F5; [7A C4 34, 05, 05]
+121C9; [77 C9 C3, 05, 05]
 
-121F6; [7A C4 3C, 05, 05]
+121CA; [77 C9 CB, 05, 05]
 
-121F7; [7A C4 44, 05, 05]
+121CB; [77 C9 D3, 05, 05]
 
-121F8; [7A C4 4C, 05, 05]
+121CC; [77 C9 DB, 05, 05]
 
-121F9; [7A C4 54, 05, 05]
+121CD; [77 C9 E3, 05, 05]
 
-121FA; [7A C4 5C, 05, 05]
+121CE; [77 C9 EB, 05, 05]
 
-121FB; [7A C4 64, 05, 05]
+121CF; [77 C9 F3, 05, 05]
 
-121FC; [7A C4 6C, 05, 05]
+121D0; [77 C9 FB, 05, 05]
 
-121FD; [7A C4 74, 05, 05]
+121D1; [77 CA 05, 05, 05]
 
-121FE; [7A C4 7C, 05, 05]
+121D2; [77 CA 0D, 05, 05]
 
-121FF; [7A C4 84, 05, 05]
+121D3; [77 CA 15, 05, 05]
 
-12200; [7A C4 8C, 05, 05]
+121D4; [77 CA 1D, 05, 05]
 
-12201; [7A C4 94, 05, 05]
+121D5; [77 CA 25, 05, 05]
 
-12202; [7A C4 9C, 05, 05]
+121D6; [77 CA 2D, 05, 05]
 
-12203; [7A C4 A4, 05, 05]
+121D7; [77 CA 35, 05, 05]
 
-12204; [7A C4 AC, 05, 05]
+121D8; [77 CA 3D, 05, 05]
 
-12205; [7A C4 B4, 05, 05]
+121D9; [77 CA 45, 05, 05]
 
-12206; [7A C4 BC, 05, 05]
+121DA; [77 CA 4D, 05, 05]
 
-12207; [7A C4 C4, 05, 05]
+121DB; [77 CA 55, 05, 05]
 
-12208; [7A C4 CC, 05, 05]
+121DC; [77 CA 5D, 05, 05]
 
-12209; [7A C4 D4, 05, 05]
+121DD; [77 CA 65, 05, 05]
 
-1220A; [7A C4 DC, 05, 05]
+121DE; [77 CA 6D, 05, 05]
 
-1220B; [7A C4 E4, 05, 05]
+121DF; [77 CA 75, 05, 05]
 
-1220C; [7A C4 EC, 05, 05]
+121E0; [77 CA 7D, 05, 05]
 
-1220D; [7A C4 F4, 05, 05]
+121E1; [77 CA 85, 05, 05]
 
-1220E; [7A C4 FC, 05, 05]
+121E2; [77 CA 8D, 05, 05]
 
-1220F; [7A C5 0A, 05, 05]
+121E3; [77 CA 95, 05, 05]
 
-12210; [7A C5 12, 05, 05]
+121E4; [77 CA 9D, 05, 05]
 
-12211; [7A C5 1A, 05, 05]
+121E5; [77 CA A5, 05, 05]
 
-12212; [7A C5 22, 05, 05]
+121E6; [77 CA AD, 05, 05]
 
-12213; [7A C5 2A, 05, 05]
+121E7; [77 CA B5, 05, 05]
 
-12214; [7A C5 32, 05, 05]
+121E8; [77 CA BD, 05, 05]
 
-12215; [7A C5 3A, 05, 05]
+121E9; [77 CA C5, 05, 05]
 
-12216; [7A C5 42, 05, 05]
+121EA; [77 CA CD, 05, 05]
 
-12217; [7A C5 4A, 05, 05]
+121EB; [77 CA D5, 05, 05]
 
-12218; [7A C5 52, 05, 05]
+121EC; [77 CA DD, 05, 05]
 
-12219; [7A C5 5A, 05, 05]
+121ED; [77 CA E5, 05, 05]
 
-1221A; [7A C5 62, 05, 05]
+121EE; [77 CA ED, 05, 05]
 
-1221B; [7A C5 6A, 05, 05]
+121EF; [77 CA F5, 05, 05]
 
-1221C; [7A C5 72, 05, 05]
+121F0; [77 CA FD, 05, 05]
 
-1221D; [7A C5 7A, 05, 05]
+121F1; [77 CB 07, 05, 05]
 
-1221E; [7A C5 82, 05, 05]
+121F2; [77 CB 0F, 05, 05]
 
-1221F; [7A C5 8A, 05, 05]
+121F3; [77 CB 17, 05, 05]
 
-12220; [7A C5 92, 05, 05]
+121F4; [77 CB 1F, 05, 05]
 
-12221; [7A C5 9A, 05, 05]
+121F5; [77 CB 27, 05, 05]
 
-12222; [7A C5 A2, 05, 05]
+121F6; [77 CB 2F, 05, 05]
 
-12223; [7A C5 AA, 05, 05]
+121F7; [77 CB 37, 05, 05]
 
-12224; [7A C5 B2, 05, 05]
+121F8; [77 CB 3F, 05, 05]
 
-12225; [7A C5 BA, 05, 05]
+121F9; [77 CB 47, 05, 05]
 
-12226; [7A C5 C2, 05, 05]
+121FA; [77 CB 4F, 05, 05]
 
-12227; [7A C5 CA, 05, 05]
+121FB; [77 CB 57, 05, 05]
 
-12228; [7A C5 D2, 05, 05]
+121FC; [77 CB 5F, 05, 05]
 
-12229; [7A C5 DA, 05, 05]
+121FD; [77 CB 67, 05, 05]
 
-1222A; [7A C5 E2, 05, 05]
+121FE; [77 CB 6F, 05, 05]
 
-1222B; [7A C5 EA, 05, 05]
+121FF; [77 CB 77, 05, 05]
 
-1222C; [7A C5 F2, 05, 05]
+12200; [77 CB 7F, 05, 05]
 
-1222D; [7A C5 FA, 05, 05]
+12201; [77 CB 87, 05, 05]
 
-1222E; [7A C6 08, 05, 05]
+12202; [77 CB 8F, 05, 05]
 
-1222F; [7A C6 10, 05, 05]
+12203; [77 CB 97, 05, 05]
 
-12230; [7A C6 18, 05, 05]
+12204; [77 CB 9F, 05, 05]
 
-12231; [7A C6 20, 05, 05]
+12205; [77 CB A7, 05, 05]
 
-12232; [7A C6 28, 05, 05]
+12206; [77 CB AF, 05, 05]
 
-12233; [7A C6 30, 05, 05]
+12207; [77 CB B7, 05, 05]
 
-12234; [7A C6 38, 05, 05]
+12208; [77 CB BF, 05, 05]
 
-12235; [7A C6 40, 05, 05]
+12209; [77 CB C7, 05, 05]
 
-12236; [7A C6 48, 05, 05]
+1220A; [77 CB CF, 05, 05]
 
-12237; [7A C6 50, 05, 05]
+1220B; [77 CB D7, 05, 05]
 
-12238; [7A C6 58, 05, 05]
+1220C; [77 CB DF, 05, 05]
 
-12239; [7A C6 60, 05, 05]
+1220D; [77 CB E7, 05, 05]
 
-1223A; [7A C6 68, 05, 05]
+1220E; [77 CB EF, 05, 05]
 
-1223B; [7A C6 70, 05, 05]
+1220F; [77 CB F7, 05, 05]
 
-1223C; [7A C6 78, 05, 05]
+12210; [77 CB FF, 05, 05]
 
-1223D; [7A C6 80, 05, 05]
+12211; [77 CC 09, 05, 05]
 
-1223E; [7A C6 88, 05, 05]
+12212; [77 CC 11, 05, 05]
 
-1223F; [7A C6 90, 05, 05]
+12213; [77 CC 19, 05, 05]
 
-12240; [7A C6 98, 05, 05]
+12214; [77 CC 21, 05, 05]
 
-12241; [7A C6 A0, 05, 05]
+12215; [77 CC 29, 05, 05]
 
-12242; [7A C6 A8, 05, 05]
+12216; [77 CC 31, 05, 05]
 
-12243; [7A C6 B0, 05, 05]
+12217; [77 CC 39, 05, 05]
 
-12244; [7A C6 B8, 05, 05]
+12218; [77 CC 41, 05, 05]
 
-12245; [7A C6 C0, 05, 05]
+12219; [77 CC 49, 05, 05]
 
-12246; [7A C6 C8, 05, 05]
+1221A; [77 CC 51, 05, 05]
 
-12247; [7A C6 D0, 05, 05]
+1221B; [77 CC 59, 05, 05]
 
-12248; [7A C6 D8, 05, 05]
+1221C; [77 CC 61, 05, 05]
 
-12249; [7A C6 E0, 05, 05]
+1221D; [77 CC 69, 05, 05]
 
-1224A; [7A C6 E8, 05, 05]
+1221E; [77 CC 71, 05, 05]
 
-1224B; [7A C6 F0, 05, 05]
+1221F; [77 CC 79, 05, 05]
 
-1224C; [7A C6 F8, 05, 05]
+12220; [77 CC 81, 05, 05]
 
-1224D; [7A C7 06, 05, 05]
+12221; [77 CC 89, 05, 05]
 
-1224E; [7A C7 0E, 05, 05]
+12222; [77 CC 91, 05, 05]
 
-1224F; [7A C7 16, 05, 05]
+12223; [77 CC 99, 05, 05]
 
-12250; [7A C7 1E, 05, 05]
+12224; [77 CC A1, 05, 05]
 
-12251; [7A C7 26, 05, 05]
+12225; [77 CC A9, 05, 05]
 
-12252; [7A C7 2E, 05, 05]
+12226; [77 CC B1, 05, 05]
 
-12253; [7A C7 36, 05, 05]
+12227; [77 CC B9, 05, 05]
 
-12254; [7A C7 3E, 05, 05]
+12228; [77 CC C1, 05, 05]
 
-12255; [7A C7 46, 05, 05]
+12229; [77 CC C9, 05, 05]
 
-12256; [7A C7 4E, 05, 05]
+1222A; [77 CC D1, 05, 05]
 
-12257; [7A C7 56, 05, 05]
+1222B; [77 CC D9, 05, 05]
 
-12258; [7A C7 5E, 05, 05]
+1222C; [77 CC E1, 05, 05]
 
-12259; [7A C7 66, 05, 05]
+1222D; [77 CC E9, 05, 05]
 
-1225A; [7A C7 6E, 05, 05]
+1222E; [77 CC F1, 05, 05]
 
-1225B; [7A C7 76, 05, 05]
+1222F; [77 CC F9, 05, 05]
 
-1225C; [7A C7 7E, 05, 05]
+12230; [77 CD 03, 05, 05]
 
-1225D; [7A C7 86, 05, 05]
+12231; [77 CD 0B, 05, 05]
 
-1225E; [7A C7 8E, 05, 05]
+12232; [77 CD 13, 05, 05]
 
-1225F; [7A C7 96, 05, 05]
+12233; [77 CD 1B, 05, 05]
 
-12260; [7A C7 9E, 05, 05]
+12234; [77 CD 23, 05, 05]
 
-12261; [7A C7 A6, 05, 05]
+12235; [77 CD 2B, 05, 05]
 
-12262; [7A C7 AE, 05, 05]
+12236; [77 CD 33, 05, 05]
 
-12263; [7A C7 B6, 05, 05]
+12237; [77 CD 3B, 05, 05]
 
-12264; [7A C7 BE, 05, 05]
+12238; [77 CD 43, 05, 05]
 
-12265; [7A C7 C6, 05, 05]
+12239; [77 CD 4B, 05, 05]
 
-12266; [7A C7 CE, 05, 05]
+1223A; [77 CD 53, 05, 05]
 
-12267; [7A C7 D6, 05, 05]
+1223B; [77 CD 5B, 05, 05]
 
-12268; [7A C7 DE, 05, 05]
+1223C; [77 CD 63, 05, 05]
 
-12269; [7A C7 E6, 05, 05]
+1223D; [77 CD 6B, 05, 05]
 
-1226A; [7A C7 EE, 05, 05]
+1223E; [77 CD 73, 05, 05]
 
-1226B; [7A C7 F6, 05, 05]
+1223F; [77 CD 7B, 05, 05]
 
-1226C; [7A C8 04, 05, 05]
+12240; [77 CD 83, 05, 05]
 
-1226D; [7A C8 0C, 05, 05]
+12241; [77 CD 8B, 05, 05]
 
-1226E; [7A C8 14, 05, 05]
+12242; [77 CD 93, 05, 05]
 
-1226F; [7A C8 1C, 05, 05]
+12243; [77 CD 9B, 05, 05]
 
-12270; [7A C8 24, 05, 05]
+12244; [77 CD A3, 05, 05]
 
-12271; [7A C8 2C, 05, 05]
+12245; [77 CD AB, 05, 05]
 
-12272; [7A C8 34, 05, 05]
+12246; [77 CD B3, 05, 05]
 
-12273; [7A C8 3C, 05, 05]
+12247; [77 CD BB, 05, 05]
 
-12274; [7A C8 44, 05, 05]
+12248; [77 CD C3, 05, 05]
 
-12275; [7A C8 4C, 05, 05]
+12249; [77 CD CB, 05, 05]
 
-12276; [7A C8 54, 05, 05]
+1224A; [77 CD D3, 05, 05]
 
-12277; [7A C8 5C, 05, 05]
+1224B; [77 CD DB, 05, 05]
 
-12278; [7A C8 64, 05, 05]
+1224C; [77 CD E3, 05, 05]
 
-12279; [7A C8 6C, 05, 05]
+1224D; [77 CD EB, 05, 05]
 
-1227A; [7A C8 74, 05, 05]
+1224E; [77 CD F3, 05, 05]
 
-1227B; [7A C8 7C, 05, 05]
+1224F; [77 CD FB, 05, 05]
 
-1227C; [7A C8 84, 05, 05]
+12250; [77 CE 05, 05, 05]
 
-1227D; [7A C8 8C, 05, 05]
+12251; [77 CE 0D, 05, 05]
 
-1227E; [7A C8 94, 05, 05]
+12252; [77 CE 15, 05, 05]
 
-1227F; [7A C8 9C, 05, 05]
+12253; [77 CE 1D, 05, 05]
 
-12280; [7A C8 A4, 05, 05]
+12254; [77 CE 25, 05, 05]
 
-12281; [7A C8 AC, 05, 05]
+12255; [77 CE 2D, 05, 05]
 
-12282; [7A C8 B4, 05, 05]
+12256; [77 CE 35, 05, 05]
 
-12283; [7A C8 BC, 05, 05]
+12257; [77 CE 3D, 05, 05]
 
-12284; [7A C8 C4, 05, 05]
+12258; [77 CE 45, 05, 05]
 
-12285; [7A C8 CC, 05, 05]
+12259; [77 CE 4D, 05, 05]
 
-12286; [7A C8 D4, 05, 05]
+1225A; [77 CE 55, 05, 05]
 
-12287; [7A C8 DC, 05, 05]
+1225B; [77 CE 5D, 05, 05]
 
-12288; [7A C8 E4, 05, 05]
+1225C; [77 CE 65, 05, 05]
 
-12289; [7A C8 EC, 05, 05]
+1225D; [77 CE 6D, 05, 05]
 
-1228A; [7A C8 F4, 05, 05]
+1225E; [77 CE 75, 05, 05]
 
-1228B; [7A C8 FC, 05, 05]
+1225F; [77 CE 7D, 05, 05]
 
-1228C; [7A C9 0A, 05, 05]
+12260; [77 CE 85, 05, 05]
 
-1228D; [7A C9 12, 05, 05]
+12261; [77 CE 8D, 05, 05]
 
-1228E; [7A C9 1A, 05, 05]
+12262; [77 CE 95, 05, 05]
 
-1228F; [7A C9 22, 05, 05]
+122D4; [77 CE 9D, 05, 05]
 
-12290; [7A C9 2A, 05, 05]
+122D5; [77 CE A5, 05, 05]
 
-12291; [7A C9 32, 05, 05]
+12263; [77 CE AD, 05, 05]
 
-12292; [7A C9 3A, 05, 05]
+12264; [77 CE B5, 05, 05]
 
-12293; [7A C9 42, 05, 05]
+12265; [77 CE BD, 05, 05]
 
-12294; [7A C9 4A, 05, 05]
+12266; [77 CE C5, 05, 05]
 
-12295; [7A C9 52, 05, 05]
+12267; [77 CE CD, 05, 05]
 
-12296; [7A C9 5A, 05, 05]
+12268; [77 CE D5, 05, 05]
 
-12297; [7A C9 62, 05, 05]
+12269; [77 CE DD, 05, 05]
 
-12298; [7A C9 6A, 05, 05]
+1226A; [77 CE E5, 05, 05]
 
-12299; [7A C9 72, 05, 05]
+1226B; [77 CE ED, 05, 05]
 
-1229A; [7A C9 7A, 05, 05]
+1226C; [77 CE F5, 05, 05]
 
-1229B; [7A C9 82, 05, 05]
+1226D; [77 CE FD, 05, 05]
 
-1229C; [7A C9 8A, 05, 05]
+1226E; [77 CF 07, 05, 05]
 
-1229D; [7A C9 92, 05, 05]
+1226F; [77 CF 0F, 05, 05]
 
-1229E; [7A C9 9A, 05, 05]
+12270; [77 CF 17, 05, 05]
 
-1229F; [7A C9 A2, 05, 05]
+12271; [77 CF 1F, 05, 05]
 
-122A0; [7A C9 AA, 05, 05]
+12272; [77 CF 27, 05, 05]
 
-122A1; [7A C9 B2, 05, 05]
+12273; [77 CF 2F, 05, 05]
 
-122A2; [7A C9 BA, 05, 05]
+12274; [77 CF 37, 05, 05]
 
-122A3; [7A C9 C2, 05, 05]
+12275; [77 CF 3F, 05, 05]
 
-122A4; [7A C9 CA, 05, 05]
+12276; [77 CF 47, 05, 05]
 
-122A5; [7A C9 D2, 05, 05]
+12277; [77 CF 4F, 05, 05]
 
-122A6; [7A C9 DA, 05, 05]
+12278; [77 CF 57, 05, 05]
 
-122A7; [7A C9 E2, 05, 05]
+12279; [77 CF 5F, 05, 05]
 
-122A8; [7A C9 EA, 05, 05]
+1227A; [77 CF 67, 05, 05]
 
-122A9; [7A C9 F2, 05, 05]
+1227B; [77 CF 6F, 05, 05]
 
-122AA; [7A C9 FA, 05, 05]
+1227C; [77 CF 77, 05, 05]
 
-122AB; [7A CA 08, 05, 05]
+1227D; [77 CF 7F, 05, 05]
 
-122AC; [7A CA 10, 05, 05]
+1227E; [77 CF 87, 05, 05]
 
-122AD; [7A CA 18, 05, 05]
+1227F; [77 CF 8F, 05, 05]
 
-122AE; [7A CA 20, 05, 05]
+12280; [77 CF 97, 05, 05]
 
-122AF; [7A CA 28, 05, 05]
+12281; [77 CF 9F, 05, 05]
 
-122B0; [7A CA 30, 05, 05]
+12282; [77 CF A7, 05, 05]
 
-122B1; [7A CA 38, 05, 05]
+12283; [77 CF AF, 05, 05]
 
-122B2; [7A CA 40, 05, 05]
+12284; [77 CF B7, 05, 05]
 
-122B3; [7A CA 48, 05, 05]
+12285; [77 CF BF, 05, 05]
 
-122B4; [7A CA 50, 05, 05]
+12286; [77 CF C7, 05, 05]
 
-122B5; [7A CA 58, 05, 05]
+12287; [77 CF CF, 05, 05]
 
-122B6; [7A CA 60, 05, 05]
+12288; [77 CF D7, 05, 05]
 
-122B7; [7A CA 68, 05, 05]
+12289; [77 CF DF, 05, 05]
 
-122B8; [7A CA 70, 05, 05]
+1228A; [77 CF E7, 05, 05]
 
-122B9; [7A CA 78, 05, 05]
+1228B; [77 CF EF, 05, 05]
 
-122BA; [7A CA 80, 05, 05]
+1228C; [77 CF F7, 05, 05]
 
-122BB; [7A CA 88, 05, 05]
+1228D; [77 CF FF, 05, 05]
 
-122BC; [7A CA 90, 05, 05]
+1228E; [77 D0 09, 05, 05]
 
-122BD; [7A CA 98, 05, 05]
+1228F; [77 D0 11, 05, 05]
 
-122BE; [7A CA A0, 05, 05]
+12290; [77 D0 19, 05, 05]
 
-122BF; [7A CA A8, 05, 05]
+12291; [77 D0 21, 05, 05]
 
-122C0; [7A CA B0, 05, 05]
+12292; [77 D0 29, 05, 05]
 
-122C1; [7A CA B8, 05, 05]
+12293; [77 D0 31, 05, 05]
 
-122C2; [7A CA C0, 05, 05]
+12294; [77 D0 39, 05, 05]
 
-122C3; [7A CA C8, 05, 05]
+12295; [77 D0 41, 05, 05]
 
-122C4; [7A CA D0, 05, 05]
+12296; [77 D0 49, 05, 05]
 
-122C5; [7A CA D8, 05, 05]
+12297; [77 D0 51, 05, 05]
 
-122C6; [7A CA E0, 05, 05]
+12298; [77 D0 59, 05, 05]
 
-122C7; [7A CA E8, 05, 05]
+12299; [77 D0 61, 05, 05]
 
-122C8; [7A CA F0, 05, 05]
+1229A; [77 D0 69, 05, 05]
 
-122C9; [7A CA F8, 05, 05]
+1229B; [77 D0 71, 05, 05]
 
-122CA; [7A CB 06, 05, 05]
+1229C; [77 D0 79, 05, 05]
 
-122CB; [7A CB 0E, 05, 05]
+1229D; [77 D0 81, 05, 05]
 
-122CC; [7A CB 16, 05, 05]
+1229E; [77 D0 89, 05, 05]
 
-122CD; [7A CB 1E, 05, 05]
+1229F; [77 D0 91, 05, 05]
 
-122CE; [7A CB 26, 05, 05]
+122A0; [77 D0 99, 05, 05]
 
-122CF; [7A CB 2E, 05, 05]
+122A1; [77 D0 A1, 05, 05]
 
-122D0; [7A CB 36, 05, 05]
+122A2; [77 D0 A9, 05, 05]
 
-122D1; [7A CB 3E, 05, 05]
+122A3; [77 D0 B1, 05, 05]
 
-122D2; [7A CB 46, 05, 05]
+122A4; [77 D0 B9, 05, 05]
 
-122D3; [7A CB 4E, 05, 05]
+122A5; [77 D0 C1, 05, 05]
 
-122D4; [7A CB 56, 05, 05]
+122A6; [77 D0 C9, 05, 05]
 
-122D5; [7A CB 5E, 05, 05]
+122A7; [77 D0 D1, 05, 05]
 
-122D6; [7A CB 66, 05, 05]
+122A8; [77 D0 D9, 05, 05]
 
-122D7; [7A CB 6E, 05, 05]
+122A9; [77 D0 E1, 05, 05]
 
-122D8; [7A CB 76, 05, 05]
+122AA; [77 D0 E9, 05, 05]
 
-122D9; [7A CB 7E, 05, 05]
+122AB; [77 D0 F1, 05, 05]
 
-122DA; [7A CB 86, 05, 05]
+122AC; [77 D0 F9, 05, 05]
 
-122DB; [7A CB 8E, 05, 05]
+122AD; [77 D1 03, 05, 05]
 
-122DC; [7A CB 96, 05, 05]
+122AE; [77 D1 0B, 05, 05]
 
-122DD; [7A CB 9E, 05, 05]
+122AF; [77 D1 13, 05, 05]
 
-122DE; [7A CB A6, 05, 05]
+122B0; [77 D1 1B, 05, 05]
 
-122DF; [7A CB AE, 05, 05]
+122B1; [77 D1 23, 05, 05]
 
-122E0; [7A CB B6, 05, 05]
+122B2; [77 D1 2B, 05, 05]
 
-122E1; [7A CB BE, 05, 05]
+122B3; [77 D1 33, 05, 05]
 
-122E2; [7A CB C6, 05, 05]
+122B4; [77 D1 3B, 05, 05]
 
-122E3; [7A CB CE, 05, 05]
+122B5; [77 D1 43, 05, 05]
 
-122E4; [7A CB D6, 05, 05]
+122B6; [77 D1 4B, 05, 05]
 
-122E5; [7A CB DE, 05, 05]
+122B7; [77 D1 53, 05, 05]
 
-122E6; [7A CB E6, 05, 05]
+122B8; [77 D1 5B, 05, 05]
 
-122E7; [7A CB EE, 05, 05]
+122B9; [77 D1 63, 05, 05]
 
-122E8; [7A CB F6, 05, 05]
+122BA; [77 D1 6B, 05, 05]
 
-122E9; [7A CC 04, 05, 05]
+122BB; [77 D1 73, 05, 05]
 
-122EA; [7A CC 0C, 05, 05]
+122BC; [77 D1 7B, 05, 05]
 
-122EB; [7A CC 14, 05, 05]
+122BD; [77 D1 83, 05, 05]
 
-122EC; [7A CC 1C, 05, 05]
+122BE; [77 D1 8B, 05, 05]
 
-122ED; [7A CC 24, 05, 05]
+122BF; [77 D1 93, 05, 05]
 
-122EE; [7A CC 2C, 05, 05]
+122C0; [77 D1 9B, 05, 05]
 
-122EF; [7A CC 34, 05, 05]
+122C1; [77 D1 A3, 05, 05]
 
-122F0; [7A CC 3C, 05, 05]
+122C2; [77 D1 AB, 05, 05]
 
-122F1; [7A CC 44, 05, 05]
+122C3; [77 D1 B3, 05, 05]
 
-122F2; [7A CC 4C, 05, 05]
+122C4; [77 D1 BB, 05, 05]
 
-122F3; [7A CC 54, 05, 05]
+122C5; [77 D1 C3, 05, 05]
 
-122F4; [7A CC 5C, 05, 05]
+122C6; [77 D1 CB, 05, 05]
 
-122F5; [7A CC 64, 05, 05]
+122C7; [77 D1 D3, 05, 05]
 
-122F6; [7A CC 6C, 05, 05]
+122C8; [77 D1 DB, 05, 05]
 
-122F7; [7A CC 74, 05, 05]
+122C9; [77 D1 E3, 05, 05]
 
-122F8; [7A CC 7C, 05, 05]
+122CA; [77 D1 EB, 05, 05]
 
-122F9; [7A CC 84, 05, 05]
+122CB; [77 D1 F3, 05, 05]
 
-122FA; [7A CC 8C, 05, 05]
+122CC; [77 D1 FB, 05, 05]
 
-122FB; [7A CC 94, 05, 05]
+122CD; [77 D2 05, 05, 05]
 
-122FC; [7A CC 9C, 05, 05]
+122CE; [77 D2 0D, 05, 05]
 
-122FD; [7A CC A4, 05, 05]
+122CF; [77 D2 15, 05, 05]
 
-122FE; [7A CC AC, 05, 05]
+122D0; [77 D2 1D, 05, 05]
 
-122FF; [7A CC B4, 05, 05]
+122D1; [77 D2 25, 05, 05]
 
-12300; [7A CC BC, 05, 05]
+122D2; [77 D2 2D, 05, 05]
 
-12301; [7A CC C4, 05, 05]
+122D3; [77 D2 35, 05, 05]
 
-12302; [7A CC CC, 05, 05]
+122D6; [77 D2 3D, 05, 05]
 
-12303; [7A CC D4, 05, 05]
+122D7; [77 D2 45, 05, 05]
 
-12304; [7A CC DC, 05, 05]
+122D8; [77 D2 4D, 05, 05]
 
-12305; [7A CC E4, 05, 05]
+122D9; [77 D2 55, 05, 05]
 
-12306; [7A CC EC, 05, 05]
+122DA; [77 D2 5D, 05, 05]
 
-12307; [7A CC F4, 05, 05]
+122DB; [77 D2 65, 05, 05]
 
-12308; [7A CC FC, 05, 05]
+122DC; [77 D2 6D, 05, 05]
 
-12309; [7A CD 0A, 05, 05]
+122DD; [77 D2 75, 05, 05]
 
-1230A; [7A CD 12, 05, 05]
+122DE; [77 D2 7D, 05, 05]
 
-1230B; [7A CD 1A, 05, 05]
+122DF; [77 D2 85, 05, 05]
 
-1230C; [7A CD 22, 05, 05]
+122E0; [77 D2 8D, 05, 05]
 
-1230D; [7A CD 2A, 05, 05]
+122E1; [77 D2 95, 05, 05]
 
-1230E; [7A CD 32, 05, 05]
+122E2; [77 D2 9D, 05, 05]
 
-1230F; [7A CD 3A, 05, 05]
+122E3; [77 D2 A5, 05, 05]
 
-12310; [7A CD 42, 05, 05]
+122E4; [77 D2 AD, 05, 05]
 
-12311; [7A CD 4A, 05, 05]
+122E5; [77 D2 B5, 05, 05]
 
-12312; [7A CD 52, 05, 05]
+122E6; [77 D2 BD, 05, 05]
 
-12313; [7A CD 5A, 05, 05]
+122E7; [77 D2 C5, 05, 05]
 
-12314; [7A CD 62, 05, 05]
+122E8; [77 D2 CD, 05, 05]
 
-12315; [7A CD 6A, 05, 05]
+122E9; [77 D2 D5, 05, 05]
 
-12316; [7A CD 72, 05, 05]
+122EA; [77 D2 DD, 05, 05]
 
-12317; [7A CD 7A, 05, 05]
+122EB; [77 D2 E5, 05, 05]
 
-12318; [7A CD 82, 05, 05]
+122EC; [77 D2 ED, 05, 05]
 
-12319; [7A CD 8A, 05, 05]
+122ED; [77 D2 F5, 05, 05]
 
-1231A; [7A CD 92, 05, 05]
+122EE; [77 D2 FD, 05, 05]
 
-1231B; [7A CD 9A, 05, 05]
+122EF; [77 D3 07, 05, 05]
 
-1231C; [7A CD A2, 05, 05]
+122F0; [77 D3 0F, 05, 05]
 
-1231D; [7A CD AA, 05, 05]
+122F1; [77 D3 17, 05, 05]
 
-1231E; [7A CD B2, 05, 05]
+122F2; [77 D3 1F, 05, 05]
 
-1231F; [7A CD BA, 05, 05]
+122F3; [77 D3 27, 05, 05]
 
-12320; [7A CD C2, 05, 05]
+122F4; [77 D3 2F, 05, 05]
 
-12321; [7A CD CA, 05, 05]
+122F5; [77 D3 37, 05, 05]
 
-12322; [7A CD D2, 05, 05]
+122F6; [77 D3 3F, 05, 05]
 
-12323; [7A CD DA, 05, 05]
+122F7; [77 D3 47, 05, 05]
 
-12324; [7A CD E2, 05, 05]
+122F8; [77 D3 4F, 05, 05]
 
-12325; [7A CD EA, 05, 05]
+122F9; [77 D3 57, 05, 05]
 
-12326; [7A CD F2, 05, 05]
+122FA; [77 D3 5F, 05, 05]
 
-12327; [7A CD FA, 05, 05]
+122FB; [77 D3 67, 05, 05]
 
-12328; [7A CE 08, 05, 05]
+122FC; [77 D3 6F, 05, 05]
 
-12329; [7A CE 10, 05, 05]
+122FD; [77 D3 77, 05, 05]
 
-1232A; [7A CE 18, 05, 05]
+122FE; [77 D3 7F, 05, 05]
 
-1232B; [7A CE 20, 05, 05]
+122FF; [77 D3 87, 05, 05]
 
-1232C; [7A CE 28, 05, 05]
+12300; [77 D3 8F, 05, 05]
 
-1232D; [7A CE 30, 05, 05]
+12301; [77 D3 97, 05, 05]
 
-1232E; [7A CE 38, 05, 05]
+12302; [77 D3 9F, 05, 05]
 
-1232F; [7A CE 40, 05, 05]
+12303; [77 D3 A7, 05, 05]
 
-12330; [7A CE 48, 05, 05]
+12304; [77 D3 AF, 05, 05]
 
-12331; [7A CE 50, 05, 05]
+12305; [77 D3 B7, 05, 05]
 
-12332; [7A CE 58, 05, 05]
+12306; [77 D3 BF, 05, 05]
 
-12333; [7A CE 60, 05, 05]
+12307; [77 D3 C7, 05, 05]
 
-12334; [7A CE 68, 05, 05]
+12308; [77 D3 CF, 05, 05]
 
-12335; [7A CE 70, 05, 05]
+12309; [77 D3 D7, 05, 05]
 
-12336; [7A CE 78, 05, 05]
+1230A; [77 D3 DF, 05, 05]
 
-12337; [7A CE 80, 05, 05]
+1230B; [77 D3 E7, 05, 05]
 
-12338; [7A CE 88, 05, 05]
+1230C; [77 D3 EF, 05, 05]
 
-12339; [7A CE 90, 05, 05]
+1230D; [77 D3 F7, 05, 05]
 
-1233A; [7A CE 98, 05, 05]
+1230E; [77 D3 FF, 05, 05]
 
-1233B; [7A CE A0, 05, 05]
+1230F; [77 D4 09, 05, 05]
 
-1233C; [7A CE A8, 05, 05]
+12310; [77 D4 11, 05, 05]
 
-1233D; [7A CE B0, 05, 05]
+12311; [77 D4 19, 05, 05]
 
-1233E; [7A CE B8, 05, 05]
+12312; [77 D4 21, 05, 05]
 
-1233F; [7A CE C0, 05, 05]
+12313; [77 D4 29, 05, 05]
 
-12340; [7A CE C8, 05, 05]
+12314; [77 D4 31, 05, 05]
 
-12341; [7A CE D0, 05, 05]
+12315; [77 D4 39, 05, 05]
 
-12342; [7A CE D8, 05, 05]
+12316; [77 D4 41, 05, 05]
 
-12343; [7A CE E0, 05, 05]
+12317; [77 D4 49, 05, 05]
 
-12344; [7A CE E8, 05, 05]
+12318; [77 D4 51, 05, 05]
 
-12345; [7A CE F0, 05, 05]
+12319; [77 D4 59, 05, 05]
 
-12346; [7A CE F8, 05, 05]
+1231A; [77 D4 61, 05, 05]
 
-12347; [7A CF 06, 05, 05]
+1231B; [77 D4 69, 05, 05]
 
-12348; [7A CF 0E, 05, 05]
+1231C; [77 D4 71, 05, 05]
 
-12349; [7A CF 16, 05, 05]
+1231D; [77 D4 79, 05, 05]
 
-1234A; [7A CF 1E, 05, 05]
+1231E; [77 D4 81, 05, 05]
 
-1234B; [7A CF 26, 05, 05]
+1231F; [77 D4 89, 05, 05]
 
-1234C; [7A CF 2E, 05, 05]
+12320; [77 D4 91, 05, 05]
 
-1234D; [7A CF 36, 05, 05]
+12321; [77 D4 99, 05, 05]
 
-1234E; [7A CF 3E, 05, 05]
+12322; [77 D4 A1, 05, 05]
 
-1234F; [7A CF 46, 05, 05]
+12323; [77 D4 A9, 05, 05]
 
-12350; [7A CF 4E, 05, 05]
+12324; [77 D4 B1, 05, 05]
 
-12351; [7A CF 56, 05, 05]
+12325; [77 D4 B9, 05, 05]
 
-12352; [7A CF 5E, 05, 05]
+12326; [77 D4 C1, 05, 05]
 
-12353; [7A CF 66, 05, 05]
+12327; [77 D4 C9, 05, 05]
 
-12354; [7A CF 6E, 05, 05]
+12328; [77 D4 D1, 05, 05]
 
-12355; [7A CF 76, 05, 05]
+12329; [77 D4 D9, 05, 05]
 
-12356; [7A CF 7E, 05, 05]
+1232A; [77 D4 E1, 05, 05]
 
-12357; [7A CF 86, 05, 05]
+1232B; [77 D4 E9, 05, 05]
 
-12358; [7A CF 8E, 05, 05]
+1232C; [77 D4 F1, 05, 05]
 
-12359; [7A CF 96, 05, 05]
+1232D; [77 D4 F9, 05, 05]
 
-1235A; [7A CF 9E, 05, 05]
+1232E; [77 D5 03, 05, 05]
 
-1235B; [7A CF A6, 05, 05]
+1232F; [77 D5 0B, 05, 05]
 
-1235C; [7A CF AE, 05, 05]
+12330; [77 D5 13, 05, 05]
 
-1235D; [7A CF B6, 05, 05]
+12331; [77 D5 1B, 05, 05]
 
-1235E; [7A CF BE, 05, 05]
+12332; [77 D5 23, 05, 05]
 
-1235F; [7A CF C6, 05, 05]
+12333; [77 D5 2B, 05, 05]
 
-12360; [7A CF CE, 05, 05]
+12334; [77 D5 33, 05, 05]
 
-12361; [7A CF D6, 05, 05]
+12335; [77 D5 3B, 05, 05]
 
-12362; [7A CF DE, 05, 05]
+12336; [77 D5 43, 05, 05]
 
-12363; [7A CF E6, 05, 05]
+12337; [77 D5 4B, 05, 05]
 
-12364; [7A CF EE, 05, 05]
+12338; [77 D5 53, 05, 05]
 
-12365; [7A CF F6, 05, 05]
+12339; [77 D5 5B, 05, 05]
 
-12366; [7A D0 04, 05, 05]
+1233A; [77 D5 63, 05, 05]
 
-12367; [7A D0 0C, 05, 05]
+1233B; [77 D5 6B, 05, 05]
 
-12368; [7A D0 14, 05, 05]
+1233C; [77 D5 73, 05, 05]
 
-12369; [7A D0 1C, 05, 05]
+1233D; [77 D5 7B, 05, 05]
 
-1236A; [7A D0 24, 05, 05]
+1233E; [77 D5 83, 05, 05]
 
-1236B; [7A D0 2C, 05, 05]
+1233F; [77 D5 8B, 05, 05]
 
-1236C; [7A D0 34, 05, 05]
+12340; [77 D5 93, 05, 05]
 
-1236D; [7A D0 3C, 05, 05]
+12341; [77 D5 9B, 05, 05]
 
-1236E; [7A D0 44, 05, 05]
+12342; [77 D5 A3, 05, 05]
 
-13000; [7A D0 4C, 05, 05]
+12343; [77 D5 AB, 05, 05]
 
-13001; [7A D0 54, 05, 05]
+12344; [77 D5 B3, 05, 05]
 
-13002; [7A D0 5C, 05, 05]
+12345; [77 D5 BB, 05, 05]
 
-13003; [7A D0 64, 05, 05]
+12346; [77 D5 C3, 05, 05]
 
-13004; [7A D0 6C, 05, 05]
+12347; [77 D5 CB, 05, 05]
 
-13005; [7A D0 74, 05, 05]
+12348; [77 D5 D3, 05, 05]
 
-13006; [7A D0 7C, 05, 05]
+12349; [77 D5 DB, 05, 05]
 
-13007; [7A D0 84, 05, 05]
+1234A; [77 D5 E3, 05, 05]
 
-13008; [7A D0 8C, 05, 05]
+1234B; [77 D5 EB, 05, 05]
 
-13009; [7A D0 94, 05, 05]
+1234C; [77 D5 F3, 05, 05]
 
-1300A; [7A D0 9C, 05, 05]
+1234D; [77 D5 FB, 05, 05]
 
-1300B; [7A D0 A4, 05, 05]
+1234E; [77 D6 05, 05, 05]
 
-1300C; [7A D0 AC, 05, 05]
+1234F; [77 D6 0D, 05, 05]
 
-1300D; [7A D0 B4, 05, 05]
+12350; [77 D6 15, 05, 05]
 
-1300E; [7A D0 BC, 05, 05]
+12351; [77 D6 1D, 05, 05]
 
-1300F; [7A D0 C4, 05, 05]
+12352; [77 D6 25, 05, 05]
 
-13010; [7A D0 CC, 05, 05]
+12353; [77 D6 2D, 05, 05]
 
-13011; [7A D0 D4, 05, 05]
+12354; [77 D6 35, 05, 05]
 
-13012; [7A D0 DC, 05, 05]
+12355; [77 D6 3D, 05, 05]
 
-13013; [7A D0 E4, 05, 05]
+12356; [77 D6 45, 05, 05]
 
-13014; [7A D0 EC, 05, 05]
+12357; [77 D6 4D, 05, 05]
 
-13015; [7A D0 F4, 05, 05]
+12358; [77 D6 55, 05, 05]
 
-13016; [7A D0 FC, 05, 05]
+12359; [77 D6 5D, 05, 05]
 
-13017; [7A D1 0A, 05, 05]
+1235A; [77 D6 65, 05, 05]
 
-13018; [7A D1 12, 05, 05]
+1235B; [77 D6 6D, 05, 05]
 
-13019; [7A D1 1A, 05, 05]
+1235C; [77 D6 75, 05, 05]
 
-1301A; [7A D1 22, 05, 05]
+1235D; [77 D6 7D, 05, 05]
 
-1301B; [7A D1 2A, 05, 05]
+1235E; [77 D6 85, 05, 05]
 
-1301C; [7A D1 32, 05, 05]
+1235F; [77 D6 8D, 05, 05]
 
-1301D; [7A D1 3A, 05, 05]
+12360; [77 D6 95, 05, 05]
 
-1301E; [7A D1 42, 05, 05]
+12361; [77 D6 9D, 05, 05]
 
-1301F; [7A D1 4A, 05, 05]
+12362; [77 D6 A5, 05, 05]
 
-13020; [7A D1 52, 05, 05]
+12363; [77 D6 AD, 05, 05]
 
-13021; [7A D1 5A, 05, 05]
+12364; [77 D6 B5, 05, 05]
 
-13022; [7A D1 62, 05, 05]
+12365; [77 D6 BD, 05, 05]
 
-13023; [7A D1 6A, 05, 05]
+12366; [77 D6 C5, 05, 05]
 
-13024; [7A D1 72, 05, 05]
+12367; [77 D6 CD, 05, 05]
 
-13025; [7A D1 7A, 05, 05]
+12368; [77 D6 D5, 05, 05]
 
-13026; [7A D1 82, 05, 05]
+12369; [77 D6 DD, 05, 05]
 
-13027; [7A D1 8A, 05, 05]
+1236A; [77 D6 E5, 05, 05]
 
-13028; [7A D1 92, 05, 05]
+1236B; [77 D6 ED, 05, 05]
 
-13029; [7A D1 9A, 05, 05]
+1236C; [77 D6 F5, 05, 05]
 
-1302A; [7A D1 A2, 05, 05]
+1236D; [77 D6 FD, 05, 05]
 
-1302B; [7A D1 AA, 05, 05]
+1236E; [77 D7 07, 05, 05]
 
-1302C; [7A D1 B2, 05, 05]
+FDD1 13153;    [77 D7 30, 05, 05]      # Egyptian Hieroglyphs first primary
 
-1302D; [7A D1 BA, 05, 05]
+13000; [77 D7 59, 05, 05]
 
-1302E; [7A D1 C2, 05, 05]
+13001; [77 D7 61, 05, 05]
 
-1302F; [7A D1 CA, 05, 05]
+13002; [77 D7 69, 05, 05]
 
-13030; [7A D1 D2, 05, 05]
+13003; [77 D7 71, 05, 05]
 
-13031; [7A D1 DA, 05, 05]
+13004; [77 D7 79, 05, 05]
 
-13032; [7A D1 E2, 05, 05]
+13005; [77 D7 81, 05, 05]
 
-13033; [7A D1 EA, 05, 05]
+13006; [77 D7 89, 05, 05]
 
-13034; [7A D1 F2, 05, 05]
+13007; [77 D7 91, 05, 05]
 
-13035; [7A D1 FA, 05, 05]
+13008; [77 D7 99, 05, 05]
 
-13036; [7A D2 08, 05, 05]
+13009; [77 D7 A1, 05, 05]
 
-13037; [7A D2 10, 05, 05]
+1300A; [77 D7 A9, 05, 05]
 
-13038; [7A D2 18, 05, 05]
+1300B; [77 D7 B1, 05, 05]
 
-13039; [7A D2 20, 05, 05]
+1300C; [77 D7 B9, 05, 05]
 
-1303A; [7A D2 28, 05, 05]
+1300D; [77 D7 C1, 05, 05]
 
-1303B; [7A D2 30, 05, 05]
+1300E; [77 D7 C9, 05, 05]
 
-1303C; [7A D2 38, 05, 05]
+1300F; [77 D7 D1, 05, 05]
 
-1303D; [7A D2 40, 05, 05]
+13010; [77 D7 D9, 05, 05]
 
-1303E; [7A D2 48, 05, 05]
+13011; [77 D7 E1, 05, 05]
 
-1303F; [7A D2 50, 05, 05]
+13012; [77 D7 E9, 05, 05]
 
-13040; [7A D2 58, 05, 05]
+13013; [77 D7 F1, 05, 05]
 
-13041; [7A D2 60, 05, 05]
+13014; [77 D7 F9, 05, 05]
 
-13042; [7A D2 68, 05, 05]
+13015; [77 D8 03, 05, 05]
 
-13043; [7A D2 70, 05, 05]
+13016; [77 D8 0B, 05, 05]
 
-13044; [7A D2 78, 05, 05]
+13017; [77 D8 13, 05, 05]
 
-13045; [7A D2 80, 05, 05]
+13018; [77 D8 1B, 05, 05]
 
-13046; [7A D2 88, 05, 05]
+13019; [77 D8 23, 05, 05]
 
-13047; [7A D2 90, 05, 05]
+1301A; [77 D8 2B, 05, 05]
 
-13048; [7A D2 98, 05, 05]
+1301B; [77 D8 33, 05, 05]
 
-13049; [7A D2 A0, 05, 05]
+1301C; [77 D8 3B, 05, 05]
 
-1304A; [7A D2 A8, 05, 05]
+1301D; [77 D8 43, 05, 05]
 
-1304B; [7A D2 B0, 05, 05]
+1301E; [77 D8 4B, 05, 05]
 
-1304C; [7A D2 B8, 05, 05]
+1301F; [77 D8 53, 05, 05]
 
-1304D; [7A D2 C0, 05, 05]
+13020; [77 D8 5B, 05, 05]
 
-1304E; [7A D2 C8, 05, 05]
+13021; [77 D8 63, 05, 05]
 
-1304F; [7A D2 D0, 05, 05]
+13022; [77 D8 6B, 05, 05]
 
-13050; [7A D2 D8, 05, 05]
+13023; [77 D8 73, 05, 05]
 
-13051; [7A D2 E0, 05, 05]
+13024; [77 D8 7B, 05, 05]
 
-13052; [7A D2 E8, 05, 05]
+13025; [77 D8 83, 05, 05]
 
-13053; [7A D2 F0, 05, 05]
+13026; [77 D8 8B, 05, 05]
 
-13054; [7A D2 F8, 05, 05]
+13027; [77 D8 93, 05, 05]
 
-13055; [7A D3 06, 05, 05]
+13028; [77 D8 9B, 05, 05]
 
-13056; [7A D3 0E, 05, 05]
+13029; [77 D8 A3, 05, 05]
 
-13057; [7A D3 16, 05, 05]
+1302A; [77 D8 AB, 05, 05]
 
-13058; [7A D3 1E, 05, 05]
+1302B; [77 D8 B3, 05, 05]
 
-13059; [7A D3 26, 05, 05]
+1302C; [77 D8 BB, 05, 05]
 
-1305A; [7A D3 2E, 05, 05]
+1302D; [77 D8 C3, 05, 05]
 
-1305B; [7A D3 36, 05, 05]
+1302E; [77 D8 CB, 05, 05]
 
-1305C; [7A D3 3E, 05, 05]
+1302F; [77 D8 D3, 05, 05]
 
-1305D; [7A D3 46, 05, 05]
+13030; [77 D8 DB, 05, 05]
 
-1305E; [7A D3 4E, 05, 05]
+13031; [77 D8 E3, 05, 05]
 
-1305F; [7A D3 56, 05, 05]
+13032; [77 D8 EB, 05, 05]
 
-13060; [7A D3 5E, 05, 05]
+13033; [77 D8 F3, 05, 05]
 
-13061; [7A D3 66, 05, 05]
+13034; [77 D8 FB, 05, 05]
 
-13062; [7A D3 6E, 05, 05]
+13035; [77 D9 05, 05, 05]
 
-13063; [7A D3 76, 05, 05]
+13036; [77 D9 0D, 05, 05]
 
-13064; [7A D3 7E, 05, 05]
+13037; [77 D9 15, 05, 05]
 
-13065; [7A D3 86, 05, 05]
+13038; [77 D9 1D, 05, 05]
 
-13066; [7A D3 8E, 05, 05]
+13039; [77 D9 25, 05, 05]
 
-13067; [7A D3 96, 05, 05]
+1303A; [77 D9 2D, 05, 05]
 
-13068; [7A D3 9E, 05, 05]
+1303B; [77 D9 35, 05, 05]
 
-13069; [7A D3 A6, 05, 05]
+1303C; [77 D9 3D, 05, 05]
 
-1306A; [7A D3 AE, 05, 05]
+1303D; [77 D9 45, 05, 05]
 
-1306B; [7A D3 B6, 05, 05]
+1303E; [77 D9 4D, 05, 05]
 
-1306C; [7A D3 BE, 05, 05]
+1303F; [77 D9 55, 05, 05]
 
-1306D; [7A D3 C6, 05, 05]
+13040; [77 D9 5D, 05, 05]
 
-1306E; [7A D3 CE, 05, 05]
+13041; [77 D9 65, 05, 05]
 
-1306F; [7A D3 D6, 05, 05]
+13042; [77 D9 6D, 05, 05]
 
-13070; [7A D3 DE, 05, 05]
+13043; [77 D9 75, 05, 05]
 
-13071; [7A D3 E6, 05, 05]
+13044; [77 D9 7D, 05, 05]
 
-13072; [7A D3 EE, 05, 05]
+13045; [77 D9 85, 05, 05]
 
-13073; [7A D3 F6, 05, 05]
+13046; [77 D9 8D, 05, 05]
 
-13074; [7A D4 04, 05, 05]
+13047; [77 D9 95, 05, 05]
 
-13075; [7A D4 0C, 05, 05]
+13048; [77 D9 9D, 05, 05]
 
-13076; [7A D4 14, 05, 05]
+13049; [77 D9 A5, 05, 05]
 
-13077; [7A D4 1C, 05, 05]
+1304A; [77 D9 AD, 05, 05]
 
-13078; [7A D4 24, 05, 05]
+1304B; [77 D9 B5, 05, 05]
 
-13079; [7A D4 2C, 05, 05]
+1304C; [77 D9 BD, 05, 05]
 
-1307A; [7A D4 34, 05, 05]
+1304D; [77 D9 C5, 05, 05]
 
-1307B; [7A D4 3C, 05, 05]
+1304E; [77 D9 CD, 05, 05]
 
-1307C; [7A D4 44, 05, 05]
+1304F; [77 D9 D5, 05, 05]
 
-1307D; [7A D4 4C, 05, 05]
+13050; [77 D9 DD, 05, 05]
 
-1307E; [7A D4 54, 05, 05]
+13051; [77 D9 E5, 05, 05]
 
-1307F; [7A D4 5C, 05, 05]
+13052; [77 D9 ED, 05, 05]
 
-13080; [7A D4 64, 05, 05]
+13053; [77 D9 F5, 05, 05]
 
-13081; [7A D4 6C, 05, 05]
+13054; [77 D9 FD, 05, 05]
 
-13082; [7A D4 74, 05, 05]
+13055; [77 DA 07, 05, 05]
 
-13083; [7A D4 7C, 05, 05]
+13056; [77 DA 0F, 05, 05]
 
-13084; [7A D4 84, 05, 05]
+13057; [77 DA 17, 05, 05]
 
-13085; [7A D4 8C, 05, 05]
+13058; [77 DA 1F, 05, 05]
 
-13086; [7A D4 94, 05, 05]
+13059; [77 DA 27, 05, 05]
 
-13087; [7A D4 9C, 05, 05]
+1305A; [77 DA 2F, 05, 05]
 
-13088; [7A D4 A4, 05, 05]
+1305B; [77 DA 37, 05, 05]
 
-13089; [7A D4 AC, 05, 05]
+1305C; [77 DA 3F, 05, 05]
 
-1308A; [7A D4 B4, 05, 05]
+1305D; [77 DA 47, 05, 05]
 
-1308B; [7A D4 BC, 05, 05]
+1305E; [77 DA 4F, 05, 05]
 
-1308C; [7A D4 C4, 05, 05]
+1305F; [77 DA 57, 05, 05]
 
-1308D; [7A D4 CC, 05, 05]
+13060; [77 DA 5F, 05, 05]
 
-1308E; [7A D4 D4, 05, 05]
+13061; [77 DA 67, 05, 05]
 
-1308F; [7A D4 DC, 05, 05]
+13062; [77 DA 6F, 05, 05]
 
-13090; [7A D4 E4, 05, 05]
+13063; [77 DA 77, 05, 05]
 
-13091; [7A D4 EC, 05, 05]
+13064; [77 DA 7F, 05, 05]
 
-13092; [7A D4 F4, 05, 05]
+13065; [77 DA 87, 05, 05]
 
-13093; [7A D4 FC, 05, 05]
+13066; [77 DA 8F, 05, 05]
 
-13094; [7A D5 0A, 05, 05]
+13067; [77 DA 97, 05, 05]
 
-13095; [7A D5 12, 05, 05]
+13068; [77 DA 9F, 05, 05]
 
-13096; [7A D5 1A, 05, 05]
+13069; [77 DA A7, 05, 05]
 
-13097; [7A D5 22, 05, 05]
+1306A; [77 DA AF, 05, 05]
 
-13098; [7A D5 2A, 05, 05]
+1306B; [77 DA B7, 05, 05]
 
-13099; [7A D5 32, 05, 05]
+1306C; [77 DA BF, 05, 05]
 
-1309A; [7A D5 3A, 05, 05]
+1306D; [77 DA C7, 05, 05]
 
-1309B; [7A D5 42, 05, 05]
+1306E; [77 DA CF, 05, 05]
 
-1309C; [7A D5 4A, 05, 05]
+1306F; [77 DA D7, 05, 05]
 
-1309D; [7A D5 52, 05, 05]
+13070; [77 DA DF, 05, 05]
 
-1309E; [7A D5 5A, 05, 05]
+13071; [77 DA E7, 05, 05]
 
-1309F; [7A D5 62, 05, 05]
+13072; [77 DA EF, 05, 05]
 
-130A0; [7A D5 6A, 05, 05]
+13073; [77 DA F7, 05, 05]
 
-130A1; [7A D5 72, 05, 05]
+13074; [77 DA FF, 05, 05]
 
-130A2; [7A D5 7A, 05, 05]
+13075; [77 DB 09, 05, 05]
 
-130A3; [7A D5 82, 05, 05]
+13076; [77 DB 11, 05, 05]
 
-130A4; [7A D5 8A, 05, 05]
+13077; [77 DB 19, 05, 05]
 
-130A5; [7A D5 92, 05, 05]
+13078; [77 DB 21, 05, 05]
 
-130A6; [7A D5 9A, 05, 05]
+13079; [77 DB 29, 05, 05]
 
-130A7; [7A D5 A2, 05, 05]
+1307A; [77 DB 31, 05, 05]
 
-130A8; [7A D5 AA, 05, 05]
+1307B; [77 DB 39, 05, 05]
 
-130A9; [7A D5 B2, 05, 05]
+1307C; [77 DB 41, 05, 05]
 
-130AA; [7A D5 BA, 05, 05]
+1307D; [77 DB 49, 05, 05]
 
-130AB; [7A D5 C2, 05, 05]
+1307E; [77 DB 51, 05, 05]
 
-130AC; [7A D5 CA, 05, 05]
+1307F; [77 DB 59, 05, 05]
 
-130AD; [7A D5 D2, 05, 05]
+13080; [77 DB 61, 05, 05]
 
-130AE; [7A D5 DA, 05, 05]
+13081; [77 DB 69, 05, 05]
 
-130AF; [7A D5 E2, 05, 05]
+13082; [77 DB 71, 05, 05]
 
-130B0; [7A D5 EA, 05, 05]
+13083; [77 DB 79, 05, 05]
 
-130B1; [7A D5 F2, 05, 05]
+13084; [77 DB 81, 05, 05]
 
-130B2; [7A D5 FA, 05, 05]
+13085; [77 DB 89, 05, 05]
 
-130B3; [7A D6 08, 05, 05]
+13086; [77 DB 91, 05, 05]
 
-130B4; [7A D6 10, 05, 05]
+13087; [77 DB 99, 05, 05]
 
-130B5; [7A D6 18, 05, 05]
+13088; [77 DB A1, 05, 05]
 
-130B6; [7A D6 20, 05, 05]
+13089; [77 DB A9, 05, 05]
 
-130B7; [7A D6 28, 05, 05]
+1308A; [77 DB B1, 05, 05]
 
-130B8; [7A D6 30, 05, 05]
+1308B; [77 DB B9, 05, 05]
 
-130B9; [7A D6 38, 05, 05]
+1308C; [77 DB C1, 05, 05]
 
-130BA; [7A D6 40, 05, 05]
+1308D; [77 DB C9, 05, 05]
 
-130BB; [7A D6 48, 05, 05]
+1308E; [77 DB D1, 05, 05]
 
-130BC; [7A D6 50, 05, 05]
+1308F; [77 DB D9, 05, 05]
 
-130BD; [7A D6 58, 05, 05]
+13090; [77 DB E1, 05, 05]
 
-130BE; [7A D6 60, 05, 05]
+13091; [77 DB E9, 05, 05]
 
-130BF; [7A D6 68, 05, 05]
+13092; [77 DB F1, 05, 05]
 
-130C0; [7A D6 70, 05, 05]
+13093; [77 DB F9, 05, 05]
 
-130C1; [7A D6 78, 05, 05]
+13094; [77 DC 03, 05, 05]
 
-130C2; [7A D6 80, 05, 05]
+13095; [77 DC 0B, 05, 05]
 
-130C3; [7A D6 88, 05, 05]
+13096; [77 DC 13, 05, 05]
 
-130C4; [7A D6 90, 05, 05]
+13097; [77 DC 1B, 05, 05]
 
-130C5; [7A D6 98, 05, 05]
+13098; [77 DC 23, 05, 05]
 
-130C6; [7A D6 A0, 05, 05]
+13099; [77 DC 2B, 05, 05]
 
-130C7; [7A D6 A8, 05, 05]
+1309A; [77 DC 33, 05, 05]
 
-130C8; [7A D6 B0, 05, 05]
+1309B; [77 DC 3B, 05, 05]
 
-130C9; [7A D6 B8, 05, 05]
+1309C; [77 DC 43, 05, 05]
 
-130CA; [7A D6 C0, 05, 05]
+1309D; [77 DC 4B, 05, 05]
 
-130CB; [7A D6 C8, 05, 05]
+1309E; [77 DC 53, 05, 05]
 
-130CC; [7A D6 D0, 05, 05]
+1309F; [77 DC 5B, 05, 05]
 
-130CD; [7A D6 D8, 05, 05]
+130A0; [77 DC 63, 05, 05]
 
-130CE; [7A D6 E0, 05, 05]
+130A1; [77 DC 6B, 05, 05]
 
-130CF; [7A D6 E8, 05, 05]
+130A2; [77 DC 73, 05, 05]
 
-130D0; [7A D6 F0, 05, 05]
+130A3; [77 DC 7B, 05, 05]
 
-130D1; [7A D6 F8, 05, 05]
+130A4; [77 DC 83, 05, 05]
 
-130D2; [7A D7 06, 05, 05]
+130A5; [77 DC 8B, 05, 05]
 
-130D3; [7A D7 0E, 05, 05]
+130A6; [77 DC 93, 05, 05]
 
-130D4; [7A D7 16, 05, 05]
+130A7; [77 DC 9B, 05, 05]
 
-130D5; [7A D7 1E, 05, 05]
+130A8; [77 DC A3, 05, 05]
 
-130D6; [7A D7 26, 05, 05]
+130A9; [77 DC AB, 05, 05]
 
-130D7; [7A D7 2E, 05, 05]
+130AA; [77 DC B3, 05, 05]
 
-130D8; [7A D7 36, 05, 05]
+130AB; [77 DC BB, 05, 05]
 
-130D9; [7A D7 3E, 05, 05]
+130AC; [77 DC C3, 05, 05]
 
-130DA; [7A D7 46, 05, 05]
+130AD; [77 DC CB, 05, 05]
 
-130DB; [7A D7 4E, 05, 05]
+130AE; [77 DC D3, 05, 05]
 
-130DC; [7A D7 56, 05, 05]
+130AF; [77 DC DB, 05, 05]
 
-130DD; [7A D7 5E, 05, 05]
+130B0; [77 DC E3, 05, 05]
 
-130DE; [7A D7 66, 05, 05]
+130B1; [77 DC EB, 05, 05]
 
-130DF; [7A D7 6E, 05, 05]
+130B2; [77 DC F3, 05, 05]
 
-130E0; [7A D7 76, 05, 05]
+130B3; [77 DC FB, 05, 05]
 
-130E1; [7A D7 7E, 05, 05]
+130B4; [77 DD 05, 05, 05]
 
-130E2; [7A D7 86, 05, 05]
+130B5; [77 DD 0D, 05, 05]
 
-130E3; [7A D7 8E, 05, 05]
+130B6; [77 DD 15, 05, 05]
 
-130E4; [7A D7 96, 05, 05]
+130B7; [77 DD 1D, 05, 05]
 
-130E5; [7A D7 9E, 05, 05]
+130B8; [77 DD 25, 05, 05]
 
-130E6; [7A D7 A6, 05, 05]
+130B9; [77 DD 2D, 05, 05]
 
-130E7; [7A D7 AE, 05, 05]
+130BA; [77 DD 35, 05, 05]
 
-130E8; [7A D7 B6, 05, 05]
+130BB; [77 DD 3D, 05, 05]
 
-130E9; [7A D7 BE, 05, 05]
+130BC; [77 DD 45, 05, 05]
 
-130EA; [7A D7 C6, 05, 05]
+130BD; [77 DD 4D, 05, 05]
 
-130EB; [7A D7 CE, 05, 05]
+130BE; [77 DD 55, 05, 05]
 
-130EC; [7A D7 D6, 05, 05]
+130BF; [77 DD 5D, 05, 05]
 
-130ED; [7A D7 DE, 05, 05]
+130C0; [77 DD 65, 05, 05]
 
-130EE; [7A D7 E6, 05, 05]
+130C1; [77 DD 6D, 05, 05]
 
-130EF; [7A D7 EE, 05, 05]
+130C2; [77 DD 75, 05, 05]
 
-130F0; [7A D7 F6, 05, 05]
+130C3; [77 DD 7D, 05, 05]
 
-130F1; [7A D8 04, 05, 05]
+130C4; [77 DD 85, 05, 05]
 
-130F2; [7A D8 0C, 05, 05]
+130C5; [77 DD 8D, 05, 05]
 
-130F3; [7A D8 14, 05, 05]
+130C6; [77 DD 95, 05, 05]
 
-130F4; [7A D8 1C, 05, 05]
+130C7; [77 DD 9D, 05, 05]
 
-130F5; [7A D8 24, 05, 05]
+130C8; [77 DD A5, 05, 05]
 
-130F6; [7A D8 2C, 05, 05]
+130C9; [77 DD AD, 05, 05]
 
-130F7; [7A D8 34, 05, 05]
+130CA; [77 DD B5, 05, 05]
 
-130F8; [7A D8 3C, 05, 05]
+130CB; [77 DD BD, 05, 05]
 
-130F9; [7A D8 44, 05, 05]
+130CC; [77 DD C5, 05, 05]
 
-130FA; [7A D8 4C, 05, 05]
+130CD; [77 DD CD, 05, 05]
 
-130FB; [7A D8 54, 05, 05]
+130CE; [77 DD D5, 05, 05]
 
-130FC; [7A D8 5C, 05, 05]
+130CF; [77 DD DD, 05, 05]
 
-130FD; [7A D8 64, 05, 05]
+130D0; [77 DD E5, 05, 05]
 
-130FE; [7A D8 6C, 05, 05]
+130D1; [77 DD ED, 05, 05]
 
-130FF; [7A D8 74, 05, 05]
+130D2; [77 DD F5, 05, 05]
 
-13100; [7A D8 7C, 05, 05]
+130D3; [77 DD FD, 05, 05]
 
-13101; [7A D8 84, 05, 05]
+130D4; [77 DE 07, 05, 05]
 
-13102; [7A D8 8C, 05, 05]
+130D5; [77 DE 0F, 05, 05]
 
-13103; [7A D8 94, 05, 05]
+130D6; [77 DE 17, 05, 05]
 
-13104; [7A D8 9C, 05, 05]
+130D7; [77 DE 1F, 05, 05]
 
-13105; [7A D8 A4, 05, 05]
+130D8; [77 DE 27, 05, 05]
 
-13106; [7A D8 AC, 05, 05]
+130D9; [77 DE 2F, 05, 05]
 
-13107; [7A D8 B4, 05, 05]
+130DA; [77 DE 37, 05, 05]
 
-13108; [7A D8 BC, 05, 05]
+130DB; [77 DE 3F, 05, 05]
 
-13109; [7A D8 C4, 05, 05]
+130DC; [77 DE 47, 05, 05]
 
-1310A; [7A D8 CC, 05, 05]
+130DD; [77 DE 4F, 05, 05]
 
-1310B; [7A D8 D4, 05, 05]
+130DE; [77 DE 57, 05, 05]
 
-1310C; [7A D8 DC, 05, 05]
+130DF; [77 DE 5F, 05, 05]
 
-1310D; [7A D8 E4, 05, 05]
+130E0; [77 DE 67, 05, 05]
 
-1310E; [7A D8 EC, 05, 05]
+130E1; [77 DE 6F, 05, 05]
 
-1310F; [7A D8 F4, 05, 05]
+130E2; [77 DE 77, 05, 05]
 
-13110; [7A D8 FC, 05, 05]
+130E3; [77 DE 7F, 05, 05]
 
-13111; [7A D9 0A, 05, 05]
+130E4; [77 DE 87, 05, 05]
 
-13112; [7A D9 12, 05, 05]
+130E5; [77 DE 8F, 05, 05]
 
-13113; [7A D9 1A, 05, 05]
+130E6; [77 DE 97, 05, 05]
 
-13114; [7A D9 22, 05, 05]
+130E7; [77 DE 9F, 05, 05]
 
-13115; [7A D9 2A, 05, 05]
+130E8; [77 DE A7, 05, 05]
 
-13116; [7A D9 32, 05, 05]
+130E9; [77 DE AF, 05, 05]
 
-13117; [7A D9 3A, 05, 05]
+130EA; [77 DE B7, 05, 05]
 
-13118; [7A D9 42, 05, 05]
+130EB; [77 DE BF, 05, 05]
 
-13119; [7A D9 4A, 05, 05]
+130EC; [77 DE C7, 05, 05]
 
-1311A; [7A D9 52, 05, 05]
+130ED; [77 DE CF, 05, 05]
 
-1311B; [7A D9 5A, 05, 05]
+130EE; [77 DE D7, 05, 05]
 
-1311C; [7A D9 62, 05, 05]
+130EF; [77 DE DF, 05, 05]
 
-1311D; [7A D9 6A, 05, 05]
+130F0; [77 DE E7, 05, 05]
 
-1311E; [7A D9 72, 05, 05]
+130F1; [77 DE EF, 05, 05]
 
-1311F; [7A D9 7A, 05, 05]
+130F2; [77 DE F7, 05, 05]
 
-13120; [7A D9 82, 05, 05]
+130F3; [77 DE FF, 05, 05]
 
-13121; [7A D9 8A, 05, 05]
+130F4; [77 DF 09, 05, 05]
 
-13122; [7A D9 92, 05, 05]
+130F5; [77 DF 11, 05, 05]
 
-13123; [7A D9 9A, 05, 05]
+130F6; [77 DF 19, 05, 05]
 
-13124; [7A D9 A2, 05, 05]
+130F7; [77 DF 21, 05, 05]
 
-13125; [7A D9 AA, 05, 05]
+130F8; [77 DF 29, 05, 05]
 
-13126; [7A D9 B2, 05, 05]
+130F9; [77 DF 31, 05, 05]
 
-13127; [7A D9 BA, 05, 05]
+130FA; [77 DF 39, 05, 05]
 
-13128; [7A D9 C2, 05, 05]
+130FB; [77 DF 41, 05, 05]
 
-13129; [7A D9 CA, 05, 05]
+130FC; [77 DF 49, 05, 05]
 
-1312A; [7A D9 D2, 05, 05]
+130FD; [77 DF 51, 05, 05]
 
-1312B; [7A D9 DA, 05, 05]
+130FE; [77 DF 59, 05, 05]
 
-1312C; [7A D9 E2, 05, 05]
+130FF; [77 DF 61, 05, 05]
 
-1312D; [7A D9 EA, 05, 05]
+13100; [77 DF 69, 05, 05]
 
-1312E; [7A D9 F2, 05, 05]
+13101; [77 DF 71, 05, 05]
 
-1312F; [7A D9 FA, 05, 05]
+13102; [77 DF 79, 05, 05]
 
-13130; [7A DA 08, 05, 05]
+13103; [77 DF 81, 05, 05]
 
-13131; [7A DA 10, 05, 05]
+13104; [77 DF 89, 05, 05]
 
-13132; [7A DA 18, 05, 05]
+13105; [77 DF 91, 05, 05]
 
-13133; [7A DA 20, 05, 05]
+13106; [77 DF 99, 05, 05]
 
-13134; [7A DA 28, 05, 05]
+13107; [77 DF A1, 05, 05]
 
-13135; [7A DA 30, 05, 05]
+13108; [77 DF A9, 05, 05]
 
-13136; [7A DA 38, 05, 05]
+13109; [77 DF B1, 05, 05]
 
-13137; [7A DA 40, 05, 05]
+1310A; [77 DF B9, 05, 05]
 
-13138; [7A DA 48, 05, 05]
+1310B; [77 DF C1, 05, 05]
 
-13139; [7A DA 50, 05, 05]
+1310C; [77 DF C9, 05, 05]
 
-1313A; [7A DA 58, 05, 05]
+1310D; [77 DF D1, 05, 05]
 
-1313B; [7A DA 60, 05, 05]
+1310E; [77 DF D9, 05, 05]
 
-1313C; [7A DA 68, 05, 05]
+1310F; [77 DF E1, 05, 05]
 
-1313D; [7A DA 70, 05, 05]
+13110; [77 DF E9, 05, 05]
 
-1313E; [7A DA 78, 05, 05]
+13111; [77 DF F1, 05, 05]
 
-1313F; [7A DA 80, 05, 05]
+13112; [77 DF F9, 05, 05]
 
-13140; [7A DA 88, 05, 05]
+13113; [77 E0 03, 05, 05]
 
-13141; [7A DA 90, 05, 05]
+13114; [77 E0 0B, 05, 05]
 
-13142; [7A DA 98, 05, 05]
+13115; [77 E0 13, 05, 05]
 
-13143; [7A DA A0, 05, 05]
+13116; [77 E0 1B, 05, 05]
 
-13144; [7A DA A8, 05, 05]
+13117; [77 E0 23, 05, 05]
 
-13145; [7A DA B0, 05, 05]
+13118; [77 E0 2B, 05, 05]
 
-13146; [7A DA B8, 05, 05]
+13119; [77 E0 33, 05, 05]
 
-13147; [7A DA C0, 05, 05]
+1311A; [77 E0 3B, 05, 05]
 
-13148; [7A DA C8, 05, 05]
+1311B; [77 E0 43, 05, 05]
 
-13149; [7A DA D0, 05, 05]
+1311C; [77 E0 4B, 05, 05]
 
-1314A; [7A DA D8, 05, 05]
+1311D; [77 E0 53, 05, 05]
 
-1314B; [7A DA E0, 05, 05]
+1311E; [77 E0 5B, 05, 05]
 
-1314C; [7A DA E8, 05, 05]
+1311F; [77 E0 63, 05, 05]
 
-1314D; [7A DA F0, 05, 05]
+13120; [77 E0 6B, 05, 05]
 
-1314E; [7A DA F8, 05, 05]
+13121; [77 E0 73, 05, 05]
 
-1314F; [7A DB 06, 05, 05]
+13122; [77 E0 7B, 05, 05]
 
-13150; [7A DB 0E, 05, 05]
+13123; [77 E0 83, 05, 05]
 
-13151; [7A DB 16, 05, 05]
+13124; [77 E0 8B, 05, 05]
 
-13152; [7A DB 1E, 05, 05]
+13125; [77 E0 93, 05, 05]
 
-13153; [7A DB 26, 05, 05]
+13126; [77 E0 9B, 05, 05]
 
-13154; [7A DB 2E, 05, 05]
+13127; [77 E0 A3, 05, 05]
 
-13155; [7A DB 36, 05, 05]
+13128; [77 E0 AB, 05, 05]
 
-13156; [7A DB 3E, 05, 05]
+13129; [77 E0 B3, 05, 05]
 
-13157; [7A DB 46, 05, 05]
+1312A; [77 E0 BB, 05, 05]
 
-13158; [7A DB 4E, 05, 05]
+1312B; [77 E0 C3, 05, 05]
 
-13159; [7A DB 56, 05, 05]
+1312C; [77 E0 CB, 05, 05]
 
-1315A; [7A DB 5E, 05, 05]
+1312D; [77 E0 D3, 05, 05]
 
-1315B; [7A DB 66, 05, 05]
+1312E; [77 E0 DB, 05, 05]
 
-1315C; [7A DB 6E, 05, 05]
+1312F; [77 E0 E3, 05, 05]
 
-1315D; [7A DB 76, 05, 05]
+13130; [77 E0 EB, 05, 05]
 
-1315E; [7A DB 7E, 05, 05]
+13131; [77 E0 F3, 05, 05]
 
-1315F; [7A DB 86, 05, 05]
+13132; [77 E0 FB, 05, 05]
 
-13160; [7A DB 8E, 05, 05]
+13133; [77 E1 05, 05, 05]
 
-13161; [7A DB 96, 05, 05]
+13134; [77 E1 0D, 05, 05]
 
-13162; [7A DB 9E, 05, 05]
+13135; [77 E1 15, 05, 05]
 
-13163; [7A DB A6, 05, 05]
+13136; [77 E1 1D, 05, 05]
 
-13164; [7A DB AE, 05, 05]
+13137; [77 E1 25, 05, 05]
 
-13165; [7A DB B6, 05, 05]
+13138; [77 E1 2D, 05, 05]
 
-13166; [7A DB BE, 05, 05]
+13139; [77 E1 35, 05, 05]
 
-13167; [7A DB C6, 05, 05]
+1313A; [77 E1 3D, 05, 05]
 
-13168; [7A DB CE, 05, 05]
+1313B; [77 E1 45, 05, 05]
 
-13169; [7A DB D6, 05, 05]
+1313C; [77 E1 4D, 05, 05]
 
-1316A; [7A DB DE, 05, 05]
+1313D; [77 E1 55, 05, 05]
 
-1316B; [7A DB E6, 05, 05]
+1313E; [77 E1 5D, 05, 05]
 
-1316C; [7A DB EE, 05, 05]
+1313F; [77 E1 65, 05, 05]
 
-1316D; [7A DB F6, 05, 05]
+13140; [77 E1 6D, 05, 05]
 
-1316E; [7A DC 04, 05, 05]
+13141; [77 E1 75, 05, 05]
 
-1316F; [7A DC 0C, 05, 05]
+13142; [77 E1 7D, 05, 05]
 
-13170; [7A DC 14, 05, 05]
+13143; [77 E1 85, 05, 05]
 
-13171; [7A DC 1C, 05, 05]
+13144; [77 E1 8D, 05, 05]
 
-13172; [7A DC 24, 05, 05]
+13145; [77 E1 95, 05, 05]
 
-13173; [7A DC 2C, 05, 05]
+13146; [77 E1 9D, 05, 05]
 
-13174; [7A DC 34, 05, 05]
+13147; [77 E1 A5, 05, 05]
 
-13175; [7A DC 3C, 05, 05]
+13148; [77 E1 AD, 05, 05]
 
-13176; [7A DC 44, 05, 05]
+13149; [77 E1 B5, 05, 05]
 
-13177; [7A DC 4C, 05, 05]
+1314A; [77 E1 BD, 05, 05]
 
-13178; [7A DC 54, 05, 05]
+1314B; [77 E1 C5, 05, 05]
 
-13179; [7A DC 5C, 05, 05]
+1314C; [77 E1 CD, 05, 05]
 
-1317A; [7A DC 64, 05, 05]
+1314D; [77 E1 D5, 05, 05]
 
-1317B; [7A DC 6C, 05, 05]
+1314E; [77 E1 DD, 05, 05]
 
-1317C; [7A DC 74, 05, 05]
+1314F; [77 E1 E5, 05, 05]
 
-1317D; [7A DC 7C, 05, 05]
+13150; [77 E1 ED, 05, 05]
 
-1317E; [7A DC 84, 05, 05]
+13151; [77 E1 F5, 05, 05]
 
-1317F; [7A DC 8C, 05, 05]
+13152; [77 E1 FD, 05, 05]
 
-13180; [7A DC 94, 05, 05]
+13153; [77 E2 07, 05, 05]
 
-13181; [7A DC 9C, 05, 05]
+13154; [77 E2 0F, 05, 05]
 
-13182; [7A DC A4, 05, 05]
+13155; [77 E2 17, 05, 05]
 
-13183; [7A DC AC, 05, 05]
+13156; [77 E2 1F, 05, 05]
 
-13184; [7A DC B4, 05, 05]
+13157; [77 E2 27, 05, 05]
 
-13185; [7A DC BC, 05, 05]
+13158; [77 E2 2F, 05, 05]
 
-13186; [7A DC C4, 05, 05]
+13159; [77 E2 37, 05, 05]
 
-13187; [7A DC CC, 05, 05]
+1315A; [77 E2 3F, 05, 05]
 
-13188; [7A DC D4, 05, 05]
+1315B; [77 E2 47, 05, 05]
 
-13189; [7A DC DC, 05, 05]
+1315C; [77 E2 4F, 05, 05]
 
-1318A; [7A DC E4, 05, 05]
+1315D; [77 E2 57, 05, 05]
 
-1318B; [7A DC EC, 05, 05]
+1315E; [77 E2 5F, 05, 05]
 
-1318C; [7A DC F4, 05, 05]
+1315F; [77 E2 67, 05, 05]
 
-1318D; [7A DC FC, 05, 05]
+13160; [77 E2 6F, 05, 05]
 
-1318E; [7A DD 0A, 05, 05]
+13161; [77 E2 77, 05, 05]
 
-1318F; [7A DD 12, 05, 05]
+13162; [77 E2 7F, 05, 05]
 
-13190; [7A DD 1A, 05, 05]
+13163; [77 E2 87, 05, 05]
 
-13191; [7A DD 22, 05, 05]
+13164; [77 E2 8F, 05, 05]
 
-13192; [7A DD 2A, 05, 05]
+13165; [77 E2 97, 05, 05]
 
-13193; [7A DD 32, 05, 05]
+13166; [77 E2 9F, 05, 05]
 
-13194; [7A DD 3A, 05, 05]
+13167; [77 E2 A7, 05, 05]
 
-13195; [7A DD 42, 05, 05]
+13168; [77 E2 AF, 05, 05]
 
-13196; [7A DD 4A, 05, 05]
+13169; [77 E2 B7, 05, 05]
 
-13197; [7A DD 52, 05, 05]
+1316A; [77 E2 BF, 05, 05]
 
-13198; [7A DD 5A, 05, 05]
+1316B; [77 E2 C7, 05, 05]
 
-13199; [7A DD 62, 05, 05]
+1316C; [77 E2 CF, 05, 05]
 
-1319A; [7A DD 6A, 05, 05]
+1316D; [77 E2 D7, 05, 05]
 
-1319B; [7A DD 72, 05, 05]
+1316E; [77 E2 DF, 05, 05]
 
-1319C; [7A DD 7A, 05, 05]
+1316F; [77 E2 E7, 05, 05]
 
-1319D; [7A DD 82, 05, 05]
+13170; [77 E2 EF, 05, 05]
 
-1319E; [7A DD 8A, 05, 05]
+13171; [77 E2 F7, 05, 05]
 
-1319F; [7A DD 92, 05, 05]
+13172; [77 E2 FF, 05, 05]
 
-131A0; [7A DD 9A, 05, 05]
+13173; [77 E3 09, 05, 05]
 
-131A1; [7A DD A2, 05, 05]
+13174; [77 E3 11, 05, 05]
 
-131A2; [7A DD AA, 05, 05]
+13175; [77 E3 19, 05, 05]
 
-131A3; [7A DD B2, 05, 05]
+13176; [77 E3 21, 05, 05]
 
-131A4; [7A DD BA, 05, 05]
+13177; [77 E3 29, 05, 05]
 
-131A5; [7A DD C2, 05, 05]
+13178; [77 E3 31, 05, 05]
 
-131A6; [7A DD CA, 05, 05]
+13179; [77 E3 39, 05, 05]
 
-131A7; [7A DD D2, 05, 05]
+1317A; [77 E3 41, 05, 05]
 
-131A8; [7A DD DA, 05, 05]
+1317B; [77 E3 49, 05, 05]
 
-131A9; [7A DD E2, 05, 05]
+1317C; [77 E3 51, 05, 05]
 
-131AA; [7A DD EA, 05, 05]
+1317D; [77 E3 59, 05, 05]
 
-131AB; [7A DD F2, 05, 05]
+1317E; [77 E3 61, 05, 05]
 
-131AC; [7A DD FA, 05, 05]
+1317F; [77 E3 69, 05, 05]
 
-131AD; [7A DE 08, 05, 05]
+13180; [77 E3 71, 05, 05]
 
-131AE; [7A DE 10, 05, 05]
+13181; [77 E3 79, 05, 05]
 
-131AF; [7A DE 18, 05, 05]
+13182; [77 E3 81, 05, 05]
 
-131B0; [7A DE 20, 05, 05]
+13183; [77 E3 89, 05, 05]
 
-131B1; [7A DE 28, 05, 05]
+13184; [77 E3 91, 05, 05]
 
-131B2; [7A DE 30, 05, 05]
+13185; [77 E3 99, 05, 05]
 
-131B3; [7A DE 38, 05, 05]
+13186; [77 E3 A1, 05, 05]
 
-131B4; [7A DE 40, 05, 05]
+13187; [77 E3 A9, 05, 05]
 
-131B5; [7A DE 48, 05, 05]
+13188; [77 E3 B1, 05, 05]
 
-131B6; [7A DE 50, 05, 05]
+13189; [77 E3 B9, 05, 05]
 
-131B7; [7A DE 58, 05, 05]
+1318A; [77 E3 C1, 05, 05]
 
-131B8; [7A DE 60, 05, 05]
+1318B; [77 E3 C9, 05, 05]
 
-131B9; [7A DE 68, 05, 05]
+1318C; [77 E3 D1, 05, 05]
 
-131BA; [7A DE 70, 05, 05]
+1318D; [77 E3 D9, 05, 05]
 
-131BB; [7A DE 78, 05, 05]
+1318E; [77 E3 E1, 05, 05]
 
-131BC; [7A DE 80, 05, 05]
+1318F; [77 E3 E9, 05, 05]
 
-131BD; [7A DE 88, 05, 05]
+13190; [77 E3 F1, 05, 05]
 
-131BE; [7A DE 90, 05, 05]
+13191; [77 E3 F9, 05, 05]
 
-131BF; [7A DE 98, 05, 05]
+13192; [77 E4 03, 05, 05]
 
-131C0; [7A DE A0, 05, 05]
+13193; [77 E4 0B, 05, 05]
 
-131C1; [7A DE A8, 05, 05]
+13194; [77 E4 13, 05, 05]
 
-131C2; [7A DE B0, 05, 05]
+13195; [77 E4 1B, 05, 05]
 
-131C3; [7A DE B8, 05, 05]
+13196; [77 E4 23, 05, 05]
 
-131C4; [7A DE C0, 05, 05]
+13197; [77 E4 2B, 05, 05]
 
-131C5; [7A DE C8, 05, 05]
+13198; [77 E4 33, 05, 05]
 
-131C6; [7A DE D0, 05, 05]
+13199; [77 E4 3B, 05, 05]
 
-131C7; [7A DE D8, 05, 05]
+1319A; [77 E4 43, 05, 05]
 
-131C8; [7A DE E0, 05, 05]
+1319B; [77 E4 4B, 05, 05]
 
-131C9; [7A DE E8, 05, 05]
+1319C; [77 E4 53, 05, 05]
 
-131CA; [7A DE F0, 05, 05]
+1319D; [77 E4 5B, 05, 05]
 
-131CB; [7A DE F8, 05, 05]
+1319E; [77 E4 63, 05, 05]
 
-131CC; [7A DF 06, 05, 05]
+1319F; [77 E4 6B, 05, 05]
 
-131CD; [7A DF 0E, 05, 05]
+131A0; [77 E4 73, 05, 05]
 
-131CE; [7A DF 16, 05, 05]
+131A1; [77 E4 7B, 05, 05]
 
-131CF; [7A DF 1E, 05, 05]
+131A2; [77 E4 83, 05, 05]
 
-131D0; [7A DF 26, 05, 05]
+131A3; [77 E4 8B, 05, 05]
 
-131D1; [7A DF 2E, 05, 05]
+131A4; [77 E4 93, 05, 05]
 
-131D2; [7A DF 36, 05, 05]
+131A5; [77 E4 9B, 05, 05]
 
-131D3; [7A DF 3E, 05, 05]
+131A6; [77 E4 A3, 05, 05]
 
-131D4; [7A DF 46, 05, 05]
+131A7; [77 E4 AB, 05, 05]
 
-131D5; [7A DF 4E, 05, 05]
+131A8; [77 E4 B3, 05, 05]
 
-131D6; [7A DF 56, 05, 05]
+131A9; [77 E4 BB, 05, 05]
 
-131D7; [7A DF 5E, 05, 05]
+131AA; [77 E4 C3, 05, 05]
 
-131D8; [7A DF 66, 05, 05]
+131AB; [77 E4 CB, 05, 05]
 
-131D9; [7A DF 6E, 05, 05]
+131AC; [77 E4 D3, 05, 05]
 
-131DA; [7A DF 76, 05, 05]
+131AD; [77 E4 DB, 05, 05]
 
-131DB; [7A DF 7E, 05, 05]
+131AE; [77 E4 E3, 05, 05]
 
-131DC; [7A DF 86, 05, 05]
+131AF; [77 E4 EB, 05, 05]
 
-131DD; [7A DF 8E, 05, 05]
+131B0; [77 E4 F3, 05, 05]
 
-131DE; [7A DF 96, 05, 05]
+131B1; [77 E4 FB, 05, 05]
 
-131DF; [7A DF 9E, 05, 05]
+131B2; [77 E5 05, 05, 05]
 
-131E0; [7A DF A6, 05, 05]
+131B3; [77 E5 0D, 05, 05]
 
-131E1; [7A DF AE, 05, 05]
+131B4; [77 E5 15, 05, 05]
 
-131E2; [7A DF B6, 05, 05]
+131B5; [77 E5 1D, 05, 05]
 
-131E3; [7A DF BE, 05, 05]
+131B6; [77 E5 25, 05, 05]
 
-131E4; [7A DF C6, 05, 05]
+131B7; [77 E5 2D, 05, 05]
 
-131E5; [7A DF CE, 05, 05]
+131B8; [77 E5 35, 05, 05]
 
-131E6; [7A DF D6, 05, 05]
+131B9; [77 E5 3D, 05, 05]
 
-131E7; [7A DF DE, 05, 05]
+131BA; [77 E5 45, 05, 05]
 
-131E8; [7A DF E6, 05, 05]
+131BB; [77 E5 4D, 05, 05]
 
-131E9; [7A DF EE, 05, 05]
+131BC; [77 E5 55, 05, 05]
 
-131EA; [7A DF F6, 05, 05]
+131BD; [77 E5 5D, 05, 05]
 
-131EB; [7A E0 04, 05, 05]
+131BE; [77 E5 65, 05, 05]
 
-131EC; [7A E0 0C, 05, 05]
+131BF; [77 E5 6D, 05, 05]
 
-131ED; [7A E0 14, 05, 05]
+131C0; [77 E5 75, 05, 05]
 
-131EE; [7A E0 1C, 05, 05]
+131C1; [77 E5 7D, 05, 05]
 
-131EF; [7A E0 24, 05, 05]
+131C2; [77 E5 85, 05, 05]
 
-131F0; [7A E0 2C, 05, 05]
+131C3; [77 E5 8D, 05, 05]
 
-131F1; [7A E0 34, 05, 05]
+131C4; [77 E5 95, 05, 05]
 
-131F2; [7A E0 3C, 05, 05]
+131C5; [77 E5 9D, 05, 05]
 
-131F3; [7A E0 44, 05, 05]
+131C6; [77 E5 A5, 05, 05]
 
-131F4; [7A E0 4C, 05, 05]
+131C7; [77 E5 AD, 05, 05]
 
-131F5; [7A E0 54, 05, 05]
+131C8; [77 E5 B5, 05, 05]
 
-131F6; [7A E0 5C, 05, 05]
+131C9; [77 E5 BD, 05, 05]
 
-131F7; [7A E0 64, 05, 05]
+131CA; [77 E5 C5, 05, 05]
 
-131F8; [7A E0 6C, 05, 05]
+131CB; [77 E5 CD, 05, 05]
 
-131F9; [7A E0 74, 05, 05]
+131CC; [77 E5 D5, 05, 05]
 
-131FA; [7A E0 7C, 05, 05]
+131CD; [77 E5 DD, 05, 05]
 
-131FB; [7A E0 84, 05, 05]
+131CE; [77 E5 E5, 05, 05]
 
-131FC; [7A E0 8C, 05, 05]
+131CF; [77 E5 ED, 05, 05]
 
-131FD; [7A E0 94, 05, 05]
+131D0; [77 E5 F5, 05, 05]
 
-131FE; [7A E0 9C, 05, 05]
+131D1; [77 E5 FD, 05, 05]
 
-131FF; [7A E0 A4, 05, 05]
+131D2; [77 E6 07, 05, 05]
 
-13200; [7A E0 AC, 05, 05]
+131D3; [77 E6 0F, 05, 05]
 
-13201; [7A E0 B4, 05, 05]
+131D4; [77 E6 17, 05, 05]
 
-13202; [7A E0 BC, 05, 05]
+131D5; [77 E6 1F, 05, 05]
 
-13203; [7A E0 C4, 05, 05]
+131D6; [77 E6 27, 05, 05]
 
-13204; [7A E0 CC, 05, 05]
+131D7; [77 E6 2F, 05, 05]
 
-13205; [7A E0 D4, 05, 05]
+131D8; [77 E6 37, 05, 05]
 
-13206; [7A E0 DC, 05, 05]
+131D9; [77 E6 3F, 05, 05]
 
-13207; [7A E0 E4, 05, 05]
+131DA; [77 E6 47, 05, 05]
 
-13208; [7A E0 EC, 05, 05]
+131DB; [77 E6 4F, 05, 05]
 
-13209; [7A E0 F4, 05, 05]
+131DC; [77 E6 57, 05, 05]
 
-1320A; [7A E0 FC, 05, 05]
+131DD; [77 E6 5F, 05, 05]
 
-1320B; [7A E1 0A, 05, 05]
+131DE; [77 E6 67, 05, 05]
 
-1320C; [7A E1 12, 05, 05]
+131DF; [77 E6 6F, 05, 05]
 
-1320D; [7A E1 1A, 05, 05]
+131E0; [77 E6 77, 05, 05]
 
-1320E; [7A E1 22, 05, 05]
+131E1; [77 E6 7F, 05, 05]
 
-1320F; [7A E1 2A, 05, 05]
+131E2; [77 E6 87, 05, 05]
 
-13210; [7A E1 32, 05, 05]
+131E3; [77 E6 8F, 05, 05]
 
-13211; [7A E1 3A, 05, 05]
+131E4; [77 E6 97, 05, 05]
 
-13212; [7A E1 42, 05, 05]
+131E5; [77 E6 9F, 05, 05]
 
-13213; [7A E1 4A, 05, 05]
+131E6; [77 E6 A7, 05, 05]
 
-13214; [7A E1 52, 05, 05]
+131E7; [77 E6 AF, 05, 05]
 
-13215; [7A E1 5A, 05, 05]
+131E8; [77 E6 B7, 05, 05]
 
-13216; [7A E1 62, 05, 05]
+131E9; [77 E6 BF, 05, 05]
 
-13217; [7A E1 6A, 05, 05]
+131EA; [77 E6 C7, 05, 05]
 
-13218; [7A E1 72, 05, 05]
+131EB; [77 E6 CF, 05, 05]
 
-13219; [7A E1 7A, 05, 05]
+131EC; [77 E6 D7, 05, 05]
 
-1321A; [7A E1 82, 05, 05]
+131ED; [77 E6 DF, 05, 05]
 
-1321B; [7A E1 8A, 05, 05]
+131EE; [77 E6 E7, 05, 05]
 
-1321C; [7A E1 92, 05, 05]
+131EF; [77 E6 EF, 05, 05]
 
-1321D; [7A E1 9A, 05, 05]
+131F0; [77 E6 F7, 05, 05]
 
-1321E; [7A E1 A2, 05, 05]
+131F1; [77 E6 FF, 05, 05]
 
-1321F; [7A E1 AA, 05, 05]
+131F2; [77 E7 09, 05, 05]
 
-13220; [7A E1 B2, 05, 05]
+131F3; [77 E7 11, 05, 05]
 
-13221; [7A E1 BA, 05, 05]
+131F4; [77 E7 19, 05, 05]
 
-13222; [7A E1 C2, 05, 05]
+131F5; [77 E7 21, 05, 05]
 
-13223; [7A E1 CA, 05, 05]
+131F6; [77 E7 29, 05, 05]
 
-13224; [7A E1 D2, 05, 05]
+131F7; [77 E7 31, 05, 05]
 
-13225; [7A E1 DA, 05, 05]
+131F8; [77 E7 39, 05, 05]
 
-13226; [7A E1 E2, 05, 05]
+131F9; [77 E7 41, 05, 05]
 
-13227; [7A E1 EA, 05, 05]
+131FA; [77 E7 49, 05, 05]
 
-13228; [7A E1 F2, 05, 05]
+131FB; [77 E7 51, 05, 05]
 
-13229; [7A E1 FA, 05, 05]
+131FC; [77 E7 59, 05, 05]
 
-1322A; [7A E2 08, 05, 05]
+131FD; [77 E7 61, 05, 05]
 
-1322B; [7A E2 10, 05, 05]
+131FE; [77 E7 69, 05, 05]
 
-1322C; [7A E2 18, 05, 05]
+131FF; [77 E7 71, 05, 05]
 
-1322D; [7A E2 20, 05, 05]
+13200; [77 E7 79, 05, 05]
 
-1322E; [7A E2 28, 05, 05]
+13201; [77 E7 81, 05, 05]
 
-1322F; [7A E2 30, 05, 05]
+13202; [77 E7 89, 05, 05]
 
-13230; [7A E2 38, 05, 05]
+13203; [77 E7 91, 05, 05]
 
-13231; [7A E2 40, 05, 05]
+13204; [77 E7 99, 05, 05]
 
-13232; [7A E2 48, 05, 05]
+13205; [77 E7 A1, 05, 05]
 
-13233; [7A E2 50, 05, 05]
+13206; [77 E7 A9, 05, 05]
 
-13234; [7A E2 58, 05, 05]
+13207; [77 E7 B1, 05, 05]
 
-13235; [7A E2 60, 05, 05]
+13208; [77 E7 B9, 05, 05]
 
-13236; [7A E2 68, 05, 05]
+13209; [77 E7 C1, 05, 05]
 
-13237; [7A E2 70, 05, 05]
+1320A; [77 E7 C9, 05, 05]
 
-13238; [7A E2 78, 05, 05]
+1320B; [77 E7 D1, 05, 05]
 
-13239; [7A E2 80, 05, 05]
+1320C; [77 E7 D9, 05, 05]
 
-1323A; [7A E2 88, 05, 05]
+1320D; [77 E7 E1, 05, 05]
 
-1323B; [7A E2 90, 05, 05]
+1320E; [77 E7 E9, 05, 05]
 
-1323C; [7A E2 98, 05, 05]
+1320F; [77 E7 F1, 05, 05]
 
-1323D; [7A E2 A0, 05, 05]
+13210; [77 E7 F9, 05, 05]
 
-1323E; [7A E2 A8, 05, 05]
+13211; [77 E8 03, 05, 05]
 
-1323F; [7A E2 B0, 05, 05]
+13212; [77 E8 0B, 05, 05]
 
-13240; [7A E2 B8, 05, 05]
+13213; [77 E8 13, 05, 05]
 
-13241; [7A E2 C0, 05, 05]
+13214; [77 E8 1B, 05, 05]
 
-13242; [7A E2 C8, 05, 05]
+13215; [77 E8 23, 05, 05]
 
-13243; [7A E2 D0, 05, 05]
+13216; [77 E8 2B, 05, 05]
 
-13244; [7A E2 D8, 05, 05]
+13217; [77 E8 33, 05, 05]
 
-13245; [7A E2 E0, 05, 05]
+13218; [77 E8 3B, 05, 05]
 
-13246; [7A E2 E8, 05, 05]
+13219; [77 E8 43, 05, 05]
 
-13247; [7A E2 F0, 05, 05]
+1321A; [77 E8 4B, 05, 05]
 
-13248; [7A E2 F8, 05, 05]
+1321B; [77 E8 53, 05, 05]
 
-13249; [7A E3 06, 05, 05]
+1321C; [77 E8 5B, 05, 05]
 
-1324A; [7A E3 0E, 05, 05]
+1321D; [77 E8 63, 05, 05]
 
-1324B; [7A E3 16, 05, 05]
+1321E; [77 E8 6B, 05, 05]
 
-1324C; [7A E3 1E, 05, 05]
+1321F; [77 E8 73, 05, 05]
 
-1324D; [7A E3 26, 05, 05]
+13220; [77 E8 7B, 05, 05]
 
-1324E; [7A E3 2E, 05, 05]
+13221; [77 E8 83, 05, 05]
 
-1324F; [7A E3 36, 05, 05]
+13222; [77 E8 8B, 05, 05]
 
-13250; [7A E3 3E, 05, 05]
+13223; [77 E8 93, 05, 05]
 
-13251; [7A E3 46, 05, 05]
+13224; [77 E8 9B, 05, 05]
 
-13252; [7A E3 4E, 05, 05]
+13225; [77 E8 A3, 05, 05]
 
-13253; [7A E3 56, 05, 05]
+13226; [77 E8 AB, 05, 05]
 
-13254; [7A E3 5E, 05, 05]
+13227; [77 E8 B3, 05, 05]
 
-13255; [7A E3 66, 05, 05]
+13228; [77 E8 BB, 05, 05]
 
-13256; [7A E3 6E, 05, 05]
+13229; [77 E8 C3, 05, 05]
 
-13257; [7A E3 76, 05, 05]
+1322A; [77 E8 CB, 05, 05]
 
-13258; [7A E3 7E, 05, 05]
+1322B; [77 E8 D3, 05, 05]
 
-13259; [7A E3 86, 05, 05]
+1322C; [77 E8 DB, 05, 05]
 
-1325A; [7A E3 8E, 05, 05]
+1322D; [77 E8 E3, 05, 05]
 
-1325B; [7A E3 96, 05, 05]
+1322E; [77 E8 EB, 05, 05]
 
-1325C; [7A E3 9E, 05, 05]
+1322F; [77 E8 F3, 05, 05]
 
-1325D; [7A E3 A6, 05, 05]
+13230; [77 E8 FB, 05, 05]
 
-1325E; [7A E3 AE, 05, 05]
+13231; [77 E9 05, 05, 05]
 
-1325F; [7A E3 B6, 05, 05]
+13232; [77 E9 0D, 05, 05]
 
-13260; [7A E3 BE, 05, 05]
+13233; [77 E9 15, 05, 05]
 
-13261; [7A E3 C6, 05, 05]
+13234; [77 E9 1D, 05, 05]
 
-13262; [7A E3 CE, 05, 05]
+13235; [77 E9 25, 05, 05]
 
-13263; [7A E3 D6, 05, 05]
+13236; [77 E9 2D, 05, 05]
 
-13264; [7A E3 DE, 05, 05]
+13237; [77 E9 35, 05, 05]
 
-13265; [7A E3 E6, 05, 05]
+13238; [77 E9 3D, 05, 05]
 
-13266; [7A E3 EE, 05, 05]
+13239; [77 E9 45, 05, 05]
 
-13267; [7A E3 F6, 05, 05]
+1323A; [77 E9 4D, 05, 05]
 
-13268; [7A E4 04, 05, 05]
+1323B; [77 E9 55, 05, 05]
 
-13269; [7A E4 0C, 05, 05]
+1323C; [77 E9 5D, 05, 05]
 
-1326A; [7A E4 14, 05, 05]
+1323D; [77 E9 65, 05, 05]
 
-1326B; [7A E4 1C, 05, 05]
+1323E; [77 E9 6D, 05, 05]
 
-1326C; [7A E4 24, 05, 05]
+1323F; [77 E9 75, 05, 05]
 
-1326D; [7A E4 2C, 05, 05]
+13240; [77 E9 7D, 05, 05]
 
-1326E; [7A E4 34, 05, 05]
+13241; [77 E9 85, 05, 05]
 
-1326F; [7A E4 3C, 05, 05]
+13242; [77 E9 8D, 05, 05]
 
-13270; [7A E4 44, 05, 05]
+13243; [77 E9 95, 05, 05]
 
-13271; [7A E4 4C, 05, 05]
+13244; [77 E9 9D, 05, 05]
 
-13272; [7A E4 54, 05, 05]
+13245; [77 E9 A5, 05, 05]
 
-13273; [7A E4 5C, 05, 05]
+13246; [77 E9 AD, 05, 05]
 
-13274; [7A E4 64, 05, 05]
+13247; [77 E9 B5, 05, 05]
 
-13275; [7A E4 6C, 05, 05]
+13248; [77 E9 BD, 05, 05]
 
-13276; [7A E4 74, 05, 05]
+13249; [77 E9 C5, 05, 05]
 
-13277; [7A E4 7C, 05, 05]
+1324A; [77 E9 CD, 05, 05]
 
-13278; [7A E4 84, 05, 05]
+1324B; [77 E9 D5, 05, 05]
 
-13279; [7A E4 8C, 05, 05]
+1324C; [77 E9 DD, 05, 05]
 
-1327A; [7A E4 94, 05, 05]
+1324D; [77 E9 E5, 05, 05]
 
-1327B; [7A E4 9C, 05, 05]
+1324E; [77 E9 ED, 05, 05]
 
-1327C; [7A E4 A4, 05, 05]
+1324F; [77 E9 F5, 05, 05]
 
-1327D; [7A E4 AC, 05, 05]
+13250; [77 E9 FD, 05, 05]
 
-1327E; [7A E4 B4, 05, 05]
+13251; [77 EA 07, 05, 05]
 
-1327F; [7A E4 BC, 05, 05]
+13252; [77 EA 0F, 05, 05]
 
-13280; [7A E4 C4, 05, 05]
+13253; [77 EA 17, 05, 05]
 
-13281; [7A E4 CC, 05, 05]
+13254; [77 EA 1F, 05, 05]
 
-13282; [7A E4 D4, 05, 05]
+13255; [77 EA 27, 05, 05]
 
-13283; [7A E4 DC, 05, 05]
+13256; [77 EA 2F, 05, 05]
 
-13284; [7A E4 E4, 05, 05]
+13257; [77 EA 37, 05, 05]
 
-13285; [7A E4 EC, 05, 05]
+13258; [77 EA 3F, 05, 05]
 
-13286; [7A E4 F4, 05, 05]
+13259; [77 EA 47, 05, 05]
 
-13287; [7A E4 FC, 05, 05]
+1325A; [77 EA 4F, 05, 05]
 
-13288; [7A E5 0A, 05, 05]
+1325B; [77 EA 57, 05, 05]
 
-13289; [7A E5 12, 05, 05]
+1325C; [77 EA 5F, 05, 05]
 
-1328A; [7A E5 1A, 05, 05]
+1325D; [77 EA 67, 05, 05]
 
-1328B; [7A E5 22, 05, 05]
+1325E; [77 EA 6F, 05, 05]
 
-1328C; [7A E5 2A, 05, 05]
+1325F; [77 EA 77, 05, 05]
 
-1328D; [7A E5 32, 05, 05]
+13260; [77 EA 7F, 05, 05]
 
-1328E; [7A E5 3A, 05, 05]
+13261; [77 EA 87, 05, 05]
 
-1328F; [7A E5 42, 05, 05]
+13262; [77 EA 8F, 05, 05]
 
-13290; [7A E5 4A, 05, 05]
+13263; [77 EA 97, 05, 05]
 
-13291; [7A E5 52, 05, 05]
+13264; [77 EA 9F, 05, 05]
 
-13292; [7A E5 5A, 05, 05]
+13265; [77 EA A7, 05, 05]
 
-13293; [7A E5 62, 05, 05]
+13266; [77 EA AF, 05, 05]
 
-13294; [7A E5 6A, 05, 05]
+13267; [77 EA B7, 05, 05]
 
-13295; [7A E5 72, 05, 05]
+13268; [77 EA BF, 05, 05]
 
-13296; [7A E5 7A, 05, 05]
+13269; [77 EA C7, 05, 05]
 
-13297; [7A E5 82, 05, 05]
+1326A; [77 EA CF, 05, 05]
 
-13298; [7A E5 8A, 05, 05]
+1326B; [77 EA D7, 05, 05]
 
-13299; [7A E5 92, 05, 05]
+1326C; [77 EA DF, 05, 05]
 
-1329A; [7A E5 9A, 05, 05]
+1326D; [77 EA E7, 05, 05]
 
-1329B; [7A E5 A2, 05, 05]
+1326E; [77 EA EF, 05, 05]
 
-1329C; [7A E5 AA, 05, 05]
+1326F; [77 EA F7, 05, 05]
 
-1329D; [7A E5 B2, 05, 05]
+13270; [77 EA FF, 05, 05]
 
-1329E; [7A E5 BA, 05, 05]
+13271; [77 EB 09, 05, 05]
 
-1329F; [7A E5 C2, 05, 05]
+13272; [77 EB 11, 05, 05]
 
-132A0; [7A E5 CA, 05, 05]
+13273; [77 EB 19, 05, 05]
 
-132A1; [7A E5 D2, 05, 05]
+13274; [77 EB 21, 05, 05]
 
-132A2; [7A E5 DA, 05, 05]
+13275; [77 EB 29, 05, 05]
 
-132A3; [7A E5 E2, 05, 05]
+13276; [77 EB 31, 05, 05]
 
-132A4; [7A E5 EA, 05, 05]
+13277; [77 EB 39, 05, 05]
 
-132A5; [7A E5 F2, 05, 05]
+13278; [77 EB 41, 05, 05]
 
-132A6; [7A E5 FA, 05, 05]
+13279; [77 EB 49, 05, 05]
 
-132A7; [7A E6 08, 05, 05]
+1327A; [77 EB 51, 05, 05]
 
-132A8; [7A E6 10, 05, 05]
+1327B; [77 EB 59, 05, 05]
 
-132A9; [7A E6 18, 05, 05]
+1327C; [77 EB 61, 05, 05]
 
-132AA; [7A E6 20, 05, 05]
+1327D; [77 EB 69, 05, 05]
 
-132AB; [7A E6 28, 05, 05]
+1327E; [77 EB 71, 05, 05]
 
-132AC; [7A E6 30, 05, 05]
+1327F; [77 EB 79, 05, 05]
 
-132AD; [7A E6 38, 05, 05]
+13280; [77 EB 81, 05, 05]
 
-132AE; [7A E6 40, 05, 05]
+13281; [77 EB 89, 05, 05]
 
-132AF; [7A E6 48, 05, 05]
+13282; [77 EB 91, 05, 05]
 
-132B0; [7A E6 50, 05, 05]
+13283; [77 EB 99, 05, 05]
 
-132B1; [7A E6 58, 05, 05]
+13284; [77 EB A1, 05, 05]
 
-132B2; [7A E6 60, 05, 05]
+13285; [77 EB A9, 05, 05]
 
-132B3; [7A E6 68, 05, 05]
+13286; [77 EB B1, 05, 05]
 
-132B4; [7A E6 70, 05, 05]
+13287; [77 EB B9, 05, 05]
 
-132B5; [7A E6 78, 05, 05]
+13288; [77 EB C1, 05, 05]
 
-132B6; [7A E6 80, 05, 05]
+13289; [77 EB C9, 05, 05]
 
-132B7; [7A E6 88, 05, 05]
+1328A; [77 EB D1, 05, 05]
 
-132B8; [7A E6 90, 05, 05]
+1328B; [77 EB D9, 05, 05]
 
-132B9; [7A E6 98, 05, 05]
+1328C; [77 EB E1, 05, 05]
 
-132BA; [7A E6 A0, 05, 05]
+1328D; [77 EB E9, 05, 05]
 
-132BB; [7A E6 A8, 05, 05]
+1328E; [77 EB F1, 05, 05]
 
-132BC; [7A E6 B0, 05, 05]
+1328F; [77 EB F9, 05, 05]
 
-132BD; [7A E6 B8, 05, 05]
+13290; [77 EC 03, 05, 05]
 
-132BE; [7A E6 C0, 05, 05]
+13291; [77 EC 0B, 05, 05]
 
-132BF; [7A E6 C8, 05, 05]
+13292; [77 EC 13, 05, 05]
 
-132C0; [7A E6 D0, 05, 05]
+13293; [77 EC 1B, 05, 05]
 
-132C1; [7A E6 D8, 05, 05]
+13294; [77 EC 23, 05, 05]
 
-132C2; [7A E6 E0, 05, 05]
+13295; [77 EC 2B, 05, 05]
 
-132C3; [7A E6 E8, 05, 05]
+13296; [77 EC 33, 05, 05]
 
-132C4; [7A E6 F0, 05, 05]
+13297; [77 EC 3B, 05, 05]
 
-132C5; [7A E6 F8, 05, 05]
+13298; [77 EC 43, 05, 05]
 
-132C6; [7A E7 06, 05, 05]
+13299; [77 EC 4B, 05, 05]
 
-132C7; [7A E7 0E, 05, 05]
+1329A; [77 EC 53, 05, 05]
 
-132C8; [7A E7 16, 05, 05]
+1329B; [77 EC 5B, 05, 05]
 
-132C9; [7A E7 1E, 05, 05]
+1329C; [77 EC 63, 05, 05]
 
-132CA; [7A E7 26, 05, 05]
+1329D; [77 EC 6B, 05, 05]
 
-132CB; [7A E7 2E, 05, 05]
+1329E; [77 EC 73, 05, 05]
 
-132CC; [7A E7 36, 05, 05]
+1329F; [77 EC 7B, 05, 05]
 
-132CD; [7A E7 3E, 05, 05]
+132A0; [77 EC 83, 05, 05]
 
-132CE; [7A E7 46, 05, 05]
+132A1; [77 EC 8B, 05, 05]
 
-132CF; [7A E7 4E, 05, 05]
+132A2; [77 EC 93, 05, 05]
 
-132D0; [7A E7 56, 05, 05]
+132A3; [77 EC 9B, 05, 05]
 
-132D1; [7A E7 5E, 05, 05]
+132A4; [77 EC A3, 05, 05]
 
-132D2; [7A E7 66, 05, 05]
+132A5; [77 EC AB, 05, 05]
 
-132D3; [7A E7 6E, 05, 05]
+132A6; [77 EC B3, 05, 05]
 
-132D4; [7A E7 76, 05, 05]
+132A7; [77 EC BB, 05, 05]
 
-132D5; [7A E7 7E, 05, 05]
+132A8; [77 EC C3, 05, 05]
 
-132D6; [7A E7 86, 05, 05]
+132A9; [77 EC CB, 05, 05]
 
-132D7; [7A E7 8E, 05, 05]
+132AA; [77 EC D3, 05, 05]
 
-132D8; [7A E7 96, 05, 05]
+132AB; [77 EC DB, 05, 05]
 
-132D9; [7A E7 9E, 05, 05]
+132AC; [77 EC E3, 05, 05]
 
-132DA; [7A E7 A6, 05, 05]
+132AD; [77 EC EB, 05, 05]
 
-132DB; [7A E7 AE, 05, 05]
+132AE; [77 EC F3, 05, 05]
 
-132DC; [7A E7 B6, 05, 05]
+132AF; [77 EC FB, 05, 05]
 
-132DD; [7A E7 BE, 05, 05]
+132B0; [77 ED 05, 05, 05]
 
-132DE; [7A E7 C6, 05, 05]
+132B1; [77 ED 0D, 05, 05]
 
-132DF; [7A E7 CE, 05, 05]
+132B2; [77 ED 15, 05, 05]
 
-132E0; [7A E7 D6, 05, 05]
+132B3; [77 ED 1D, 05, 05]
 
-132E1; [7A E7 DE, 05, 05]
+132B4; [77 ED 25, 05, 05]
 
-132E2; [7A E7 E6, 05, 05]
+132B5; [77 ED 2D, 05, 05]
 
-132E3; [7A E7 EE, 05, 05]
+132B6; [77 ED 35, 05, 05]
 
-132E4; [7A E7 F6, 05, 05]
+132B7; [77 ED 3D, 05, 05]
 
-132E5; [7A E8 04, 05, 05]
+132B8; [77 ED 45, 05, 05]
 
-132E6; [7A E8 0C, 05, 05]
+132B9; [77 ED 4D, 05, 05]
 
-132E7; [7A E8 14, 05, 05]
+132BA; [77 ED 55, 05, 05]
 
-132E8; [7A E8 1C, 05, 05]
+132BB; [77 ED 5D, 05, 05]
 
-132E9; [7A E8 24, 05, 05]
+132BC; [77 ED 65, 05, 05]
 
-132EA; [7A E8 2C, 05, 05]
+132BD; [77 ED 6D, 05, 05]
 
-132EB; [7A E8 34, 05, 05]
+132BE; [77 ED 75, 05, 05]
 
-132EC; [7A E8 3C, 05, 05]
+132BF; [77 ED 7D, 05, 05]
 
-132ED; [7A E8 44, 05, 05]
+132C0; [77 ED 85, 05, 05]
 
-132EE; [7A E8 4C, 05, 05]
+132C1; [77 ED 8D, 05, 05]
 
-132EF; [7A E8 54, 05, 05]
+132C2; [77 ED 95, 05, 05]
 
-132F0; [7A E8 5C, 05, 05]
+132C3; [77 ED 9D, 05, 05]
 
-132F1; [7A E8 64, 05, 05]
+132C4; [77 ED A5, 05, 05]
 
-132F2; [7A E8 6C, 05, 05]
+132C5; [77 ED AD, 05, 05]
 
-132F3; [7A E8 74, 05, 05]
+132C6; [77 ED B5, 05, 05]
 
-132F4; [7A E8 7C, 05, 05]
+132C7; [77 ED BD, 05, 05]
 
-132F5; [7A E8 84, 05, 05]
+132C8; [77 ED C5, 05, 05]
 
-132F6; [7A E8 8C, 05, 05]
+132C9; [77 ED CD, 05, 05]
 
-132F7; [7A E8 94, 05, 05]
+132CA; [77 ED D5, 05, 05]
 
-132F8; [7A E8 9C, 05, 05]
+132CB; [77 ED DD, 05, 05]
 
-132F9; [7A E8 A4, 05, 05]
+132CC; [77 ED E5, 05, 05]
 
-132FA; [7A E8 AC, 05, 05]
+132CD; [77 ED ED, 05, 05]
 
-132FB; [7A E8 B4, 05, 05]
+132CE; [77 ED F5, 05, 05]
 
-132FC; [7A E8 BC, 05, 05]
+132CF; [77 ED FD, 05, 05]
 
-132FD; [7A E8 C4, 05, 05]
+132D0; [77 EE 07, 05, 05]
 
-132FE; [7A E8 CC, 05, 05]
+132D1; [77 EE 0F, 05, 05]
 
-132FF; [7A E8 D4, 05, 05]
+132D2; [77 EE 17, 05, 05]
 
-13300; [7A E8 DC, 05, 05]
+132D3; [77 EE 1F, 05, 05]
 
-13301; [7A E8 E4, 05, 05]
+132D4; [77 EE 27, 05, 05]
 
-13302; [7A E8 EC, 05, 05]
+132D5; [77 EE 2F, 05, 05]
 
-13303; [7A E8 F4, 05, 05]
+132D6; [77 EE 37, 05, 05]
 
-13304; [7A E8 FC, 05, 05]
+132D7; [77 EE 3F, 05, 05]
 
-13305; [7A E9 0A, 05, 05]
+132D8; [77 EE 47, 05, 05]
 
-13306; [7A E9 12, 05, 05]
+132D9; [77 EE 4F, 05, 05]
 
-13307; [7A E9 1A, 05, 05]
+132DA; [77 EE 57, 05, 05]
 
-13308; [7A E9 22, 05, 05]
+132DB; [77 EE 5F, 05, 05]
 
-13309; [7A E9 2A, 05, 05]
+132DC; [77 EE 67, 05, 05]
 
-1330A; [7A E9 32, 05, 05]
+132DD; [77 EE 6F, 05, 05]
 
-1330B; [7A E9 3A, 05, 05]
+132DE; [77 EE 77, 05, 05]
 
-1330C; [7A E9 42, 05, 05]
+132DF; [77 EE 7F, 05, 05]
 
-1330D; [7A E9 4A, 05, 05]
+132E0; [77 EE 87, 05, 05]
 
-1330E; [7A E9 52, 05, 05]
+132E1; [77 EE 8F, 05, 05]
 
-1330F; [7A E9 5A, 05, 05]
+132E2; [77 EE 97, 05, 05]
 
-13310; [7A E9 62, 05, 05]
+132E3; [77 EE 9F, 05, 05]
 
-13311; [7A E9 6A, 05, 05]
+132E4; [77 EE A7, 05, 05]
 
-13312; [7A E9 72, 05, 05]
+132E5; [77 EE AF, 05, 05]
 
-13313; [7A E9 7A, 05, 05]
+132E6; [77 EE B7, 05, 05]
 
-13314; [7A E9 82, 05, 05]
+132E7; [77 EE BF, 05, 05]
 
-13315; [7A E9 8A, 05, 05]
+132E8; [77 EE C7, 05, 05]
 
-13316; [7A E9 92, 05, 05]
+132E9; [77 EE CF, 05, 05]
 
-13317; [7A E9 9A, 05, 05]
+132EA; [77 EE D7, 05, 05]
 
-13318; [7A E9 A2, 05, 05]
+132EB; [77 EE DF, 05, 05]
 
-13319; [7A E9 AA, 05, 05]
+132EC; [77 EE E7, 05, 05]
 
-1331A; [7A E9 B2, 05, 05]
+132ED; [77 EE EF, 05, 05]
 
-1331B; [7A E9 BA, 05, 05]
+132EE; [77 EE F7, 05, 05]
 
-1331C; [7A E9 C2, 05, 05]
+132EF; [77 EE FF, 05, 05]
 
-1331D; [7A E9 CA, 05, 05]
+132F0; [77 EF 09, 05, 05]
 
-1331E; [7A E9 D2, 05, 05]
+132F1; [77 EF 11, 05, 05]
 
-1331F; [7A E9 DA, 05, 05]
+132F2; [77 EF 19, 05, 05]
 
-13320; [7A E9 E2, 05, 05]
+132F3; [77 EF 21, 05, 05]
 
-13321; [7A E9 EA, 05, 05]
+132F4; [77 EF 29, 05, 05]
 
-13322; [7A E9 F2, 05, 05]
+132F5; [77 EF 31, 05, 05]
 
-13323; [7A E9 FA, 05, 05]
+132F6; [77 EF 39, 05, 05]
 
-13324; [7A EA 08, 05, 05]
+132F7; [77 EF 41, 05, 05]
 
-13325; [7A EA 10, 05, 05]
+132F8; [77 EF 49, 05, 05]
 
-13326; [7A EA 18, 05, 05]
+132F9; [77 EF 51, 05, 05]
 
-13327; [7A EA 20, 05, 05]
+132FA; [77 EF 59, 05, 05]
 
-13328; [7A EA 28, 05, 05]
+132FB; [77 EF 61, 05, 05]
 
-13329; [7A EA 30, 05, 05]
+132FC; [77 EF 69, 05, 05]
 
-1332A; [7A EA 38, 05, 05]
+132FD; [77 EF 71, 05, 05]
 
-1332B; [7A EA 40, 05, 05]
+132FE; [77 EF 79, 05, 05]
 
-1332C; [7A EA 48, 05, 05]
+132FF; [77 EF 81, 05, 05]
 
-1332D; [7A EA 50, 05, 05]
+13300; [77 EF 89, 05, 05]
 
-1332E; [7A EA 58, 05, 05]
+13301; [77 EF 91, 05, 05]
 
-1332F; [7A EA 60, 05, 05]
+13302; [77 EF 99, 05, 05]
 
-13330; [7A EA 68, 05, 05]
+13303; [77 EF A1, 05, 05]
 
-13331; [7A EA 70, 05, 05]
+13304; [77 EF A9, 05, 05]
 
-13332; [7A EA 78, 05, 05]
+13305; [77 EF B1, 05, 05]
 
-13333; [7A EA 80, 05, 05]
+13306; [77 EF B9, 05, 05]
 
-13334; [7A EA 88, 05, 05]
+13307; [77 EF C1, 05, 05]
 
-13335; [7A EA 90, 05, 05]
+13308; [77 EF C9, 05, 05]
 
-13336; [7A EA 98, 05, 05]
+13309; [77 EF D1, 05, 05]
 
-13337; [7A EA A0, 05, 05]
+1330A; [77 EF D9, 05, 05]
 
-13338; [7A EA A8, 05, 05]
+1330B; [77 EF E1, 05, 05]
 
-13339; [7A EA B0, 05, 05]
+1330C; [77 EF E9, 05, 05]
 
-1333A; [7A EA B8, 05, 05]
+1330D; [77 EF F1, 05, 05]
 
-1333B; [7A EA C0, 05, 05]
+1330E; [77 EF F9, 05, 05]
 
-1333C; [7A EA C8, 05, 05]
+1330F; [77 F0 03, 05, 05]
 
-1333D; [7A EA D0, 05, 05]
+13310; [77 F0 0B, 05, 05]
 
-1333E; [7A EA D8, 05, 05]
+13311; [77 F0 13, 05, 05]
 
-1333F; [7A EA E0, 05, 05]
+13312; [77 F0 1B, 05, 05]
 
-13340; [7A EA E8, 05, 05]
+13313; [77 F0 23, 05, 05]
 
-13341; [7A EA F0, 05, 05]
+13314; [77 F0 2B, 05, 05]
 
-13342; [7A EA F8, 05, 05]
+13315; [77 F0 33, 05, 05]
 
-13343; [7A EB 06, 05, 05]
+13316; [77 F0 3B, 05, 05]
 
-13344; [7A EB 0E, 05, 05]
+13317; [77 F0 43, 05, 05]
 
-13345; [7A EB 16, 05, 05]
+13318; [77 F0 4B, 05, 05]
 
-13346; [7A EB 1E, 05, 05]
+13319; [77 F0 53, 05, 05]
 
-13347; [7A EB 26, 05, 05]
+1331A; [77 F0 5B, 05, 05]
 
-13348; [7A EB 2E, 05, 05]
+1331B; [77 F0 63, 05, 05]
 
-13349; [7A EB 36, 05, 05]
+1331C; [77 F0 6B, 05, 05]
 
-1334A; [7A EB 3E, 05, 05]
+1331D; [77 F0 73, 05, 05]
 
-1334B; [7A EB 46, 05, 05]
+1331E; [77 F0 7B, 05, 05]
 
-1334C; [7A EB 4E, 05, 05]
+1331F; [77 F0 83, 05, 05]
 
-1334D; [7A EB 56, 05, 05]
+13320; [77 F0 8B, 05, 05]
 
-1334E; [7A EB 5E, 05, 05]
+13321; [77 F0 93, 05, 05]
 
-1334F; [7A EB 66, 05, 05]
+13322; [77 F0 9B, 05, 05]
 
-13350; [7A EB 6E, 05, 05]
+13323; [77 F0 A3, 05, 05]
 
-13351; [7A EB 76, 05, 05]
+13324; [77 F0 AB, 05, 05]
 
-13352; [7A EB 7E, 05, 05]
+13325; [77 F0 B3, 05, 05]
 
-13353; [7A EB 86, 05, 05]
+13326; [77 F0 BB, 05, 05]
 
-13354; [7A EB 8E, 05, 05]
+13327; [77 F0 C3, 05, 05]
 
-13355; [7A EB 96, 05, 05]
+13328; [77 F0 CB, 05, 05]
 
-13356; [7A EB 9E, 05, 05]
+13329; [77 F0 D3, 05, 05]
 
-13357; [7A EB A6, 05, 05]
+1332A; [77 F0 DB, 05, 05]
 
-13358; [7A EB AE, 05, 05]
+1332B; [77 F0 E3, 05, 05]
 
-13359; [7A EB B6, 05, 05]
+1332C; [77 F0 EB, 05, 05]
 
-1335A; [7A EB BE, 05, 05]
+1332D; [77 F0 F3, 05, 05]
 
-1335B; [7A EB C6, 05, 05]
+1332E; [77 F0 FB, 05, 05]
 
-1335C; [7A EB CE, 05, 05]
+1332F; [77 F1 05, 05, 05]
 
-1335D; [7A EB D6, 05, 05]
+13330; [77 F1 0D, 05, 05]
 
-1335E; [7A EB DE, 05, 05]
+13331; [77 F1 15, 05, 05]
 
-1335F; [7A EB E6, 05, 05]
+13332; [77 F1 1D, 05, 05]
 
-13360; [7A EB EE, 05, 05]
+13333; [77 F1 25, 05, 05]
 
-13361; [7A EB F6, 05, 05]
+13334; [77 F1 2D, 05, 05]
 
-13362; [7A EC 04, 05, 05]
+13335; [77 F1 35, 05, 05]
 
-13363; [7A EC 0C, 05, 05]
+13336; [77 F1 3D, 05, 05]
 
-13364; [7A EC 14, 05, 05]
+13337; [77 F1 45, 05, 05]
 
-13365; [7A EC 1C, 05, 05]
+13338; [77 F1 4D, 05, 05]
 
-13366; [7A EC 24, 05, 05]
+13339; [77 F1 55, 05, 05]
 
-13367; [7A EC 2C, 05, 05]
+1333A; [77 F1 5D, 05, 05]
 
-13368; [7A EC 34, 05, 05]
+1333B; [77 F1 65, 05, 05]
 
-13369; [7A EC 3C, 05, 05]
+1333C; [77 F1 6D, 05, 05]
 
-1336A; [7A EC 44, 05, 05]
+1333D; [77 F1 75, 05, 05]
 
-1336B; [7A EC 4C, 05, 05]
+1333E; [77 F1 7D, 05, 05]
 
-1336C; [7A EC 54, 05, 05]
+1333F; [77 F1 85, 05, 05]
 
-1336D; [7A EC 5C, 05, 05]
+13340; [77 F1 8D, 05, 05]
 
-1336E; [7A EC 64, 05, 05]
+13341; [77 F1 95, 05, 05]
 
-1336F; [7A EC 6C, 05, 05]
+13342; [77 F1 9D, 05, 05]
 
-13370; [7A EC 74, 05, 05]
+13343; [77 F1 A5, 05, 05]
 
-13371; [7A EC 7C, 05, 05]
+13344; [77 F1 AD, 05, 05]
 
-13372; [7A EC 84, 05, 05]
+13345; [77 F1 B5, 05, 05]
 
-13373; [7A EC 8C, 05, 05]
+13346; [77 F1 BD, 05, 05]
 
-13374; [7A EC 94, 05, 05]
+13347; [77 F1 C5, 05, 05]
 
-13375; [7A EC 9C, 05, 05]
+13348; [77 F1 CD, 05, 05]
 
-13376; [7A EC A4, 05, 05]
+13349; [77 F1 D5, 05, 05]
 
-13377; [7A EC AC, 05, 05]
+1334A; [77 F1 DD, 05, 05]
 
-13378; [7A EC B4, 05, 05]
+1334B; [77 F1 E5, 05, 05]
 
-13379; [7A EC BC, 05, 05]
+1334C; [77 F1 ED, 05, 05]
 
-1337A; [7A EC C4, 05, 05]
+1334D; [77 F1 F5, 05, 05]
 
-1337B; [7A EC CC, 05, 05]
+1334E; [77 F1 FD, 05, 05]
 
-1337C; [7A EC D4, 05, 05]
+1334F; [77 F2 07, 05, 05]
 
-1337D; [7A EC DC, 05, 05]
+13350; [77 F2 0F, 05, 05]
 
-1337E; [7A EC E4, 05, 05]
+13351; [77 F2 17, 05, 05]
 
-1337F; [7A EC EC, 05, 05]
+13352; [77 F2 1F, 05, 05]
 
-13380; [7A EC F4, 05, 05]
+13353; [77 F2 27, 05, 05]
 
-13381; [7A EC FC, 05, 05]
+13354; [77 F2 2F, 05, 05]
 
-13382; [7A ED 0A, 05, 05]
+13355; [77 F2 37, 05, 05]
 
-13383; [7A ED 12, 05, 05]
+13356; [77 F2 3F, 05, 05]
 
-13384; [7A ED 1A, 05, 05]
+13357; [77 F2 47, 05, 05]
 
-13385; [7A ED 22, 05, 05]
+13358; [77 F2 4F, 05, 05]
 
-13386; [7A ED 2A, 05, 05]
+13359; [77 F2 57, 05, 05]
 
-13387; [7A ED 32, 05, 05]
+1335A; [77 F2 5F, 05, 05]
 
-13388; [7A ED 3A, 05, 05]
+1335B; [77 F2 67, 05, 05]
 
-13389; [7A ED 42, 05, 05]
+1335C; [77 F2 6F, 05, 05]
 
-1338A; [7A ED 4A, 05, 05]
+1335D; [77 F2 77, 05, 05]
 
-1338B; [7A ED 52, 05, 05]
+1335E; [77 F2 7F, 05, 05]
 
-1338C; [7A ED 5A, 05, 05]
+1335F; [77 F2 87, 05, 05]
 
-1338D; [7A ED 62, 05, 05]
+13360; [77 F2 8F, 05, 05]
 
-1338E; [7A ED 6A, 05, 05]
+13361; [77 F2 97, 05, 05]
 
-1338F; [7A ED 72, 05, 05]
+13362; [77 F2 9F, 05, 05]
 
-13390; [7A ED 7A, 05, 05]
+13363; [77 F2 A7, 05, 05]
 
-13391; [7A ED 82, 05, 05]
+13364; [77 F2 AF, 05, 05]
 
-13392; [7A ED 8A, 05, 05]
+13365; [77 F2 B7, 05, 05]
 
-13393; [7A ED 92, 05, 05]
+13366; [77 F2 BF, 05, 05]
 
-13394; [7A ED 9A, 05, 05]
+13367; [77 F2 C7, 05, 05]
 
-13395; [7A ED A2, 05, 05]
+13368; [77 F2 CF, 05, 05]
 
-13396; [7A ED AA, 05, 05]
+13369; [77 F2 D7, 05, 05]
 
-13397; [7A ED B2, 05, 05]
+1336A; [77 F2 DF, 05, 05]
 
-13398; [7A ED BA, 05, 05]
+1336B; [77 F2 E7, 05, 05]
 
-13399; [7A ED C2, 05, 05]
+1336C; [77 F2 EF, 05, 05]
 
-1339A; [7A ED CA, 05, 05]
+1336D; [77 F2 F7, 05, 05]
 
-1339B; [7A ED D2, 05, 05]
+1336E; [77 F2 FF, 05, 05]
 
-1339C; [7A ED DA, 05, 05]
+1336F; [77 F3 09, 05, 05]
 
-1339D; [7A ED E2, 05, 05]
+13370; [77 F3 11, 05, 05]
 
-1339E; [7A ED EA, 05, 05]
+13371; [77 F3 19, 05, 05]
 
-1339F; [7A ED F2, 05, 05]
+13372; [77 F3 21, 05, 05]
 
-133A0; [7A ED FA, 05, 05]
+13373; [77 F3 29, 05, 05]
 
-133A1; [7A EE 08, 05, 05]
+13374; [77 F3 31, 05, 05]
 
-133A2; [7A EE 10, 05, 05]
+13375; [77 F3 39, 05, 05]
 
-133A3; [7A EE 18, 05, 05]
+13376; [77 F3 41, 05, 05]
 
-133A4; [7A EE 20, 05, 05]
+13377; [77 F3 49, 05, 05]
 
-133A5; [7A EE 28, 05, 05]
+13378; [77 F3 51, 05, 05]
 
-133A6; [7A EE 30, 05, 05]
+13379; [77 F3 59, 05, 05]
 
-133A7; [7A EE 38, 05, 05]
+1337A; [77 F3 61, 05, 05]
 
-133A8; [7A EE 40, 05, 05]
+1337B; [77 F3 69, 05, 05]
 
-133A9; [7A EE 48, 05, 05]
+1337C; [77 F3 71, 05, 05]
 
-133AA; [7A EE 50, 05, 05]
+1337D; [77 F3 79, 05, 05]
 
-133AB; [7A EE 58, 05, 05]
+1337E; [77 F3 81, 05, 05]
 
-133AC; [7A EE 60, 05, 05]
+1337F; [77 F3 89, 05, 05]
 
-133AD; [7A EE 68, 05, 05]
+13380; [77 F3 91, 05, 05]
 
-133AE; [7A EE 70, 05, 05]
+13381; [77 F3 99, 05, 05]
 
-133AF; [7A EE 78, 05, 05]
+13382; [77 F3 A1, 05, 05]
 
-133B0; [7A EE 80, 05, 05]
+13383; [77 F3 A9, 05, 05]
 
-133B1; [7A EE 88, 05, 05]
+13384; [77 F3 B1, 05, 05]
 
-133B2; [7A EE 90, 05, 05]
+13385; [77 F3 B9, 05, 05]
 
-133B3; [7A EE 98, 05, 05]
+13386; [77 F3 C1, 05, 05]
 
-133B4; [7A EE A0, 05, 05]
+13387; [77 F3 C9, 05, 05]
 
-133B5; [7A EE A8, 05, 05]
+13388; [77 F3 D1, 05, 05]
 
-133B6; [7A EE B0, 05, 05]
+13389; [77 F3 D9, 05, 05]
 
-133B7; [7A EE B8, 05, 05]
+1338A; [77 F3 E1, 05, 05]
 
-133B8; [7A EE C0, 05, 05]
+1338B; [77 F3 E9, 05, 05]
 
-133B9; [7A EE C8, 05, 05]
+1338C; [77 F3 F1, 05, 05]
 
-133BA; [7A EE D0, 05, 05]
+1338D; [77 F3 F9, 05, 05]
 
-133BB; [7A EE D8, 05, 05]
+1338E; [77 F4 03, 05, 05]
 
-133BC; [7A EE E0, 05, 05]
+1338F; [77 F4 0B, 05, 05]
 
-133BD; [7A EE E8, 05, 05]
+13390; [77 F4 13, 05, 05]
 
-133BE; [7A EE F0, 05, 05]
+13391; [77 F4 1B, 05, 05]
 
-133BF; [7A EE F8, 05, 05]
+13392; [77 F4 23, 05, 05]
 
-133C0; [7A EF 06, 05, 05]
+13393; [77 F4 2B, 05, 05]
 
-133C1; [7A EF 0E, 05, 05]
+13394; [77 F4 33, 05, 05]
 
-133C2; [7A EF 16, 05, 05]
+13395; [77 F4 3B, 05, 05]
 
-133C3; [7A EF 1E, 05, 05]
+13396; [77 F4 43, 05, 05]
 
-133C4; [7A EF 26, 05, 05]
+13397; [77 F4 4B, 05, 05]
 
-133C5; [7A EF 2E, 05, 05]
+13398; [77 F4 53, 05, 05]
 
-133C6; [7A EF 36, 05, 05]
+13399; [77 F4 5B, 05, 05]
 
-133C7; [7A EF 3E, 05, 05]
+1339A; [77 F4 63, 05, 05]
 
-133C8; [7A EF 46, 05, 05]
+1339B; [77 F4 6B, 05, 05]
 
-133C9; [7A EF 4E, 05, 05]
+1339C; [77 F4 73, 05, 05]
 
-133CA; [7A EF 56, 05, 05]
+1339D; [77 F4 7B, 05, 05]
 
-133CB; [7A EF 5E, 05, 05]
+1339E; [77 F4 83, 05, 05]
 
-133CC; [7A EF 66, 05, 05]
+1339F; [77 F4 8B, 05, 05]
 
-133CD; [7A EF 6E, 05, 05]
+133A0; [77 F4 93, 05, 05]
 
-133CE; [7A EF 76, 05, 05]
+133A1; [77 F4 9B, 05, 05]
 
-133CF; [7A EF 7E, 05, 05]
+133A2; [77 F4 A3, 05, 05]
 
-133D0; [7A EF 86, 05, 05]
+133A3; [77 F4 AB, 05, 05]
 
-133D1; [7A EF 8E, 05, 05]
+133A4; [77 F4 B3, 05, 05]
 
-133D2; [7A EF 96, 05, 05]
+133A5; [77 F4 BB, 05, 05]
 
-133D3; [7A EF 9E, 05, 05]
+133A6; [77 F4 C3, 05, 05]
 
-133D4; [7A EF A6, 05, 05]
+133A7; [77 F4 CB, 05, 05]
 
-133D5; [7A EF AE, 05, 05]
+133A8; [77 F4 D3, 05, 05]
 
-133D6; [7A EF B6, 05, 05]
+133A9; [77 F4 DB, 05, 05]
 
-133D7; [7A EF BE, 05, 05]
+133AA; [77 F4 E3, 05, 05]
 
-133D8; [7A EF C6, 05, 05]
+133AB; [77 F4 EB, 05, 05]
 
-133D9; [7A EF CE, 05, 05]
+133AC; [77 F4 F3, 05, 05]
 
-133DA; [7A EF D6, 05, 05]
+133AD; [77 F4 FB, 05, 05]
 
-133DB; [7A EF DE, 05, 05]
+133AE; [77 F5 05, 05, 05]
 
-133DC; [7A EF E6, 05, 05]
+133AF; [77 F5 0D, 05, 05]
 
-133DD; [7A EF EE, 05, 05]
+133B0; [77 F5 15, 05, 05]
 
-133DE; [7A EF F6, 05, 05]
+133B1; [77 F5 1D, 05, 05]
 
-133DF; [7A F0 04, 05, 05]
+133B2; [77 F5 25, 05, 05]
 
-133E0; [7A F0 0C, 05, 05]
+133B3; [77 F5 2D, 05, 05]
 
-133E1; [7A F0 14, 05, 05]
+133B4; [77 F5 35, 05, 05]
 
-133E2; [7A F0 1C, 05, 05]
+133B5; [77 F5 3D, 05, 05]
 
-133E3; [7A F0 24, 05, 05]
+133B6; [77 F5 45, 05, 05]
 
-133E4; [7A F0 2C, 05, 05]
+133B7; [77 F5 4D, 05, 05]
 
-133E5; [7A F0 34, 05, 05]
+133B8; [77 F5 55, 05, 05]
 
-133E6; [7A F0 3C, 05, 05]
+133B9; [77 F5 5D, 05, 05]
 
-133E7; [7A F0 44, 05, 05]
+133BA; [77 F5 65, 05, 05]
 
-133E8; [7A F0 4C, 05, 05]
+133BB; [77 F5 6D, 05, 05]
 
-133E9; [7A F0 54, 05, 05]
+133BC; [77 F5 75, 05, 05]
 
-133EA; [7A F0 5C, 05, 05]
+133BD; [77 F5 7D, 05, 05]
 
-133EB; [7A F0 64, 05, 05]
+133BE; [77 F5 85, 05, 05]
 
-133EC; [7A F0 6C, 05, 05]
+133BF; [77 F5 8D, 05, 05]
 
-133ED; [7A F0 74, 05, 05]
+133C0; [77 F5 95, 05, 05]
 
-133EE; [7A F0 7C, 05, 05]
+133C1; [77 F5 9D, 05, 05]
 
-133EF; [7A F0 84, 05, 05]
+133C2; [77 F5 A5, 05, 05]
 
-133F0; [7A F0 8C, 05, 05]
+133C3; [77 F5 AD, 05, 05]
 
-133F1; [7A F0 94, 05, 05]
+133C4; [77 F5 B5, 05, 05]
 
-133F2; [7A F0 9C, 05, 05]
+133C5; [77 F5 BD, 05, 05]
 
-133F3; [7A F0 A4, 05, 05]
+133C6; [77 F5 C5, 05, 05]
 
-133F4; [7A F0 AC, 05, 05]
+133C7; [77 F5 CD, 05, 05]
 
-133F5; [7A F0 B4, 05, 05]
+133C8; [77 F5 D5, 05, 05]
 
-133F6; [7A F0 BC, 05, 05]
+133C9; [77 F5 DD, 05, 05]
 
-133F7; [7A F0 C4, 05, 05]
+133CA; [77 F5 E5, 05, 05]
 
-133F8; [7A F0 CC, 05, 05]
+133CB; [77 F5 ED, 05, 05]
 
-133F9; [7A F0 D4, 05, 05]
+133CC; [77 F5 F5, 05, 05]
 
-133FA; [7A F0 DC, 05, 05]
+133CD; [77 F5 FD, 05, 05]
 
-133FB; [7A F0 E4, 05, 05]
+133CE; [77 F6 07, 05, 05]
 
-133FC; [7A F0 EC, 05, 05]
+133CF; [77 F6 0F, 05, 05]
 
-133FD; [7A F0 F4, 05, 05]
+133D0; [77 F6 17, 05, 05]
 
-133FE; [7A F0 FC, 05, 05]
+133D1; [77 F6 1F, 05, 05]
 
-133FF; [7A F1 0A, 05, 05]
+133D2; [77 F6 27, 05, 05]
 
-13400; [7A F1 12, 05, 05]
+133D3; [77 F6 2F, 05, 05]
 
-13401; [7A F1 1A, 05, 05]
+133D4; [77 F6 37, 05, 05]
 
-13402; [7A F1 22, 05, 05]
+133D5; [77 F6 3F, 05, 05]
 
-13403; [7A F1 2A, 05, 05]
+133D6; [77 F6 47, 05, 05]
 
-13404; [7A F1 32, 05, 05]
+133D7; [77 F6 4F, 05, 05]
 
-13405; [7A F1 3A, 05, 05]
+133D8; [77 F6 57, 05, 05]
 
-13406; [7A F1 42, 05, 05]
+133D9; [77 F6 5F, 05, 05]
 
-13407; [7A F1 4A, 05, 05]
+133DA; [77 F6 67, 05, 05]
 
-13408; [7A F1 52, 05, 05]
+133DB; [77 F6 6F, 05, 05]
 
-13409; [7A F1 5A, 05, 05]
+133DC; [77 F6 77, 05, 05]
 
-1340A; [7A F1 62, 05, 05]
+133DD; [77 F6 7F, 05, 05]
 
-1340B; [7A F1 6A, 05, 05]
+133DE; [77 F6 87, 05, 05]
 
-1340C; [7A F1 72, 05, 05]
+133DF; [77 F6 8F, 05, 05]
 
-1340D; [7A F1 7A, 05, 05]
+133E0; [77 F6 97, 05, 05]
 
-1340E; [7A F1 82, 05, 05]
+133E1; [77 F6 9F, 05, 05]
 
-1340F; [7A F1 8A, 05, 05]
+133E2; [77 F6 A7, 05, 05]
 
-13410; [7A F1 92, 05, 05]
+133E3; [77 F6 AF, 05, 05]
 
-13411; [7A F1 9A, 05, 05]
+133E4; [77 F6 B7, 05, 05]
 
-13412; [7A F1 A2, 05, 05]
+133E5; [77 F6 BF, 05, 05]
 
-13413; [7A F1 AA, 05, 05]
+133E6; [77 F6 C7, 05, 05]
 
-13414; [7A F1 B2, 05, 05]
+133E7; [77 F6 CF, 05, 05]
 
-13415; [7A F1 BA, 05, 05]
+133E8; [77 F6 D7, 05, 05]
 
-13416; [7A F1 C2, 05, 05]
+133E9; [77 F6 DF, 05, 05]
 
-13417; [7A F1 CA, 05, 05]
+133EA; [77 F6 E7, 05, 05]
 
-13418; [7A F1 D2, 05, 05]
+133EB; [77 F6 EF, 05, 05]
 
-13419; [7A F1 DA, 05, 05]
+133EC; [77 F6 F7, 05, 05]
 
-1341A; [7A F1 E2, 05, 05]
+133ED; [77 F6 FF, 05, 05]
 
-1341B; [7A F1 EA, 05, 05]
+133EE; [77 F7 09, 05, 05]
 
-1341C; [7A F1 F2, 05, 05]
+133EF; [77 F7 11, 05, 05]
 
-1341D; [7A F1 FA, 05, 05]
+133F0; [77 F7 19, 05, 05]
 
-1341E; [7A F2 08, 05, 05]
+133F1; [77 F7 21, 05, 05]
 
-1341F; [7A F2 10, 05, 05]
+133F2; [77 F7 29, 05, 05]
 
-13420; [7A F2 18, 05, 05]
+133F3; [77 F7 31, 05, 05]
 
-13421; [7A F2 20, 05, 05]
+133F4; [77 F7 39, 05, 05]
 
-13422; [7A F2 28, 05, 05]
+133F5; [77 F7 41, 05, 05]
 
-13423; [7A F2 30, 05, 05]
+133F6; [77 F7 49, 05, 05]
 
-13424; [7A F2 38, 05, 05]
+133F7; [77 F7 51, 05, 05]
 
-13425; [7A F2 40, 05, 05]
+133F8; [77 F7 59, 05, 05]
 
-13426; [7A F2 48, 05, 05]
+133F9; [77 F7 61, 05, 05]
 
-13427; [7A F2 50, 05, 05]
+133FA; [77 F7 69, 05, 05]
 
-13428; [7A F2 58, 05, 05]
+133FB; [77 F7 71, 05, 05]
 
-13429; [7A F2 60, 05, 05]
+133FC; [77 F7 79, 05, 05]
 
-1342A; [7A F2 68, 05, 05]
+133FD; [77 F7 81, 05, 05]
 
-1342B; [7A F2 70, 05, 05]
+133FE; [77 F7 89, 05, 05]
 
-1342C; [7A F2 78, 05, 05]
+133FF; [77 F7 91, 05, 05]
 
-1342D; [7A F2 80, 05, 05]
+13400; [77 F7 99, 05, 05]
 
-1342E; [7A F2 88, 05, 05]
+13401; [77 F7 A1, 05, 05]
 
-109A0; [7A F2 90, 05, 05]
-10980; [7A F2 90, 05, 09][, DB A9, 09]
+13402; [77 F7 A9, 05, 05]
 
-109A1; [7A F2 98, 05, 05]
-10981; [7A F2 98, 05, 09][, DB A9, 09]
+13403; [77 F7 B1, 05, 05]
 
-109A2; [7A F2 A0, 05, 05]
-10982; [7A F2 A0, 05, 09][, DB A9, 09]
+13404; [77 F7 B9, 05, 05]
 
-109A3; [7A F2 A8, 05, 05]
-10983; [7A F2 A8, 05, 09][, DB A9, 09]
+13405; [77 F7 C1, 05, 05]
 
-109A4; [7A F2 B0, 05, 05]
-10984; [7A F2 B0, 05, 09][, DB A9, 09]
+13406; [77 F7 C9, 05, 05]
 
-109A5; [7A F2 B8, 05, 05]
-10985; [7A F2 B8, 05, 09][, DB A9, 09]
+13407; [77 F7 D1, 05, 05]
 
-109A6; [7A F2 C0, 05, 05]
-10986; [7A F2 C0, 05, 09][, DB A9, 09]
-10987; [7A F2 C0, 05, 09][, DB B9, 09]
+13408; [77 F7 D9, 05, 05]
 
-109A7; [7A F2 C8, 05, 05]
-10988; [7A F2 C8, 05, 09][, DB A9, 09]
+13409; [77 F7 E1, 05, 05]
 
-109A8; [7A F2 D0, 05, 05]
-10989; [7A F2 D0, 05, 09][, DB A9, 09]
+1340A; [77 F7 E9, 05, 05]
 
-109A9; [7A F2 D8, 05, 05]
-1098A; [7A F2 D8, 05, 09][, DB A9, 09]
-1098B; [7A F2 D8, 05, 09][, DB B9, 09]
+1340B; [77 F7 F1, 05, 05]
 
-109AA; [7A F2 E0, 05, 05]
-1098C; [7A F2 E0, 05, 09][, DB A9, 09]
-1098D; [7A F2 E0, 05, 09][, DB B9, 09]
+1340C; [77 F7 F9, 05, 05]
 
-109AB; [7A F2 E8, 05, 05]
-1098E; [7A F2 E8, 05, 09][, DB A9, 09]
-1098F; [7A F2 E8, 05, 09][, DB B9, 09]
+1340D; [77 F8 03, 05, 05]
 
-109AC; [7A F2 F0, 05, 05]
-10990; [7A F2 F0, 05, 09][, DB A9, 09]
+1340E; [77 F8 0B, 05, 05]
 
-109AD; [7A F2 F8, 05, 05]
-10991; [7A F2 F8, 05, 09][, DB A9, 09]
+1340F; [77 F8 13, 05, 05]
 
-109AE; [7A F3 06, 05, 05]
-10992; [7A F3 06, 05, 09][, DB A9, 09]
+13410; [77 F8 1B, 05, 05]
 
-109AF; [7A F3 0E, 05, 05]
-109B0; [7A F3 0E, 05, 09][, DB A9, 09]
-10993; [7A F3 0E, 05, 09][, DB B9, 09]
-10994; [7A F3 0E, 05, 09][, DB C9, 09]
+13411; [77 F8 23, 05, 05]
 
-109B1; [7A F3 16, 05, 05]
-10995; [7A F3 16, 05, 09][, DB A9, 09]
-
-109B2; [7A F3 1E, 05, 05]
-10996; [7A F3 1E, 05, 09][, DB A9, 09]
-
-109B3; [7A F3 26, 05, 05]
-10997; [7A F3 26, 05, 09][, DB A9, 09]
-
-109B4; [7A F3 2E, 05, 05]
-10998; [7A F3 2E, 05, 09][, DB A9, 09]
-10999; [7A F3 2E, 05, 09][, DB B9, 09]
-
-109B5; [7A F3 36, 05, 05]
-1099A; [7A F3 36, 05, 09][, DB A9, 09]
-1099B; [7A F3 36, 05, 09][, DB B9, 09]
-
-109B6; [7A F3 3E, 05, 05]
-1099C; [7A F3 3E, 05, 09][, DB A9, 09]
-
-109B7; [7A F3 46, 05, 05]
-1099D; [7A F3 46, 05, 09][, DB A9, 09]
-
-109BE; [7A F3 4E, 05, 05]
-
-109BF; [7A F3 56, 05, 05]
-
-1099E; [7A F3 5E, 05, 05]
-
-1099F; [7A F3 66, 05, 05]
-
-2F00; [E0 04 06, 05, 09]
-3280; [E0 04 06, 05, 0D]
-3192; [E0 04 06, 05, 27]
-1F229; [E0 04 06, 05, 37]
-319C; [E0 04 08, 05, 27]
-3286; [E0 04 0C, 05, 0D]
-3282; [E0 04 18, 05, 0D]
-3194; [E0 04 18, 05, 27]
-1F22A; [E0 04 18, 05, 37]
-32A4; [E0 04 1A, 05, 0D]
-3196; [E0 04 1A, 05, 27]
-32A6; [E0 04 1C, 05, 0D]
-3198; [E0 04 1C, 05, 27]
-F967; [E0 04 20, 05, 05]
-319B; [E0 04 38, 05, 27]
-FA70; [E0 04 52, 05, 05]
-2F01; [E0 04 56, 05, 09]
-2EA6; [E0 04 5E, 05, 09]
-32A5; [E0 04 60, 05, 0D]
-3197; [E0 04 60, 05, 27]
-1F22D; [E0 04 60, 05, 37]
-F905; [E0 04 6A, 05, 05]
-2F02; [E0 04 72, 05, 09]
-2E80; [E0 04 72, 05, 09][, DB A9, 09]
-2F801; [E0 04 76, 05, 05]
-F95E; [E0 04 78, 05, 05]
-2F800; [E0 04 80, 05, 05]
-2F03; [E0 04 84, 05, 09]
-2F802; [E0 04 88, 05, 05]
-2F04; [E0 04 B8, 05, 09]
-319A; [E0 04 B8, 05, 27]
-2E84; [E0 04 B8, 05, 09][, DB A9, 09]
-2E83; [E0 04 BA, 05, 09]
-2E82; [E0 04 BC, 05, 09]
-3288; [E0 04 C0, 05, 0D]
-F91B; [E0 05 10, 05, 05]
-2F05; [E0 05 16, 05, 09]
-F9BA; [E0 05 18, 05, 05]
-2F06; [E0 05 24, 05, 09]
-3281; [E0 05 24, 05, 0D]
-3193; [E0 05 24, 05, 27]
-1F214; [E0 05 24, 05, 37]
-3284; [E0 05 34, 05, 0D]
-2F07; [E0 05 4C, 05, 09]
-1F218; [E0 05 54, 05, 37]
-F977; [E0 05 68, 05, 05]
-2F08; [E0 05 80, 05, 09]
-319F; [E0 05 80, 05, 27]
-2E85; [E0 05 82, 05, 09]
-F9FD; [E0 05 8C, 05, 05]
-2F819; [E0 05 A4, 05, 05]
-F9A8; [E0 05 D4, 05, 05]
-32AD; [E0 06 14, 05, 0D]
-32A1; [E0 06 34, 05, 0D]
-2F804; [E0 06 D2, 05, 05]
-FA73; [E0 07 18, 05, 05]
-F92D; [E0 07 24, 05, 05]
-F9B5; [E0 07 2E, 05, 05]
-2F805; [E0 07 74, 05, 05]
-FA30; [E0 07 74, 05, 05]
-2F806; [E0 07 8E, 05, 05]
-F965; [E0 07 96, 05, 05]
-2F807; [E0 08 22, 05, 05]
-F9D4; [E0 08 74, 05, 05]
-2F808; [E0 09 18, 05, 05]
-2F809; [E0 09 56, 05, 05]
-2F80B; [E0 09 C2, 05, 05]
-F9BB; [E0 09 D8, 05, 05]
-2F80A; [E0 09 F2, 05, 05]
-FA31; [E0 09 F2, 05, 05]
-329D; [E0 0A 7E, 05, 0D]
-2F09; [E0 0A A8, 05, 09]
-FA0C; [E0 0A AA, 05, 05]
-FA74; [E0 0A B4, 05, 05]
-2F80E; [E0 0A C4, 05, 05]
-FA32; [E0 0A C4, 05, 05]
-2F80F; [E0 0A D2, 05, 05]
-2F810; [E0 0A F2, 05, 05]
-2F0A; [E0 0A F4, 05, 09]
-2F814; [E0 0A F8, 05, 05]
-FA72; [E0 0A FA, 05, 05]
-F978; [E0 0A FC, 05, 05]
-2F0B; [E0 0B 06, 05, 09]
-3287; [E0 0B 06, 05, 0D]
-F9D1; [E0 0B 0A, 05, 05]
-3285; [E0 0B 0A, 05, 0D]
-2F811; [E0 0B 1E, 05, 05]
-FA75; [E0 0B 30, 05, 05]
-2F0C; [E0 0B 34, 05, 09]
-2E86; [E0 0B 34, 05, 09][, DB A9, 09]
-2F815; [E0 0B 4A, 05, 05]
-1F21E; [E0 0B 4A, 05, 37]
-2F8D2; [E0 0B 54, 05, 05]
-2F8D3; [E0 0B 5A, 05, 05]
-2F0D; [E0 0B 5C, 05, 09]
-2F817; [E0 0B 5E, 05, 05]
-32A2; [E0 0B 62, 05, 0D]
-2F818; [E0 0B 78, 05, 05]
-2F0E; [E0 0B 86, 05, 09]
-2F81A; [E0 0B 88, 05, 05]
-2F81B; [E0 0B 9A, 05, 05]
-FA71; [E0 0B 9A, 05, 05]
-F92E; [E0 0B 9E, 05, 05]
-F979; [E0 0B C2, 05, 05]
-F955; [E0 0B C8, 05, 05]
-F954; [E0 0B E8, 05, 05]
-FA15; [E0 0B EC, 05, 05]
-2F0F; [E0 0B F0, 05, 09]
-2E87; [E0 0B F0, 05, 09][, DB A9, 09]
-2F81D; [E0 0C 20, 05, 05]
-2F10; [E0 0C 20, 05, 09]
-2F11; [E0 0C 36, 05, 09]
-2E88; [E0 0C 36, 05, 09][, DB A9, 09]
-2E89; [E0 0C 3A, 05, 09]
-2F81E; [E0 0C 3C, 05, 05]
-2F850; [E0 0C 44, 05, 05]
-FA00; [E0 0C 44, 05, 05]
-F99C; [E0 0C 64, 05, 05]
-1F220; [E0 0C 70, 05, 37]
-F9DD; [E0 0C 88, 05, 05]
-F9FF; [E0 0C AA, 05, 05]
-2F820; [E0 0C AC, 05, 05]
-2F821; [E0 0C C2, 05, 05]
-1F21C; [E0 0C D0, 05, 37]
-2F822; [E0 0D 20, 05, 05]
-1F239; [E0 0D 20, 05, 37]
-2F823; [E0 0D 2A, 05, 05]
-F9C7; [E0 0D 4E, 05, 05]
-F98A; [E0 0D 72, 05, 05]
-2F12; [E0 0D 72, 05, 09]
-F99D; [E0 0D 82, 05, 05]
-2F992; [E0 0D A2, 05, 05]
-3298; [E0 0D A4, 05, 0D]
-2F825; [E0 0D CA, 05, 05]
-FA76; [E0 0D CA, 05, 05]
-2F826; [E0 0D CE, 05, 05]
-FA33; [E0 0D CE, 05, 05]
-F952; [E0 0D E0, 05, 05]
-F92F; [E0 0D F8, 05, 05]
-2F827; [E0 0E 0A, 05, 05]
-FA34; [E0 0E 0A, 05, 05]
-F97F; [E0 0E 2C, 05, 05]
-2F13; [E0 0E 34, 05, 09]
-2F828; [E0 0E 36, 05, 05]
-FA77; [E0 0E 36, 05, 05]
-2F829; [E0 0E 4C, 05, 05]
-2F82A; [E0 0E 4E, 05, 05]
-2F14; [E0 0E 6C, 05, 09]
-2F82B; [E0 0E 70, 05, 05]
-F963; [E0 0E 70, 05, 05]
-2F15; [E0 0E 76, 05, 09]
-2F16; [E0 0E B2, 05, 09]
-32A9; [E0 0E B8, 05, 0D]
-F9EB; [E0 0E C0, 05, 05]
-2F17; [E0 0E C4, 05, 09]
-3038; [E0 0E C4, 05, 09]
-3289; [E0 0E C4, 05, 0D]
-3039; [E0 0E CA, 05, 09]
-303A; [E0 0E CC, 05, 09]
-2F82C; [E0 0E D4, 05, 05]
-2F82D; [E0 0E E4, 05, 05]
-FA35; [E0 0E E4, 05, 05]
-32AF; [E0 0E EA, 05, 0D]
-2F82E; [E0 0E F6, 05, 05]
-2F18; [E0 0E FA, 05, 09]
-2E8A; [E0 0E FA, 05, 09][, DB A9, 09]
-2F19; [E0 0F 1A, 05, 09]
-2E8B; [E0 0F 1A, 05, 09][, DB A9, 09]
-329E; [E0 0F 28, 05, 0D]
-2F82F; [E0 0F 2E, 05, 05]
-F91C; [E0 0F 32, 05, 05]
-2F830; [E0 0F 42, 05, 05]
-2F831; [E0 0F 46, 05, 05]
-2F832; [E0 0F 46, 05, 05]
-2F833; [E0 0F 46, 05, 05]
-2F1A; [E0 0F 4C, 05, 09]
-2E81; [E0 0F 4C, 05, 09][, DB A9, 09]
-2F1B; [E0 0F B4, 05, 09]
-F96B; [E0 0F CE, 05, 05]
-2F1C; [E0 0F D8, 05, 09]
-2F836; [E0 0F DC, 05, 05]
-1F212; [E0 0F E0, 05, 37]
-2F837; [E0 10 0C, 05, 05]
-2F1D; [E0 10 14, 05, 09]
-F906; [E0 10 18, 05, 05]
-2F839; [E0 10 24, 05, 05]
-1F251; [E0 10 2C, 05, 0D]
-2F83A; [E0 10 30, 05, 05]
-32A8; [E0 10 34, 05, 0D]
-1F22E; [E0 10 34, 05, 37]
-2F83B; [E0 10 5A, 05, 05]
-1F234; [E0 10 5E, 05, 37]
-3294; [E0 10 68, 05, 0D]
-F9DE; [E0 10 6C, 05, 05]
-F9ED; [E0 10 88, 05, 05]
-2F83D; [E0 10 BE, 05, 05]
-1F225; [E0 10 C0, 05, 37]
-F980; [E0 10 D2, 05, 05]
-2F83E; [E0 10 DE, 05, 05]
-2F83F; [E0 11 24, 05, 05]
-2F83C; [E0 11 90, 05, 05]
-2F840; [E0 11 98, 05, 05]
-F99E; [E0 11 CE, 05, 05]
-2F841; [E0 12 46, 05, 05]
-2F842; [E0 12 7A, 05, 05]
-3244; [E0 12 F8, 05, 0D]
-2F843; [E0 13 06, 05, 05]
-FA79; [E0 13 0A, 05, 05]
-2F844; [E0 13 26, 05, 05]
-2F845; [E0 13 68, 05, 05]
-2F846; [E0 13 68, 05, 05]
-F90B; [E0 13 6E, 05, 05]
-2F847; [E0 13 92, 05, 05]
-FA7A; [E0 13 92, 05, 05]
-FA36; [E0 13 9A, 05, 05]
-FA78; [E0 13 9A, 05, 05]
-2F848; [E0 13 B6, 05, 05]
-2F849; [E0 13 C6, 05, 05]
-1F23A; [E0 13 CC, 05, 37]
-FA0D; [E0 13 E0, 05, 05]
-2F84A; [E0 13 E4, 05, 05]
-FA7B; [E0 14 2A, 05, 05]
-2F84C; [E0 14 72, 05, 05]
-FA37; [E0 14 72, 05, 05]
-2F84E; [E0 15 0E, 05, 05]
-FA38; [E0 15 3C, 05, 05]
-2F84F; [E0 15 54, 05, 05]
-2F1E; [E0 16 20, 05, 09]
-3283; [E0 16 28, 05, 0D]
-3195; [E0 16 28, 05, 27]
-F9A9; [E0 16 64, 05, 05]
-2F84B; [E0 16 9E, 05, 05]
-2F84D; [E0 16 A0, 05, 05]
-2F1F; [E0 16 B0, 05, 09]
-328F; [E0 16 B0, 05, 0D]
-319E; [E0 16 D2, 05, 27]
-2F855; [E0 17 8E, 05, 05]
-2F852; [E0 18 1A, 05, 05]
-2F853; [E0 18 66, 05, 05]
-2F854; [E0 18 98, 05, 05]
-2F857; [E0 18 E0, 05, 05]
-2F856; [E0 18 E2, 05, 05]
-FA39; [E0 19 04, 05, 05]
-FA10; [E0 19 38, 05, 05]
-FA7C; [E0 19 38, 05, 05]
-F96C; [E0 19 40, 05, 05]
-FA3A; [E0 19 D4, 05, 05]
-2F858; [E0 19 DC, 05, 05]
-FA7D; [E0 19 EA, 05, 05]
-F94A; [E0 1A 3A, 05, 05]
-F942; [E0 1A 48, 05, 05]
-2F20; [E0 1A 60, 05, 09]
-2F851; [E0 1A 66, 05, 05]
-1F224; [E0 1A 6A, 05, 37]
-2F85A; [E0 1A 6E, 05, 05]
-2F85B; [E0 1A 78, 05, 05]
-2F21; [E0 1A 8E, 05, 09]
-2F85C; [E0 1A 96, 05, 05]
-2F22; [E0 1A 9E, 05, 09]
-2F23; [E0 1A B4, 05, 09]
-2F85D; [E0 1A BE, 05, 05]
-1F215; [E0 1A BE, 05, 37]
-32B0; [E0 1A C2, 05, 0D]
-2F85E; [E0 1A CE, 05, 05]
-2F24; [E0 1A D8, 05, 09]
-337D; [E0 1A D8, 05, 37][E0 40 34, 05, 37]
-319D; [E0 1A DC, 05, 27]
-1F217; [E0 1A DC, 05, 37]
-FA7E; [E0 1B 18, 05, 05]
-F90C; [E0 1B 20, 05, 05]
-F909; [E0 1B 32, 05, 05]
-FA7F; [E0 1B 38, 05, 05]
-2F85F; [E0 1B 54, 05, 05]
-F981; [E0 1B 76, 05, 05]
-2F25; [E0 1B 76, 05, 09]
-329B; [E0 1B 76, 05, 0D]
-2F865; [E0 1C 46, 05, 05]
-2F862; [E0 1C 6E, 05, 05]
-2F863; [E0 1C CC, 05, 05]
-2F864; [E0 1C E4, 05, 05]
-FA80; [E0 1D 60, 05, 05]
-2F866; [E0 1D 68, 05, 05]
-2F986; [E0 1E 0C, 05, 05]
-2F869; [E0 1E B2, 05, 05]
-FA81; [E0 1E F2, 05, 05]
-2F86A; [E0 1F 24, 05, 05]
-2F86B; [E0 1F 24, 05, 05]
-2F26; [E0 1F 48, 05, 09]
-1F211; [E0 1F 56, 05, 37]
-32AB; [E0 1F 74, 05, 0D]
-2F27; [E0 1F A8, 05, 09]
-FA04; [E0 1F B2, 05, 05]
-32AA; [E0 1F D6, 05, 0D]
-2F86D; [E0 20 34, 05, 05]
-2F86E; [E0 20 5E, 05, 05]
-2F86F; [E0 20 7C, 05, 05]
-F95F; [E0 20 7C, 05, 05]
-F9AA; [E0 20 7C, 05, 05]
-F9BC; [E0 20 8A, 05, 05]
-2F870; [E0 20 94, 05, 05]
-2F28; [E0 20 9E, 05, 09]
-2F872; [E0 20 AC, 05, 05]
-2F873; [E0 20 BA, 05, 05]
-2F29; [E0 20 CC, 05, 09]
-2E8C; [E0 20 CC, 05, 09][, DB A9, 09]
-2E8D; [E0 20 CC, 05, 09][, DB B9, 09]
-2F875; [E0 20 F2, 05, 05]
-2E90; [E0 20 F2, 05, 09]
-2F2A; [E0 20 F2, 05, 09]
-2E8E; [E0 20 F2, 05, 09][, DB A9, 09]
-2E8F; [E0 20 F4, 05, 09]
-2E91; [E0 20 F4, 05, 09][, DB A9, 09]
-2F2B; [E0 21 24, 05, 09]
-F9BD; [E0 21 32, 05, 05]
-2F877; [E0 21 74, 05, 05]
-F94B; [E0 21 78, 05, 05]
-FA3B; [E0 21 7C, 05, 05]
-F9DF; [E0 21 7E, 05, 05]
-2F878; [E0 21 90, 05, 05]
-FA3C; [E0 21 90, 05, 05]
-2F2C; [E0 21 90, 05, 09]
-2F2D; [E0 21 96, 05, 09]
-2F87A; [E0 21 CE, 05, 05]
-2F879; [E0 22 3A, 05, 05]
-F9D5; [E0 22 EC, 05, 05]
-2F87C; [E0 23 46, 05, 05]
-F921; [E0 23 60, 05, 05]
-2F87F; [E0 23 96, 05, 05]
-2F87E; [E0 23 9C, 05, 05]
-2F880; [E0 23 B8, 05, 05]
-2F9F4; [E0 24 2A, 05, 05]
-F9AB; [E0 24 3A, 05, 05]
-2F2E; [E0 24 7C, 05, 09]
-2F881; [E0 24 88, 05, 05]
-2F882; [E0 24 8A, 05, 05]
-2F2F; [E0 24 90, 05, 09]
-32A7; [E0 24 92, 05, 0D]
-1F22C; [E0 24 92, 05, 37]
-2F30; [E0 24 A8, 05, 09]
-2E92; [E0 24 AC, 05, 09]
-2F884; [E0 24 C0, 05, 05]
-2F31; [E0 24 C2, 05, 09]
-2F885; [E0 25 1C, 05, 05]
-2F886; [E0 25 46, 05, 05]
-2F887; [E0 25 9E, 05, 05]
-2F32; [E0 25 B0, 05, 09]
-337B; [E0 25 B2, 05, 37][E0 2D 1C, 05, 37]
-F98E; [E0 25 B4, 05, 05]
-2E93; [E0 25 C0, 05, 09]
-2F33; [E0 25 C0, 05, 09]
-3245; [E0 25 C4, 05, 0D]
-2F34; [E0 25 CA, 05, 09]
-FA01; [E0 26 1E, 05, 05]
-2F88B; [E0 26 32, 05, 05]
-2F88C; [E0 26 38, 05, 05]
-2F88D; [E0 26 3E, 05, 05]
-F9A2; [E0 26 64, 05, 05]
-2F88E; [E0 26 66, 05, 05]
-F928; [E0 26 66, 05, 05]
-FA82; [E0 26 76, 05, 05]
-FA0B; [E0 26 78, 05, 05]
-FA83; [E0 26 84, 05, 05]
-F982; [E0 26 AA, 05, 05]
-2F35; [E0 26 BA, 05, 09]
-2F890; [E0 26 CE, 05, 05]
-2F36; [E0 26 CE, 05, 09]
-F943; [E0 26 DA, 05, 05]
-2F37; [E0 26 E8, 05, 09]
-2F38; [E0 26 F8, 05, 09]
-2F894; [E0 27 1C, 05, 05]
-2F895; [E0 27 1C, 05, 05]
-2F39; [E0 27 78, 05, 09]
-2E95; [E0 27 78, 05, 09][, DB A9, 09]
-2E94; [E0 27 7A, 05, 09]
-2F874; [E0 27 7E, 05, 05]
-2F3A; [E0 27 9A, 05, 09]
-2F899; [E0 27 9C, 05, 05]
-FA84; [E0 27 AA, 05, 05]
-2F89A; [E0 27 AE, 05, 05]
-2F3B; [E0 27 BE, 05, 09]
-F9D8; [E0 27 EE, 05, 05]
-1F21D; [E0 27 F0, 05, 37]
-1F250; [E0 28 0C, 05, 0D]
-2F89C; [E0 28 12, 05, 05]
-F966; [E0 28 30, 05, 05]
-FA85; [E0 28 38, 05, 05]
-2F3C; [E0 28 64, 05, 09]
-2E97; [E0 28 64, 05, 09][, DB A9, 09]
-2E96; [E0 28 66, 05, 09]
-2F89D; [E0 28 78, 05, 05]
-2F89E; [E0 28 8C, 05, 05]
-F9A3; [E0 28 C8, 05, 05]
-2F89F; [E0 28 D0, 05, 05]
-F960; [E0 29 08, 05, 05]
-F9AC; [E0 29 1C, 05, 05]
-FA6B; [E0 29 CE, 05, 05]
-2F8A0; [E0 29 E6, 05, 05]
-2F8A3; [E0 2A 12, 05, 05]
-FA3D; [E0 2A 12, 05, 05]
-2F8A5; [E0 2A 78, 05, 05]
-FA86; [E0 2A 9A, 05, 05]
-F9B9; [E0 2A AC, 05, 05]
-FA88; [E0 2A FA, 05, 05]
-F9D9; [E0 2B 78, 05, 05]
-2F8A6; [E0 2B 80, 05, 05]
-2F8A7; [E0 2B 88, 05, 05]
-2F8A9; [E0 2B 88, 05, 05]
-2F8A8; [E0 2B 8C, 05, 05]
-FA87; [E0 2B 8C, 05, 05]
-FA8A; [E0 2B B0, 05, 05]
-FA3E; [E0 2B C0, 05, 05]
-2F8AA; [E0 2B E4, 05, 05]
-2F8AB; [E0 2C 12, 05, 05]
-FA3F; [E0 2C 12, 05, 05]
-FA89; [E0 2C 12, 05, 05]
-F98F; [E0 2C 16, 05, 05]
-2F8AD; [E0 2C 3E, 05, 05]
-2F8AE; [E0 2C 54, 05, 05]
-2F8AC; [E0 2C 5A, 05, 05]
-2F8AF; [E0 2C B2, 05, 05]
-2F8B0; [E0 2C DA, 05, 05]
-FA40; [E0 2C DA, 05, 05]
-FA8B; [E0 2C DA, 05, 05]
-2F8B1; [E0 2C E2, 05, 05]
-F90D; [E0 2C E2, 05, 05]
-F990; [E0 2C F6, 05, 05]
-2F3D; [E0 2D 0C, 05, 09]
-2F8B2; [E0 2D 1C, 05, 05]
-2F8B3; [E0 2D 32, 05, 05]
-F9D2; [E0 2D 58, 05, 05]
-FA8C; [E0 2D 64, 05, 05]
-2F3E; [E0 2D 68, 05, 09]
-2F3F; [E0 2D 92, 05, 09]
-1F210; [E0 2D 92, 05, 37]
-2E98; [E0 2D 94, 05, 09]
-1F231; [E0 2D A2, 05, 37]
-2F8B4; [E0 2D B6, 05, 05]
-1F227; [E0 2E 2C, 05, 37]
-2F8B5; [E0 2E 64, 05, 05]
-F925; [E0 2E 94, 05, 05]
-F95B; [E0 2E A0, 05, 05]
-FA02; [E0 2E A8, 05, 05]
-2F8B6; [E0 2E AA, 05, 05]
-2F8BA; [E0 2E FA, 05, 05]
-F973; [E0 2F 04, 05, 05]
-1F22F; [E0 2F 16, 05, 37]
-2F8B9; [E0 2F 82, 05, 05]
-2F8B7; [E0 2F A8, 05, 05]
-1F228; [E0 2F B2, 05, 37]
-2F8BB; [E0 2F D8, 05, 05]
-F9A4; [E0 30 04, 05, 05]
-2F8BC; [E0 30 14, 05, 05]
-F975; [E0 30 4E, 05, 05]
-2F8C1; [E0 30 60, 05, 05]
-FA8D; [E0 30 96, 05, 05]
-2F8C0; [E0 30 98, 05, 05]
-2F8BD; [E0 30 D6, 05, 05]
-FA8E; [E0 31 4C, 05, 05]
-2F8BF; [E0 31 58, 05, 05]
-FA8F; [E0 31 B8, 05, 05]
-2F8C3; [E0 31 E6, 05, 05]
-2F8C6; [E0 32 08, 05, 05]
-2F8C4; [E0 32 16, 05, 05]
-F991; [E0 32 4E, 05, 05]
-2F8C5; [E0 32 54, 05, 05]
-F930; [E0 32 A2, 05, 05]
-2F40; [E0 33 7E, 05, 09]
-2F41; [E0 33 88, 05, 09]
-2E99; [E0 33 8A, 05, 09]
-2F8C8; [E0 33 BE, 05, 05]
-FA41; [E0 33 BE, 05, 05]
-FA90; [E0 33 CC, 05, 05]
-2F8C9; [E0 33 F8, 05, 05]
-F969; [E0 34 16, 05, 05]
-2F42; [E0 34 34, 05, 09]
-3246; [E0 34 34, 05, 0D]
-2F43; [E0 34 54, 05, 09]
-F9BE; [E0 34 58, 05, 05]
-1F21B; [E0 34 58, 05, 37]
-2F44; [E0 34 6E, 05, 09]
-1F21F; [E0 34 86, 05, 37]
-2F45; [E0 34 98, 05, 09]
-F983; [E0 34 B0, 05, 05]
-2F46; [E0 34 E6, 05, 09]
-2E9B; [E0 34 E8, 05, 09]
-FA42; [E0 34 EA, 05, 05]
-2F8CB; [E0 34 EC, 05, 05]
-2F47; [E0 34 F0, 05, 09]
-3290; [E0 34 F0, 05, 0D]
-2E9C; [E0 34 F0, 05, 09][, DB A9, 09]
-337E; [E0 35 48, 05, 37][E0 42 F0, 05, 37]
-F9E0; [E0 35 52, 05, 05]
-1F219; [E0 35 6C, 05, 37]
-337C; [E0 35 86, 05, 37][E0 11 6C, 05, 37]
-2F8CD; [E0 35 BE, 05, 05]
-FA12; [E0 36 1A, 05, 05]
-FA91; [E0 36 1A, 05, 05]
-F9C5; [E0 36 42, 05, 05]
-2F8CF; [E0 36 54, 05, 05]
-FA43; [E0 36 54, 05, 05]
-2F8D5; [E0 36 6A, 05, 05]
-FA06; [E0 36 9A, 05, 05]
-F98B; [E0 36 BE, 05, 05]
-2F48; [E0 37 18, 05, 09]
-F901; [E0 37 20, 05, 05]
-2F8CC; [E0 37 28, 05, 05]
-2F8D4; [E0 37 38, 05, 05]
-2F49; [E0 37 48, 05, 09]
-328A; [E0 37 48, 05, 0D]
-1F237; [E0 37 48, 05, 37]
-2E9D; [E0 37 48, 05, 09][, DB A9, 09]
-3292; [E0 37 4A, 05, 0D]
-1F236; [E0 37 4A, 05, 37]
-2F8D8; [E0 37 66, 05, 05]
-F929; [E0 37 66, 05, 05]
-FA92; [E0 37 66, 05, 05]
-2F8D9; [E0 37 6E, 05, 05]
-FA93; [E0 37 6E, 05, 05]
-2F8DA; [E0 37 7A, 05, 05]
-2F4A; [E0 37 88, 05, 09]
-328D; [E0 37 88, 05, 0D]
-F9E1; [E0 37 D4, 05, 05]
-2F8DC; [E0 37 DE, 05, 05]
-FA94; [E0 37 E4, 05, 05]
-2F8DB; [E0 37 F4, 05, 05]
-F9C8; [E0 38 34, 05, 05]
-2F8E0; [E0 38 48, 05, 05]
-F9F4; [E0 38 6C, 05, 05]
-F9C9; [E0 39 2A, 05, 05]
-2F8DF; [E0 39 38, 05, 05]
-F9DA; [E0 39 72, 05, 05]
-2F8E5; [E0 39 82, 05, 05]
-3291; [E0 39 98, 05, 0D]
-337F; [E0 39 98, 05, 37][E0 26 F0, 05, 37][E0 06 46, 05, 37][E0 5C 92, 05, 37]
-2F8E1; [E0 39 E8, 05, 05]
-F97A; [E0 3A 4C, 05, 05]
-2F8E2; [E0 3A 54, 05, 05]
-FA44; [E0 3A 54, 05, 05]
-2F8E4; [E0 3A 66, 05, 05]
-F9E2; [E0 3A 9A, 05, 05]
-2F8E6; [E0 3B 78, 05, 05]
-2F8E8; [E0 3B D4, 05, 05]
-2F8E9; [E0 3C 9C, 05, 05]
-2F8EA; [E0 3D 30, 05, 05]
-F914; [E0 3D 60, 05, 05]
-F95C; [E0 3D 60, 05, 05]
-F9BF; [E0 3D 60, 05, 05]
-F94C; [E0 3D 82, 05, 05]
-2F8EB; [E0 3E B2, 05, 05]
-F931; [E0 3F 0E, 05, 05]
-2F8ED; [E0 3F 1E, 05, 05]
-F91D; [E0 3F 70, 05, 05]
-2F4B; [E0 3F A8, 05, 09]
-2F8EF; [E0 3F AA, 05, 05]
-2F8F1; [E0 40 16, 05, 05]
-2F4C; [E0 40 32, 05, 09]
-32A3; [E0 40 34, 05, 0D]
-2F8F3; [E0 40 52, 05, 05]
-F98C; [E0 40 5C, 05, 05]
-FA95; [E0 40 60, 05, 05]
-2F4D; [E0 40 60, 05, 09]
-2E9E; [E0 40 62, 05, 09][, DB A9, 09]
-2F8F4; [E0 40 AC, 05, 05]
-F9A5; [E0 40 CA, 05, 05]
-2F4E; [E0 40 D4, 05, 09]
-2F8F5; [E0 40 E2, 05, 05]
-F970; [E0 40 E2, 05, 05]
-FA96; [E0 40 E2, 05, 05]
-2F8F6; [E0 40 E4, 05, 05]
-2F4F; [E0 41 0A, 05, 09]
-2E9F; [E0 41 0E, 05, 09]
-2F50; [E0 41 1C, 05, 09]
-2F51; [E0 41 2A, 05, 09]
-2F52; [E0 41 92, 05, 09]
-2EA0; [E0 41 96, 05, 09]
-2F53; [E0 41 9C, 05, 09]
-2F54; [E0 41 DC, 05, 09]
-328C; [E0 41 DC, 05, 0D]
-2EA1; [E0 41 DE, 05, 09]
-2EA2; [E0 41 E8, 05, 09]
-2F8FA; [E0 42 16, 05, 05]
-2F8FE; [E0 42 48, 05, 05]
-F972; [E0 42 8A, 05, 05]
-2F8FC; [E0 42 F8, 05, 05]
-F968; [E0 43 18, 05, 05]
-2F8FD; [E0 43 1A, 05, 05]
-F9E3; [E0 43 4A, 05, 05]
-329F; [E0 43 50, 05, 0D]
-2F8FF; [E0 43 AC, 05, 05]
-F915; [E0 43 B6, 05, 05]
-FA05; [E0 43 BC, 05, 05]
-2F907; [E0 43 E8, 05, 05]
-2F900; [E0 43 FC, 05, 05]
-2F902; [E0 44 08, 05, 05]
-F9CA; [E0 44 08, 05, 05]
-FA97; [E0 44 08, 05, 05]
-2F903; [E0 44 58, 05, 05]
-F92A; [E0 44 5A, 05, 05]
-2F901; [E0 44 74, 05, 05]
-FA45; [E0 44 74, 05, 05]
-2F904; [E0 44 76, 05, 05]
-2F905; [E0 44 90, 05, 05]
-F9F5; [E0 45 22, 05, 05]
-F94D; [E0 45 40, 05, 05]
-F9D6; [E0 45 60, 05, 05]
-2F90E; [E0 45 7E, 05, 05]
-FA46; [E0 45 C0, 05, 05]
-2F908; [E0 45 EA, 05, 05]
-2F909; [E0 46 6E, 05, 05]
-1F235; [E0 46 92, 05, 37]
-F9CB; [E0 46 CA, 05, 05]
-F9EC; [E0 47 0C, 05, 05]
-2F90C; [E0 47 26, 05, 05]
-2F90B; [E0 47 2E, 05, 05]
-FA99; [E0 47 2E, 05, 05]
-F904; [E0 47 3A, 05, 05]
-FA98; [E0 47 4E, 05, 05]
-F94E; [E0 47 B6, 05, 05]
-1F226; [E0 47 C0, 05, 37]
-FA47; [E0 47 DC, 05, 05]
-FA9A; [E0 47 DC, 05, 05]
-F992; [E0 47 DE, 05, 05]
-2F90F; [E0 48 7A, 05, 05]
-2F912; [E0 49 30, 05, 05]
-F922; [E0 49 7A, 05, 05]
-F984; [E0 49 A0, 05, 05]
-2F915; [E0 49 DA, 05, 05]
-2F914; [E0 49 E0, 05, 05]
-FA9B; [E0 49 E0, 05, 05]
-2F913; [E0 4A 1C, 05, 05]
-2F917; [E0 4A 3E, 05, 05]
-2F55; [E0 4A 80, 05, 09]
-328B; [E0 4A 80, 05, 0D]
-2EA3; [E0 4A 82, 05, 09]
-2F835; [E0 4A 8A, 05, 05]
-2F919; [E0 4A 98, 05, 05]
-2F918; [E0 4A A4, 05, 05]
-F9FB; [E0 4A DC, 05, 05]
-2F91A; [E0 4B 0A, 05, 05]
-F99F; [E0 4B 40, 05, 05]
-F916; [E0 4B 62, 05, 05]
-1F21A; [E0 4B F2, 05, 37]
-2F91C; [E0 4C 40, 05, 05]
-F993; [E0 4C 48, 05, 05]
-FA48; [E0 4C 92, 05, 05]
-FA9C; [E0 4C 92, 05, 05]
-2F91E; [E0 4C EE, 05, 05]
-F9C0; [E0 4D 58, 05, 05]
-F9EE; [E0 4D 5C, 05, 05]
-F932; [E0 4D DC, 05, 05]
-F91E; [E0 4D F2, 05, 05]
-2F920; [E0 4E 12, 05, 05]
-2F56; [E0 4E 16, 05, 09]
-FA49; [E0 4E 18, 05, 05]
-2EA4; [E0 4E 18, 05, 09]
-2EA5; [E0 4E 18, 05, 09][, DB A9, 09]
-2F921; [E0 4E 2C, 05, 05]
-FA9E; [E0 4E 2C, 05, 05]
-2F57; [E0 4E 2E, 05, 09]
-2F58; [E0 4E 38, 05, 09]
-2F59; [E0 4E 40, 05, 09]
-2F5A; [E0 4E 50, 05, 09]
-2F922; [E0 4E 62, 05, 05]
-2F5B; [E0 4E 74, 05, 09]
-2F5C; [E0 4E 78, 05, 09]
-2EA7; [E0 4E 78, 05, 09][, DB A9, 09]
-F946; [E0 4E 86, 05, 05]
-3295; [E0 4E B4, 05, 0D]
-2F924; [E0 4E C2, 05, 05]
-2F925; [E0 4E EC, 05, 05]
-2F5D; [E0 4F 20, 05, 09]
-2EA8; [E0 4F 22, 05, 09]
-FA9F; [E0 4F 26, 05, 05]
-F9FA; [E0 4F 48, 05, 05]
-F92B; [E0 4F C0, 05, 05]
-FA16; [E0 50 22, 05, 05]
-FAA0; [E0 50 22, 05, 05]
-F9A7; [E0 50 B8, 05, 05]
-2F928; [E0 50 C2, 05, 05]
-2F5E; [E0 50 D6, 05, 09]
-F961; [E0 50 DC, 05, 05]
-F9DB; [E0 50 DC, 05, 05]
-2F5F; [E0 50 E0, 05, 09]
-2F929; [E0 50 E4, 05, 05]
-2EA9; [E0 50 E4, 05, 09][, DB A9, 09]
-2F92B; [E0 51 1E, 05, 05]
-F9AD; [E0 51 38, 05, 05]
-F917; [E0 51 90, 05, 05]
-F9E4; [E0 51 E0, 05, 05]
-F9CC; [E0 51 E6, 05, 05]
-FA4A; [E0 52 1E, 05, 05]
-2F92E; [E0 52 68, 05, 05]
-2F92F; [E0 52 92, 05, 05]
-F9AE; [E0 52 AC, 05, 05]
-2F930; [E0 52 BC, 05, 05]
-FAA1; [E0 52 BC, 05, 05]
-2F931; [E0 52 E4, 05, 05]
-F994; [E0 52 EC, 05, 05]
-F9EF; [E0 53 10, 05, 05]
-2F932; [E0 53 74, 05, 05]
-2F60; [E0 53 98, 05, 09]
-2F61; [E0 53 AC, 05, 09]
-FAA2; [E0 53 EC, 05, 05]
-2F62; [E0 54 16, 05, 09]
-2F63; [E0 54 24, 05, 09]
-1F222; [E0 54 24, 05, 37]
-2F934; [E0 54 2E, 05, 05]
-2F64; [E0 54 36, 05, 09]
-2F65; [E0 54 46, 05, 09]
-3199; [E0 54 4A, 05, 27]
-1F238; [E0 54 4C, 05, 37]
-329A; [E0 54 54, 05, 0D]
-FAA3; [E0 54 5C, 05, 05]
-2F936; [E0 54 62, 05, 05]
-F9CD; [E0 54 98, 05, 05]
-F976; [E0 54 B0, 05, 05]
-2F938; [E0 54 C6, 05, 05]
-F962; [E0 54 C6, 05, 05]
-2F66; [E0 54 FC, 05, 09]
-2EAA; [E0 54 FC, 05, 09][, DB A9, 09]
-2F67; [E0 55 10, 05, 09]
-F9E5; [E0 55 B0, 05, 05]
-2F93A; [E0 56 12, 05, 05]
-FAA4; [E0 56 2C, 05, 05]
-FAA5; [E0 56 30, 05, 05]
-F9C1; [E0 56 76, 05, 05]
-F90E; [E0 56 C4, 05, 05]
-2F68; [E0 56 DE, 05, 09]
-2F69; [E0 56 EC, 05, 09]
-2F6A; [E0 57 54, 05, 09]
-2F6B; [E0 57 76, 05, 09]
-FA17; [E0 57 8C, 05, 05]
-FAA6; [E0 57 8C, 05, 05]
-FAA7; [E0 57 AE, 05, 05]
-32AC; [E0 57 BE, 05, 0D]
-F933; [E0 57 C6, 05, 05]
-2F6C; [E0 57 D4, 05, 09]
-2EAB; [E0 57 D4, 05, 09][, DB A9, 09]
-2F940; [E0 57 E0, 05, 05]
-FAA8; [E0 57 E0, 05, 05]
-F96D; [E0 57 FA, 05, 05]
-2F945; [E0 58 3A, 05, 05]
-2F946; [E0 58 3C, 05, 05]
-2F947; [E0 58 3C, 05, 05]
-FAAA; [E0 58 7E, 05, 05]
-2F948; [E0 58 92, 05, 05]
-FAA9; [E0 58 92, 05, 05]
-2F94A; [E0 59 1A, 05, 05]
-FA9D; [E0 59 52, 05, 05]
-2F6D; [E0 59 BA, 05, 09]
-2F6E; [E0 59 C8, 05, 09]
-2F6F; [E0 59 EA, 05, 09]
-2F94E; [E0 5A A6, 05, 05]
-F9CE; [E0 5A E0, 05, 05]
-2F94F; [E0 5B 28, 05, 05]
-F93B; [E0 5B 28, 05, 05]
-FA4B; [E0 5B 32, 05, 05]
-F947; [E0 5B A4, 05, 05]
-2F950; [E0 5B A8, 05, 05]
-FAAB; [E0 5B A8, 05, 05]
-F964; [E0 5C 0C, 05, 05]
-F985; [E0 5C 6A, 05, 05]
-2F70; [E0 5C 8A, 05, 09]
-2EAC; [E0 5C 8A, 05, 09][, DB A9, 09]
-2EAD; [E0 5C 8C, 05, 09]
-FA18; [E0 5C 8E, 05, 05]
-FA4C; [E0 5C 92, 05, 05]
-3293; [E0 5C 92, 05, 0D]
-FA4E; [E0 5C A6, 05, 05]
-FA4D; [E0 5C A8, 05, 05]
-FA4F; [E0 5C B6, 05, 05]
-2F953; [E0 5C C2, 05, 05]
-FA50; [E0 5C C2, 05, 05]
-FA51; [E0 5C D0, 05, 05]
-3297; [E0 5C D0, 05, 0D]
-FA19; [E0 5C D2, 05, 05]
-FA1A; [E0 5C E0, 05, 05]
-F93C; [E0 5D 1A, 05, 05]
-1F232; [E0 5D 1E, 05, 37]
-FA52; [E0 5D 36, 05, 05]
-FA53; [E0 5D 38, 05, 05]
-2F956; [E0 5D 3A, 05, 05]
-FA1B; [E0 5D 3A, 05, 05]
-F9B6; [E0 5D 78, 05, 05]
-2F71; [E0 5D 8C, 05, 09]
-2F72; [E0 5D 98, 05, 09]
-F995; [E0 5D B0, 05, 05]
-3299; [E0 5D CC, 05, 0D]
-2F957; [E0 5D F2, 05, 05]
-F956; [E0 5E 5A, 05, 05]
-2F959; [E0 5E A2, 05, 05]
-FA54; [E0 5E A2, 05, 05]
-2F95A; [E0 5E B6, 05, 05]
-2F95B; [E0 5E C0, 05, 05]
-2F73; [E0 5F 10, 05, 09]
-1F233; [E0 5F 1C, 05, 37]
-FA55; [E0 5F 2A, 05, 05]
-FAAC; [E0 5F 8A, 05, 05]
-F9F7; [E0 5F BE, 05, 05]
-2F74; [E0 5F BE, 05, 09]
-2F95F; [E0 60 0A, 05, 05]
-2F75; [E0 60 20, 05, 09]
-2EAE; [E0 60 20, 05, 09][, DB A9, 09]
-F9F8; [E0 60 6E, 05, 05]
-3247; [E0 61 52, 05, 0D]
-FA56; [E0 61 B4, 05, 05]
-FAAD; [E0 61 B4, 05, 05]
-2F962; [E0 61 C0, 05, 05]
-2F963; [E0 61 C6, 05, 05]
-F9A6; [E0 62 B6, 05, 05]
-F944; [E0 62 FA, 05, 05]
-2F76; [E0 63 26, 05, 09]
-FAAE; [E0 63 36, 05, 05]
-F9F9; [E0 63 64, 05, 05]
-FA1D; [E0 63 BC, 05, 05]
-2F966; [E0 63 E4, 05, 05]
-FA03; [E0 63 EC, 05, 05]
-2F969; [E0 64 0C, 05, 05]
-F97B; [E0 64 14, 05, 05]
-2F968; [E0 64 16, 05, 05]
-2F77; [E0 64 36, 05, 09]
-2EAF; [E0 64 38, 05, 09]
-2F96A; [E0 64 46, 05, 05]
-F9CF; [E0 64 66, 05, 05]
-F96A; [E0 64 8A, 05, 05]
-F94F; [E0 64 A4, 05, 05]
-1F221; [E0 64 CA, 05, 37]
-FAAF; [E0 64 FC, 05, 05]
-2F96C; [E0 65 12, 05, 05]
-F93D; [E0 65 8C, 05, 05]
-F957; [E0 65 C8, 05, 05]
-2F96E; [E0 65 DA, 05, 05]
-F996; [E0 66 3A, 05, 05]
-FA57; [E0 66 3A, 05, 05]
-FAB0; [E0 66 3A, 05, 05]
-2F96F; [E0 66 56, 05, 05]
-FA58; [E0 66 64, 05, 05]
-F950; [E0 66 C0, 05, 05]
-FA59; [E0 66 D4, 05, 05]
-2F970; [E0 66 DC, 05, 05]
-2EB0; [E0 67 96, 05, 09]
-2F78; [E0 68 CA, 05, 09]
-FAB1; [E0 68 DA, 05, 05]
-2F79; [E0 69 06, 05, 09]
-2EB2; [E0 69 08, 05, 09]
-2EB5; [E0 69 08, 05, 09][, DB A9, 09]
-2EB1; [E0 69 0A, 05, 09]
-2EB3; [E0 69 0A, 05, 09][, DB A9, 09]
-2EB4; [E0 69 0A, 05, 09][, DB B9, 09]
-FA5A; [E0 69 48, 05, 05]
-F9E6; [E0 69 56, 05, 05]
-2F976; [E0 69 58, 05, 05]
-F90F; [E0 69 6E, 05, 05]
-2F7A; [E0 69 78, 05, 09]
-2EB6; [E0 69 78, 05, 09][, DB A9, 09]
-2EB7; [E0 69 78, 05, 09][, DB B9, 09]
-2EB8; [E0 69 7A, 05, 09]
-2F978; [E0 69 8E, 05, 05]
-F9AF; [E0 69 98, 05, 05]
-FA1E; [E0 69 DE, 05, 05]
-2F7B; [E0 69 DE, 05, 09]
-2F979; [E0 6A 5E, 05, 05]
-
-F934; [E0 6A 6C, 05, 05]
-2F7C; [E0 6A 6C, 05, 09]
-2EB9; [E0 6A 6E, 05, 09]
-2F97A; [E0 6A 74, 05, 05]
-FA5B; [E0 6A 74, 05, 05]
-FAB2; [E0 6A 74, 05, 05]
-2F7D; [E0 6A 82, 05, 09]
-2F7E; [E0 6A 8E, 05, 09]
-2F7F; [E0 6A D0, 05, 09]
-F9B0; [E0 6A F6, 05, 05]
-2F97D; [E0 6B 30, 05, 05]
-F997; [E0 6B 4E, 05, 05]
-2F97F; [E0 6B 50, 05, 05]
-F945; [E0 6B 6C, 05, 05]
-2F80; [E0 6B 6E, 05, 09]
-2EBB; [E0 6B 6E, 05, 09][, DB A9, 09]
-2EBA; [E0 6B 70, 05, 09]
-2F81; [E0 6B 82, 05, 09]
-2EBC; [E0 6B 82, 05, 09][, DB A9, 09]
-F953; [E0 6B 86, 05, 05]
-2F8D6; [E0 6B CA, 05, 05]
-2F982; [E0 6B D4, 05, 05]
-2F983; [E0 6C 7C, 05, 05]
-2F985; [E0 6C F2, 05, 05]
-F926; [E0 6E 32, 05, 05]
-2F82; [E0 6E 48, 05, 09]
-F9F6; [E0 6E 52, 05, 05]
-2F83; [E0 6E 56, 05, 09]
-FA5C; [E0 6E 5C, 05, 05]
-2F84; [E0 6E 68, 05, 09]
-2F85; [E0 6E 7A, 05, 09]
-2EBD; [E0 6E 7A, 05, 09][, DB A9, 09]
-2F893; [E0 6E 84, 05, 05]
-2F98B; [E0 6E 84, 05, 05]
-2F98C; [E0 6E 8A, 05, 05]
-2F86; [E0 6E 9A, 05, 09]
-FA6D; [E0 6E B2, 05, 05]
-2F87; [E0 6E B8, 05, 09]
-2F88; [E0 6E C0, 05, 09]
-2F89; [E0 6F 64, 05, 09]
-F97C; [E0 6F 66, 05, 05]
-2F8A; [E0 6F 6C, 05, 09]
-2F8B; [E0 6F 78, 05, 09]
-FA5D; [E0 6F 7A, 05, 05]
-FA5E; [E0 6F 7A, 05, 05]
-2EBE; [E0 6F 7A, 05, 09]
-2EBF; [E0 6F 7A, 05, 09][, DB A9, 09]
-2EC0; [E0 6F 7A, 05, 09][, DB B9, 09]
-2F990; [E0 6F 9E, 05, 05]
-2F98F; [E0 6F AA, 05, 05]
-2F991; [E0 6F C2, 05, 05]
-2F993; [E0 6F EA, 05, 05]
-2F994; [E0 6F EE, 05, 05]
-2F995; [E0 70 08, 05, 05]
-2F998; [E0 70 58, 05, 05]
-F974; [E0 70 58, 05, 05]
-2F996; [E0 70 5A, 05, 05]
-2F999; [E0 70 C8, 05, 05]
-2F99C; [E0 70 D4, 05, 05]
-F9FE; [E0 70 FA, 05, 05]
-FAB3; [E0 71 38, 05, 05]
-2F9A0; [E0 71 3A, 05, 05]
-2F99A; [E0 71 5A, 05, 05]
-2F99B; [E0 71 EE, 05, 05]
-2F99D; [E0 72 14, 05, 05]
-F93E; [E0 72 2C, 05, 05]
-2F9A1; [E0 72 2E, 05, 05]
-2F9A2; [E0 72 32, 05, 05]
-2F9A3; [E0 72 52, 05, 05]
-2F99E; [E0 72 68, 05, 05]
-FAB4; [E0 72 78, 05, 05]
-F958; [E0 72 7C, 05, 05]
-F918; [E0 73 1A, 05, 05]
-F96E; [E0 73 32, 05, 05]
-2F99F; [E0 73 4E, 05, 05]
-FA5F; [E0 73 4E, 05, 05]
-F999; [E0 74 82, 05, 05]
-2F9A8; [E0 74 88, 05, 05]
-2F9A9; [E0 74 8C, 05, 05]
-F9C2; [E0 74 9E, 05, 05]
-2F9AA; [E0 74 D2, 05, 05]
-2F9AC; [E0 75 74, 05, 05]
-F923; [E0 76 4C, 05, 05]
-F9F0; [E0 76 A6, 05, 05]
-F935; [E0 76 BE, 05, 05]
-FA20; [E0 76 D6, 05, 05]
-F91F; [E0 77 12, 05, 05]
-F910; [E0 77 36, 05, 05]
-2F8C; [E0 77 52, 05, 09]
-2EC1; [E0 77 54, 05, 09]
-2F9B3; [E0 77 58, 05, 05]
-2F9B4; [E0 77 70, 05, 05]
-F936; [E0 77 70, 05, 05]
-2F9B5; [E0 77 86, 05, 05]
-2F9B6; [E0 77 8A, 05, 05]
-2F8D; [E0 77 8E, 05, 09]
-2F9B8; [E0 77 C8, 05, 05]
-2F9B7; [E0 78 10, 05, 05]
-2F9BA; [E0 78 82, 05, 05]
-2F9B9; [E0 78 DA, 05, 05]
-2F9BC; [E0 79 14, 05, 05]
-2F9BD; [E0 79 9A, 05, 05]
-2F9BB; [E0 79 B6, 05, 05]
-FAB5; [E0 79 B6, 05, 05]
-2F9BE; [E0 79 D0, 05, 05]
-F911; [E0 7A 3E, 05, 05]
-2F9C0; [E0 7A 8C, 05, 05]
-2F9C1; [E0 7A CC, 05, 05]
-F927; [E0 7B 0E, 05, 05]
-2F8E; [E0 7B 50, 05, 09]
-FA08; [E0 7B 68, 05, 05]
-2F8F; [E0 7B 68, 05, 09]
-2F9C3; [E0 7B 90, 05, 05]
-2F9C4; [E0 7B 96, 05, 05]
-2F90; [E0 7B 96, 05, 09]
-2EC2; [E0 7B 98, 05, 09]
-F9A0; [E0 7C 5A, 05, 05]
-F9E7; [E0 7C 74, 05, 05]
-2F9C6; [E0 7C 84, 05, 05]
-2F9C7; [E0 7C 92, 05, 05]
-F9E8; [E0 7C 98, 05, 05]
-F912; [E0 7C C6, 05, 05]
-2F9C9; [E0 7C CA, 05, 05]
-FA60; [E0 7C F6, 05, 05]
-FAB6; [E0 7D 5E, 05, 05]
-F924; [E0 7D A4, 05, 05]
-2F91; [E0 7D D8, 05, 09]
-2EC4; [E0 7D DA, 05, 09]
-2EC3; [E0 7D DC, 05, 09]
-FAB7; [E0 7D E8, 05, 05]
-FA0A; [E0 7D F2, 05, 05]
-2F92; [E0 7D F2, 05, 09]
-FA61; [E0 7E 0E, 05, 05]
-FAB8; [E0 7E 0E, 05, 05]
-2EC5; [E0 7E 64, 05, 09]
-2EC6; [E0 7E 86, 05, 09]
-2F93; [E0 7E 86, 05, 09]
-2EC7; [E0 7E 86, 05, 09][, DB A9, 09]
-1F216; [E0 7E A8, 05, 37]
-2F94; [E0 7E E2, 05, 09]
-2F9CF; [E0 80 2E, 05, 05]
-F96F; [E0 80 42, 05, 05]
-F9A1; [E0 80 42, 05, 05]
-FAB9; [E0 80 6C, 05, 05]
-FABB; [E0 80 84, 05, 05]
-F97D; [E0 80 92, 05, 05]
-F941; [E0 80 9A, 05, 05]
-2F9D0; [E0 80 C8, 05, 05]
-FABE; [E0 80 C8, 05, 05]
-FA22; [E0 80 DE, 05, 05]
-FABA; [E0 80 DE, 05, 05]
-F95D; [E0 80 EA, 05, 05]
-FABD; [E0 80 EA, 05, 05]
-FA62; [E0 80 F0, 05, 05]
-FABC; [E0 80 F0, 05, 05]
-FA63; [E0 81 66, 05, 05]
-FABF; [E0 81 66, 05, 05]
-F9FC; [E0 81 A4, 05, 05]
-F95A; [E0 81 F4, 05, 05]
-2F9D1; [E0 82 0E, 05, 05]
-FAC0; [E0 82 0E, 05, 05]
-2EC8; [E0 82 3A, 05, 09]
-2F95; [E0 83 6E, 05, 09]
-2F96; [E0 83 8C, 05, 09]
-F900; [E0 83 90, 05, 05]
-2F9D2; [E0 83 AA, 05, 05]
-2F97; [E0 83 AA, 05, 09]
-2F98; [E0 83 F0, 05, 09]
-2F99; [E0 84 40, 05, 09]
-3296; [E0 84 48, 05, 0D]
-1F223; [E0 84 58, 05, 37]
-2F9D4; [E0 84 5C, 05, 05]
-2F9D5; [E0 84 88, 05, 05]
-F948; [E0 84 8A, 05, 05]
-32AE; [E0 84 94, 05, 0D]
-F903; [E0 84 96, 05, 05]
-FA64; [E0 84 AC, 05, 05]
-FA65; [E0 85 1C, 05, 05]
-FAC1; [E0 85 1C, 05, 05]
-2F9D6; [E0 85 42, 05, 05]
-2EC9; [E0 85 46, 05, 09]
-2F9A; [E0 85 D4, 05, 09]
-2F9B; [E0 85 EC, 05, 09]
-1F230; [E0 85 EC, 05, 37]
-2F9D7; [E0 85 FA, 05, 05]
-2F9C; [E0 86 78, 05, 09]
-2ECA; [E0 86 78, 05, 09][, DB A9, 09]
-2F9DB; [E0 86 8A, 05, 05]
-2F9DA; [E0 86 A8, 05, 05]
-F937; [E0 86 F0, 05, 05]
-2F9DC; [E0 86 F2, 05, 05]
-2F9D; [E0 88 74, 05, 09]
-F902; [E0 88 B2, 05, 05]
-2F9E; [E0 88 B2, 05, 09]
-2F9DE; [E0 88 C6, 05, 05]
-F998; [E0 89 70, 05, 05]
-F9D7; [E0 89 78, 05, 05]
-2F9DF; [E0 89 94, 05, 05]
-FAC2; [E0 89 94, 05, 05]
-FA07; [E0 89 9A, 05, 05]
-F98D; [E0 89 E8, 05, 05]
-2ECB; [E0 89 F0, 05, 09]
-2F9F; [E0 8A 60, 05, 09]
-2F98D; [E0 8A 66, 05, 05]
-F971; [E0 8A 8A, 05, 05]
-2FA0; [E0 8A 8A, 05, 09]
-2FA1; [E0 8A 94, 05, 09]
-FA66; [E0 8A 96, 05, 05]
-2ECC; [E0 8A 96, 05, 09]
-2ECD; [E0 8A 96, 05, 09][, DB A9, 09]
-2ECE; [E0 8A 96, 05, 09][, DB B9, 09]
-F99A; [E0 8B 76, 05, 05]
-FA25; [E0 8B A0, 05, 05]
-FA67; [E0 8B A0, 05, 05]
-1F22B; [E0 8B C4, 05, 37]
-329C; [E0 8C 08, 05, 0D]
-FAC3; [E0 8C 1A, 05, 05]
-F9C3; [E0 8C 2E, 05, 05]
-F913; [E0 8C 54, 05, 05]
-2FA2; [E0 8C 58, 05, 09]
-2ECF; [E0 8C 58, 05, 09][, DB A9, 09]
-2F9E2; [E0 8C 5E, 05, 05]
-F92C; [E0 8C D2, 05, 05]
-FA2E; [E0 8C F2, 05, 05]
-2F9E3; [E0 8D 1E, 05, 05]
-FA26; [E0 8D 36, 05, 05]
-2F9E4; [E0 8D 5E, 05, 05]
-2F9E6; [E0 8D 72, 05, 05]
-2FA3; [E0 8D CE, 05, 09]
-F919; [E0 8E 16, 05, 05]
-FAC4; [E0 8E 74, 05, 05]
-F9B7; [E0 8E AA, 05, 05]
-2FA4; [E0 8E CE, 05, 09]
-F9E9; [E0 8E DA, 05, 05]
-2FA5; [E0 8E DA, 05, 09]
-F97E; [E0 8E E0, 05, 05]
-F90A; [E0 8E E4, 05, 05]
-2FA6; [E0 8E E4, 05, 09]
-328E; [E0 8E E4, 05, 0D]
-F9B1; [E0 8F B0, 05, 05]
-2F9E7; [E0 8F B8, 05, 05]
-FAC5; [E0 90 3A, 05, 05]
-2F9EA; [E0 90 46, 05, 05]
-2F9E8; [E0 90 FC, 05, 05]
-2F9E9; [E0 91 04, 05, 05]
-F93F; [E0 91 5C, 05, 05]
-F99B; [E0 91 E8, 05, 05]
-2F9EB; [E0 93 52, 05, 05]
-2F9EC; [E0 93 8A, 05, 05]
-2ED0; [E0 94 70, 05, 09]
-2ED1; [E0 96 60, 05, 09]
-2FA7; [E0 96 60, 05, 09]
-2ED2; [E0 96 62, 05, 09]
-2ED3; [E0 96 70, 05, 09]
-2FA8; [E0 96 72, 05, 09]
-2F9EE; [E0 96 88, 05, 05]
-F986; [E0 96 CC, 05, 05]
-2F9F0; [E0 96 E0, 05, 05]
-2ED4; [E0 97 48, 05, 09]
-2FA9; [E0 97 B0, 05, 09]
-2ED5; [E0 97 B0, 05, 09][, DB A9, 09]
-2ED6; [E0 97 B2, 05, 09]
-F9C6; [E0 97 D4, 05, 05]
-F951; [E0 98 14, 05, 05]
-FA09; [E0 98 18, 05, 05]
-F959; [E0 98 68, 05, 05]
-F9D3; [E0 98 6E, 05, 05]
-FAC6; [E0 98 76, 05, 05]
-F9DC; [E0 98 8A, 05, 05]
-F9F1; [E0 98 C4, 05, 05]
-2FAA; [E0 98 EA, 05, 09]
-FA2F; [E0 98 EC, 05, 05]
-F9B8; [E0 98 EE, 05, 05]
-2FAB; [E0 98 F0, 05, 09]
-2F9F3; [E0 99 0A, 05, 05]
-F9EA; [E0 99 48, 05, 05]
-FA68; [E0 99 4A, 05, 05]
-FAC7; [E0 99 4A, 05, 05]
-2FAC; [E0 99 54, 05, 09]
-2ED7; [E0 99 54, 05, 09][, DB A9, 09]
-F9B2; [E0 99 70, 05, 05]
-F949; [E0 99 72, 05, 05]
-2F9F5; [E0 99 CA, 05, 05]
-F938; [E0 99 E8, 05, 05]
-F9B3; [E0 9A 1A, 05, 05]
-2FAD; [E0 9A 2C, 05, 09]
-2ED8; [E0 9A 2E, 05, 09]
-FA1C; [E0 9A 36, 05, 05]
-FAC8; [E0 9A 36, 05, 05]
-2FAE; [E0 9A 46, 05, 09]
-2FAF; [E0 9A 4E, 05, 09]
-2FB0; [E0 9A 5C, 05, 09]
-2FB1; [E0 9B 26, 05, 09]
-FAC9; [E0 9B 46, 05, 05]
-2F9FA; [E0 9B 50, 05, 05]
-2ED9; [E0 9B 5C, 05, 09]
-2FB2; [E0 9B 6A, 05, 09]
-2FB3; [E0 9B 76, 05, 09]
-FA69; [E0 9B 8E, 05, 05]
-FACA; [E0 9B 8E, 05, 05]
-2FB4; [E0 9B 92, 05, 09]
-32A0; [E0 9B 9A, 05, 0D]
-2F9FE; [E0 9B A6, 05, 05]
-2F9FF; [E0 9B A6, 05, 05]
-FACB; [E0 9B A6, 05, 05]
-F9B4; [E0 9B C0, 05, 05]
-2FA00; [E0 9B E2, 05, 05]
-FA6A; [E0 9C 0C, 05, 05]
-FACC; [E0 9C 0C, 05, 05]
-F9D0; [E0 9C 52, 05, 05]
-2EDA; [E0 9C 80, 05, 09]
-2FB5; [E0 9C E6, 05, 09]
-2EDB; [E0 9D 38, 05, 09]
-2FB6; [E0 9D 52, 05, 09]
-2EDC; [E0 9D 58, 05, 09]
-2EDD; [E0 9D 5A, 05, 09]
-2FB7; [E0 9D 5A, 05, 09]
-2EDF; [E0 9D 5C, 05, 09]
-2EDE; [E0 9D 5C, 05, 09][, DB A9, 09]
-2FA02; [E0 9D 60, 05, 05]
-FA2A; [E0 9D 7A, 05, 05]
-FA2B; [E0 9D 94, 05, 05]
-FA2C; [E0 9D EC, 05, 05]
-2FA04; [E0 9D EE, 05, 05]
-2EE0; [E0 9E 68, 05, 09]
-2FB8; [E0 9E CE, 05, 09]
-2EE1; [E0 9E CE, 05, 09][, DB A9, 09]
-2FB9; [E0 9E D4, 05, 09]
-2FA05; [E0 9E F0, 05, 05]
-2FBA; [E0 9E FA, 05, 09]
-2FA06; [E0 9F 2C, 05, 05]
-F91A; [E0 9F 8A, 05, 05]
-2FA07; [E0 9F A4, 05, 05]
-F987; [E0 A0 82, 05, 05]
-2EE2; [E0 A0 86, 05, 09]
-2FBB; [E0 A1 04, 05, 09]
-2EE3; [E0 A1 04, 05, 09][, DB A9, 09]
-2FBC; [E0 A1 64, 05, 09]
-2FBD; [E0 A1 72, 05, 09]
-2FA0A; [E0 A1 D8, 05, 05]
-FACD; [E0 A1 D8, 05, 05]
-2FBE; [E0 A2 04, 05, 09]
-2FBF; [E0 A2 18, 05, 09]
-2FC0; [E0 A2 1E, 05, 09]
-2FC1; [E0 A2 32, 05, 09]
-2EE4; [E0 A2 32, 05, 09][, DB A9, 09]
-2FC2; [E0 A2 6E, 05, 09]
-F939; [E0 A2 98, 05, 05]
-2FA0B; [E0 A4 46, 05, 05]
-F9F2; [E0 A4 74, 05, 05]
-2EE5; [E0 A4 BE, 05, 09]
-2FC3; [E0 A5 96, 05, 09]
-2FA0C; [E0 A5 C6, 05, 05]
-2FA0F; [E0 A6 A0, 05, 05]
-FA2D; [E0 A7 40, 05, 05]
-F93A; [E0 A7 CC, 05, 05]
-F920; [E0 A8 1A, 05, 05]
-2EE6; [E0 A8 1C, 05, 09]
-2FC4; [E0 A8 C8, 05, 09]
-2EE7; [E0 A8 C8, 05, 09][, DB A9, 09]
-F940; [E0 A8 DC, 05, 05]
-2FC5; [E0 A8 DC, 05, 09]
-F988; [E0 A9 12, 05, 05]
-F9F3; [E0 A9 22, 05, 05]
-2FC6; [E0 A9 2E, 05, 09]
-2EE8; [E0 A9 30, 05, 09]
-2FA15; [E0 A9 5A, 05, 05]
-2FC7; [E0 A9 5A, 05, 09]
-2FC8; [E0 A9 6A, 05, 09]
-2EE9; [E0 A9 6C, 05, 09]
-2FC9; [E0 A9 7E, 05, 09]
-F989; [E0 A9 80, 05, 05]
-2FCA; [E0 A9 86, 05, 09]
-2FA17; [E0 A9 D6, 05, 05]
-2FCB; [E0 A9 D6, 05, 09]
-2FCC; [E0 A9 DE, 05, 09]
-2FA18; [E0 A9 E0, 05, 05]
-2EEA; [E0 A9 E0, 05, 09]
-2FA19; [E0 A9 EE, 05, 05]
-2FCD; [E0 AA 06, 05, 09]
-2FA1A; [E0 AA 08, 05, 05]
-2FCE; [E0 AA 10, 05, 09]
-2FA1B; [E0 AA 16, 05, 05]
-2FCF; [E0 AA 2A, 05, 09]
-2FA1C; [E0 AA 60, 05, 05]
-2FD0; [E0 AA 60, 05, 09]
-FAD8; [E0 AA 70, 05, 05]
-2FD1; [E0 AA 7E, 05, 09]
-2EEB; [E0 AA 7E, 05, 09][, DB A9, 09]
-2EEC; [E0 AA 8A, 05, 09]
-2FD2; [E0 AA 8E, 05, 09]
-2EED; [E0 AA 8E, 05, 09][, DB A9, 09]
-2EEE; [E0 AA E8, 05, 09]
-F9C4; [E0 AB 0A, 05, 05]
-2FD3; [E0 AB 0A, 05, 09]
-2EEF; [E0 AB 0A, 05, 09][, DB A9, 09]
-FAD9; [E0 AB 0C, 05, 05]
-2EF0; [E0 AB 22, 05, 09]
-F907; [E0 AB 28, 05, 05]
-F908; [E0 AB 28, 05, 05]
-FACE; [E0 AB 28, 05, 05]
-2FD4; [E0 AB 28, 05, 09]
-2EF1; [E0 AB 28, 05, 09][, DB A9, 09]
-2EF2; [E0 AB 28, 05, 09][, DB B9, 09]
-2EF3; [E0 AB 2E, 05, 09]
-2FD5; [E0 AB 30, 05, 09]
-FA0E; [E0 AB 8A, 05, 05]
-FA0F; [E0 AB 8C, 05, 05]
-FA11; [E0 AB 90, 05, 05]
-FA13; [E0 AB 94, 05, 05]
-FA14; [E0 AB 96, 05, 05]
-FA1F; [E0 AB AC, 05, 05]
-FA21; [E0 AB B0, 05, 05]
-FA23; [E0 AB B4, 05, 05]
-FA24; [E0 AB B6, 05, 05]
-FA27; [E0 AB BC, 05, 05]
-FA28; [E0 AB BE, 05, 05]
-FA29; [E0 AB C0, 05, 05]
-
-2F80C; [E0 AD 16, 05, 05]
-2F813; [E0 AD 4C, 05, 05]
-2F9CA; [E0 AD 50, 05, 05]
-2F81F; [E0 AD 98, 05, 05]
-2F824; [E0 AE 0A, 05, 05]
-2F867; [E0 B1 CE, 05, 05]
-2F868; [E0 B1 EA, 05, 05]
-2F876; [E0 B2 FA, 05, 05]
-2F883; [E0 B4 62, 05, 05]
-2F888; [E0 B4 C8, 05, 05]
-2F88A; [E0 B4 FC, 05, 05]
-2F896; [E0 B5 98, 05, 05]
-2F89B; [E0 B5 D0, 05, 05]
-2F8A2; [E0 B6 48, 05, 05]
-2F8A1; [E0 B6 84, 05, 05]
-2F8C2; [E0 B8 78, 05, 05]
-2F8C7; [E0 B8 F4, 05, 05]
-2F8D1; [E0 B9 EA, 05, 05]
-2F8D0; [E0 BA 38, 05, 05]
-2F8CE; [E0 BA 5A, 05, 05]
-2F8DE; [E0 BA BA, 05, 05]
-2F8E7; [E0 BB 68, 05, 05]
-FAD2; [E0 BB 68, 05, 05]
-2F8EE; [E0 BC 64, 05, 05]
-2F8F2; [E0 BC D0, 05, 05]
-2F90A; [E0 BE A6, 05, 05]
-2F916; [E0 BF 72, 05, 05]
-2F92A; [E0 C1 AA, 05, 05]
-2F92C; [E0 C1 C2, 05, 05]
-2F92D; [E0 C1 C2, 05, 05]
-2F933; [E0 C2 8E, 05, 05]
-2F93E; [E0 C4 5C, 05, 05]
-2F93F; [E0 C4 74, 05, 05]
-FAD3; [E0 C4 94, 05, 05]
-2F949; [E0 C4 D6, 05, 05]
-FAD4; [E0 C4 D6, 05, 05]
-2F94B; [E0 C4 F0, 05, 05]
-2F94C; [E0 C5 96, 05, 05]
-2F951; [E0 C6 36, 05, 05]
-2F958; [E0 C6 CE, 05, 05]
-2F960; [E0 C8 80, 05, 05]
-2F964; [E0 C8 CA, 05, 05]
-2F967; [E0 C9 C2, 05, 05]
-2F96D; [E0 CA 8A, 05, 05]
-2F971; [E0 CA F0, 05, 05]
-2F974; [E0 CB 40, 05, 05]
-2F981; [E0 CC 3E, 05, 05]
-2F8D7; [E0 CC 46, 05, 05]
-2F984; [E0 CC AA, 05, 05]
-2F98E; [E0 CD 70, 05, 05]
-2F9A7; [E0 CE F6, 05, 05]
-2F9AE; [E0 CF 60, 05, 05]
-2F9AF; [E0 CF 68, 05, 05]
-2F9B2; [E0 CF 7C, 05, 05]
-2F9BF; [E0 D0 5A, 05, 05]
-2F9C2; [E0 D0 9E, 05, 05]
-2F9C8; [E0 D1 1C, 05, 05]
-2F9CD; [E0 D2 34, 05, 05]
-2F9CE; [E0 D2 46, 05, 05]
-2F9EF; [E0 D8 06, 05, 05]
-2F9F2; [E0 D8 A8, 05, 05]
-2F9F8; [E0 D9 BE, 05, 05]
-2F9F9; [E0 D9 CE, 05, 05]
-2F9FC; [E0 DA 4C, 05, 05]
-2FA03; [E0 DB 54, 05, 05]
-2FA08; [E0 DC 90, 05, 05]
-2FA0D; [E0 DE 9C, 05, 05]
-2FA0E; [E0 DE DA, 05, 05]
-2FA11; [E0 DE F0, 05, 05]
-2FA16; [E0 DF B2, 05, 05]
-
-2F803; [E1 30 45 C8, 05, 05]
-2F812; [E1 30 B6 E4, 05, 05]
-2F91B; [E1 30 B7 E4, 05, 05]
-2F816; [E1 30 BC 20, 05, 05]
-2F80D; [E1 30 D6 AC, 05, 05]
-2F9D9; [E1 31 0E 90, 05, 05]
-2F9DD; [E1 31 26 C8, 05, 05]
-2F834; [E1 31 4B E4, 05, 05]
-2F838; [E1 31 6E 74, 05, 05]
-2F859; [E1 32 81 C8, 05, 05]
-2F860; [E1 32 B4 04, 05, 05]
-2F861; [E1 32 BB 58, 05, 05]
-2F86C; [E1 33 11 E4, 05, 05]
-2F871; [E1 33 37 3C, 05, 05]
-2F8F8; [E1 33 6E AC, 05, 05]
-2F87B; [E1 33 86 C8, 05, 05]
-2F87D; [E1 33 87 04, 05, 05]
-2F889; [E1 33 ED C8, 05, 05]
-2F939; [E1 33 F0 E4, 05, 05]
-2F891; [E1 34 22 90, 05, 05]
-2F892; [E1 34 22 90, 05, 05]
-2F8A4; [E1 34 8A 04, 05, 05]
-FAD0; [E1 34 B2 E4, 05, 05]
-FACF; [E1 34 B3 90, 05, 05]
-2F8B8; [E1 35 07 04, 05, 05]
-2F8BE; [E1 35 20 74, 05, 05]
-2F8CA; [E1 35 95 04, 05, 05]
-2F897; [E1 35 E1 3C, 05, 05]
-2F980; [E1 35 F3 C8, 05, 05]
-2F989; [E1 35 F9 90, 05, 05]
-2F98A; [E1 35 FA 90, 05, 05]
-2F8DD; [E1 35 FE E4, 05, 05]
-FAD1; [E1 36 05 E4, 05, 05]
-2F8E3; [E1 36 16 C8, 05, 05]
-2F8EC; [E1 36 55 AC, 05, 05]
-2F8F0; [E1 36 8F 04, 05, 05]
-2F8F7; [E1 36 C5 04, 05, 05]
-2F8F9; [E1 36 D1 20, 05, 05]
-2F8FB; [E1 37 08 20, 05, 05]
-2F906; [E1 37 13 04, 05, 05]
-2F90D; [E1 37 43 58, 05, 05]
-2F910; [E1 37 53 04, 05, 05]
-2F911; [E1 37 58 58, 05, 05]
-2F91D; [E1 37 A8 E4, 05, 05]
-FA6C; [E1 37 B8 58, 05, 05]
-2F91F; [E1 37 CD 58, 05, 05]
-2F923; [E1 38 15 90, 05, 05]
-2F926; [E1 38 37 04, 05, 05]
-2F927; [E1 38 4F C8, 05, 05]
-2F935; [E1 38 C5 58, 05, 05]
-2F937; [E1 38 CF 90, 05, 05]
-2F93B; [E1 39 2B 90, 05, 05]
-2F93C; [E1 39 2E 20, 05, 05]
-2F93D; [E1 39 3D AC, 05, 05]
-2F942; [E1 39 51 04, 05, 05]
-2F941; [E1 39 51 20, 05, 05]
-2F943; [E1 39 55 58, 05, 05]
-2F944; [E1 39 58 3C, 05, 05]
-FAD5; [E1 39 77 20, 05, 05]
-2F94D; [E1 39 AB 20, 05, 05]
-2F952; [E1 39 E5 04, 05, 05]
-2F954; [E1 39 F1 E4, 05, 05]
-2F955; [E1 39 F6 AC, 05, 05]
-2F95C; [E1 3A 48 E4, 05, 05]
-2F95D; [E1 3A 6A 20, 05, 05]
-2F95E; [E1 3A 6A 20, 05, 05]
-2F961; [E1 3A 87 04, 05, 05]
-2F965; [E1 3A 9E AC, 05, 05]
-FAD6; [E1 3A A7 90, 05, 05]
-2F96B; [E1 3A F4 AC, 05, 05]
-2F898; [E1 3B 3B E4, 05, 05]
-2F972; [E1 3B 44 90, 05, 05]
-2F973; [E1 3B 48 04, 05, 05]
-2F975; [E1 3B 58 3C, 05, 05]
-2F977; [E1 3B 63 74, 05, 05]
-2F97B; [E1 3B 91 3C, 05, 05]
-2F97C; [E1 3B 99 58, 05, 05]
-2F97E; [E1 3B A8 20, 05, 05]
-2F987; [E1 3B E0 E4, 05, 05]
-2F988; [E1 3B E2 74, 05, 05]
-2F997; [E1 3C 4B C8, 05, 05]
-2F9A4; [E1 3C 67 90, 05, 05]
-2F9A6; [E1 3C 79 3C, 05, 05]
-2F9A5; [E1 3C 89 E4, 05, 05]
-2F9AD; [E1 3C BB C8, 05, 05]
-2F9B0; [E1 3C CA 90, 05, 05]
-2F9B1; [E1 3C EA AC, 05, 05]
-2F9AB; [E1 3D 44 20, 05, 05]
-2F9C5; [E1 3D 8E 74, 05, 05]
-2F9CB; [E1 3D CF 3C, 05, 05]
-2F9CC; [E1 3D E3 AC, 05, 05]
-2F9D3; [E1 3E 45 58, 05, 05]
-FAD7; [E1 3E 83 04, 05, 05]
-2F9D8; [E1 3E 8D 3C, 05, 05]
-
-2F9E0; [E1 3F 4F 04, 05, 05]
-2F9E1; [E1 3F 52 04, 05, 05]
-2F9E5; [E1 3F 75 AC, 05, 05]
-2F9ED; [E1 3F FE 20, 05, 05]
-2F9F1; [E1 40 2D 74, 05, 05]
-2F9F6; [E1 40 99 AC, 05, 05]
-2F81C; [E1 40 AA C8, 05, 05]
-2F9F7; [E1 40 B1 58, 05, 05]
-2F9FB; [E1 40 E8 74, 05, 05]
-2F9FD; [E1 40 F8 04, 05, 05]
-2FA01; [E1 41 1D 04, 05, 05]
-2FA09; [E1 41 B8 C8, 05, 05]
-2FA10; [E1 42 5D 90, 05, 05]
-2FA12; [E1 42 63 AC, 05, 05]
-2FA13; [E1 42 81 20, 05, 05]
-2FA14; [E1 42 8F AC, 05, 05]
-2F88F; [E1 42 AC 3C, 05, 05]
-2FA1D; [E1 42 F1 58, 05, 05]
+13412; [77 F8 2B, 05, 05]
+
+13413; [77 F8 33, 05, 05]
+
+13414; [77 F8 3B, 05, 05]
+
+13415; [77 F8 43, 05, 05]
+
+13416; [77 F8 4B, 05, 05]
+
+13417; [77 F8 53, 05, 05]
+
+13418; [77 F8 5B, 05, 05]
+
+13419; [77 F8 63, 05, 05]
+
+1341A; [77 F8 6B, 05, 05]
+
+1341B; [77 F8 73, 05, 05]
+
+1341C; [77 F8 7B, 05, 05]
+
+1341D; [77 F8 83, 05, 05]
+
+1341E; [77 F8 8B, 05, 05]
+
+1341F; [77 F8 93, 05, 05]
+
+13420; [77 F8 9B, 05, 05]
+
+13421; [77 F8 A3, 05, 05]
+
+13422; [77 F8 AB, 05, 05]
+
+13423; [77 F8 B3, 05, 05]
+
+13424; [77 F8 BB, 05, 05]
+
+13425; [77 F8 C3, 05, 05]
+
+13426; [77 F8 CB, 05, 05]
+
+13427; [77 F8 D3, 05, 05]
+
+13428; [77 F8 DB, 05, 05]
+
+13429; [77 F8 E3, 05, 05]
+
+1342A; [77 F8 EB, 05, 05]
+
+1342B; [77 F8 F3, 05, 05]
+
+1342C; [77 F8 FB, 05, 05]
+
+1342D; [77 F9 05, 05, 05]
+
+1342E; [77 F9 0D, 05, 05]
+
+FDD1 109A0;    [77 F9 36, 05, 05]      # Meroitic_Cursive first primary
+
+FDD1 10980;    [77 F9 36, 05, 05]      # Meroitic_Hieroglyphs first primary
+
+109A0; [77 F9 5F, 05, 05]
+10980; [77 F9 5F, 70, 20]
+
+109A1; [77 F9 67, 05, 05]
+10981; [77 F9 67, 70, 20]
+
+109A2; [77 F9 6F, 05, 05]
+10982; [77 F9 6F, 70, 20]
+
+109A3; [77 F9 77, 05, 05]
+10983; [77 F9 77, 70, 20]
+
+109A4; [77 F9 7F, 05, 05]
+10984; [77 F9 7F, 70, 20]
+
+109A5; [77 F9 87, 05, 05]
+10985; [77 F9 87, 70, 20]
+
+109A6; [77 F9 8F, 05, 05]
+10986; [77 F9 8F, 70, 20]
+10987; [77 F9 8F, 78, 20]
+
+109A7; [77 F9 97, 05, 05]
+10988; [77 F9 97, 70, 20]
+
+109A8; [77 F9 9F, 05, 05]
+10989; [77 F9 9F, 70, 20]
+
+109A9; [77 F9 A7, 05, 05]
+1098A; [77 F9 A7, 70, 20]
+1098B; [77 F9 A7, 78, 20]
+
+109AA; [77 F9 AF, 05, 05]
+1098C; [77 F9 AF, 70, 20]
+1098D; [77 F9 AF, 78, 20]
+
+109AB; [77 F9 B7, 05, 05]
+1098E; [77 F9 B7, 70, 20]
+1098F; [77 F9 B7, 78, 20]
+
+109AC; [77 F9 BF, 05, 05]
+10990; [77 F9 BF, 70, 20]
+
+109AD; [77 F9 C7, 05, 05]
+10991; [77 F9 C7, 70, 20]
+
+109AE; [77 F9 CF, 05, 05]
+10992; [77 F9 CF, 70, 20]
+
+109AF; [77 F9 D7, 05, 05]
+109B0; [77 F9 D7, 70, 20]
+10993; [77 F9 D7, 75, 20]
+10994; [77 F9 D7, 7A, 20]
+
+109B1; [77 F9 DF, 05, 05]
+10995; [77 F9 DF, 70, 20]
+
+109B2; [77 F9 E7, 05, 05]
+10996; [77 F9 E7, 70, 20]
+
+109B3; [77 F9 EF, 05, 05]
+10997; [77 F9 EF, 70, 20]
+
+109B4; [77 F9 F7, 05, 05]
+10998; [77 F9 F7, 70, 20]
+10999; [77 F9 F7, 78, 20]
+
+109B5; [77 F9 FF, 05, 05]
+1099A; [77 F9 FF, 70, 20]
+1099B; [77 F9 FF, 78, 20]
+
+109B6; [77 FA 09, 05, 05]
+1099C; [77 FA 09, 70, 20]
+
+109B7; [77 FA 11, 05, 05]
+1099D; [77 FA 11, 70, 20]
+
+109BE; [77 FA 19, 05, 05]
+
+109BF; [77 FA 21, 05, 05]
+
+1099E; [77 FA 29, 05, 05]
+
+1099F; [77 FA 31, 05, 05]
+
+FDD1 5B57;     [78 02 02, 05, 05]      # HAN first primary starts reordering group
+
+2F00; [U+4E00, 10]
+3280; [U+4E00, 1B]
+3192; [U+4E00, 26]
+1F229; [U+4E00, 31]
+319C; [U+4E01, 26]
+3286; [U+4E03, 1B]
+3282; [U+4E09, 1B]
+3194; [U+4E09, 26]
+1F22A; [U+4E09, 31]
+32A4; [U+4E0A, 1B]
+3196; [U+4E0A, 26]
+32A6; [U+4E0B, 1B]
+3198; [U+4E0B, 26]
+F967; [U+4E0D]
+319B; [U+4E19, 26]
+FA70; [U+4E26]
+2F01; [U+4E28, 10]
+2EA6; [U+4E2C, 10]
+32A5; [U+4E2D, 1B]
+3197; [U+4E2D, 26]
+1F22D; [U+4E2D, 31]
+F905; [U+4E32]
+2F02; [U+4E36, 10]
+2E80; [U+4E36, 70, 20]
+2F801; [U+4E38]
+F95E; [U+4E39]
+2F800; [U+4E3D]
+2F03; [U+4E3F, 10]
+2F802; [U+4E41]
+2F04; [U+4E59, 10]
+319A; [U+4E59, 26]
+2E84; [U+4E59, 70, 20]
+2E83; [U+4E5A, 10]
+2E82; [U+4E5B, 10]
+3288; [U+4E5D, 1B]
+F91B; [U+4E82]
+2F05; [U+4E85, 10]
+F9BA; [U+4E86]
+2F06; [U+4E8C, 10]
+3281; [U+4E8C, 1B]
+3193; [U+4E8C, 26]
+1F214; [U+4E8C, 31]
+3284; [U+4E94, 1B]
+2F07; [U+4EA0, 10]
+1F218; [U+4EA4, 31]
+F977; [U+4EAE]
+2F08; [U+4EBA, 10]
+319F; [U+4EBA, 26]
+2E85; [U+4EBB, 10]
+F9FD; [U+4EC0]
+2F819; [U+4ECC]
+F9A8; [U+4EE4]
+32AD; [U+4F01, 1B]
+32A1; [U+4F11, 1B]
+2F804; [U+4F60]
+FA73; [U+4F80]
+F92D; [U+4F86]
+F9B5; [U+4F8B]
+2F805; [U+4FAE]
+FA30; [U+4FAE]
+2F806; [U+4FBB]
+F965; [U+4FBF]
+2F807; [U+5002]
+F9D4; [U+502B]
+2F808; [U+507A]
+2F809; [U+5099]
+2F80B; [U+50CF]
+F9BB; [U+50DA]
+2F80A; [U+50E7]
+FA31; [U+50E7]
+329D; [U+512A, 1B]
+2F09; [U+513F, 10]
+FA0C; [U+5140]
+FA74; [U+5145]
+2F80E; [U+514D]
+FA32; [U+514D]
+2F80F; [U+5154]
+2F810; [U+5164]
+2F0A; [U+5165, 10]
+2F814; [U+5167]
+FA72; [U+5168]
+F978; [U+5169]
+2F0B; [U+516B, 10]
+3287; [U+516B, 1B]
+F9D1; [U+516D]
+3285; [U+516D, 1B]
+2F811; [U+5177]
+FA75; [U+5180]
+2F0C; [U+5182, 10]
+2E86; [U+5182, 70, 20]
+2F815; [U+518D]
+1F21E; [U+518D, 31]
+2F8D2; [U+5192]
+2F8D3; [U+5195]
+2F0D; [U+5196, 10]
+2F817; [U+5197]
+32A2; [U+5199, 1B]
+2F818; [U+51A4]
+2F0E; [U+51AB, 10]
+2F81A; [U+51AC]
+2F81B; [U+51B5]
+FA71; [U+51B5]
+F92E; [U+51B7]
+F979; [U+51C9]
+F955; [U+51CC]
+F954; [U+51DC]
+FA15; [U+51DE]
+2F0F; [U+51E0, 10]
+2E87; [U+51E0, 70, 20]
+2F81D; [U+51F5]
+2F10; [U+51F5, 10]
+2F11; [U+5200, 10]
+2E88; [U+5200, 70, 20]
+2E89; [U+5202, 10]
+2F81E; [U+5203]
+2F850; [U+5207]
+FA00; [U+5207]
+F99C; [U+5217]
+1F220; [U+521D, 31]
+F9DD; [U+5229]
+F9FF; [U+523A]
+2F820; [U+523B]
+2F821; [U+5246]
+1F21C; [U+524D, 31]
+2F822; [U+5272]
+1F239; [U+5272, 31]
+2F823; [U+5277]
+F9C7; [U+5289]
+F98A; [U+529B]
+2F12; [U+529B, 10]
+F99D; [U+52A3]
+2F992; [U+52B3]
+3298; [U+52B4, 1B]
+2F825; [U+52C7]
+FA76; [U+52C7]
+2F826; [U+52C9]
+FA33; [U+52C9]
+F952; [U+52D2]
+F92F; [U+52DE]
+2F827; [U+52E4]
+FA34; [U+52E4]
+F97F; [U+52F5]
+2F13; [U+52F9, 10]
+2F828; [U+52FA]
+FA77; [U+52FA]
+2F829; [U+5305]
+2F82A; [U+5306]
+2F14; [U+5315, 10]
+2F82B; [U+5317]
+F963; [U+5317]
+2F15; [U+531A, 10]
+2F16; [U+5338, 10]
+32A9; [U+533B, 1B]
+F9EB; [U+533F]
+2F17; [U+5341, 10]
+3038; [U+5341, 10]
+3289; [U+5341, 1B]
+3039; [U+5344, 10]
+303A; [U+5345, 10]
+2F82C; [U+5349]
+2F82D; [U+5351]
+FA35; [U+5351]
+32AF; [U+5354, 1B]
+2F82E; [U+535A]
+2F18; [U+535C, 10]
+2E8A; [U+535C, 70, 20]
+2F19; [U+5369, 10]
+2E8B; [U+5369, 70, 20]
+329E; [U+5370, 1B]
+2F82F; [U+5373]
+F91C; [U+5375]
+2F830; [U+537D]
+2F831; [U+537F]
+2F832; [U+537F]
+2F833; [U+537F]
+2F1A; [U+5382, 10]
+2E81; [U+5382, 70, 20]
+2F1B; [U+53B6, 10]
+F96B; [U+53C3]
+2F1C; [U+53C8, 10]
+2F836; [U+53CA]
+1F212; [U+53CC, 31]
+2F837; [U+53DF]
+2F1D; [U+53E3, 10]
+F906; [U+53E5]
+2F839; [U+53EB]
+1F251; [U+53EF, 1B]
+2F83A; [U+53F1]
+32A8; [U+53F3, 1B]
+1F22E; [U+53F3, 31]
+2F83B; [U+5406]
+1F234; [U+5408, 31]
+3294; [U+540D, 1B]
+F9DE; [U+540F]
+F9ED; [U+541D]
+2F83D; [U+5438]
+1F225; [U+5439, 31]
+F980; [U+5442]
+2F83E; [U+5448]
+2F83F; [U+5468]
+2F83C; [U+549E]
+2F840; [U+54A2]
+F99E; [U+54BD]
+2F841; [U+54F6]
+2F842; [U+5510]
+3244; [U+554F, 1B]
+2F843; [U+5553]
+FA79; [U+5555]
+2F844; [U+5563]
+2F845; [U+5584]
+2F846; [U+5584]
+F90B; [U+5587]
+2F847; [U+5599]
+FA7A; [U+5599]
+FA36; [U+559D]
+FA78; [U+559D]
+2F848; [U+55AB]
+2F849; [U+55B3]
+1F23A; [U+55B6, 31]
+FA0D; [U+55C0]
+2F84A; [U+55C2]
+FA7B; [U+55E2]
+2F84C; [U+5606]
+FA37; [U+5606]
+2F84E; [U+5651]
+FA38; [U+5668]
+2F84F; [U+5674]
+2F1E; [U+56D7, 10]
+3283; [U+56DB, 1B]
+3195; [U+56DB, 26]
+F9A9; [U+56F9]
+2F84B; [U+5716]
+2F84D; [U+5717]
+2F1F; [U+571F, 10]
+328F; [U+571F, 1B]
+319E; [U+5730, 26]
+2F855; [U+578B]
+2F852; [U+57CE]
+2F853; [U+57F4]
+2F854; [U+580D]
+2F857; [U+5831]
+2F856; [U+5832]
+FA39; [U+5840]
+FA10; [U+585A]
+FA7C; [U+585A]
+F96C; [U+585E]
+FA3A; [U+58A8]
+2F858; [U+58AC]
+FA7D; [U+58B3]
+F94A; [U+58D8]
+F942; [U+58DF]
+2F20; [U+58EB, 10]
+2F851; [U+58EE]
+1F224; [U+58F0, 31]
+2F85A; [U+58F2]
+2F85B; [U+58F7]
+2F21; [U+5902, 10]
+2F85C; [U+5906]
+2F22; [U+590A, 10]
+2F23; [U+5915, 10]
+2F85D; [U+591A]
+1F215; [U+591A, 31]
+32B0; [U+591C, 1B]
+2F85E; [U+5922]
+2F24; [U+5927, 10]
+337D; [U+5927, 31][U+6B63, 31]
+319D; [U+5929, 26]
+1F217; [U+5929, 31]
+FA7E; [U+5944]
+F90C; [U+5948]
+F909; [U+5951]
+FA7F; [U+5954]
+2F85F; [U+5962]
+F981; [U+5973]
+2F25; [U+5973, 10]
+329B; [U+5973, 1B]
+2F865; [U+59D8]
+2F862; [U+59EC]
+2F863; [U+5A1B]
+2F864; [U+5A27]
+FA80; [U+5A62]
+2F866; [U+5A66]
+2F986; [U+5AB5]
+2F869; [U+5B08]
+FA81; [U+5B28]
+2F86A; [U+5B3E]
+2F86B; [U+5B3E]
+2F26; [U+5B50, 10]
+1F211; [U+5B57, 31]
+32AB; [U+5B66, 1B]
+2F27; [U+5B80, 10]
+FA04; [U+5B85]
+32AA; [U+5B97, 1B]
+2F86D; [U+5BC3]
+2F86E; [U+5BD8]
+2F86F; [U+5BE7]
+F95F; [U+5BE7]
+F9AA; [U+5BE7]
+F9BC; [U+5BEE]
+2F870; [U+5BF3]
+2F28; [U+5BF8, 10]
+2F872; [U+5BFF]
+2F873; [U+5C06]
+2F29; [U+5C0F, 10]
+2E8C; [U+5C0F, 70, 20]
+2E8D; [U+5C0F, 78, 20]
+2F875; [U+5C22]
+2E90; [U+5C22, 10]
+2F2A; [U+5C22, 10]
+2E8E; [U+5C22, 70, 20]
+2E8F; [U+5C23, 10]
+2E91; [U+5C23, 70, 20]
+2F2B; [U+5C38, 10]
+F9BD; [U+5C3F]
+2F877; [U+5C60]
+F94B; [U+5C62]
+FA3B; [U+5C64]
+F9DF; [U+5C65]
+2F878; [U+5C6E]
+FA3C; [U+5C6E]
+2F2C; [U+5C6E, 10]
+2F2D; [U+5C71, 10]
+2F87A; [U+5C8D]
+2F879; [U+5CC0]
+F9D5; [U+5D19]
+2F87C; [U+5D43]
+F921; [U+5D50]
+2F87F; [U+5D6B]
+2F87E; [U+5D6E]
+2F880; [U+5D7C]
+2F9F4; [U+5DB2]
+F9AB; [U+5DBA]
+2F2E; [U+5DDB, 10]
+2F881; [U+5DE1]
+2F882; [U+5DE2]
+2F2F; [U+5DE5, 10]
+32A7; [U+5DE6, 1B]
+1F22C; [U+5DE6, 31]
+2F30; [U+5DF1, 10]
+2E92; [U+5DF3, 10]
+2F884; [U+5DFD]
+2F31; [U+5DFE, 10]
+2F885; [U+5E28]
+2F886; [U+5E3D]
+2F887; [U+5E69]
+2F32; [U+5E72, 10]
+337B; [U+5E73, 31][U+6210, 31]
+F98E; [U+5E74]
+2E93; [U+5E7A, 10]
+2F33; [U+5E7A, 10]
+3245; [U+5E7C, 1B]
+2F34; [U+5E7F, 10]
+FA01; [U+5EA6]
+2F88B; [U+5EB0]
+2F88C; [U+5EB3]
+2F88D; [U+5EB6]
+F9A2; [U+5EC9]
+2F88E; [U+5ECA]
+F928; [U+5ECA]
+FA82; [U+5ED2]
+FA0B; [U+5ED3]
+FA83; [U+5ED9]
+F982; [U+5EEC]
+2F35; [U+5EF4, 10]
+2F890; [U+5EFE]
+2F36; [U+5EFE, 10]
+F943; [U+5F04]
+2F37; [U+5F0B, 10]
+2F38; [U+5F13, 10]
+2F894; [U+5F22]
+2F895; [U+5F22]
+2F39; [U+5F50, 10]
+2E95; [U+5F50, 70, 20]
+2E94; [U+5F51, 10]
+2F874; [U+5F53]
+2F3A; [U+5F61, 10]
+2F899; [U+5F62]
+FA84; [U+5F69]
+2F89A; [U+5F6B]
+2F3B; [U+5F73, 10]
+F9D8; [U+5F8B]
+1F21D; [U+5F8C, 31]
+1F250; [U+5F97, 1B]
+2F89C; [U+5F9A]
+F966; [U+5FA9]
+FA85; [U+5FAD]
+2F3C; [U+5FC3, 10]
+2E97; [U+5FC3, 70, 20]
+2E96; [U+5FC4, 10]
+2F89D; [U+5FCD]
+2F89E; [U+5FD7]
+F9A3; [U+5FF5]
+2F89F; [U+5FF9]
+F960; [U+6012]
+F9AC; [U+601C]
+FA6B; [U+6075]
+2F8A0; [U+6081]
+2F8A3; [U+6094]
+FA3D; [U+6094]
+2F8A5; [U+60C7]
+FA86; [U+60D8]
+F9B9; [U+60E1]
+FA88; [U+6108]
+F9D9; [U+6144]
+2F8A6; [U+6148]
+2F8A7; [U+614C]
+2F8A9; [U+614C]
+2F8A8; [U+614E]
+FA87; [U+614E]
+FA8A; [U+6160]
+FA3E; [U+6168]
+2F8AA; [U+617A]
+2F8AB; [U+618E]
+FA3F; [U+618E]
+FA89; [U+618E]
+F98F; [U+6190]
+2F8AD; [U+61A4]
+2F8AE; [U+61AF]
+2F8AC; [U+61B2]
+2F8AF; [U+61DE]
+2F8B0; [U+61F2]
+FA40; [U+61F2]
+FA8B; [U+61F2]
+2F8B1; [U+61F6]
+F90D; [U+61F6]
+F990; [U+6200]
+2F3D; [U+6208, 10]
+2F8B2; [U+6210]
+2F8B3; [U+621B]
+F9D2; [U+622E]
+FA8C; [U+6234]
+2F3E; [U+6236, 10]
+2F3F; [U+624B, 10]
+1F210; [U+624B, 31]
+2E98; [U+624C, 10]
+1F231; [U+6253, 31]
+2F8B4; [U+625D]
+1F227; [U+6295, 31]
+2F8B5; [U+62B1]
+F925; [U+62C9]
+F95B; [U+62CF]
+FA02; [U+62D3]
+2F8B6; [U+62D4]
+2F8BA; [U+62FC]
+F973; [U+62FE]
+1F22F; [U+6307, 31]
+2F8B9; [U+633D]
+2F8B7; [U+6350]
+1F228; [U+6355, 31]
+2F8BB; [U+6368]
+F9A4; [U+637B]
+2F8BC; [U+6383]
+F975; [U+63A0]
+2F8C1; [U+63A9]
+FA8D; [U+63C4]
+2F8C0; [U+63C5]
+2F8BD; [U+63E4]
+FA8E; [U+641C]
+2F8BF; [U+6422]
+FA8F; [U+6452]
+2F8C3; [U+6469]
+2F8C6; [U+6477]
+2F8C4; [U+647E]
+F991; [U+649A]
+2F8C5; [U+649D]
+F930; [U+64C4]
+2F40; [U+652F, 10]
+2F41; [U+6534, 10]
+2E99; [U+6535, 10]
+2F8C8; [U+654F]
+FA41; [U+654F]
+FA90; [U+6556]
+2F8C9; [U+656C]
+F969; [U+6578]
+2F42; [U+6587, 10]
+3246; [U+6587, 1B]
+2F43; [U+6597, 10]
+F9BE; [U+6599]
+1F21B; [U+6599, 31]
+2F44; [U+65A4, 10]
+1F21F; [U+65B0, 31]
+2F45; [U+65B9, 10]
+F983; [U+65C5]
+2F46; [U+65E0, 10]
+2E9B; [U+65E1, 10]
+FA42; [U+65E2]
+2F8CB; [U+65E3]
+2F47; [U+65E5, 10]
+3290; [U+65E5, 1B]
+2E9C; [U+65E5, 70, 20]
+337E; [U+660E, 31][U+6CBB, 31]
+F9E0; [U+6613]
+1F219; [U+6620, 31]
+337C; [U+662D, 31][U+548C, 31]
+2F8CD; [U+6649]
+FA12; [U+6674]
+FA91; [U+6674]
+F9C5; [U+6688]
+2F8CF; [U+6691]
+FA43; [U+6691]
+2F8D5; [U+669C]
+FA06; [U+66B4]
+F98B; [U+66C6]
+2F48; [U+66F0, 10]
+F901; [U+66F4]
+2F8CC; [U+66F8]
+2F8D4; [U+6700]
+2F49; [U+6708, 10]
+328A; [U+6708, 1B]
+1F237; [U+6708, 31]
+2E9D; [U+6708, 70, 20]
+3292; [U+6709, 1B]
+1F236; [U+6709, 31]
+2F8D8; [U+6717]
+F929; [U+6717]
+FA92; [U+6717]
+2F8D9; [U+671B]
+FA93; [U+671B]
+2F8DA; [U+6721]
+2F4A; [U+6728, 10]
+328D; [U+6728, 1B]
+F9E1; [U+674E]
+2F8DC; [U+6753]
+FA94; [U+6756]
+2F8DB; [U+675E]
+F9C8; [U+677B]
+2F8E0; [U+6785]
+F9F4; [U+6797]
+F9C9; [U+67F3]
+2F8DF; [U+67FA]
+F9DA; [U+6817]
+2F8E5; [U+681F]
+3291; [U+682A, 1B]
+337F; [U+682A, 31][U+5F0F, 31][U+4F1A, 31][U+793E, 31]
+2F8E1; [U+6852]
+F97A; [U+6881]
+2F8E2; [U+6885]
+FA44; [U+6885]
+2F8E4; [U+688E]
+F9E2; [U+68A8]
+2F8E6; [U+6914]
+2F8E8; [U+6942]
+2F8E9; [U+69A3]
+2F8EA; [U+69EA]
+F914; [U+6A02]
+F95C; [U+6A02]
+F9BF; [U+6A02]
+F94C; [U+6A13]
+2F8EB; [U+6AA8]
+F931; [U+6AD3]
+2F8ED; [U+6ADB]
+F91D; [U+6B04]
+2F4B; [U+6B20, 10]
+2F8EF; [U+6B21]
+2F8F1; [U+6B54]
+2F4C; [U+6B62, 10]
+32A3; [U+6B63, 1B]
+2F8F3; [U+6B72]
+F98C; [U+6B77]
+FA95; [U+6B79]
+2F4D; [U+6B79, 10]
+2E9E; [U+6B7A, 70, 20]
+2F8F4; [U+6B9F]
+F9A5; [U+6BAE]
+2F4E; [U+6BB3, 10]
+2F8F5; [U+6BBA]
+F970; [U+6BBA]
+FA96; [U+6BBA]
+2F8F6; [U+6BBB]
+2F4F; [U+6BCB, 10]
+2E9F; [U+6BCD, 10]
+2F50; [U+6BD4, 10]
+2F51; [U+6BDB, 10]
+2F52; [U+6C0F, 10]
+2EA0; [U+6C11, 10]
+2F53; [U+6C14, 10]
+2F54; [U+6C34, 10]
+328C; [U+6C34, 1B]
+2EA1; [U+6C35, 10]
+2EA2; [U+6C3A, 10]
+2F8FA; [U+6C4E]
+2F8FE; [U+6C67]
+F972; [U+6C88]
+2F8FC; [U+6CBF]
+F968; [U+6CCC]
+2F8FD; [U+6CCD]
+F9E3; [U+6CE5]
+329F; [U+6CE8, 1B]
+2F8FF; [U+6D16]
+F915; [U+6D1B]
+FA05; [U+6D1E]
+2F907; [U+6D34]
+2F900; [U+6D3E]
+2F902; [U+6D41]
+F9CA; [U+6D41]
+FA97; [U+6D41]
+2F903; [U+6D69]
+F92A; [U+6D6A]
+2F901; [U+6D77]
+FA45; [U+6D77]
+2F904; [U+6D78]
+2F905; [U+6D85]
+F9F5; [U+6DCB]
+F94D; [U+6DDA]
+F9D6; [U+6DEA]
+2F90E; [U+6DF9]
+FA46; [U+6E1A]
+2F908; [U+6E2F]
+2F909; [U+6E6E]
+1F235; [U+6E80, 31]
+F9CB; [U+6E9C]
+F9EC; [U+6EBA]
+2F90C; [U+6EC7]
+2F90B; [U+6ECB]
+FA99; [U+6ECB]
+F904; [U+6ED1]
+FA98; [U+6EDB]
+F94E; [U+6F0F]
+1F226; [U+6F14, 31]
+FA47; [U+6F22]
+FA9A; [U+6F22]
+F992; [U+6F23]
+2F90F; [U+6F6E]
+2F912; [U+6FC6]
+F922; [U+6FEB]
+F984; [U+6FFE]
+2F915; [U+701B]
+2F914; [U+701E]
+FA9B; [U+701E]
+2F913; [U+7039]
+2F917; [U+704A]
+2F55; [U+706B, 10]
+328B; [U+706B, 1B]
+2EA3; [U+706C, 10]
+2F835; [U+7070]
+2F919; [U+7077]
+2F918; [U+707D]
+F9FB; [U+7099]
+2F91A; [U+70AD]
+F99F; [U+70C8]
+F916; [U+70D9]
+1F21A; [U+7121, 31]
+2F91C; [U+7145]
+F993; [U+7149]
+FA48; [U+716E]
+FA9C; [U+716E]
+2F91E; [U+719C]
+F9C0; [U+71CE]
+F9EE; [U+71D0]
+F932; [U+7210]
+F91E; [U+721B]
+2F920; [U+7228]
+2F56; [U+722A, 10]
+FA49; [U+722B]
+2EA4; [U+722B, 10]
+2EA5; [U+722B, 70, 20]
+2F921; [U+7235]
+FA9E; [U+7235]
+2F57; [U+7236, 10]
+2F58; [U+723B, 10]
+2F59; [U+723F, 10]
+2F5A; [U+7247, 10]
+2F922; [U+7250]
+2F5B; [U+7259, 10]
+2F5C; [U+725B, 10]
+2EA7; [U+725B, 70, 20]
+F946; [U+7262]
+3295; [U+7279, 1B]
+2F924; [U+7280]
+2F925; [U+7295]
+2F5D; [U+72AC, 10]
+2EA8; [U+72AD, 10]
+FA9F; [U+72AF]
+F9FA; [U+72C0]
+F92B; [U+72FC]
+FA16; [U+732A]
+FAA0; [U+732A]
+F9A7; [U+7375]
+2F928; [U+737A]
+2F5E; [U+7384, 10]
+F961; [U+7387]
+F9DB; [U+7387]
+2F5F; [U+7389, 10]
+2F929; [U+738B]
+2EA9; [U+738B, 70, 20]
+2F92B; [U+73A5]
+F9AD; [U+73B2]
+F917; [U+73DE]
+F9E4; [U+7406]
+F9CC; [U+7409]
+FA4A; [U+7422]
+2F92E; [U+7447]
+2F92F; [U+745C]
+F9AE; [U+7469]
+2F930; [U+7471]
+FAA1; [U+7471]
+2F931; [U+7485]
+F994; [U+7489]
+F9EF; [U+7498]
+2F932; [U+74CA]
+2F60; [U+74DC, 10]
+2F61; [U+74E6, 10]
+FAA2; [U+7506]
+2F62; [U+7518, 10]
+2F63; [U+751F, 10]
+1F222; [U+751F, 31]
+2F934; [U+7524]
+2F64; [U+7528, 10]
+2F65; [U+7530, 10]
+3199; [U+7532, 26]
+1F238; [U+7533, 31]
+329A; [U+7537, 1B]
+FAA3; [U+753B]
+2F936; [U+753E]
+F9CD; [U+7559]
+F976; [U+7565]
+2F938; [U+7570]
+F962; [U+7570]
+2F66; [U+758B, 10]
+2EAA; [U+758B, 70, 20]
+2F67; [U+7592, 10]
+F9E5; [U+75E2]
+2F93A; [U+7610]
+FAA4; [U+761D]
+FAA5; [U+761F]
+F9C1; [U+7642]
+F90E; [U+7669]
+2F68; [U+7676, 10]
+2F69; [U+767D, 10]
+2F6A; [U+76AE, 10]
+2F6B; [U+76BF, 10]
+FA17; [U+76CA]
+FAA6; [U+76CA]
+FAA7; [U+76DB]
+32AC; [U+76E3, 1B]
+F933; [U+76E7]
+2F6C; [U+76EE, 10]
+2EAB; [U+76EE, 70, 20]
+2F940; [U+76F4]
+FAA8; [U+76F4]
+F96D; [U+7701]
+2F945; [U+771E]
+2F946; [U+771F]
+2F947; [U+771F]
+FAAA; [U+7740]
+2F948; [U+774A]
+FAA9; [U+774A]
+2F94A; [U+778B]
+FA9D; [U+77A7]
+2F6D; [U+77DB, 10]
+2F6E; [U+77E2, 10]
+2F6F; [U+77F3, 10]
+2F94E; [U+784E]
+F9CE; [U+786B]
+2F94F; [U+788C]
+F93B; [U+788C]
+FA4B; [U+7891]
+F947; [U+78CA]
+2F950; [U+78CC]
+FAAB; [U+78CC]
+F964; [U+78FB]
+F985; [U+792A]
+2F70; [U+793A, 10]
+2EAC; [U+793A, 70, 20]
+2EAD; [U+793B, 10]
+FA18; [U+793C]
+FA4C; [U+793E]
+3293; [U+793E, 1B]
+FA4E; [U+7948]
+FA4D; [U+7949]
+FA4F; [U+7950]
+2F953; [U+7956]
+FA50; [U+7956]
+FA51; [U+795D]
+3297; [U+795D, 1B]
+FA19; [U+795E]
+FA1A; [U+7965]
+F93C; [U+797F]
+1F232; [U+7981, 31]
+FA52; [U+798D]
+FA53; [U+798E]
+2F956; [U+798F]
+FA1B; [U+798F]
+F9B6; [U+79AE]
+2F71; [U+79B8, 10]
+2F72; [U+79BE, 10]
+F995; [U+79CA]
+3299; [U+79D8, 1B]
+2F957; [U+79EB]
+F956; [U+7A1C]
+2F959; [U+7A40]
+FA54; [U+7A40]
+2F95A; [U+7A4A]
+2F95B; [U+7A4F]
+2F73; [U+7A74, 10]
+1F233; [U+7A7A, 31]
+FA55; [U+7A81]
+FAAC; [U+7AB1]
+F9F7; [U+7ACB]
+2F74; [U+7ACB, 10]
+2F95F; [U+7AEE]
+2F75; [U+7AF9, 10]
+2EAE; [U+7AF9, 70, 20]
+F9F8; [U+7B20]
+3247; [U+7B8F, 1B]
+FA56; [U+7BC0]
+FAAD; [U+7BC0]
+2F962; [U+7BC6]
+2F963; [U+7BC9]
+F9A6; [U+7C3E]
+F944; [U+7C60]
+2F76; [U+7C73, 10]
+FAAE; [U+7C7B]
+F9F9; [U+7C92]
+FA1D; [U+7CBE]
+2F966; [U+7CD2]
+FA03; [U+7CD6]
+2F969; [U+7CE3]
+F97B; [U+7CE7]
+2F968; [U+7CE8]
+2F77; [U+7CF8, 10]
+2EAF; [U+7CF9, 10]
+2F96A; [U+7D00]
+F9CF; [U+7D10]
+F96A; [U+7D22]
+F94F; [U+7D2F]
+1F221; [U+7D42, 31]
+FAAF; [U+7D5B]
+2F96C; [U+7D63]
+F93D; [U+7DA0]
+F957; [U+7DBE]
+2F96E; [U+7DC7]
+F996; [U+7DF4]
+FA57; [U+7DF4]
+FAB0; [U+7DF4]
+2F96F; [U+7E02]
+FA58; [U+7E09]
+F950; [U+7E37]
+FA59; [U+7E41]
+2F970; [U+7E45]
+2EB0; [U+7E9F, 10]
+2F78; [U+7F36, 10]
+FAB1; [U+7F3E]
+2F79; [U+7F51, 10]
+2EB2; [U+7F52, 10]
+2EB5; [U+7F52, 70, 20]
+2EB1; [U+7F53, 10]
+2EB3; [U+7F53, 70, 20]
+2EB4; [U+7F53, 78, 20]
+FA5A; [U+7F72]
+F9E6; [U+7F79]
+2F976; [U+7F7A]
+F90F; [U+7F85]
+2F7A; [U+7F8A, 10]
+2EB6; [U+7F8A, 70, 20]
+2EB7; [U+7F8A, 78, 20]
+2EB8; [U+7F8B, 10]
+2F978; [U+7F95]
+F9AF; [U+7F9A]
+FA1E; [U+7FBD]
+2F7B; [U+7FBD, 10]
+2F979; [U+7FFA]
+
+F934; [U+8001]
+2F7C; [U+8001, 10]
+2EB9; [U+8002, 10]
+2F97A; [U+8005]
+FA5B; [U+8005]
+FAB2; [U+8005]
+2F7D; [U+800C, 10]
+2F7E; [U+8012, 10]
+2F7F; [U+8033, 10]
+F9B0; [U+8046]
+2F97D; [U+8060]
+F997; [U+806F]
+2F97F; [U+8070]
+F945; [U+807E]
+2F80; [U+807F, 10]
+2EBB; [U+807F, 70, 20]
+2EBA; [U+8080, 10]
+2F81; [U+8089, 10]
+2EBC; [U+8089, 70, 20]
+F953; [U+808B]
+2F8D6; [U+80AD]
+2F982; [U+80B2]
+2F983; [U+8103]
+2F985; [U+813E]
+F926; [U+81D8]
+2F82; [U+81E3, 10]
+F9F6; [U+81E8]
+2F83; [U+81EA, 10]
+FA5C; [U+81ED]
+2F84; [U+81F3, 10]
+2F85; [U+81FC, 10]
+2EBD; [U+81FC, 70, 20]
+2F893; [U+8201]
+2F98B; [U+8201]
+2F98C; [U+8204]
+2F86; [U+820C, 10]
+FA6D; [U+8218]
+2F87; [U+821B, 10]
+2F88; [U+821F, 10]
+2F89; [U+826E, 10]
+F97C; [U+826F]
+2F8A; [U+8272, 10]
+2F8B; [U+8278, 10]
+FA5D; [U+8279]
+FA5E; [U+8279]
+2EBE; [U+8279, 10]
+2EBF; [U+8279, 70, 20]
+2EC0; [U+8279, 78, 20]
+2F990; [U+828B]
+2F98F; [U+8291]
+2F991; [U+829D]
+2F993; [U+82B1]
+2F994; [U+82B3]
+2F995; [U+82BD]
+2F998; [U+82E5]
+F974; [U+82E5]
+2F996; [U+82E6]
+2F999; [U+831D]
+2F99C; [U+8323]
+F9FE; [U+8336]
+FAB3; [U+8352]
+2F9A0; [U+8353]
+2F99A; [U+8363]
+2F99B; [U+83AD]
+2F99D; [U+83BD]
+F93E; [U+83C9]
+2F9A1; [U+83CA]
+2F9A2; [U+83CC]
+2F9A3; [U+83DC]
+2F99E; [U+83E7]
+FAB4; [U+83EF]
+F958; [U+83F1]
+F918; [U+843D]
+F96E; [U+8449]
+2F99F; [U+8457]
+FA5F; [U+8457]
+F999; [U+84EE]
+2F9A8; [U+84F1]
+2F9A9; [U+84F3]
+F9C2; [U+84FC]
+2F9AA; [U+8516]
+2F9AC; [U+8564]
+F923; [U+85CD]
+F9F0; [U+85FA]
+F935; [U+8606]
+FA20; [U+8612]
+F91F; [U+862D]
+F910; [U+863F]
+2F8C; [U+864D, 10]
+2EC1; [U+864E, 10]
+2F9B3; [U+8650]
+2F9B4; [U+865C]
+F936; [U+865C]
+2F9B5; [U+8667]
+2F9B6; [U+8669]
+2F8D; [U+866B, 10]
+2F9B8; [U+8688]
+2F9B7; [U+86A9]
+2F9BA; [U+86E2]
+2F9B9; [U+870E]
+2F9BC; [U+8728]
+2F9BD; [U+876B]
+2F9BB; [U+8779]
+FAB5; [U+8779]
+2F9BE; [U+8786]
+F911; [U+87BA]
+2F9C0; [U+87E1]
+2F9C1; [U+8801]
+F927; [U+881F]
+2F8E; [U+8840, 10]
+FA08; [U+884C]
+2F8F; [U+884C, 10]
+2F9C3; [U+8860]
+2F9C4; [U+8863]
+2F90; [U+8863, 10]
+2EC2; [U+8864, 10]
+F9A0; [U+88C2]
+F9E7; [U+88CF]
+2F9C6; [U+88D7]
+2F9C7; [U+88DE]
+F9E8; [U+88E1]
+F912; [U+88F8]
+2F9C9; [U+88FA]
+FA60; [U+8910]
+FAB6; [U+8941]
+F924; [U+8964]
+2F91; [U+897E, 10]
+2EC4; [U+897F, 10]
+2EC3; [U+8980, 10]
+FAB7; [U+8986]
+FA0A; [U+898B]
+2F92; [U+898B, 10]
+FA61; [U+8996]
+FAB8; [U+8996]
+2EC5; [U+89C1, 10]
+2EC6; [U+89D2, 10]
+2F93; [U+89D2, 10]
+2EC7; [U+89D2, 70, 20]
+1F216; [U+89E3, 31]
+2F94; [U+8A00, 10]
+2F9CF; [U+8AA0]
+F96F; [U+8AAA]
+F9A1; [U+8AAA]
+FAB9; [U+8ABF]
+FABB; [U+8ACB]
+F97D; [U+8AD2]
+F941; [U+8AD6]
+2F9D0; [U+8AED]
+FABE; [U+8AED]
+FA22; [U+8AF8]
+FABA; [U+8AF8]
+F95D; [U+8AFE]
+FABD; [U+8AFE]
+FA62; [U+8B01]
+FABC; [U+8B01]
+FA63; [U+8B39]
+FABF; [U+8B39]
+F9FC; [U+8B58]
+F95A; [U+8B80]
+2F9D1; [U+8B8A]
+FAC0; [U+8B8A]
+2EC8; [U+8BA0, 10]
+2F95; [U+8C37, 10]
+2F96; [U+8C46, 10]
+F900; [U+8C48]
+2F9D2; [U+8C55]
+2F97; [U+8C55, 10]
+2F98; [U+8C78, 10]
+2F99; [U+8C9D, 10]
+3296; [U+8CA1, 1B]
+1F223; [U+8CA9, 31]
+2F9D4; [U+8CAB]
+2F9D5; [U+8CC1]
+F948; [U+8CC2]
+32AE; [U+8CC7, 1B]
+F903; [U+8CC8]
+FA64; [U+8CD3]
+FA65; [U+8D08]
+FAC1; [U+8D08]
+2F9D6; [U+8D1B]
+2EC9; [U+8D1D, 10]
+2F9A; [U+8D64, 10]
+2F9B; [U+8D70, 10]
+1F230; [U+8D70, 31]
+2F9D7; [U+8D77]
+2F9C; [U+8DB3, 10]
+2ECA; [U+8DB3, 70, 20]
+2F9DB; [U+8DBC]
+2F9DA; [U+8DCB]
+F937; [U+8DEF]
+2F9DC; [U+8DF0]
+2F9D; [U+8EAB, 10]
+F902; [U+8ECA]
+2F9E; [U+8ECA, 10]
+2F9DE; [U+8ED4]
+F998; [U+8F26]
+F9D7; [U+8F2A]
+2F9DF; [U+8F38]
+FAC2; [U+8F38]
+FA07; [U+8F3B]
+F98D; [U+8F62]
+2ECB; [U+8F66, 10]
+2F9F; [U+8F9B, 10]
+2F98D; [U+8F9E]
+F971; [U+8FB0]
+2FA0; [U+8FB0, 10]
+2FA1; [U+8FB5, 10]
+FA66; [U+8FB6]
+2ECC; [U+8FB6, 10]
+2ECD; [U+8FB6, 70, 20]
+2ECE; [U+8FB6, 78, 20]
+F99A; [U+9023]
+FA25; [U+9038]
+FA67; [U+9038]
+1F22B; [U+904A, 31]
+329C; [U+9069, 1B]
+FAC3; [U+9072]
+F9C3; [U+907C]
+F913; [U+908F]
+2FA2; [U+9091, 10]
+2ECF; [U+9091, 70, 20]
+2F9E2; [U+9094]
+F92C; [U+90CE]
+FA2E; [U+90DE]
+2F9E3; [U+90F1]
+FA26; [U+90FD]
+2F9E4; [U+9111]
+2F9E6; [U+911B]
+2FA3; [U+9149, 10]
+F919; [U+916A]
+FAC4; [U+9199]
+F9B7; [U+91B4]
+2FA4; [U+91C6, 10]
+F9E9; [U+91CC]
+2FA5; [U+91CC, 10]
+F97E; [U+91CF]
+F90A; [U+91D1]
+2FA6; [U+91D1, 10]
+328E; [U+91D1, 1B]
+F9B1; [U+9234]
+2F9E7; [U+9238]
+FAC5; [U+9276]
+2F9EA; [U+927C]
+2F9E8; [U+92D7]
+2F9E9; [U+92D8]
+F93F; [U+9304]
+F99B; [U+934A]
+2F9EB; [U+93F9]
+2F9EC; [U+9415]
+2ED0; [U+9485, 10]
+2ED1; [U+9577, 10]
+2FA7; [U+9577, 10]
+2ED2; [U+9578, 10]
+2ED3; [U+957F, 10]
+2FA8; [U+9580, 10]
+2F9EE; [U+958B]
+F986; [U+95AD]
+2F9F0; [U+95B7]
+2ED4; [U+95E8, 10]
+2FA9; [U+961C, 10]
+2ED5; [U+961C, 70, 20]
+2ED6; [U+961D, 10]
+F9C6; [U+962E]
+F951; [U+964B]
+FA09; [U+964D]
+F959; [U+9675]
+F9D3; [U+9678]
+FAC6; [U+967C]
+F9DC; [U+9686]
+F9F1; [U+96A3]
+2FAA; [U+96B6, 10]
+FA2F; [U+96B7]
+F9B8; [U+96B8]
+2FAB; [U+96B9, 10]
+2F9F3; [U+96C3]
+F9EA; [U+96E2]
+FA68; [U+96E3]
+FAC7; [U+96E3]
+2FAC; [U+96E8, 10]
+2ED7; [U+96E8, 70, 20]
+F9B2; [U+96F6]
+F949; [U+96F7]
+2F9F5; [U+9723]
+F938; [U+9732]
+F9B3; [U+9748]
+2FAD; [U+9751, 10]
+2ED8; [U+9752, 10]
+FA1C; [U+9756]
+FAC8; [U+9756]
+2FAE; [U+975E, 10]
+2FAF; [U+9762, 10]
+2FB0; [U+9769, 10]
+2FB1; [U+97CB, 10]
+FAC9; [U+97DB]
+2F9FA; [U+97E0]
+2ED9; [U+97E6, 10]
+2FB2; [U+97ED, 10]
+2FB3; [U+97F3, 10]
+FA69; [U+97FF]
+FACA; [U+97FF]
+2FB4; [U+9801, 10]
+32A0; [U+9805, 1B]
+2F9FE; [U+980B]
+2F9FF; [U+980B]
+FACB; [U+980B]
+F9B4; [U+9818]
+2FA00; [U+9829]
+FA6A; [U+983B]
+FACC; [U+983B]
+F9D0; [U+985E]
+2EDA; [U+9875, 10]
+2FB5; [U+98A8, 10]
+2EDB; [U+98CE, 10]
+2FB6; [U+98DB, 10]
+2EDC; [U+98DE, 10]
+2EDD; [U+98DF, 10]
+2FB7; [U+98DF, 10]
+2EDF; [U+98E0, 10]
+2EDE; [U+98E0, 70, 20]
+2FA02; [U+98E2]
+FA2A; [U+98EF]
+FA2B; [U+98FC]
+FA2C; [U+9928]
+2FA04; [U+9929]
+2EE0; [U+9963, 10]
+2FB8; [U+9996, 10]
+2EE1; [U+9996, 70, 20]
+2FB9; [U+9999, 10]
+2FA05; [U+99A7]
+2FBA; [U+99AC, 10]
+2FA06; [U+99C2]
+F91A; [U+99F1]
+2FA07; [U+99FE]
+F987; [U+9A6A]
+2EE2; [U+9A6C, 10]
+2FBB; [U+9AA8, 10]
+2EE3; [U+9AA8, 70, 20]
+2FBC; [U+9AD8, 10]
+2FBD; [U+9ADF, 10]
+2FA0A; [U+9B12]
+FACD; [U+9B12]
+2FBE; [U+9B25, 10]
+2FBF; [U+9B2F, 10]
+2FC0; [U+9B32, 10]
+2FC1; [U+9B3C, 10]
+2EE4; [U+9B3C, 70, 20]
+2FC2; [U+9B5A, 10]
+F939; [U+9B6F]
+2FA0B; [U+9C40]
+F9F2; [U+9C57]
+2EE5; [U+9C7C, 10]
+2FC3; [U+9CE5, 10]
+2FA0C; [U+9CFD]
+2FA0F; [U+9D67]
+FA2D; [U+9DB4]
+F93A; [U+9DFA]
+F920; [U+9E1E]
+2EE6; [U+9E1F, 10]
+2FC4; [U+9E75, 10]
+2EE7; [U+9E75, 70, 20]
+F940; [U+9E7F]
+2FC5; [U+9E7F, 10]
+F988; [U+9E97]
+F9F3; [U+9E9F]
+2FC6; [U+9EA5, 10]
+2EE8; [U+9EA6, 10]
+2FA15; [U+9EBB]
+2FC7; [U+9EBB, 10]
+2FC8; [U+9EC3, 10]
+2EE9; [U+9EC4, 10]
+2FC9; [U+9ECD, 10]
+F989; [U+9ECE]
+2FCA; [U+9ED1, 10]
+2FA17; [U+9EF9]
+2FCB; [U+9EF9, 10]
+2FCC; [U+9EFD, 10]
+2FA18; [U+9EFE]
+2EEA; [U+9EFE, 10]
+2FA19; [U+9F05]
+2FCD; [U+9F0E, 10]
+2FA1A; [U+9F0F]
+2FCE; [U+9F13, 10]
+2FA1B; [U+9F16]
+2FCF; [U+9F20, 10]
+2FA1C; [U+9F3B]
+2FD0; [U+9F3B, 10]
+FAD8; [U+9F43]
+2FD1; [U+9F4A, 10]
+2EEB; [U+9F4A, 70, 20]
+2EEC; [U+9F50, 10]
+2FD2; [U+9F52, 10]
+2EED; [U+9F52, 70, 20]
+2EEE; [U+9F7F, 10]
+F9C4; [U+9F8D]
+2FD3; [U+9F8D, 10]
+2EEF; [U+9F8D, 70, 20]
+FAD9; [U+9F8E]
+2EF0; [U+9F99, 10]
+F907; [U+9F9C]
+F908; [U+9F9C]
+FACE; [U+9F9C]
+2FD4; [U+9F9C, 10]
+2EF1; [U+9F9C, 70, 20]
+2EF2; [U+9F9C, 78, 20]
+2EF3; [U+9F9F, 10]
+2FD5; [U+9FA0, 10]
+FA0E; [U+FA0E]
+FA0F; [U+FA0F]
+FA11; [U+FA11]
+FA13; [U+FA13]
+FA14; [U+FA14]
+FA1F; [U+FA1F]
+FA21; [U+FA21]
+FA23; [U+FA23]
+FA24; [U+FA24]
+FA27; [U+FA27]
+FA28; [U+FA28]
+FA29; [U+FA29]
+
+2F80C; [U+349E]
+2F813; [U+34B9]
+2F9CA; [U+34BB]
+2F81F; [U+34DF]
+2F824; [U+3515]
+2F867; [U+36EE]
+2F868; [U+36FC]
+2F876; [U+3781]
+2F883; [U+382F]
+2F888; [U+3862]
+2F88A; [U+387C]
+2F896; [U+38C7]
+2F89B; [U+38E3]
+2F8A2; [U+391C]
+2F8A1; [U+393A]
+2F8C2; [U+3A2E]
+2F8C7; [U+3A6C]
+2F8D1; [U+3AE4]
+2F8D0; [U+3B08]
+2F8CE; [U+3B19]
+2F8DE; [U+3B49]
+2F8E7; [U+3B9D]
+FAD2; [U+3B9D]
+2F8EE; [U+3C18]
+2F8F2; [U+3C4E]
+2F90A; [U+3D33]
+2F916; [U+3D96]
+2F92A; [U+3EAC]
+2F92C; [U+3EB8]
+2F92D; [U+3EB8]
+2F933; [U+3F1B]
+2F93E; [U+3FFC]
+2F93F; [U+4008]
+FAD3; [U+4018]
+2F949; [U+4039]
+FAD4; [U+4039]
+2F94B; [U+4046]
+2F94C; [U+4096]
+2F951; [U+40E3]
+2F958; [U+412F]
+2F960; [U+4202]
+2F964; [U+4227]
+2F967; [U+42A0]
+2F96D; [U+4301]
+2F971; [U+4334]
+2F974; [U+4359]
+2F981; [U+43D5]
+2F8D7; [U+43D9]
+2F984; [U+440B]
+2F98E; [U+446B]
+2F9A7; [U+452B]
+2F9AE; [U+455D]
+2F9AF; [U+4561]
+2F9B2; [U+456B]
+2F9BF; [U+45D7]
+2F9C2; [U+45F9]
+2F9C8; [U+4635]
+2F9CD; [U+46BE]
+2F9CE; [U+46C7]
+2F9EF; [U+4995]
+2F9F2; [U+49E6]
+2F9F8; [U+4A6E]
+2F9F9; [U+4A76]
+2F9FC; [U+4AB2]
+2FA03; [U+4B33]
+2FA08; [U+4BCE]
+2FA0D; [U+4CCE]
+2FA0E; [U+4CED]
+2FA11; [U+4CF8]
+2FA16; [U+4D56]
+
+2F803; [U+20122]
+2F812; [U+2051C]
+2F91B; [U+20525]
+2F816; [U+2054B]
+2F80D; [U+2063A]
+2F9D9; [U+20804]
+2F9DD; [U+208DE]
+2F834; [U+20A2C]
+2F838; [U+20B63]
+2F859; [U+214E4]
+2F860; [U+216A8]
+2F861; [U+216EA]
+2F86C; [U+219C8]
+2F871; [U+21B18]
+2F8F8; [U+21D0B]
+2F87B; [U+21DE4]
+2F87D; [U+21DE6]
+2F889; [U+22183]
+2F939; [U+2219F]
+2F891; [U+22331]
+2F892; [U+22331]
+2F8A4; [U+226D4]
+FAD0; [U+22844]
+FACF; [U+2284A]
+2F8B8; [U+22B0C]
+2F8BE; [U+22BF1]
+2F8CA; [U+2300A]
+2F897; [U+232B8]
+2F980; [U+2335F]
+2F989; [U+23393]
+2F98A; [U+2339C]
+2F8DD; [U+233C3]
+FAD1; [U+233D5]
+2F8E3; [U+2346D]
+2F8EC; [U+236A3]
+2F8F0; [U+238A7]
+2F8F7; [U+23A8D]
+2F8F9; [U+23AFA]
+2F8FB; [U+23CBC]
+2F906; [U+23D1E]
+2F90D; [U+23ED1]
+2F910; [U+23F5E]
+2F911; [U+23F8E]
+2F91D; [U+24263]
+FA6C; [U+242EE]
+2F91F; [U+243AB]
+2F923; [U+24608]
+2F926; [U+24735]
+2F927; [U+24814]
+2F935; [U+24C36]
+2F937; [U+24C92]
+2F93B; [U+24FA1]
+2F93C; [U+24FB8]
+2F93D; [U+25044]
+2F942; [U+250F2]
+2F941; [U+250F3]
+2F943; [U+25119]
+2F944; [U+25133]
+FAD5; [U+25249]
+2F94D; [U+2541D]
+2F952; [U+25626]
+2F954; [U+2569A]
+2F955; [U+256C5]
+2F95C; [U+2597C]
+2F95D; [U+25AA7]
+2F95E; [U+25AA7]
+2F961; [U+25BAB]
+2F965; [U+25C80]
+FAD6; [U+25CD0]
+2F96B; [U+25F86]
+2F898; [U+261DA]
+2F972; [U+26228]
+2F973; [U+26247]
+2F975; [U+262D9]
+2F977; [U+2633E]
+2F97B; [U+264DA]
+2F97C; [U+26523]
+2F97E; [U+265A8]
+2F987; [U+267A7]
+2F988; [U+267B5]
+2F997; [U+26B3C]
+2F9A4; [U+26C36]
+2F9A6; [U+26CD5]
+2F9A5; [U+26D6B]
+2F9AD; [U+26F2C]
+2F9B0; [U+26FB1]
+2F9B1; [U+270D2]
+2F9AB; [U+273CA]
+2F9C5; [U+27667]
+2F9CB; [U+278AE]
+2F9CC; [U+27966]
+2F9D3; [U+27CA8]
+FAD7; [U+27ED3]
+2F9D8; [U+27F2F]
+
+2F9E0; [U+285D2]
+2F9E1; [U+285ED]
+2F9E5; [U+2872E]
+2F9ED; [U+28BFA]
+2F9F1; [U+28D77]
+2F9F6; [U+29145]
+2F81C; [U+291DF]
+2F9F7; [U+2921A]
+2F9FB; [U+2940A]
+2F9FD; [U+29496]
+2FA01; [U+295B6]
+2FA09; [U+29B30]
+2FA10; [U+2A0CE]
+2FA12; [U+2A105]
+2FA13; [U+2A20E]
+2FA14; [U+2A291]
+2F88F; [U+2A392]
+2FA1D; [U+2A600]
+
+FFFD; [EF FD, 05, 05]
+
+FDD1 FDD0;     [E4, 05, 05]    # unassigned first primary
 
 # SPECIAL MAX/MIN COLLATION ELEMENTS
 
 FFFE;  [02, 02, 02]    # Special LOWEST primary, for merge/interleaving
-FFFF;  [EF FE, 05, 05] # Special HIGHEST primary, for ranges
-
-# SPECIAL FINAL VALUES for Script Reordering
-
-FDD0 0042;     [05 FE, 05, 05] # Special final value for reordering token
-FDD0 0043;     [0C FE, 05, 05] # Special final value for reordering token
-FDD0 0044;     [0D FE, 05, 05] # Special final value for reordering token
-FDD0 0045;     [0E FE, 05, 05] # Special final value for reordering token
-FDD0 0046;     [0F FE, 05, 05] # Special final value for reordering token
-FDD0 0047;     [25 FE, 05, 05] # Special final value for reordering token
-FDD0 0048;     [5A FE, 05, 05] # Special final value for reordering token
-FDD0 0049;     [5B FE, 05, 05] # Special final value for reordering token
-FDD0 004A;     [5D FE, 05, 05] # Special final value for reordering token
-FDD0 004B;     [5E FE, 05, 05] # Special final value for reordering token
-FDD0 004C;     [5F FE, 05, 05] # Special final value for reordering token
-FDD0 004D;     [60 FE, 05, 05] # Special final value for reordering token
-FDD0 004E;     [62 FE, 05, 05] # Special final value for reordering token
-FDD0 004F;     [63 FE, 05, 05] # Special final value for reordering token
-FDD0 0050;     [67 FE, 05, 05] # Special final value for reordering token
-FDD0 0051;     [68 FE, 05, 05] # Special final value for reordering token
-FDD0 0052;     [69 FE, 05, 05] # Special final value for reordering token
-FDD0 0053;     [6A FE, 05, 05] # Special final value for reordering token
-FDD0 0054;     [6B FE, 05, 05] # Special final value for reordering token
-FDD0 0055;     [6C FE, 05, 05] # Special final value for reordering token
-FDD0 0056;     [6D FE, 05, 05] # Special final value for reordering token
-FDD0 0057;     [6E FE, 05, 05] # Special final value for reordering token
-FDD0 0058;     [6F FE, 05, 05] # Special final value for reordering token
-FDD0 0059;     [70 FE, 05, 05] # Special final value for reordering token
-FDD0 005A;     [71 FE, 05, 05] # Special final value for reordering token
-FDD0 005B;     [72 FE, 05, 05] # Special final value for reordering token
-FDD0 005C;     [73 FE, 05, 05] # Special final value for reordering token
-FDD0 005D;     [74 FE, 05, 05] # Special final value for reordering token
-FDD0 005E;     [76 FE, 05, 05] # Special final value for reordering token
-FDD0 005F;     [77 FE, 05, 05] # Special final value for reordering token
-FDD0 0060;     [78 FE, 05, 05] # Special final value for reordering token
-FDD0 0061;     [79 FE, 05, 05] # Special final value for reordering token
-FDD0 0062;     [7A FE, 05, 05] # Special final value for reordering token
+FFFF;  [EF FF, 05, 05] # Special HIGHEST primary, for ranges
+
 
 # HOMELESS COLLATION ELEMENTS
-FDD0 0063;     [, 97, 09]
-FDD0 0064;     [, A7, 09]
-FDD0 0065;     [, B1, 09]
-FDD0 0066;     [, D0 3D, 27]
-FDD0 0067;     [, D2 75, 31]
-FDD0 0068;     [, D3 D9, 31]
-FDD0 0069;     [, D3 D9, 33]
-FDD0 006A;     [, D5 11, 2D]
-FDD0 006B;     [, D5 11, 31]
-FDD0 006C;     [, D5 11, 33]
-FDD0 006D;     [, D7 39, 09]
-FDD0 006E;     [, DA 95, 37]
-FDD0 006F;     [, DA A5, 37]
-FDD0 0070;     [, DB A9, 05]
-FDD0 0071;     [, DB A9, 09]
-FDD0 0072;     [, DB A9, 27]
-FDD0 0073;     [, DB B9, 09]
-FDD0 0074;     [, DB B9, 2B]
-FDD0 0075;     [, DB C9, 09]
-FDD0 0076;     [, DB D9, 09]
-FDD0 0077;     [, DB E9, 09]
-FDD0 0078;     [, DB F9, 05]
-FDD0 0079;     [, DC 0D, 05]
-FDD0 007A;     [, DC 1D, 05]
-FDD0 007B;     [, DC 2D, 05]
-FDD0 007C;     [, DC 3D, 05]
-FDD0 007D;     [, DC 4D, 05]
-FDD0 007E;     [, DC 5D, 05]
-FDD0 007F;     [, DC 6D, 05]
-FDD0 0080;     [, DC 7D, 05]
-FDD0 0081;     [, DC 8D, 05]
-FDD0 0082;     [, DC 9D, 05]
-FDD0 0083;     [, DC AD, 05]
-FDD0 0084;     [, DC BD, 05]
-FDD0 0085;     [, DC CD, 05]
-FDD0 0086;     [, DC DD, 05]
-FDD0 0087;     [, DC ED, 05]
-FDD0 0088;     [, DC FD, 05]
-FDD0 0089;     [, DD 11, 05]
-FDD0 008A;     [, DD 21, 05]
-FDD0 008B;     [, DD 31, 05]
-FDD0 008C;     [, DD 41, 05]
-FDD0 008D;     [, DF 59, 05]
-FDD0 008E;     [, DF 69, 05]
-FDD0 008F;     [, DF 79, 05]
-FDD0 0090;     [, DF 79, 09]
-FDD0 0091;     [, DF 89, 05]
-FDD0 0092;     [, E0 1D, 05]
-FDD0 0093;     [, E0 2D, 05]
-FDD0 0094;     [, E0 3D, 05]
-FDD0 0095;     [, E0 4D, 05]
-FDD0 0096;     [, E0 5D, 05]
-FDD0 0097;     [, E0 6D, 05]
-FDD0 0098;     [, E0 7D, 05]
-FDD0 0099;     [, E0 8D, 05]
-FDD0 009A;     [, E0 9D, 05]
-FDD0 009B;     [, E0 AD, 05]
-FDD0 009C;     [, E0 BD, 05]
-FDD0 009D;     [, E0 CD, 05]
-FDD0 009E;     [, E0 DD, 05]
-FDD0 009F;     [, E0 ED, 05]
-FDD0 00A0;     [, E0 FD, 05]
-FDD0 00A1;     [, E1 11, 05]
-FDD0 00A2;     [, E1 21, 05]
-FDD0 00A3;     [, E1 31, 05]
-FDD0 00A4;     [, E1 41, 05]
-FDD0 00A5;     [, E1 51, 05]
-FDD0 00A6;     [, E1 61, 05]
-FDD0 00A7;     [, E1 71, 05]
-FDD0 00A8;     [, E1 81, 05]
-FDD0 00A9;     [, E1 91, 05]
-FDD0 00AA;     [, E1 A1, 05]
-FDD0 00AB;     [, E1 B1, 05]
-FDD0 00AC;     [, E1 C1, 05]
-FDD0 00AD;     [, E1 D1, 05]
-FDD0 00AE;     [, E1 E1, 05]
-FDD0 00AF;     [, E1 F1, 05]
-FDD0 00B0;     [, E2 05, 05]
-FDD0 00B1;     [, E2 15, 05]
-FDD0 00B2;     [, , 3F 03]     # CONSTRUCTED FAKE SECONDARY-IGNORABLE
+FDD0 0041;     [, 90, 20]
+FDD0 0042;     [, A0, 20]
+FDD0 0043;     [, AA, 20]
+FDD0 0044;     [, AE, 2E]
+FDD0 0045;     [, B0, 2E]
+FDD0 0046;     [, B2, 20]
+FDD0 0047;     [, E9 48, 1E]
+FDD0 0048;     [, EC 0E, 20]
+FDD0 0049;     [, EC 0E, 2E]
+FDD0 004A;     [, EE 72, 10]
+FDD0 004B;     [, EE 72, 1E]
+FDD0 004C;     [, EE 72, 2C]
+FDD0 004D;     [, F2 BA, 20]
+FDD0 004E;     [, , 3D 02]     # CONSTRUCTED FAKE SECONDARY-IGNORABLE
 
 # VALUES BASED ON UCA
 [first tertiary ignorable [,,]] # CONSTRUCTED
 [last tertiary ignorable [,,]] # CONSTRUCTED
 # Warning: Case bits are masked in the following
 [first tertiary in secondary non-ignorable [X, X, 05]] # U+0332 COMBINING LOW LINE
-[last tertiary in secondary non-ignorable [X, X, 3D]] # U+2A74 DOUBLE COLON EQUAL
-[first secondary ignorable [,, 3F 03]] # CONSTRUCTED
-[last secondary ignorable [,, 3F 03]] # CONSTRUCTED
+[last tertiary in secondary non-ignorable [X, X, 38]] # U+33BE SQUARE KW
+[first secondary ignorable [,, 3D 02]] # CONSTRUCTED
+[last secondary ignorable [,, 3D 02]] # CONSTRUCTED
 [first secondary in primary non-ignorable [X, 05, X]] # U+0009 <CHARACTER TABULATION>
-[last secondary in primary non-ignorable [X, 05, X]] # U+0009 <CHARACTER TABULATION>
-[first primary ignorable [, 87, 05]] # U+0332 COMBINING LOW LINE
-[last primary ignorable [, E2 15, 05]] # U+1D360 COUNTING ROD UNIT DIGIT ONE
-[first variable [03 40, 05, 05]] # U+0009 <CHARACTER TABULATION>
-[last variable [0C FE, 05, 05]] # U+10A7F OLD SOUTH ARABIAN NUMERIC INDICATOR
-[variable top = 0C FE]
-[first regular [0D 0A, 05, 05]] # U+0060 GRAVE ACCENT
-[last regular [7A FE, 05, 05]] # U+1099F MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2
-[first implicit [E0 04 06, 05, 05]] # CONSTRUCTED
-[last implicit [E4 DF 7E 20, 05, 05]] # CONSTRUCTED
-[first trailing [E5, 05, 05]] # CONSTRUCTED
-[last trailing [E5, 05, 05]] # CONSTRUCTED
-
-# Top Byte => Reordering Tokens
-[top_byte      00      TERMINATOR ]    #       [0]     TERMINATOR=1
-[top_byte      01      LEVEL-SEPARATOR ]       #       [0]     LEVEL-SEPARATOR=1
-[top_byte      02      FIELD-SEPARATOR ]       #       [0]     FIELD-SEPARATOR=1
-[top_byte      03      SPACE ] #       [9]     SPACE=1 Cc=6 Zl=1 Zp=1 Zs=1
-[top_byte      04      SPACE ] #       [1]     SPACE=1 Zs=17
-[top_byte      05      SPACE ] #       [0]     SPACE=1
-[top_byte      06      PUNCTUATION ]   #       [22]    PUNCTUATION=1 Pc=7 Pd=21 Po=5 Zs=6
-[top_byte      07      PUNCTUATION ]   #       [1]     PUNCTUATION=1 Po=4
-[top_byte      08      PUNCTUATION ]   #       [81]    PUNCTUATION=1 Po=102
-[top_byte      09      PUNCTUATION ]   #       [1]     PUNCTUATION=1 Po=8
-[top_byte      0A      PUNCTUATION ]   #       [172]   PUNCTUATION=1 Pe=31 Pf=4 Pi=6 Po=125 Ps=172
-[top_byte      0B      PUNCTUATION ]   #       [124]   PUNCTUATION=1 Pc=3 Pe=40 Pf=6 Pi=6 Po=68 Ps=49
-[top_byte      0C      PUNCTUATION ]   #       [116]   PUNCTUATION=1 Pd=2 Po=115
-[top_byte      0D      SYMBOL ]        #       [4297]  SYMBOL=1 Lm=24 Sk=86 Sm=951 So=3330 Zs=29
-[top_byte      0E      SYMBOL ]        #       [21]    SYMBOL=1 Lm=25 So=1
-[top_byte      0F      CURRENCY ]      #       [43]    CURRENCY=1 Sc=47
-[top_byte      10      DIGIT ] #       [124]   DIGIT=1 Nl=25 No=99
-[top_byte      11      DIGIT ] #       [82]    DIGIT=1 Nl=37 No=45
-[top_byte      12      DIGIT ] #       [1]     DIGIT=1 Nd=53 Nl=1 No=5
-[top_byte      13      DIGIT ] #       [0]     DIGIT=1
-[top_byte      14      DIGIT ] #       [1]     DIGIT=1 Nd=107 Nl=12 No=35
-[top_byte      15      DIGIT ] #       [0]     DIGIT=1
-[top_byte      16      DIGIT ] #       [1]     DIGIT=1 Nd=82 Nl=15 No=20
-[top_byte      17      DIGIT ] #       [0]     DIGIT=1
-[top_byte      18      DIGIT ] #       [1]     DIGIT=1 Nd=69 Nl=15 No=19
-[top_byte      19      DIGIT ] #       [0]     DIGIT=1
-[top_byte      1A      DIGIT ] #       [1]     DIGIT=1 Nd=65 Nl=16 No=15
-[top_byte      1B      DIGIT ] #       [0]     DIGIT=1
-[top_byte      1C      DIGIT ] #       [1]     DIGIT=1 Nd=57 Nl=17 No=13
-[top_byte      1D      DIGIT ] #       [0]     DIGIT=1
-[top_byte      1E      DIGIT ] #       [1]     DIGIT=1 Nd=54 Nl=9 No=12
-[top_byte      1F      DIGIT ] #       [0]     DIGIT=1
-[top_byte      20      DIGIT ] #       [1]     DIGIT=1 Nd=55 Nl=9 No=12
-[top_byte      21      DIGIT ] #       [0]     DIGIT=1
-[top_byte      22      DIGIT ] #       [1]     DIGIT=1 Nd=54 Nl=8 No=12
-[top_byte      23      DIGIT ] #       [0]     DIGIT=1
-[top_byte      24      DIGIT ] #       [1]     DIGIT=1 Nd=54 Nl=10 No=11
-[top_byte      25      DIGIT ] #       [0]     DIGIT=1
-[top_byte      26      Latn ]  #       [0]     Latn=1
-[top_byte      27      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      28      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      29      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      2A      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      2B      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      2C      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      2D      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      2E      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      2F      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      30      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      31      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      32      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      33      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      34      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      35      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      36      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      37      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      38      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      39      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      3A      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      3B      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      3C      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      3D      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      3E      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      3F      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      40      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      41      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      42      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      43      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      44      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      45      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      46      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      47      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      48      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      49      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      4A      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      4B      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      4C      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      4D      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      4E      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      4F      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      50      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      51      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      52      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      53      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      54      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      55      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      56      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      57      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      58      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      59      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      5A      Latn ]  #       [331]   Latn=2152 Lm=12 Mn=35 So=69
-[top_byte      5B      Grek Copt       COMPRESS ]      #       [104]   Copt=121 Grek=642 Zs=1
-[top_byte      5C      Cyrl Glag ]     #       [219]   Cyrl=405 Glag=94 Lm=2 Mn=41
-[top_byte      5D      Cyrl Glag ]     #       [219]   Cyrl=405 Glag=94 Lm=2 Mn=41
-[top_byte      5E      Geor    COMPRESS ]      #       [86]    Geor=127
-[top_byte      5F      Armn    COMPRESS ]      #       [39]    Armn=82 Lm=1
-[top_byte      60      Hebr Phnx Samr  COMPRESS ]      #       [70]    Hebr=78 Phnx=22 Samr=22 Lm=1 Mn=3
-[top_byte      61      Arab Syrc Mand ]        #       [254]   Arab=1063 Mand=25 Syrc=34 Lm=2 So=2
-[top_byte      62      Arab Syrc Mand ]        #       [254]   Arab=1063 Mand=25 Syrc=34 Lm=2 So=2
-[top_byte      63      Thaa Nkoo Tfng  COMPRESS ]      #       [139]   Nkoo=33 Tfng=57 Thaa=39 Lm=2 Mn=11
-[top_byte      64      Ethi ]  #       [453]   Ethi=453
-[top_byte      65      Ethi ]  #       [453]   Ethi=453
-[top_byte      66      Ethi ]  #       [453]   Ethi=453
-[top_byte      67      Ethi ]  #       [453]   Ethi=453
-[top_byte      68      Deva    COMPRESS ]      #       [98]    Deva=86 Lo=10 Mc=10 Mn=15
-[top_byte      69      Beng    COMPRESS ]      #       [64]    Beng=53 Mc=10 Mn=7
-[top_byte      6A      Guru    COMPRESS ]      #       [57]    Guru=51 Mc=3 Mn=9
-[top_byte      6B      Gujr    COMPRESS ]      #       [68]    Gujr=52 Mc=6 Mn=10
-[top_byte      6C      Orya    COMPRESS ]      #       [67]    Orya=53 Mc=10 Mn=9
-[top_byte      6D      Taml    COMPRESS ]      #       [50]    Taml=38 Mc=14 Mn=2
-[top_byte      6E      Telu    COMPRESS ]      #       [72]    Telu=54 Mc=4 Mn=15
-[top_byte      6F      Knda    COMPRESS ]      #       [73]    Knda=55 Mc=7 Mn=17
-[top_byte      70      Mlym    COMPRESS ]      #       [72]    Mlym=62 Mc=13 Mn=7
-[top_byte      71      Sinh Mtei Sylo Saur Kthi Shrd Takr Sund Brah Khar       COMPRESS ]      #       [575]   Brah=53 Khar=35 Kthi=45 Mtei=47 Saur=50 Shrd=52 Sinh=59 Sund=38 Sylo=32 Takr=43 Mc=66 Mn=66
-[top_byte      72      Thai    COMPRESS ]      #       [64]    Thai=285 Mn=10
-[top_byte      73      Laoo Tavt       COMPRESS ]      #       [115]   Laoo=195 Tavt=300 Mn=18
-[top_byte      74      Tibt Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Batk Rjng Kali     COMPRESS ]      #       [463]   Batk=38 Bugi=23 Buhd=18 Hano=18 Kali=28 Lepc=39 Limb=29 Phag=52 Rjng=23 Tagb=16 Tglg=17 Tibt=50 Mc=37 Mn=131
-[top_byte      75      Mymr Cakm ]     #       [200]   Cakm=36 Mymr=98 Mc=31 Mn=40
-[top_byte      76      Mymr Cakm ]     #       [200]   Cakm=36 Mymr=98 Mc=31 Mn=40
-[top_byte      77      Khmr Tale Talu Lana Cham Bali Java Mong Olck Cher Cans Ogam Runr Orkh Vaii Bamu COMPRESS ]      #       [2436]  Bali=60 Bamu=639 Cans=707 Cham=52 Cher=85 Java=47 Khmr=53 Lana=53 Mong=129 Ogam=26 Olck=30 Orkh=73 Runr=75 Tale=35 Talu=51 Vaii=286 Lm=8 Mc=60 Mn=58 Nl=13 So=2
-[top_byte      78      Hang    COMPRESS ]      #       [357]   Hang=534
-[top_byte      79      Kana    COMPRESS ]      #       [50]    Kana=390 Lo=2
-[top_byte      7A      Bopo Yiii Lisu Plrd Lyci Cari Lydi Ital Goth Dsrt Shaw Osma Sora Linb Cprt Sarb Avst Armi Prti Phli Ugar Xpeo Xsux Egyp Merc Mero       COMPRESS ]      #       [4158]  Armi=22 Avst=54 Bopo=68 Cari=49 Cprt=55 Dsrt=80 Egyp=1071 Goth=25 Ital=31 Linb=211 Lisu=40 Lyci=29 Lydi=26 Merc=26 Mero=32 Osma=30 Phli=19 Plrd=70 Prti=22 Sarb=29 Shaw=48 Sora=25 Ugar=30 Xpeo=44 Xsux=879 Yiii=1164 Lm=20 Mc=46 Mn=4 Nl=2
-[top_byte      7B      Hani ]  #       [0]     Hani=1
-[top_byte      7C      Hani ]  #       [0]     Hani=1
-[top_byte      7D      Hani ]  #       [0]     Hani=1
-[top_byte      7E      Hani ]  #       [0]     Hani=1
-[top_byte      7F      Hani ]  #       [0]     Hani=1
-[top_byte      80      Hani ]  #       [0]     Hani=1
-[top_byte      81      Hani ]  #       [0]     Hani=1
-[top_byte      82      Hani ]  #       [0]     Hani=1
-[top_byte      83      Hani ]  #       [0]     Hani=1
-[top_byte      84      Hani ]  #       [0]     Hani=1
-[top_byte      85      Hani ]  #       [0]     Hani=1
-[top_byte      86      Hani ]  #       [0]     Hani=1
-[top_byte      87      Hani ]  #       [0]     Hani=1
-[top_byte      88      Hani ]  #       [0]     Hani=1
-[top_byte      89      Hani ]  #       [0]     Hani=1
-[top_byte      8A      Hani ]  #       [0]     Hani=1
-[top_byte      8B      Hani ]  #       [0]     Hani=1
-[top_byte      8C      Hani ]  #       [0]     Hani=1
-[top_byte      8D      Hani ]  #       [0]     Hani=1
-[top_byte      8E      Hani ]  #       [0]     Hani=1
-[top_byte      8F      Hani ]  #       [0]     Hani=1
-[top_byte      90      Hani ]  #       [0]     Hani=1
-[top_byte      91      Hani ]  #       [0]     Hani=1
-[top_byte      92      Hani ]  #       [0]     Hani=1
-[top_byte      93      Hani ]  #       [0]     Hani=1
-[top_byte      94      Hani ]  #       [0]     Hani=1
-[top_byte      95      Hani ]  #       [0]     Hani=1
-[top_byte      96      Hani ]  #       [0]     Hani=1
-[top_byte      97      Hani ]  #       [0]     Hani=1
-[top_byte      98      Hani ]  #       [0]     Hani=1
-[top_byte      99      Hani ]  #       [0]     Hani=1
-[top_byte      9A      Hani ]  #       [0]     Hani=1
-[top_byte      9B      Hani ]  #       [0]     Hani=1
-[top_byte      9C      Hani ]  #       [0]     Hani=1
-[top_byte      9D      Hani ]  #       [0]     Hani=1
-[top_byte      9E      Hani ]  #       [0]     Hani=1
-[top_byte      9F      Hani ]  #       [0]     Hani=1
-[top_byte      A0      Hani ]  #       [0]     Hani=1
-[top_byte      A1      Hani ]  #       [0]     Hani=1
-[top_byte      A2      Hani ]  #       [0]     Hani=1
-[top_byte      A3      Hani ]  #       [0]     Hani=1
-[top_byte      A4      Hani ]  #       [0]     Hani=1
-[top_byte      A5      Hani ]  #       [0]     Hani=1
-[top_byte      A6      Hani ]  #       [0]     Hani=1
-[top_byte      A7      Hani ]  #       [0]     Hani=1
-[top_byte      A8      Hani ]  #       [0]     Hani=1
-[top_byte      A9      Hani ]  #       [0]     Hani=1
-[top_byte      AA      Hani ]  #       [0]     Hani=1
-[top_byte      AB      Hani ]  #       [0]     Hani=1
-[top_byte      AC      Hani ]  #       [0]     Hani=1
-[top_byte      AD      Hani ]  #       [0]     Hani=1
-[top_byte      AE      Hani ]  #       [0]     Hani=1
-[top_byte      AF      Hani ]  #       [0]     Hani=1
-[top_byte      B0      Hani ]  #       [0]     Hani=1
-[top_byte      B1      Hani ]  #       [0]     Hani=1
-[top_byte      B2      Hani ]  #       [0]     Hani=1
-[top_byte      B3      Hani ]  #       [0]     Hani=1
-[top_byte      B4      Hani ]  #       [0]     Hani=1
-[top_byte      B5      Hani ]  #       [0]     Hani=1
-[top_byte      B6      Hani ]  #       [0]     Hani=1
-[top_byte      B7      Hani ]  #       [0]     Hani=1
-[top_byte      B8      Hani ]  #       [0]     Hani=1
-[top_byte      B9      Hani ]  #       [0]     Hani=1
-[top_byte      BA      Hani ]  #       [0]     Hani=1
-[top_byte      BB      Hani ]  #       [0]     Hani=1
-[top_byte      BC      Hani ]  #       [0]     Hani=1
-[top_byte      BD      Hani ]  #       [0]     Hani=1
-[top_byte      BE      Hani ]  #       [0]     Hani=1
-[top_byte      BF      Hani ]  #       [0]     Hani=1
-[top_byte      C0      Hani ]  #       [0]     Hani=1
-[top_byte      C1      Hani ]  #       [0]     Hani=1
-[top_byte      C2      Hani ]  #       [0]     Hani=1
-[top_byte      C3      Hani ]  #       [0]     Hani=1
-[top_byte      C4      Hani ]  #       [0]     Hani=1
-[top_byte      C5      Hani ]  #       [0]     Hani=1
-[top_byte      C6      Hani ]  #       [0]     Hani=1
-[top_byte      C7      Hani ]  #       [0]     Hani=1
-[top_byte      C8      Hani ]  #       [0]     Hani=1
-[top_byte      C9      Hani ]  #       [0]     Hani=1
-[top_byte      CA      Hani ]  #       [0]     Hani=1
-[top_byte      CB      Hani ]  #       [0]     Hani=1
-[top_byte      CC      Hani ]  #       [0]     Hani=1
-[top_byte      CD      Hani ]  #       [0]     Hani=1
-[top_byte      CE      Hani ]  #       [0]     Hani=1
-[top_byte      CF      Hani ]  #       [0]     Hani=1
-[top_byte      D0      Hani ]  #       [0]     Hani=1
-[top_byte      D1      Hani ]  #       [0]     Hani=1
-[top_byte      D2      Hani ]  #       [0]     Hani=1
-[top_byte      D3      Hani ]  #       [0]     Hani=1
-[top_byte      D4      Hani ]  #       [0]     Hani=1
-[top_byte      D5      Hani ]  #       [0]     Hani=1
-[top_byte      D6      Hani ]  #       [0]     Hani=1
-[top_byte      D7      Hani ]  #       [0]     Hani=1
-[top_byte      D8      Hani ]  #       [0]     Hani=1
-[top_byte      D9      Hani ]  #       [0]     Hani=1
-[top_byte      DA      Hani ]  #       [0]     Hani=1
-[top_byte      DB      Hani ]  #       [0]     Hani=1
-[top_byte      DC      Hani ]  #       [0]     Hani=1
-[top_byte      DD      Hani ]  #       [0]     Hani=1
-[top_byte      DE      Hani ]  #       [0]     Hani=1
-[top_byte      DF      Hani ]  #       [0]     Hani=1
-# merged into Hani
-# [top_byte    E0      IMPLICIT ]      #       [0]     IMPLICIT=5
-# [top_byte    E1      IMPLICIT ]      #       [0]     IMPLICIT=5
-# [top_byte    E2      IMPLICIT ]      #       [0]     IMPLICIT=5
-# [top_byte    E3      IMPLICIT ]      #       [0]     IMPLICIT=5
-# [top_byte    E4      IMPLICIT ]      #       [0]     IMPLICIT=5
-[top_byte      E0      Hani ]  #       [0]     Hani=5
-[top_byte      E1      Hani ]  #       [0]     Hani=5
-[top_byte      E2      Hani ]  #       [0]     Hani=5
-[top_byte      E3      Hani ]  #       [0]     Hani=5
-[top_byte      E4      Hani ]  #       [0]     Hani=5
-[top_byte      E5      TRAILING ]      #       [0]     TRAILING=11
-[top_byte      E6      TRAILING ]      #       [0]     TRAILING=11
-[top_byte      E7      TRAILING ]      #       [0]     TRAILING=11
-[top_byte      E8      TRAILING ]      #       [0]     TRAILING=11
-[top_byte      E9      TRAILING ]      #       [0]     TRAILING=11
-[top_byte      EA      TRAILING ]      #       [0]     TRAILING=11
-[top_byte      EB      TRAILING ]      #       [0]     TRAILING=11
-[top_byte      EC      TRAILING ]      #       [0]     TRAILING=11
-[top_byte      ED      TRAILING ]      #       [0]     TRAILING=11
-[top_byte      EE      TRAILING ]      #       [0]     TRAILING=11
-[top_byte      EF      TRAILING ]      #       [0]     TRAILING=11
-[top_byte      F0      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      F1      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      F2      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      F3      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      F4      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      F5      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      F6      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      F7      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      F8      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      F9      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      FA      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      FB      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      FC      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      FD      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      FE      SPECIAL ]       #       [0]     SPECIAL=16
-[top_byte      FF      SPECIAL ]       #       [0]     SPECIAL=16
-
+[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 4C, 05]] # U+00B7 MIDDLE DOT
+[first variable [03 07, 05, 05]] # U+0009 <CHARACTER TABULATION>
+[last variable [0C 4F 6C, 05, 05]] # U+10A7F OLD SOUTH ARABIAN NUMERIC INDICATOR
+[variable top = 0C FF FF FF]
+[first regular [0D 07, 05, 05]] # U+0060 GRAVE ACCENT
+[last regular [77 FA 31, 05, 05]] # U+1099F MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2
+[first implicit [E0, 05, 05]] # CONSTRUCTED
+[last implicit [E4, 05, 05]] # CONSTRUCTED
+[first trailing [EF FD, 05, 05]] # U+FFFD REPLACEMENT CHARACTER
+[last trailing [EF FF, 05, 05]] # U+FFFF <noncharacter-FFFF>
 
 # Reordering Tokens => Top Bytes
-[reorderingTokens      Arab    61=1063 62=1063 ]
-[reorderingTokens      Armi    7A=22 ]
-[reorderingTokens      Armn    5F=82 ]
-[reorderingTokens      Avst    7A=54 ]
-[reorderingTokens      Bali    77=60 ]
-[reorderingTokens      Bamu    77=639 ]
-[reorderingTokens      Batk    74=38 ]
-[reorderingTokens      Beng    69=53 ]
-[reorderingTokens      Bopo    7A=68 ]
-[reorderingTokens      Brah    71=53 ]
-[reorderingTokens      Bugi    74=23 ]
-[reorderingTokens      Buhd    74=18 ]
+[reorderingTokens      Arab    62=1064 ]
+[reorderingTokens      Armi    77=23 ]
+[reorderingTokens      Armn    60=83 ]
+[reorderingTokens      Avst    77=55 ]
+[reorderingTokens      Bali    73=61 ]
+[reorderingTokens      Bamu    74=640 ]
+[reorderingTokens      Batk    71=39 ]
+[reorderingTokens      Beng    66=54 ]
+[reorderingTokens      Bopo    77=69 ]
+[reorderingTokens      Brah    6E=54 ]
+[reorderingTokens      Bugi    71=24 ]
+[reorderingTokens      Buhd    71=19 ]
 [reorderingTokens      CURRENCY        0F=1 ]
-[reorderingTokens      Cakm    75=36 76=36 ]
-[reorderingTokens      Cans    77=707 ]
-[reorderingTokens      Cari    7A=49 ]
-[reorderingTokens      Cham    77=52 ]
-[reorderingTokens      Cher    77=85 ]
-[reorderingTokens      Copt    5B=121 ]
-[reorderingTokens      Cprt    7A=55 ]
-[reorderingTokens      Cyrl    5C=405 5D=405 ]
-[reorderingTokens      DIGIT   10=1 11=1 12=1 13=1 14=1 15=1 16=1 17=1 18=1 19=1 1A=1 1B=1 1C=1 1D=1 1E=1 1F=1 20=1 21=1 22=1 23=1 24=1 25=1 ]
-[reorderingTokens      Deva    68=86 ]
-[reorderingTokens      Dsrt    7A=80 ]
-[reorderingTokens      Egyp    7A=1071 ]
-[reorderingTokens      Ethi    64=453 65=453 66=453 67=453 ]
+[reorderingTokens      Cakm    72=37 ]
+[reorderingTokens      Cans    74=708 ]
+[reorderingTokens      Cari    77=50 ]
+[reorderingTokens      Cham    73=53 ]
+[reorderingTokens      Cher    74=86 ]
+[reorderingTokens      Copt    5D=122 ]
+[reorderingTokens      Cprt    77=56 ]
+[reorderingTokens      Cyrl    5E=406 ]
+[reorderingTokens      DIGIT   10=1 11=1 12=1 13=1 14=1 15=1 16=1 17=1 18=1 19=1 1A=1 1B=1 1C=1 1D=1 1E=1 1F=1 20=1 21=1 22=1 23=1 24=1 25=1 26=1 27=1 ]
+[reorderingTokens      Deva    65=87 ]
+[reorderingTokens      Dsrt    77=81 ]
+[reorderingTokens      Egyp    77=1072 ]
+[reorderingTokens      Ethi    64=454 ]
 [reorderingTokens      FIELD-SEPARATOR 02=1 ]
-[reorderingTokens      Geor    5E=127 ]
-[reorderingTokens      Glag    5C=94 5D=94 ]
-[reorderingTokens      Goth    7A=25 ]
-[reorderingTokens      Grek    5B=642 ]
-[reorderingTokens      Gujr    6B=52 ]
-[reorderingTokens      Guru    6A=51 ]
-[reorderingTokens      Hang    78=534 ]
-[reorderingTokens      Hani    7B=1 7C=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 E0=5 E1=5 E2=5 E3=5 E4=5 ]
-[reorderingTokens      Hano    74=18 ]
-[reorderingTokens      Hebr    60=78 ]
-# merged into Hani
-# [reorderingTokens    IMPLICIT        E0=5 E1=5 E2=5 E3=5 E4=5 ]
-[reorderingTokens      Ital    7A=31 ]
-[reorderingTokens      Java    77=47 ]
-[reorderingTokens      Kali    74=28 ]
-[reorderingTokens      Kana    79=390 ]
-[reorderingTokens      Khar    71=35 ]
-[reorderingTokens      Khmr    77=53 ]
-[reorderingTokens      Knda    6F=55 ]
-[reorderingTokens      Kthi    71=45 ]
+[reorderingTokens      Geor    5F=128 ]
+[reorderingTokens      Glag    5E=95 ]
+[reorderingTokens      Goth    77=26 ]
+[reorderingTokens      Grek    5D=643 ]
+[reorderingTokens      Gujr    68=53 ]
+[reorderingTokens      Guru    67=52 ]
+[reorderingTokens      Hang    75=535 ]
+[reorderingTokens      Hani    78=1 79=1 7A=1 7B=1 7C=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    71=19 ]
+[reorderingTokens      Hans    78=1 79=1 7A=1 7B=1 7C=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    78=1 79=1 7A=1 7B=1 7C=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      Hebr    61=79 ]
+[reorderingTokens      Hira    76=1 ]
+[reorderingTokens      Hrkt    76=1 ]
+[reorderingTokens      IMPLICIT        E0=5 E1=5 E2=5 E3=5 E4=5 ]
+[reorderingTokens      Ital    77=32 ]
+[reorderingTokens      Java    73=48 ]
+[reorderingTokens      Kali    71=29 ]
+[reorderingTokens      Kana    76=391 ]
+[reorderingTokens      Khar    6E=36 ]
+[reorderingTokens      Khmr    73=54 ]
+[reorderingTokens      Knda    6C=56 ]
+[reorderingTokens      Kthi    6E=46 ]
 [reorderingTokens      LEVEL-SEPARATOR 01=1 ]
-[reorderingTokens      Lana    77=53 ]
-[reorderingTokens      Laoo    73=195 ]
-[reorderingTokens      Latn    26=1 27=2152 28=2152 29=2152 2A=2152 2B=2152 2C=2152 2D=2152 2E=2152 2F=2152 30=2152 31=2152 32=2152 33=2152 34=2152 35=2152 36=2152 37=2152 38=2152 39=2152 3A=2152 3B=2152 3C=2152 3D=2152 3E=2152 3F=2152 40=2152 41=2152 42=2152 43=2152 44=2152 45=2152 46=2152 47=2152 48=2152 49=2152 4A=2152 4B=2152 4C=2152 4D=2152 4E=2152 4F=2152 50=2152 51=2152 52=2152 53=2152 54=2152 55=2152 56=2152 57=2152 58=2152 59=2152 5A=2152 ]
-[reorderingTokens      Lepc    74=39 ]
-[reorderingTokens      Limb    74=29 ]
-[reorderingTokens      Linb    7A=211 ]
-[reorderingTokens      Lisu    7A=40 ]
-[reorderingTokens      Lyci    7A=29 ]
-[reorderingTokens      Lydi    7A=26 ]
-[reorderingTokens      Mand    61=25 62=25 ]
-[reorderingTokens      Merc    7A=26 ]
-[reorderingTokens      Mero    7A=32 ]
-[reorderingTokens      Mlym    70=62 ]
-[reorderingTokens      Mong    77=129 ]
-[reorderingTokens      Mtei    71=47 ]
-[reorderingTokens      Mymr    75=98 76=98 ]
-[reorderingTokens      Nkoo    63=33 ]
-[reorderingTokens      Ogam    77=26 ]
-[reorderingTokens      Olck    77=30 ]
-[reorderingTokens      Orkh    77=73 ]
-[reorderingTokens      Orya    6C=53 ]
-[reorderingTokens      Osma    7A=30 ]
+[reorderingTokens      Lana    73=54 ]
+[reorderingTokens      Laoo    70=196 ]
+[reorderingTokens      Latn    28=2153 29=2153 2A=2153 2B=2153 2C=2153 2D=2153 2E=2153 2F=2153 30=2153 31=2153 32=2153 33=2153 34=2153 35=2153 36=2153 37=2153 38=2153 39=2153 3A=2153 3B=2153 3C=2153 3D=2153 3E=2153 3F=2153 40=2153 41=2153 42=2153 43=2153 44=2153 45=2153 46=2153 47=2153 48=2153 49=2153 4A=2153 4B=2153 4C=2153 4D=2153 4E=2153 4F=2153 50=2153 51=2153 52=2153 53=2153 54=2153 55=2153 56=2153 57=2153 58=2153 59=2153 5A=2153 5B=2153 5C=2153 ]
+[reorderingTokens      Lepc    71=40 ]
+[reorderingTokens      Limb    71=30 ]
+[reorderingTokens      Linb    77=212 ]
+[reorderingTokens      Lisu    77=41 ]
+[reorderingTokens      Lyci    77=30 ]
+[reorderingTokens      Lydi    77=27 ]
+[reorderingTokens      Mand    62=26 ]
+[reorderingTokens      Merc    77=27 ]
+[reorderingTokens      Mero    77=32 ]
+[reorderingTokens      Mlym    6D=63 ]
+[reorderingTokens      Mong    73=130 ]
+[reorderingTokens      Mtei    6E=48 ]
+[reorderingTokens      Mymr    72=99 ]
+[reorderingTokens      Nkoo    63=34 ]
+[reorderingTokens      Ogam    74=27 ]
+[reorderingTokens      Olck    73=31 ]
+[reorderingTokens      Orkh    74=74 ]
+[reorderingTokens      Orya    69=54 ]
+[reorderingTokens      Osma    77=31 ]
 [reorderingTokens      PUNCTUATION     06=1 07=1 08=1 09=1 0A=1 0B=1 0C=1 ]
-[reorderingTokens      Phag    74=52 ]
-[reorderingTokens      Phli    7A=19 ]
-[reorderingTokens      Phnx    60=22 ]
-[reorderingTokens      Plrd    7A=70 ]
-[reorderingTokens      Prti    7A=22 ]
-[reorderingTokens      Rjng    74=23 ]
-[reorderingTokens      Runr    77=75 ]
+[reorderingTokens      Phag    71=53 ]
+[reorderingTokens      Phli    77=20 ]
+[reorderingTokens      Phnx    61=23 ]
+[reorderingTokens      Plrd    77=71 ]
+[reorderingTokens      Prti    77=23 ]
+[reorderingTokens      Rjng    71=24 ]
+[reorderingTokens      Runr    74=76 ]
 [reorderingTokens      SPACE   03=1 04=1 05=1 ]
 [reorderingTokens      SPECIAL F0=16 F1=16 F2=16 F3=16 F4=16 F5=16 F6=16 F7=16 F8=16 F9=16 FA=16 FB=16 FC=16 FD=16 FE=16 FF=16 ]
 [reorderingTokens      SYMBOL  0D=1 0E=1 ]
-[reorderingTokens      Samr    60=22 ]
-[reorderingTokens      Sarb    7A=29 ]
-[reorderingTokens      Saur    71=50 ]
-[reorderingTokens      Shaw    7A=48 ]
-[reorderingTokens      Shrd    71=52 ]
-[reorderingTokens      Sinh    71=59 ]
-[reorderingTokens      Sora    7A=25 ]
-[reorderingTokens      Sund    71=38 ]
-[reorderingTokens      Sylo    71=32 ]
-[reorderingTokens      Syrc    61=34 62=34 ]
+[reorderingTokens      Samr    61=23 ]
+[reorderingTokens      Sarb    77=30 ]
+[reorderingTokens      Saur    6E=51 ]
+[reorderingTokens      Shaw    77=49 ]
+[reorderingTokens      Shrd    6E=53 ]
+[reorderingTokens      Sinh    6E=60 ]
+[reorderingTokens      Sora    77=26 ]
+[reorderingTokens      Sund    6E=39 ]
+[reorderingTokens      Sylo    6E=33 ]
+[reorderingTokens      Syrc    62=35 ]
 [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    74=16 ]
-[reorderingTokens      Takr    71=43 ]
-[reorderingTokens      Tale    77=35 ]
-[reorderingTokens      Talu    77=51 ]
-[reorderingTokens      Taml    6D=38 ]
-[reorderingTokens      Tavt    73=300 ]
-[reorderingTokens      Telu    6E=54 ]
-[reorderingTokens      Tfng    63=57 ]
-[reorderingTokens      Tglg    74=17 ]
-[reorderingTokens      Thaa    63=39 ]
-[reorderingTokens      Thai    72=285 ]
-[reorderingTokens      Tibt    74=50 ]
-[reorderingTokens      Ugar    7A=30 ]
-[reorderingTokens      Vaii    77=286 ]
-[reorderingTokens      Xpeo    7A=44 ]
-[reorderingTokens      Xsux    7A=879 ]
-[reorderingTokens      Yiii    7A=1164 ]
+[reorderingTokens      Tagb    71=17 ]
+[reorderingTokens      Takr    6E=44 ]
+[reorderingTokens      Tale    73=36 ]
+[reorderingTokens      Talu    73=52 ]
+[reorderingTokens      Taml    6A=39 ]
+[reorderingTokens      Tavt    70=301 ]
+[reorderingTokens      Telu    6B=55 ]
+[reorderingTokens      Tfng    63=58 ]
+[reorderingTokens      Tglg    71=18 ]
+[reorderingTokens      Thaa    63=40 ]
+[reorderingTokens      Thai    6F=286 ]
+[reorderingTokens      Tibt    71=51 ]
+[reorderingTokens      Ugar    77=31 ]
+[reorderingTokens      Vaii    74=287 ]
+[reorderingTokens      Xpeo    77=45 ]
+[reorderingTokens      Xsux    77=880 ]
+[reorderingTokens      Yiii    77=1165 ]
 
 
 # General Categories => Top Byte
 [categories    Cc      03{SPACE}=6 ]
-[categories    Lm      0D{SYMBOL}=24 0E{SYMBOL}=25 27{Latn}=12 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 5C{Cyrl Glag}=2 5D{Cyrl Glag}=2 5F{Armn}=1 60{Hebr Phnx Samr}=1 61{Arab Syrc Mand}=2 62{Arab Syrc Mand}=2 63{Thaa Nkoo Tfng}=2 77{Khmr Tale Talu Lana Cham Bali Java Mong Olck Cher Cans Ogam Runr Orkh Vaii Bamu}=8 7A{Bopo Yiii Lisu Plrd Lyci Cari Lydi Ital Goth Dsrt Shaw Osma Sora Linb Cprt Sarb Avst Armi Prti Phli Ugar Xpeo Xsux Egyp Merc Mero}=20 ]
-[categories    Lo      68{Deva}=10 79{Kana}=2 ]
-[categories    Mc      68{Deva}=10 69{Beng}=10 6A{Guru}=3 6B{Gujr}=6 6C{Orya}=10 6D{Taml}=14 6E{Telu}=4 6F{Knda}=7 70{Mlym}=13 71{Sinh Mtei Sylo Saur Kthi Shrd Takr Sund Brah Khar}=66 74{Tibt Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Batk Rjng Kali}=37 75{Mymr Cakm}=31 76{Mymr Cakm}=31 77{Khmr Tale Talu Lana Cham Bali Java Mong Olck Cher Cans Ogam Runr Orkh Vaii Bamu}=60 7A{Bopo Yiii Lisu Plrd Lyci Cari Lydi Ital Goth Dsrt Shaw Osma Sora Linb Cprt Sarb Avst Armi Prti Phli Ugar Xpeo Xsux Egyp Merc Mero}=46 ]
-[categories    Mn      27{Latn}=35 28{Latn}=35 29{Latn}=35 2A{Latn}=35 2B{Latn}=35 2C{Latn}=35 2D{Latn}=35 2E{Latn}=35 2F{Latn}=35 30{Latn}=35 31{Latn}=35 32{Latn}=35 33{Latn}=35 34{Latn}=35 35{Latn}=35 36{Latn}=35 37{Latn}=35 38{Latn}=35 39{Latn}=35 3A{Latn}=35 3B{Latn}=35 3C{Latn}=35 3D{Latn}=35 3E{Latn}=35 3F{Latn}=35 40{Latn}=35 41{Latn}=35 42{Latn}=35 43{Latn}=35 44{Latn}=35 45{Latn}=35 46{Latn}=35 47{Latn}=35 48{Latn}=35 49{Latn}=35 4A{Latn}=35 4B{Latn}=35 4C{Latn}=35 4D{Latn}=35 4E{Latn}=35 4F{Latn}=35 50{Latn}=35 51{Latn}=35 52{Latn}=35 53{Latn}=35 54{Latn}=35 55{Latn}=35 56{Latn}=35 57{Latn}=35 58{Latn}=35 59{Latn}=35 5A{Latn}=35 5C{Cyrl Glag}=41 5D{Cyrl Glag}=41 60{Hebr Phnx Samr}=3 63{Thaa Nkoo Tfng}=11 68{Deva}=15 69{Beng}=7 6A{Guru}=9 6B{Gujr}=10 6C{Orya}=9 6D{Taml}=2 6E{Telu}=15 6F{Knda}=17 70{Mlym}=7 71{Sinh Mtei Sylo Saur Kthi Shrd Takr Sund Brah Khar}=66 72{Thai}=10 73{Laoo Tavt}=18 74{Tibt Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Batk Rjng Kali}=131 75{Mymr Cakm}=40 76{Mymr Cakm}=40 77{Khmr Tale Talu Lana Cham Bali Java Mong Olck Cher Cans Ogam Runr Orkh Vaii Bamu}=58 7A{Bopo Yiii Lisu Plrd Lyci Cari Lydi Ital Goth Dsrt Shaw Osma Sora Linb Cprt Sarb Avst Armi Prti Phli Ugar Xpeo Xsux Egyp Merc Mero}=4 ]
-[categories    Nd      12{DIGIT}=53 14{DIGIT}=107 16{DIGIT}=82 18{DIGIT}=69 1A{DIGIT}=65 1C{DIGIT}=57 1E{DIGIT}=54 20{DIGIT}=55 22{DIGIT}=54 24{DIGIT}=54 ]
-[categories    Nl      10{DIGIT}=25 11{DIGIT}=37 12{DIGIT}=1 14{DIGIT}=12 16{DIGIT}=15 18{DIGIT}=15 1A{DIGIT}=16 1C{DIGIT}=17 1E{DIGIT}=9 20{DIGIT}=9 22{DIGIT}=8 24{DIGIT}=10 77{Khmr Tale Talu Lana Cham Bali Java Mong Olck Cher Cans Ogam Runr Orkh Vaii Bamu}=13 7A{Bopo Yiii Lisu Plrd Lyci Cari Lydi Ital Goth Dsrt Shaw Osma Sora Linb Cprt Sarb Avst Armi Prti Phli Ugar Xpeo Xsux Egyp Merc Mero}=2 ]
-[categories    No      10{DIGIT}=99 11{DIGIT}=45 12{DIGIT}=5 14{DIGIT}=35 16{DIGIT}=20 18{DIGIT}=19 1A{DIGIT}=15 1C{DIGIT}=13 1E{DIGIT}=12 20{DIGIT}=12 22{DIGIT}=12 24{DIGIT}=11 ]
+[categories    Lm      0D{SYMBOL}=27 0E{SYMBOL}=22 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 5E{Cyrl Glag}=2 60{Armn}=1 61{Hebr Phnx Samr}=1 62{Arab Syrc Mand}=2 63{Thaa Nkoo Tfng}=2 73{Khmr Tale Talu Lana Cham Bali Java Mong Olck}=7 74{Cher Cans Ogam Runr Orkh Vaii Bamu}=1 77{Bopo Yiii Lisu Plrd Lyci Cari Lydi Ital Goth Dsrt Shaw Osma Sora Linb Cprt Sarb Avst Armi Prti Phli Ugar Xpeo Xsux Egyp Merc Mero}=20 ]
+[categories    Lo      65{Deva}=10 76{Hira Hrkt Kana}=2 ]
+[categories    Mc      65{Deva}=10 66{Beng}=10 67{Guru}=3 68{Gujr}=6 69{Orya}=10 6A{Taml}=14 6B{Telu}=4 6C{Knda}=7 6D{Mlym}=13 6E{Sinh Mtei Sylo Saur Kthi Shrd Takr Sund Brah Khar}=66 71{Tibt Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Batk Rjng Kali}=36 72{Mymr Cakm}=31 73{Khmr Tale Talu Lana Cham Bali Java Mong Olck}=60 77{Bopo Yiii Lisu Plrd Lyci Cari Lydi Ital Goth Dsrt Shaw Osma Sora Linb Cprt Sarb Avst Armi Prti Phli Ugar Xpeo Xsux Egyp Merc Mero}=46 ]
+[categories    Mn      28{Latn}=35 29{Latn}=35 2A{Latn}=35 2B{Latn}=35 2C{Latn}=35 2D{Latn}=35 2E{Latn}=35 2F{Latn}=35 30{Latn}=35 31{Latn}=35 32{Latn}=35 33{Latn}=35 34{Latn}=35 35{Latn}=35 36{Latn}=35 37{Latn}=35 38{Latn}=35 39{Latn}=35 3A{Latn}=35 3B{Latn}=35 3C{Latn}=35 3D{Latn}=35 3E{Latn}=35 3F{Latn}=35 40{Latn}=35 41{Latn}=35 42{Latn}=35 43{Latn}=35 44{Latn}=35 45{Latn}=35 46{Latn}=35 47{Latn}=35 48{Latn}=35 49{Latn}=35 4A{Latn}=35 4B{Latn}=35 4C{Latn}=35 4D{Latn}=35 4E{Latn}=35 4F{Latn}=35 50{Latn}=35 51{Latn}=35 52{Latn}=35 53{Latn}=35 54{Latn}=35 55{Latn}=35 56{Latn}=35 57{Latn}=35 58{Latn}=35 59{Latn}=35 5A{Latn}=35 5B{Latn}=35 5C{Latn}=35 5E{Cyrl Glag}=41 61{Hebr Phnx Samr}=3 63{Thaa Nkoo Tfng}=11 65{Deva}=15 66{Beng}=7 67{Guru}=9 68{Gujr}=10 69{Orya}=9 6A{Taml}=2 6B{Telu}=15 6C{Knda}=17 6D{Mlym}=7 6E{Sinh Mtei Sylo Saur Kthi Shrd Takr Sund Brah Khar}=66 6F{Thai}=10 70{Laoo Tavt}=18 71{Tibt Lepc Phag Limb Tglg Hano Buhd Tagb Bugi Batk Rjng Kali}=132 72{Mymr Cakm}=40 73{Khmr Tale Talu Lana Cham Bali Java Mong Olck}=58 77{Bopo Yiii Lisu Plrd Lyci Cari Lydi Ital Goth Dsrt Shaw Osma Sora Linb Cprt Sarb Avst Armi Prti Phli Ugar Xpeo Xsux Egyp Merc Mero}=4 ]
+[categories    Nd      10{DIGIT}=1 11{DIGIT}=1 14{DIGIT}=53 16{DIGIT}=107 18{DIGIT}=82 1A{DIGIT}=69 1C{DIGIT}=65 1E{DIGIT}=57 20{DIGIT}=54 22{DIGIT}=55 24{DIGIT}=54 26{DIGIT}=54 ]
+[categories    Nl      12{DIGIT}=28 13{DIGIT}=32 14{DIGIT}=1 16{DIGIT}=12 18{DIGIT}=16 1A{DIGIT}=16 1C{DIGIT}=16 1E{DIGIT}=17 20{DIGIT}=9 22{DIGIT}=9 24{DIGIT}=8 26{DIGIT}=10 74{Cher Cans Ogam Runr Orkh Vaii Bamu}=13 77{Bopo Yiii Lisu Plrd Lyci Cari Lydi Ital Goth Dsrt Shaw Osma Sora Linb Cprt Sarb Avst Armi Prti Phli Ugar Xpeo Xsux Egyp Merc Mero}=2 ]
+[categories    No      12{DIGIT}=99 13{DIGIT}=45 14{DIGIT}=5 16{DIGIT}=35 18{DIGIT}=20 1A{DIGIT}=19 1C{DIGIT}=15 1E{DIGIT}=13 20{DIGIT}=12 22{DIGIT}=12 24{DIGIT}=12 26{DIGIT}=11 ]
 [categories    Pc      06{PUNCTUATION}=7 0B{PUNCTUATION}=3 ]
-[categories    Pd      06{PUNCTUATION}=21 0C{PUNCTUATION}=2 ]
-[categories    Pe      0A{PUNCTUATION}=31 0B{PUNCTUATION}=40 ]
+[categories    Pd      06{PUNCTUATION}=21 0B{PUNCTUATION}=2 ]
+[categories    Pe      0A{PUNCTUATION}=44 0B{PUNCTUATION}=29 ]
 [categories    Pf      0A{PUNCTUATION}=4 0B{PUNCTUATION}=6 ]
-[categories    Pi      0A{PUNCTUATION}=6 0B{PUNCTUATION}=6 ]
-[categories    Po      06{PUNCTUATION}=5 07{PUNCTUATION}=4 08{PUNCTUATION}=102 09{PUNCTUATION}=8 0A{PUNCTUATION}=125 0B{PUNCTUATION}=68 0C{PUNCTUATION}=115 ]
-[categories    Ps      0A{PUNCTUATION}=172 0B{PUNCTUATION}=49 ]
-[categories    Sc      0F{CURRENCY}=47 ]
+[categories    Pi      06{PUNCTUATION}=1 0A{PUNCTUATION}=6 0B{PUNCTUATION}=6 ]
+[categories    Po      06{PUNCTUATION}=5 07{PUNCTUATION}=4 08{PUNCTUATION}=102 09{PUNCTUATION}=8 0A{PUNCTUATION}=125 0B{PUNCTUATION}=95 0C{PUNCTUATION}=88 ]
+[categories    Ps      0A{PUNCTUATION}=184 0B{PUNCTUATION}=39 ]
+[categories    Sc      0F{CURRENCY}=48 ]
 [categories    Sk      0D{SYMBOL}=86 ]
-[categories    Sm      0D{SYMBOL}=951 ]
-[categories    So      0D{SYMBOL}=3330 0E{SYMBOL}=1 27{Latn}=69 28{Latn}=69 29{Latn}=69 2A{Latn}=69 2B{Latn}=69 2C{Latn}=69 2D{Latn}=69 2E{Latn}=69 2F{Latn}=69 30{Latn}=69 31{Latn}=69 32{Latn}=69 33{Latn}=69 34{Latn}=69 35{Latn}=69 36{Latn}=69 37{Latn}=69 38{Latn}=69 39{Latn}=69 3A{Latn}=69 3B{Latn}=69 3C{Latn}=69 3D{Latn}=69 3E{Latn}=69 3F{Latn}=69 40{Latn}=69 41{Latn}=69 42{Latn}=69 43{Latn}=69 44{Latn}=69 45{Latn}=69 46{Latn}=69 47{Latn}=69 48{Latn}=69 49{Latn}=69 4A{Latn}=69 4B{Latn}=69 4C{Latn}=69 4D{Latn}=69 4E{Latn}=69 4F{Latn}=69 50{Latn}=69 51{Latn}=69 52{Latn}=69 53{Latn}=69 54{Latn}=69 55{Latn}=69 56{Latn}=69 57{Latn}=69 58{Latn}=69 59{Latn}=69 5A{Latn}=69 61{Arab Syrc Mand}=2 62{Arab Syrc Mand}=2 77{Khmr Tale Talu Lana Cham Bali Java Mong Olck Cher Cans Ogam Runr Orkh Vaii Bamu}=2 ]
+[categories    Sm      0D{SYMBOL}=947 ]
+[categories    So      0D{SYMBOL}=3331 28{Latn}=69 29{Latn}=69 2A{Latn}=69 2B{Latn}=69 2C{Latn}=69 2D{Latn}=69 2E{Latn}=69 2F{Latn}=69 30{Latn}=69 31{Latn}=69 32{Latn}=69 33{Latn}=69 34{Latn}=69 35{Latn}=69 36{Latn}=69 37{Latn}=69 38{Latn}=69 39{Latn}=69 3A{Latn}=69 3B{Latn}=69 3C{Latn}=69 3D{Latn}=69 3E{Latn}=69 3F{Latn}=69 40{Latn}=69 41{Latn}=69 42{Latn}=69 43{Latn}=69 44{Latn}=69 45{Latn}=69 46{Latn}=69 47{Latn}=69 48{Latn}=69 49{Latn}=69 4A{Latn}=69 4B{Latn}=69 4C{Latn}=69 4D{Latn}=69 4E{Latn}=69 4F{Latn}=69 50{Latn}=69 51{Latn}=69 52{Latn}=69 53{Latn}=69 54{Latn}=69 55{Latn}=69 56{Latn}=69 57{Latn}=69 58{Latn}=69 59{Latn}=69 5A{Latn}=69 5B{Latn}=69 5C{Latn}=69 62{Arab Syrc Mand}=2 73{Khmr Tale Talu Lana Cham Bali Java Mong Olck}=2 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 06{PUNCTUATION}=6 0D{SYMBOL}=29 5B{Grek Copt}=1 ]
+[categories    Zs      03{SPACE}=1 04{SPACE}=17 06{PUNCTUATION}=6 0D{SYMBOL}=29 5D{Grek Copt}=1 ]
 
 
 
@@ -41547,3 +41658,10 @@ FDD0 00B2;     [, , 3F 03]     # CONSTRUCTED FAKE SECONDARY-IGNORABLE
 [fixed last trail byte EF]
 [fixed first special byte F0]
 [fixed last special byte FF]
+
+[fixed secondary common byte 05]
+[fixed last secondary common byte 45]
+[fixed first ignorable secondary byte 80]
+
+[fixed tertiary common byte 05]
+[fixed first ignorable tertiary byte 3C]
index 6c6c7bf4df32dc8a14340d76f8d5303cfa1c5002..fd9785bd586458b0361d12e35d9baa965d382489 100644 (file)
@@ -1,7 +1,7 @@
 # File:        UCA_Rules_SHORT.txt
-# UCA Version: 6.2.0
-# UCD Version: 6.2.0
-# Generated:   2012-08-23, 08:39:52 GMT [MD]
+# UCA Version: 6.3.0
+# UCD Version: 6.3.0
+# Generated:   2013-09-03 [MS]
 # For a description of the format and usage, see CollationAuxiliary.html
 
 & [last tertiary ignorable]
     =   ؘ
     =   ؙ
     =   ؚ
+    =   '\u061C'
     =   ‎ـ‎
     =   ۖ
     =   ۗ
     =   ᠋
     =   ᠌
     =   ᠍
+    =   '\u180E'
     =   ᩿
     =   ᭫
     =   ᭬
     =   '\u2062'
     =   '\u2063'
     =   '\u2064'
+    =   '\u2066'
+    =   '\u2067'
+    =   '\u2068'
+    =   '\u2069'
     =   '\u206A'
     =   '\u206B'
     =   '\u206C'
     =   ⃢
     =   ⃣
     =   ⃤
+  <<    ゙
+   <<<  ゙
+  <<    ゚
+   <<<  ゚
+  <<    ̵
   <<    ̅
   <<    ̉
   <<    ̏
   <<    ̰
   <<    ̱
   <<    ̴
-  <<    ̵
   <<    ̹
   <<    ͅ
   <<    ͘
   <<    〭
   <<    〮
   <<    〯
-  <<    ゙
-   <<<  ゙
-  <<    ゚
-   <<<  ゚
   <<    ⃐
   <<    ⃑
   <<    ⃒
   <<    ⃨
   <<    ⃩
   <<    𐇽
-& [last regular]
- <      '\uFFFE'
+# TODO: There are several problems with this file. See http://unicode.org/cldr/trac/ticket/6745
+&'\u202F'  # TODO: reset to the last space, not [last regular]
+# TODO: do not tailor this: <   '\uFFFE'
  <      '\u0009'
  <      '\u000A'
  <      '\u000B'
  <      '\u000C'
  <      '\u000D'
  <      '\u0085'
- <      '᠎'
  <      '\u2028'
  <      '\u2029'
  <      ' '
    <<<  ' '
     =   ' '
     =   ' '
+&[last variable]  # TODO: insert this reset so that variables work
  <      ‾
    <<<  ﹉
     =   ﹊
  <      »
  <      '('
    <<<  (
-   <<<  ⑴ / 1')'
-   <<<  ⑽ / 10')'
-   <<<  ⑾ / 11')'
-   <<<  ⑿ / 12')'
-   <<<  ⒀ / 13')'
-   <<<  ⒁ / 14')'
-   <<<  ⒂ / 15')'
-   <<<  ⒃ / 16')'
-   <<<  ⒄ / 17')'
-   <<<  ⒅ / 18')'
-   <<<  ⒆ / 19')'
-   <<<  ⑵ / 2')'
-   <<<  ⒇ / 20')'
-   <<<  ⑶ / 3')'
-   <<<  ⑷ / 4')'
-   <<<  ⑸ / 5')'
-   <<<  ⑹ / 6')'
-   <<<  ⑺ / 7')'
-   <<<  ⑻ / 8')'
-   <<<  ⑼ / 9')'
+   <<<  ⑴ / 𝍠')'
+   <<<  ⑽ / 𝍠𑛀')'
+   <<<  ⑾ / 𝍠𝍠')'
+   <<<  ⑿ / 𝍠𝍡')'
+   <<<  ⒀ / 𝍠𝍢')'
+   <<<  ⒁ / 𝍠𝍣')'
+   <<<  ⒂ / 𝍠𝍤')'
+   <<<  ⒃ / 𝍠𝍥')'
+   <<<  ⒄ / 𝍠𝍦')'
+   <<<  ⒅ / 𝍠𝍧')'
+   <<<  ⒆ / 𝍠𝍨')'
+   <<<  ⑵ / 𝍡')'
+   <<<  ⒇ / 𝍡𑛀')'
+   <<<  ⑶ / 𝍢')'
+   <<<  ⑷ / 𝍣')'
+   <<<  ⑸ / 𝍤')'
+   <<<  ⑹ / 𝍥')'
+   <<<  ⑺ / 𝍦')'
+   <<<  ⑻ / 𝍧')'
+   <<<  ⑼ / 𝍨')'
    <<<  ⒜ / a')'
    <<<  🄐 / A')'
    <<<  ⒝ / b')'
  <      ᚜
  <      ⁅
  <      ⁆
+ <      ⌈
+ <      ⌉
+ <      ⌊
+ <      ⌋
  <      ⧼
  <      ⧽
  <      ⦃
  <      𑂼
  <      𑇇
  <      ‎𐩿‎
- <      [variable top]
+# TODO: do not try to set this: <       [variable top]
+&\u30FD  # TODO: instead, reset to the last symbol so that maxVariable=symbol works
  <      '`'
    <<<  `
  <      ´
  <      ⌅
  <      ⌆
  <      ⌇
- <      ⌈
- <      ⌉
- <      ⌊
- <      ⌋
  <      ⌌
  <      ⌍
  <      ⌎
  <      𝅕
  <      𝅖
  <      𝅗
-    =   𝅗𝅥
  <      𝅘
-    =   𝅘𝅥
-    =   𝅘𝅥𝅮
-    =   𝅘𝅥𝅯
-    =   𝅘𝅥𝅰
-    =   𝅘𝅥𝅱
-    =   𝅘𝅥𝅲
  <      𝅙
  <      𝅚
  <      𝅛
  <      𝆷
  <      𝆸
  <      𝆹
-    =   𝆹𝅥
-    =   𝆹𝅥𝅮
-    =   𝆹𝅥𝅯
  <      𝆺
-    =   𝆺𝅥
-    =   𝆺𝅥𝅮
-    =   𝆺𝅥𝅯
  <      𝇁
  <      𝇂
  <      𝇃
  <      ㆑
  <      ㉿
  <      
- <      �
  <      ː
  <      ˑ
  <      ॱ
  <      ー
    <<<  ー
  <      ヽ
+&\uFDFC  # TODO: reset to the last currency symbol
  <      ¤
  <      ¢
    <<<  ¢
  <      ₺
  <      ₨
  <      ‎﷼‎
+&[last regular]  # TODO: digits & letters from here
  <      ৴
  <      ৵
  <      ৶
  <      ‎𐩇‎
  <      𒐲
  <      𒐳
- <      𒑖
- <      𒑗
  <      𒑚
  <      𒑛
  <      𒑜
  <      𝍰
  <      𝍱
  <      0
+    =   ٠
+    =   ۰
+    =   ‎߀‎
+    =   ०
+    =   ০
+    =   ੦
+    =   ૦
+    =   ୦
+    =   ௦
+    =   ౦
+    =   ౸
+    =   ೦
+    =   ൦
+    =   ๐
+    =   ໐
+    =   ༠
+    =   ၀
+    =   ႐
+    =   ០
+    =   ៰
+    =   ᠐
+    =   ᥆
+    =   ᧐
+    =   ᪀
+    =   ᪐
+    =   ᭐
+    =   ᮰
+    =   ᱀
+    =   ᱐
+    =   〇
+    =   ꘠
+    =   ꣐
+    =   ꤀
+    =   ꧐
+    =   ꩐
+    =   ꯰
+    =   𐆊
+    =   𐒠
+    =   𑁦
+    =   𑃰
+    =   𑄶
+    =   𑇐
+    =   𑛀
    <<<  0
+   <<<  ༳
    <<<  🄁 / ','
    <<<  🄀 / '.'
    <<<  ㍘ / 点
     =   ⓿
    <<<  ⁰
    <<<  ₀
-   <<<  ↉ / ⁄3
-  <<    ٠
-  <<    ۰
-  <<    ‎߀‎
-  <<    𐒠
-  <<    ०
-  <<    ০
-  <<    ੦
-  <<    ૦
-  <<    ୦
-  <<    ௦
-  <<    ౦
-    =   ౸
-  <<    ೦
-  <<    ൦
-  <<    ꯰
-  <<    ꣐
-  <<    ᥆
-  <<    ᧐
-  <<    ᪀
-  <<    ᪐
-  <<    ๐
-  <<    ໐
-  <<    ༠
-   <<<  ༳
-  <<    ᱀
-  <<    ꤀
-  <<    ၀
-  <<    ႐
-  <<    𑄶
-  <<    ០
-  <<    ៰
-  <<    ꩐
-  <<    ᭐
-  <<    ꧐
-  <<    ᮰
-  <<    ᠐
-  <<    ᱐
-  <<    ꘠
-  <<    𑃰
-  <<    〇
-  <<    𐆊
-  <<    𑇐
-  <<    𑛀
-  <<    𑁦
+   <<<  ↉ / ⁄𝍢
  <      1
+    =   ١
+    =   ۱
+    =   ‎߁‎
+    =   १
+    =   ১
+    =   ੧
+    =   ૧
+    =   ୧
+    =   ௧
+    =   ౧
+    =   ౹
+    =   ౼
+    =   ೧
+    =   ൧
+    =   ๑
+    =   ໑
+    =   ༡
+    =   ၁
+    =   ႑
+    =   ፩
+    =   ១
+    =   ៱
+    =   ᠑
+    =   ᥇
+    =   ᧑
+    =   ᧚
+    =   ᪁
+    =   ᪑
+    =   ᭑
+    =   ᮱
+    =   ᱁
+    =   ᱑
+    =   〡
+    =   ꘡
+    =   ꣑
+    =   ꤁
+    =   ꧑
+    =   ꩑
+    =   ꯱
+    =   𐄇
+    =   𐅂
+    =   𐅘
+    =   𐅙
+    =   𐅚
+    =   𐌠
+    =   𐏑
+    =   𐒡
+    =   ‎𐡘‎
+    =   ‎𐤖‎
+    =   ‎𐩀‎
+    =   ‎𐩽‎
+    =   ‎𐭘‎
+    =   ‎𐭸‎
+    =   𐹠
+    =   𑁒
+    =   𑁧
+    =   𑃱
+    =   𑄷
+    =   𑇑
+    =   𑛁
+    =   𒐕
+    =   𒐞
+    =   𒐬
+    =   𒐴
+    =   𒑏
+    =   𒑘
+    =   𝍠
    <<<  1
+   <<<  ༪
    <<<  🄂 / ','
    <<<  ⒈ / '.'
-   <<<  ⒑ / 0'.'
-   <<<  ㏩ / 0
-   <<<  ㋉ / 0
-   <<<  ㍢ / 0
-   <<<  ⒒ / 1'.'
-   <<<  ㏪ / 1
-   <<<  ㋊ / 1
-   <<<  ㍣ / 1
-   <<<  ⒓ / 2'.'
-   <<<  ㏫ / 2
-   <<<  ㋋ / 2
-   <<<  ㍤ / 2
-   <<<  ⒔ / 3'.'
-   <<<  ㏬ / 3
-   <<<  ㍥ / 3
-   <<<  ⒕ / 4'.'
-   <<<  ㏭ / 4
-   <<<  ㍦ / 4
-   <<<  ⒖ / 5'.'
-   <<<  ㏮ / 5
-   <<<  ㍧ / 5
-   <<<  ⒗ / 6'.'
-   <<<  ㏯ / 6
-   <<<  ㍨ / 6
-   <<<  ⒘ / 7'.'
-   <<<  ㏰ / 7
-   <<<  ㍩ / 7
-   <<<  ⒙ / 8'.'
-   <<<  ㏱ / 8
-   <<<  ㍪ / 8
-   <<<  ⒚ / 9'.'
-   <<<  ㏲ / 9
-   <<<  ㍫ / 9
+   <<<  ⒑ / 𑛀'.'
+   <<<  ㏩ / 𑛀
+   <<<  ㋉ / 𑛀
+   <<<  ㍢ / 𑛀
+   <<<  ⒒ / 𝍠'.'
+   <<<  ㏪ / 𝍠
+   <<<  ㋊ / 𝍠
+   <<<  ㍣ / 𝍠
+   <<<  ⒓ / 𝍡'.'
+   <<<  ㏫ / 𝍡
+   <<<  ㋋ / 𝍡
+   <<<  ㍤ / 𝍡
+   <<<  ⒔ / 𝍢'.'
+   <<<  ㏬ / 𝍢
+   <<<  ㍥ / 𝍢
+   <<<  ⒕ / 𝍣'.'
+   <<<  ㏭ / 𝍣
+   <<<  ㍦ / 𝍣
+   <<<  ⒖ / 𝍤'.'
+   <<<  ㏮ / 𝍤
+   <<<  ㍧ / 𝍤
+   <<<  ⒗ / 𝍥'.'
+   <<<  ㏯ / 𝍥
+   <<<  ㍨ / 𝍥
+   <<<  ⒘ / 𝍦'.'
+   <<<  ㏰ / 𝍦
+   <<<  ㍩ / 𝍦
+   <<<  ⒙ / 𝍧'.'
+   <<<  ㏱ / 𝍧
+   <<<  ㍪ / 𝍧
+   <<<  ⒚ / 𝍨'.'
+   <<<  ㏲ / 𝍨
+   <<<  ㍫ / 𝍨
    <<<  ㏠ / 日
    <<<  ㋀ / 月
    <<<  ㍙ / 点
     =   ❶
     =   ➀
     =   ➊
-   <<<  ⑩ / 0
-    =   ⓾ / 0
-    =   ❿ / 0
-    =   ➉ / 0
-    =   ➓ / 0
-    =   ㉈ / 0
-   <<<  ⑪ / 1
-    =   ⓫ / 1
-   <<<  ⑫ / 2
-    =   ⓬ / 2
-   <<<  ⑬ / 3
-    =   ⓭ / 3
-   <<<  ⑭ / 4
-    =   ⓮ / 4
-   <<<  ⑮ / 5
-    =   ⓯ / 5
-   <<<  ⑯ / 6
-    =   ⓰ / 6
-   <<<  ⑰ / 7
-    =   ⓱ / 7
-   <<<  ⑱ / 8
-    =   ⓲ / 8
-   <<<  ⑲ / 9
-    =   ⓳ / 9
+   <<<  ⑩ / 𑛀
+    =   ⓾ / 𑛀
+    =   ❿ / 𑛀
+    =   ➉ / 𑛀
+    =   ➓ / 𑛀
+    =   ㉈ / 𑛀
+   <<<  ⑪ / 𝍠
+    =   ⓫ / 𝍠
+   <<<  ⑫ / 𝍡
+    =   ⓬ / 𝍡
+   <<<  ⑬ / 𝍢
+    =   ⓭ / 𝍢
+   <<<  ⑭ / 𝍣
+    =   ⓮ / 𝍣
+   <<<  ⑮ / 𝍤
+    =   ⓯ / 𝍤
+   <<<  ⑯ / 𝍥
+    =   ⓰ / 𝍥
+   <<<  ⑰ / 𝍦
+    =   ⓱ / 𝍦
+   <<<  ⑱ / 𝍧
+    =   ⓲ / 𝍧
+   <<<  ⑲ / 𝍨
+    =   ⓳ / 𝍨
    <<<  ¹
    <<<  ₁
    <<<  ⅟ / ⁄
-   <<<  ⅒ / ⁄10
-   <<<  ½ / ⁄2
-   <<<  ⅓ / ⁄3
-   <<<  ¼ / ⁄4
-   <<<  ⅕ / ⁄5
-   <<<  ⅙ / ⁄6
-   <<<  ⅐ / ⁄7
-   <<<  ⅛ / ⁄8
-   <<<  ⅑ / ⁄9
-  <<    ١
-  <<    ۱
-  <<    𐹠
-  <<    ‎߁‎
-  <<    ፩
-  <<    𐒡
-  <<    १
-  <<    ১
-  <<    ੧
-  <<    ૧
-  <<    ୧
-  <<    ௧
-  <<    ౧
-    =   ౹
-    =   ౼
-  <<    ೧
-  <<    ൧
-  <<    ꯱
-  <<    ꣑
-  <<    ᥇
-  <<    ᧑
-    =   ᧚
-  <<    ᪁
-  <<    ᪑
-  <<    ๑
-  <<    ໑
-  <<    ༡
-   <<<  ༪
-  <<    ᱁
-  <<    ꤁
-  <<    ၁
-  <<    ႑
-  <<    𑄷
-  <<    ១
-  <<    ៱
-  <<    ꩑
-  <<    ᭑
-  <<    ꧑
-  <<    ᮱
-  <<    ᠑
-  <<    ᱑
-  <<    ꘡
-  <<    𑃱
-  <<    〡
-  <<    𐄇
-  <<    𐅂
-    =   𐅘
-    =   𐅙
-    =   𐅚
-  <<    𐌠
-  <<    𐏑
-  <<    𒐕
-    =   𒐞
-    =   𒐬
-    =   𒐴
-    =   𒑏
-    =   𒑘
-  <<    ‎𐩽‎
-  <<    ‎𐤖‎
-  <<    ‎𐡘‎
-  <<    ‎𐭘‎
-  <<    ‎𐭸‎
-  <<    𑇑
-  <<    𑛁
-  <<    𑁧
-  <<    𑁒
-  <<    ‎𐩀‎
-  <<    𝍠
+   <<<  ⅒ / ⁄𝍠𑛀
+   <<<  ½ / ⁄𝍡
+   <<<  ⅓ / ⁄𝍢
+   <<<  ¼ / ⁄𝍣
+   <<<  ⅕ / ⁄𝍤
+   <<<  ⅙ / ⁄𝍥
+   <<<  ⅐ / ⁄𝍦
+   <<<  ⅛ / ⁄𝍧
+   <<<  ⅑ / ⁄𝍨
  <      2
+    =   ٢
+    =   ۲
+    =   ‎߂‎
+    =   २
+    =   ২
+    =   ੨
+    =   ૨
+    =   ୨
+    =   ௨
+    =   ౨
+    =   ౺
+    =   ౽
+    =   ೨
+    =   ൨
+    =   ๒
+    =   ໒
+    =   ༢
+    =   ၂
+    =   ႒
+    =   ፪
+    =   ២
+    =   ៲
+    =   ᠒
+    =   ᥈
+    =   ᧒
+    =   ᪂
+    =   ᪒
+    =   ᭒
+    =   ᮲
+    =   ᱂
+    =   ᱒
+    =   〢
+    =   ꘢
+    =   ꣒
+    =   ꤂
+    =   ꧒
+    =   ꩒
+    =   ꯲
+    =   𐄈
+    =   𐅛
+    =   𐅜
+    =   𐅝
+    =   𐅞
+    =   𐏒
+    =   𐒢
+    =   ‎𐡙‎
+    =   ‎𐤚‎
+    =   ‎𐩁‎
+    =   ‎𐭙‎
+    =   ‎𐭹‎
+    =   𐹡
+    =   𑁓
+    =   𑁨
+    =   𑃲
+    =   𑄸
+    =   𑇒
+    =   𑛂
+    =   𒐀
+    =   𒐖
+    =   𒐟
+    =   𒐣
+    =   𒐭
+    =   𒐵
+    =   𒑊
+    =   𒑐
+    =   𒑖
+    =   𒑙
+    =   𝍡
    <<<  2
+   <<<  ༫
    <<<  🄃 / ','
    <<<  ⒉ / '.'
-   <<<  ⒛ / 0'.'
-   <<<  ㏳ / 0
-   <<<  ㍬ / 0
-   <<<  ㏴ / 1
-   <<<  ㍭ / 1
-   <<<  ㏵ / 2
-   <<<  ㍮ / 2
-   <<<  ㏶ / 3
-   <<<  ㍯ / 3
-   <<<  ㏷ / 4
-   <<<  ㍰ / 4
-   <<<  ㏸ / 5
-   <<<  ㏹ / 6
-   <<<  ㏺ / 7
-   <<<  ㏻ / 8
-   <<<  ㏼ / 9
+   <<<  ⒛ / 𑛀'.'
+   <<<  ㏳ / 𑛀
+   <<<  ㍬ / 𑛀
+   <<<  ㏴ / 𝍠
+   <<<  ㍭ / 𝍠
+   <<<  ㏵ / 𝍡
+   <<<  ㍮ / 𝍡
+   <<<  ㏶ / 𝍢
+   <<<  ㍯ / 𝍢
+   <<<  ㏷ / 𝍣
+   <<<  ㍰ / 𝍣
+   <<<  ㏸ / 𝍤
+   <<<  ㏹ / 𝍥
+   <<<  ㏺ / 𝍦
+   <<<  ㏻ / 𝍧
+   <<<  ㏼ / 𝍨
    <<<  ㏡ / 日
    <<<  ㋁ / 月
    <<<  ㍚ / 点
     =   ❷
     =   ➁
     =   ➋
-   <<<  ⑳ / 0
-    =   ⓴ / 0
-    =   ㉉ / 0
-   <<<  ㉑ / 1
-   <<<  ㉒ / 2
-   <<<  ㉓ / 3
-   <<<  ㉔ / 4
-   <<<  ㉕ / 5
-   <<<  ㉖ / 6
-   <<<  ㉗ / 7
-   <<<  ㉘ / 8
-   <<<  ㉙ / 9
+   <<<  ⑳ / 𑛀
+    =   ⓴ / 𑛀
+    =   ㉉ / 𑛀
+   <<<  ㉑ / 𝍠
+   <<<  ㉒ / 𝍡
+   <<<  ㉓ / 𝍢
+   <<<  ㉔ / 𝍣
+   <<<  ㉕ / 𝍤
+   <<<  ㉖ / 𝍥
+   <<<  ㉗ / 𝍦
+   <<<  ㉘ / 𝍧
+   <<<  ㉙ / 𝍨
    <<<  ²
    <<<  ₂
-   <<<  ⅔ / ⁄3
-   <<<  ⅖ / ⁄5
-  <<    ٢
-  <<    ۲
-  <<    𐹡
-  <<    ‎߂‎
-  <<    ፪
-  <<    𐒢
-  <<    २
-  <<    ২
-  <<    ੨
-  <<    ૨
-  <<    ୨
-  <<    ௨
-  <<    ౨
-    =   ౺
-    =   ౽
-  <<    ೨
-  <<    ൨
-  <<    ꯲
-  <<    ꣒
-  <<    ᥈
-  <<    ᧒
-  <<    ᪂
-  <<    ᪒
-  <<    ๒
-  <<    ໒
-  <<    ༢
-   <<<  ༫
-  <<    ᱂
-  <<    ꤂
-  <<    ၂
-  <<    ႒
-  <<    𑄸
-  <<    ២
-  <<    ៲
-  <<    ꩒
-  <<    ᭒
-  <<    ꧒
-  <<    ᮲
-  <<    ᠒
-  <<    ᱒
-  <<    ꘢
-  <<    𑃲
-  <<    〢
-  <<    𐄈
-  <<    𐅛
-    =   𐅜
-    =   𐅝
-    =   𐅞
-  <<    𐏒
-  <<    𒐀
-    =   𒐖
-    =   𒐟
-    =   𒐣
-    =   𒐭
-    =   𒐵
-    =   𒑊
-    =   𒑐
-    =   𒑙
-  <<    ‎𐤚‎
-  <<    ‎𐡙‎
-  <<    ‎𐭙‎
-  <<    ‎𐭹‎
-  <<    𑇒
-  <<    𑛂
-  <<    𑁨
-  <<    𑁓
-  <<    ‎𐩁‎
-  <<    𝍡
+   <<<  ⅔ / ⁄𝍢
+   <<<  ⅖ / ⁄𝍤
  <      3
+    =   ٣
+    =   ۳
+    =   ‎߃‎
+    =   ३
+    =   ৩
+    =   ੩
+    =   ૩
+    =   ୩
+    =   ௩
+    =   ౩
+    =   ౻
+    =   ౾
+    =   ೩
+    =   ൩
+    =   ๓
+    =   ໓
+    =   ༣
+    =   ၃
+    =   ႓
+    =   ፫
+    =   ៣
+    =   ៳
+    =   ᠓
+    =   ᥉
+    =   ᧓
+    =   ᪃
+    =   ᪓
+    =   ᭓
+    =   ᮳
+    =   ᱃
+    =   ᱓
+    =   〣
+    =   ꘣
+    =   ꣓
+    =   ꤃
+    =   ꧓
+    =   ꩓
+    =   ꯳
+    =   𐄉
+    =   𐒣
+    =   ‎𐡚‎
+    =   ‎𐤛‎
+    =   ‎𐩂‎
+    =   ‎𐭚‎
+    =   ‎𐭺‎
+    =   𐹢
+    =   𑁔
+    =   𑁩
+    =   𑃳
+    =   𑄹
+    =   𑇓
+    =   𑛃
+    =   𒐁
+    =   𒐈
+    =   𒐗
+    =   𒐠
+    =   𒐤
+    =   𒐥
+    =   𒐮
+    =   𒐯
+    =   𒐶
+    =   𒐷
+    =   𒐺
+    =   𒐻
+    =   𒑋
+    =   𒑑
+    =   𒑗
+    =   𝍢
    <<<  3
+   <<<  ༬
    <<<  🄄 / ','
    <<<  ⒊ / '.'
-   <<<  ㏽ / 0
-   <<<  ㏾ / 1
+   <<<  ㏽ / 𑛀
+   <<<  ㏾ / 𝍠
    <<<  ㏢ / 日
    <<<  ㋂ / 月
    <<<  ㍛ / 点
     =   ❸
     =   ➂
     =   ➌
-   <<<  ㉊ / 0
-    =   ㉚ / 0
-   <<<  ㉛ / 1
-   <<<  ㉜ / 2
-   <<<  ㉝ / 3
-   <<<  ㉞ / 4
-   <<<  ㉟ / 5
-   <<<  ㊱ / 6
-   <<<  ㊲ / 7
-   <<<  ㊳ / 8
-   <<<  ㊴ / 9
+   <<<  ㉊ / 𑛀
+    =   ㉚ / 𑛀
+   <<<  ㉛ / 𝍠
+   <<<  ㉜ / 𝍡
+   <<<  ㉝ / 𝍢
+   <<<  ㉞ / 𝍣
+   <<<  ㉟ / 𝍤
+   <<<  ㊱ / 𝍥
+   <<<  ㊲ / 𝍦
+   <<<  ㊳ / 𝍧
+   <<<  ㊴ / 𝍨
    <<<  ³
    <<<  ₃
-   <<<  ¾ / ⁄4
-   <<<  ⅗ / ⁄5
-   <<<  ⅜ / ⁄8
-  <<    ٣
-  <<    ۳
-  <<    𐹢
-  <<    ‎߃‎
-  <<    ፫
-  <<    𐒣
-  <<    ३
-  <<    ৩
-  <<    ੩
-  <<    ૩
-  <<    ୩
-  <<    ௩
-  <<    ౩
-    =   ౻
-    =   ౾
-  <<    ೩
-  <<    ൩
-  <<    ꯳
-  <<    ꣓
-  <<    ᥉
-  <<    ᧓
-  <<    ᪃
-  <<    ᪓
-  <<    ๓
-  <<    ໓
-  <<    ༣
-   <<<  ༬
-  <<    ᱃
-  <<    ꤃
-  <<    ၃
-  <<    ႓
-  <<    𑄹
-  <<    ៣
-  <<    ៳
-  <<    ꩓
-  <<    ᭓
-  <<    ꧓
-  <<    ᮳
-  <<    ᠓
-  <<    ᱓
-  <<    ꘣
-  <<    𑃳
-  <<    〣
-  <<    𐄉
-  <<    𒐁
-    =   𒐈
-    =   𒐗
-    =   𒐠
-    =   𒐤
-    =   𒐥
-    =   𒐮
-    =   𒐯
-    =   𒐶
-    =   𒐷
-    =   𒐺
-    =   𒐻
-    =   𒑋
-    =   𒑑
-  <<    ‎𐤛‎
-  <<    ‎𐡚‎
-  <<    ‎𐭚‎
-  <<    ‎𐭺‎
-  <<    𑇓
-  <<    𑛃
-  <<    𑁩
-  <<    𑁔
-  <<    ‎𐩂‎
-  <<    𝍢
+   <<<  ¾ / ⁄𝍣
+   <<<  ⅗ / ⁄𝍤
+   <<<  ⅜ / ⁄𝍧
  <      4
+    =   ٤
+    =   ۴
+    =   ‎߄‎
+    =   ४
+    =   ৪
+    =   ੪
+    =   ૪
+    =   ୪
+    =   ௪
+    =   ౪
+    =   ೪
+    =   ൪
+    =   ๔
+    =   ໔
+    =   ༤
+    =   ၄
+    =   ႔
+    =   ፬
+    =   ៤
+    =   ៴
+    =   ᠔
+    =   ᥊
+    =   ᧔
+    =   ᪄
+    =   ᪔
+    =   ᭔
+    =   ᮴
+    =   ᱄
+    =   ᱔
+    =   〤
+    =   ꘤
+    =   ꣔
+    =   ꤄
+    =   ꧔
+    =   ꩔
+    =   ꯴
+    =   𐄊
+    =   𐒤
+    =   ‎𐩃‎
+    =   ‎𐭛‎
+    =   ‎𐭻‎
+    =   𐹣
+    =   𑁕
+    =   𑁪
+    =   𑃴
+    =   𑄺
+    =   𑇔
+    =   𑛄
+    =   𒐂
+    =   𒐉
+    =   𒐏
+    =   𒐘
+    =   𒐡
+    =   𒐦
+    =   𒐰
+    =   𒐸
+    =   𒐼
+    =   𒐽
+    =   𒐾
+    =   𒐿
+    =   𒑌
+    =   𒑒
+    =   𒑓
+    =   𝍣
    <<<  4
+   <<<  ༭
    <<<  🄅 / ','
    <<<  ⒋ / '.'
    <<<  ㏣ / 日
     =   ❹
     =   ➃
     =   ➍
-   <<<  ㉋ / 0
-    =   ㊵ / 0
-   <<<  ㊶ / 1
-   <<<  ㊷ / 2
-   <<<  ㊸ / 3
-   <<<  ㊹ / 4
-   <<<  ㊺ / 5
-   <<<  ㊻ / 6
-   <<<  ㊼ / 7
-   <<<  ㊽ / 8
-   <<<  ㊾ / 9
+   <<<  ㉋ / 𑛀
+    =   ㊵ / 𑛀
+   <<<  ㊶ / 𝍠
+   <<<  ㊷ / 𝍡
+   <<<  ㊸ / 𝍢
+   <<<  ㊹ / 𝍣
+   <<<  ㊺ / 𝍤
+   <<<  ㊻ / 𝍥
+   <<<  ㊼ / 𝍦
+   <<<  ㊽ / 𝍧
+   <<<  ㊾ / 𝍨
    <<<  ⁴
    <<<  ₄
-   <<<  ⅘ / ⁄5
-  <<    ٤
-  <<    ۴
-  <<    𐹣
-  <<    ‎߄‎
-  <<    ፬
-  <<    𐒤
-  <<    ४
-  <<    ৪
-  <<    ੪
-  <<    ૪
-  <<    ୪
-  <<    ௪
-  <<    ౪
-  <<    ೪
-  <<    ൪
-  <<    ꯴
-  <<    ꣔
-  <<    ᥊
-  <<    ᧔
-  <<    ᪄
-  <<    ᪔
-  <<    ๔
-  <<    ໔
-  <<    ༤
-   <<<  ༭
-  <<    ᱄
-  <<    ꤄
-  <<    ၄
-  <<    ႔
-  <<    𑄺
-  <<    ៤
-  <<    ៴
-  <<    ꩔
-  <<    ᭔
-  <<    ꧔
-  <<    ᮴
-  <<    ᠔
-  <<    ᱔
-  <<    ꘤
-  <<    𑃴
-  <<    〤
-  <<    𐄊
-  <<    𒐂
-    =   𒐉
-    =   𒐏
-    =   𒐘
-    =   𒐡
-    =   𒐦
-    =   𒐰
-    =   𒐸
-    =   𒐼
-    =   𒐽
-    =   𒐾
-    =   𒐿
-    =   𒑌
-    =   𒑒
-    =   𒑓
-  <<    ‎𐭛‎
-  <<    ‎𐭻‎
-  <<    𑇔
-  <<    𑛄
-  <<    𑁪
-  <<    𑁕
-  <<    ‎𐩃‎
-  <<    𝍣
+   <<<  ⅘ / ⁄𝍤
  <      5
+    =   ٥
+    =   ۵
+    =   ‎߅‎
+    =   ५
+    =   ৫
+    =   ੫
+    =   ૫
+    =   ୫
+    =   ௫
+    =   ౫
+    =   ೫
+    =   ൫
+    =   ๕
+    =   ໕
+    =   ༥
+    =   ၅
+    =   ႕
+    =   ፭
+    =   ៥
+    =   ៵
+    =   ᠕
+    =   ᥋
+    =   ᧕
+    =   ᪅
+    =   ᪕
+    =   ᭕
+    =   ᮵
+    =   ᱅
+    =   ᱕
+    =   〥
+    =   ꘥
+    =   ꣕
+    =   ꤅
+    =   ꧕
+    =   ꩕
+    =   ꯵
+    =   𐄋
+    =   𐅃
+    =   𐅈
+    =   𐅏
+    =   𐅟
+    =   𐅳
+    =   𐌡
+    =   𐒥
+    =   𐹤
+    =   𑁖
+    =   𑁫
+    =   𑃵
+    =   𑄻
+    =   𑇕
+    =   𑛅
+    =   𒐃
+    =   𒐊
+    =   𒐐
+    =   𒐙
+    =   𒐢
+    =   𒐧
+    =   𒐱
+    =   𒐹
+    =   𒑍
+    =   𒑔
+    =   𒑕
+    =   𝍤
    <<<  5
+   <<<  ༮
    <<<  🄆 / ','
    <<<  ⒌ / '.'
    <<<  ㏤ / 日
     =   ❺
     =   ➄
     =   ➎
-   <<<  ㉌ / 0
-    =   ㊿ / 0
+   <<<  ㉌ / 𑛀
+    =   ㊿ / 𑛀
    <<<  ⁵
    <<<  ₅
-   <<<  ⅚ / ⁄6
-   <<<  ⅝ / ⁄8
-  <<    ٥
-  <<    ۵
-  <<    𐹤
-  <<    ‎߅‎
-  <<    ፭
-  <<    𐒥
-  <<    ५
-  <<    ৫
-  <<    ੫
-  <<    ૫
-  <<    ୫
-  <<    ௫
-  <<    ౫
-  <<    ೫
-  <<    ൫
-  <<    ꯵
-  <<    ꣕
-  <<    ᥋
-  <<    ᧕
-  <<    ᪅
-  <<    ᪕
-  <<    ๕
-  <<    ໕
-  <<    ༥
-   <<<  ༮
-  <<    ᱅
-  <<    ꤅
-  <<    ၅
-  <<    ႕
-  <<    𑄻
-  <<    ៥
-  <<    ៵
-  <<    ꩕
-  <<    ᭕
-  <<    ꧕
-  <<    ᮵
-  <<    ᠕
-  <<    ᱕
-  <<    ꘥
-  <<    𑃵
-  <<    〥
-  <<    𐄋
-  <<    𐅃
-    =   𐅈
-    =   𐅏
-    =   𐅟
-    =   𐅳
-  <<    𐌡
-  <<    𒐃
-    =   𒐊
-    =   𒐐
-    =   𒐙
-    =   𒐢
-    =   𒐧
-    =   𒐱
-    =   𒐹
-    =   𒑍
-    =   𒑔
-    =   𒑕
-  <<    𑇕
-  <<    𑛅
-  <<    𑁫
-  <<    𑁖
-  <<    𝍤
+   <<<  ⅚ / ⁄𝍥
+   <<<  ⅝ / ⁄𝍧
  <      6
+    =   ٦
+    =   ۶
+    =   ‎߆‎
+    =   ६
+    =   ৬
+    =   ੬
+    =   ૬
+    =   ୬
+    =   ௬
+    =   ౬
+    =   ೬
+    =   ൬
+    =   ๖
+    =   ໖
+    =   ༦
+    =   ၆
+    =   ႖
+    =   ፮
+    =   ៦
+    =   ៶
+    =   ᠖
+    =   ᥌
+    =   ᧖
+    =   ᪆
+    =   ᪖
+    =   ᭖
+    =   ᮶
+    =   ᱆
+    =   ᱖
+    =   ↅ
+    =   〦
+    =   ꘦
+    =   ꣖
+    =   ꤆
+    =   ꧖
+    =   ꩖
+    =   ꯶
+    =   𐄌
+    =   𐒦
+    =   𐹥
+    =   𑁗
+    =   𑁬
+    =   𑃶
+    =   𑄼
+    =   𑇖
+    =   𑛆
+    =   𒐄
+    =   𒐋
+    =   𒐑
+    =   𒐚
+    =   𒐨
+    =   𒑀
+    =   𒑎
+    =   𝍥
    <<<  6
+   <<<  ༯
    <<<  🄇 / ','
    <<<  ⒍ / '.'
    <<<  ㏥ / 日
     =   ❻
     =   ➅
     =   ➏
-   <<<  ㉍ / 0
+   <<<  ㉍ / 𑛀
    <<<  ⁶
    <<<  ₆
-  <<    ٦
-  <<    ۶
-  <<    𐹥
-  <<    ‎߆‎
-  <<    ፮
-  <<    𐒦
-  <<    ६
-  <<    ৬
-  <<    ੬
-  <<    ૬
-  <<    ୬
-  <<    ௬
-  <<    ౬
-  <<    ೬
-  <<    ൬
-  <<    ꯶
-  <<    ꣖
-  <<    ᥌
-  <<    ᧖
-  <<    ᪆
-  <<    ᪖
-  <<    ๖
-  <<    ໖
-  <<    ༦
-   <<<  ༯
-  <<    ᱆
-  <<    ꤆
-  <<    ၆
-  <<    ႖
-  <<    𑄼
-  <<    ៦
-  <<    ៶
-  <<    ꩖
-  <<    ᭖
-  <<    ꧖
-  <<    ᮶
-  <<    ᠖
-  <<    ᱖
-  <<    ꘦
-  <<    𑃶
-  <<    〦
-  <<    𐄌
-  <<    ↅ
-  <<    𒐄
-    =   𒐋
-    =   𒐑
-    =   𒐚
-    =   𒐨
-    =   𒑀
-    =   𒑎
-  <<    𑇖
-  <<    𑛆
-  <<    𑁬
-  <<    𑁗
-  <<    𝍥
  <      7
+    =   ٧
+    =   ۷
+    =   ‎߇‎
+    =   ७
+    =   ৭
+    =   ੭
+    =   ૭
+    =   ୭
+    =   ௭
+    =   ౭
+    =   ೭
+    =   ൭
+    =   ๗
+    =   ໗
+    =   ༧
+    =   ၇
+    =   ႗
+    =   ፯
+    =   ៧
+    =   ៷
+    =   ᠗
+    =   ᥍
+    =   ᧗
+    =   ᪇
+    =   ᪗
+    =   ᭗
+    =   ᮷
+    =   ᱇
+    =   ᱗
+    =   〧
+    =   ꘧
+    =   ꣗
+    =   ꤇
+    =   ꧗
+    =   ꩗
+    =   ꯷
+    =   𐄍
+    =   𐒧
+    =   𐹦
+    =   𑁘
+    =   𑁭
+    =   𑃷
+    =   𑄽
+    =   𑇗
+    =   𑛇
+    =   𒐅
+    =   𒐌
+    =   𒐒
+    =   𒐛
+    =   𒐩
+    =   𒑁
+    =   𒑂
+    =   𒑃
+    =   𝍦
    <<<  7
+   <<<  ༰
    <<<  🄈 / ','
    <<<  ⒎ / '.'
    <<<  ㏦ / 日
     =   ❼
     =   ➆
     =   ➐
-   <<<  ㉎ / 0
+   <<<  ㉎ / 𑛀
    <<<  ⁷
    <<<  ₇
-   <<<  ⅞ / ⁄8
-  <<    ٧
-  <<    ۷
-  <<    𐹦
-  <<    ‎߇‎
-  <<    ፯
-  <<    𐒧
-  <<    ७
-  <<    ৭
-  <<    ੭
-  <<    ૭
-  <<    ୭
-  <<    ௭
-  <<    ౭
-  <<    ೭
-  <<    ൭
-  <<    ꯷
-  <<    ꣗
-  <<    ᥍
-  <<    ᧗
-  <<    ᪇
-  <<    ᪗
-  <<    ๗
-  <<    ໗
-  <<    ༧
-   <<<  ༰
-  <<    ᱇
-  <<    ꤇
-  <<    ၇
-  <<    ႗
-  <<    𑄽
-  <<    ៧
-  <<    ៷
-  <<    ꩗
-  <<    ᭗
-  <<    ꧗
-  <<    ᮷
-  <<    ᠗
-  <<    ᱗
-  <<    ꘧
-  <<    𑃷
-  <<    〧
-  <<    𐄍
-  <<    𒐅
-    =   𒐌
-    =   𒐒
-    =   𒐛
-    =   𒐩
-    =   𒑁
-    =   𒑂
-    =   𒑃
-  <<    𑇗
-  <<    𑛇
-  <<    𑁭
-  <<    𑁘
-  <<    𝍦
+   <<<  ⅞ / ⁄𝍧
  <      8
+    =   ٨
+    =   ۸
+    =   ‎߈‎
+    =   ८
+    =   ৮
+    =   ੮
+    =   ૮
+    =   ୮
+    =   ௮
+    =   ౮
+    =   ೮
+    =   ൮
+    =   ๘
+    =   ໘
+    =   ༨
+    =   ၈
+    =   ႘
+    =   ፰
+    =   ៨
+    =   ៸
+    =   ᠘
+    =   ᥎
+    =   ᧘
+    =   ᪈
+    =   ᪘
+    =   ᭘
+    =   ᮸
+    =   ᱈
+    =   ᱘
+    =   〨
+    =   ꘨
+    =   ꣘
+    =   ꤈
+    =   ꧘
+    =   ꩘
+    =   ꯸
+    =   𐄎
+    =   𐒨
+    =   𐹧
+    =   𑁙
+    =   𑁮
+    =   𑃸
+    =   𑄾
+    =   𑇘
+    =   𑛈
+    =   𒐆
+    =   𒐍
+    =   𒐓
+    =   𒐜
+    =   𒐪
+    =   𒑄
+    =   𒑅
+    =   𝍧
    <<<  8
+   <<<  ༱
    <<<  🄉 / ','
    <<<  ⒏ / '.'
    <<<  ㏧ / 日
     =   ❽
     =   ➇
     =   ➑
-   <<<  ㉏ / 0
+   <<<  ㉏ / 𑛀
    <<<  ⁸
    <<<  ₈
-  <<    ٨
-  <<    ۸
-  <<    𐹧
-  <<    ‎߈‎
-  <<    ፰
-  <<    𐒨
-  <<    ८
-  <<    ৮
-  <<    ੮
-  <<    ૮
-  <<    ୮
-  <<    ௮
-  <<    ౮
-  <<    ೮
-  <<    ൮
-  <<    ꯸
-  <<    ꣘
-  <<    ᥎
-  <<    ᧘
-  <<    ᪈
-  <<    ᪘
-  <<    ๘
-  <<    ໘
-  <<    ༨
-   <<<  ༱
-  <<    ᱈
-  <<    ꤈
-  <<    ၈
-  <<    ႘
-  <<    𑄾
-  <<    ៨
-  <<    ៸
-  <<    ꩘
-  <<    ᭘
-  <<    ꧘
-  <<    ᮸
-  <<    ᠘
-  <<    ᱘
-  <<    ꘨
-  <<    𑃸
-  <<    〨
-  <<    𐄎
-  <<    𒐆
-    =   𒐍
-    =   𒐓
-    =   𒐜
-    =   𒐪
-    =   𒑄
-    =   𒑅
-  <<    𑇘
-  <<    𑛈
-  <<    𑁮
-  <<    𑁙
-  <<    𝍧
  <      9
+    =   ٩
+    =   ۹
+    =   ‎߉‎
+    =   ९
+    =   ৯
+    =   ੯
+    =   ૯
+    =   ୯
+    =   ௯
+    =   ౯
+    =   ೯
+    =   ൯
+    =   ๙
+    =   ໙
+    =   ༩
+    =   ၉
+    =   ႙
+    =   ፱
+    =   ៩
+    =   ៹
+    =   ᠙
+    =   ᥏
+    =   ᧙
+    =   ᪉
+    =   ᪙
+    =   ᭙
+    =   ᮹
+    =   ᱉
+    =   ᱙
+    =   〩
+    =   ꘩
+    =   ꣙
+    =   ꤉
+    =   ꧙
+    =   ꩙
+    =   ꯹
+    =   𐄏
+    =   𐒩
+    =   𐹨
+    =   𑁚
+    =   𑁯
+    =   𑃹
+    =   𑄿
+    =   𑇙
+    =   𑛉
+    =   𒐇
+    =   𒐎
+    =   𒐔
+    =   𒐝
+    =   𒐫
+    =   𒑆
+    =   𒑇
+    =   𒑈
+    =   𒑉
+    =   𝍨
    <<<  9
+   <<<  ༲
    <<<  🄊 / ','
    <<<  ⒐ / '.'
    <<<  ㏨ / 日
     =   ➒
    <<<  ⁹
    <<<  ₉
-  <<    ٩
-  <<    ۹
-  <<    𐹨
-  <<    ‎߉‎
-  <<    ፱
-  <<    𐒩
-  <<    ९
-  <<    ৯
-  <<    ੯
-  <<    ૯
-  <<    ୯
-  <<    ௯
-  <<    ౯
-  <<    ೯
-  <<    ൯
-  <<    ꯹
-  <<    ꣙
-  <<    ᥏
-  <<    ᧙
-  <<    ᪉
-  <<    ᪙
-  <<    ๙
-  <<    ໙
-  <<    ༩
-   <<<  ༲
-  <<    ᱉
-  <<    ꤉
-  <<    ၉
-  <<    ႙
-  <<    𑄿
-  <<    ៩
-  <<    ៹
-  <<    ꩙
-  <<    ᭙
-  <<    ꧙
-  <<    ᮹
-  <<    ᠙
-  <<    ᱙
-  <<    ꘩
-  <<    𑃹
-  <<    〩
-  <<    𐄏
-  <<    𒐇
-    =   𒐎
-    =   𒐔
-    =   𒐝
-    =   𒐫
-    =   𒑆
-    =   𒑇
-    =   𒑈
-    =   𒑉
-  <<    𑇙
-  <<    𑛉
-  <<    𑁯
-  <<    𑁚
-  <<    𝍨
  <      a
    <<<  a
    <<<  ͣ
    <<<  ㏄ / c
    <<<  ㏅ / d
    <<<  ㎝ / m
-   <<<  ㎠ / m2
-   <<<  ㎤ / m3
+   <<<  ㎠ / m𝍡
+   <<<  ㎤ / m𝍢
    <<<  🄲
     =   🅲
    <<<  ㏆ / ∕kg
    <<<  ㏈ / B
    <<<  ㎗ / l
    <<<  ㍷ / m
-   <<<  ㍸ / m2
-   <<<  ㍹ / m3
+   <<<  ㍸ / m𝍡
+   <<<  ㍹ / m𝍢
    <<<  ᴰ
     =   🄳
     =   🅳
    <<<  I
    <<<  I
    <<<  Ⅰ
-   <<<  Ⅱ / i
-   <<<  Ⅲ / Ii
+   <<<  Ⅱ / I
+   <<<  Ⅲ / II
    <<<  IJ / J
-   <<<  Ⅳ / v
-   <<<  Ⅸ / x
+   <<<  Ⅳ / V
+   <<<  Ⅸ / X
    <<<  ℐ
     =   ℑ
     =   𝐈
    <<<  ㎑ / Hz
    <<<  ㎘ / l
    <<<  ㎞ / m
-   <<<  ㎢ / m2
-   <<<  ㎦ / m3
+   <<<  ㎢ / m𝍡
+   <<<  ㎦ / m𝍢
    <<<  ㎪ / Pa
    <<<  ㏏ / t
    <<<  ㎸ / V
    <<<  🅫 / d
    <<<  ₘ
    <<<  ㎧ / ∕s
-   <<<  ㎨ / ∕s2
-   <<<  ㎡ / 2
-   <<<  ㎥ / 3
+   <<<  ㎨ / ∕s𝍡
+   <<<  ㎡ / 𝍡
+   <<<  ㎥ / 𝍢
    <<<  ㎃ / A
    <<<  ㏔ / b
    <<<  ㎎ / g
    <<<  ㏕ / il
    <<<  ㎖ / l
    <<<  ㎜ / m
-   <<<  ㎟ / m2
-   <<<  ㎣ / m3
+   <<<  ㎟ / m𝍡
+   <<<  ㎣ / m𝍢
    <<<  ㏖ / ol
    <<<  ㎳ / s
    <<<  ㎷ / V
    <<<  ᵣ
    <<<  ㎭ / ad
    <<<  ㎮ / ad∕s
-   <<<  ㎯ / ad∕s2
+   <<<  ㎯ / ad∕s𝍡
    <<<  ᴿ
     =   🅁
     =   🆁
    <<<  V
    <<<  V
    <<<  Ⅴ
-   <<<  Ⅵ / i
-   <<<  Ⅶ / Ii
-   <<<  Ⅷ / IIi
+   <<<  Ⅵ / I
+   <<<  Ⅶ / II
+   <<<  Ⅷ / III
    <<<  Ꝡ / Y
    <<<  𝐕
     =   𝑉
    <<<  X
    <<<  X
    <<<  Ⅹ
-   <<<  Ⅺ / i
-   <<<  Ⅻ / Ii
+   <<<  Ⅺ / I
+   <<<  Ⅻ / II
    <<<  𝐗
     =   𝑋
     =   𝑿
  <      ೇ
  <      ೈ
  <      ೊ
-    =   ೊ
  <      ೋ
     =   ೋ
  <      ೌ
  <      ේ
  <      ෛ
  <      ො
-    =   ො
  <      ෝ
     =   ෝ
  <      ෞ
  <      𑂗
  <      𑂘
  <      𑂙
-   <<<  𑂚 / 𑚷
  <      𑂛
-   <<<  𑂜 / 𑚷
  <      𑂝
  <      𑂞
  <      𑂟
  <      𑂣
  <      𑂤
  <      𑂥
-   <<<  𑂫 / 𑚷
  <      𑂦
  <      𑂧
  <      𑂨
  <      𑄬
  <      𑄭
  <      𑄮
-    =   𑄮
  <      𑄯
-    =   𑄯
  <      𑄰
  <      𑄱
  <      𑄲
  <      𒉠
  <      𒉡
  <      𒉢
+ <      𒋔
+ <      𒋕
  <      𒉣
  <      𒉤
  <      𒉥
  <      𒋑
  <      𒋒
  <      𒋓
- <      𒋔
- <      𒋕
  <      𒋖
  <      𒋗
  <      𒋘
 & 丶
    <<<  ⼂
   <<    ⺀
-& 丸
-    =   丸
-& 丽
-    =   丽
 & 丿
    <<<  ⼃
-& 乁
-    =   乁
 & 乙
    <<<  ⼄
    <<<  ㆚
    <<<  ㆟
 & 亻
    <<<  ⺅
-& 仌
-    =   仌
 & 企
    <<<  ㊭
 & 休
    <<<  ㊡
-& 你
-    =   你
-& 侮
-    =   侮
-& 侻
-    =   侻
-& 倂
-    =   倂
-& 偺
-    =   偺
-& 備
-    =   備
-& 像
-    =   像
-& 僧
-    =   僧
 & 優
    <<<  ㊝
 & 儿
    <<<  ⼉
-& 免
-    =   免
-& 兔
-    =   兔
-& 兤
-    =   兤
 & 入
    <<<  ⼊
-& 內
-    =   內
 & 八
    <<<  ⼋
    <<<  ㊇
 & 六
    <<<  ㊅
-& 具
-    =   具
 & 冂
    <<<  ⼌
   <<    ⺆
 & 再
-    =   再
    <<<  🈞
-& 冒
-    =   冒
-& 冕
-    =   冕
 & 冖
    <<<  ⼍
-& 冗
-    =   冗
 & 写
    <<<  ㊢
-& 冤
-    =   冤
 & 冫
    <<<  ⼎
-& 冬
-    =   冬
-& 况
-    =   况
 & 几
    <<<  ⼏
   <<    ⺇
 & 凵
-    =   凵
    <<<  ⼐
 & 刀
    <<<  ⼑
   <<    ⺈
 & 刂
    <<<  ⺉
-& 刃
-    =   刃
-& 切
-    =   切
 & 初
    <<<  🈠
-& 刻
-    =   刻
-& 剆
-    =   剆
 & 前
    <<<  🈜
 & 割
-    =   割
    <<<  🈹
-& 剷
-    =   剷
 & 力
    <<<  ⼒
-& 劳
-    =   劳
 & 労
    <<<  ㊘
-& 勇
-    =   勇
-& 勉
-    =   勉
-& 勤
-    =   勤
 & 勹
    <<<  ⼓
-& 勺
-    =   勺
-& 包
-    =   包
-& 匆
-    =   匆
 & 匕
    <<<  ⼔
-& 北
-    =   北
 & 匚
    <<<  ⼕
 & 匸
    <<<  〹
 & 卅
    <<<  〺
-& 卉
-    =   卉
-& 卑
-    =   卑
 & 協
    <<<  ㊯
-& 博
-    =   博
 & 卜
    <<<  ⼘
   <<    ⺊
   <<    ⺋
 & 印
    <<<  ㊞
-& 即
-    =   即
-& 卽
-    =   卽
-& 卿
-    =   卿
-    =   卿
-    =   卿
 & 厂
    <<<  ⼚
   <<    ⺁
    <<<  ⼛
 & 又
    <<<  ⼜
-& 及
-    =   及
 & 双
    <<<  🈒
-& 叟
-    =   叟
 & 口
    <<<  ⼝
-& 叫
-    =   叫
 & 可
    <<<  🉑
-& 叱
-    =   叱
 & 右
    <<<  ㊨
    <<<  🈮
-& 吆
-    =   吆
 & 合
    <<<  🈴
 & 名
    <<<  ㊔
-& 吸
-    =   吸
 & 吹
    <<<  🈥
-& 呈
-    =   呈
-& 周
-    =   周
-& 咞
-    =   咞
-& 咢
-    =   咢
-& 哶
-    =   哶
-& 唐
-    =   唐
 & 問
    <<<  ㉄
-& 啓
-    =   啓
-& 啣
-    =   啣
-& 善
-    =   善
-    =   善
-& 喙
-    =   喙
-& 喫
-    =   喫
-& 喳
-    =   喳
 & 営
    <<<  🈺
-& 嗂
-    =   嗂
-& 嘆
-    =   嘆
-& 噑
-    =   噑
-& 噴
-    =   噴
 & 囗
    <<<  ⼞
 & 四
    <<<  ㊃
    <<<  ㆕
-& 圖
-    =   圖
-& 圗
-    =   圗
 & 土
    <<<  ⼟
    <<<  ㊏
 & 地
    <<<  ㆞
-& 型
-    =   型
-& 城
-    =   城
-& 埴
-    =   埴
-& 堍
-    =   堍
-& 報
-    =   報
-& 堲
-    =   堲
-& 墬
-    =   墬
 & 士
    <<<  ⼠
-& 壮
-    =   壮
 & 声
    <<<  🈤
-& 売
-    =   売
-& 壷
-    =   壷
 & 夂
    <<<  ⼡
-& 夆
-    =   夆
 & 夊
    <<<  ⼢
 & 夕
    <<<  ⼣
 & 多
-    =   多
    <<<  🈕
 & 夜
    <<<  ㊰
-& 夢
-    =   夢
 & 大
    <<<  ⼤
    <<<  ㍽ / 正
 & 天
    <<<  ㆝
    <<<  🈗
-& 奢
-    =   奢
 & 女
    <<<  ⼥
    <<<  ㊛
-& 姘
-    =   姘
-& 姬
-    =   姬
-& 娛
-    =   娛
-& 娧
-    =   娧
-& 婦
-    =   婦
-& 媵
-    =   媵
-& 嬈
-    =   嬈
-& 嬾
-    =   嬾
-    =   嬾
 & 子
    <<<  ⼦
 & 字
    <<<  ⼧
 & 宗
    <<<  ㊪
-& 寃
-    =   寃
-& 寘
-    =   寘
-& 寧
-    =   寧
-& 寳
-    =   寳
 & 寸
    <<<  ⼨
-& 寿
-    =   寿
-& 将
-    =   将
 & 小
    <<<  ⼩
   <<    ⺌
   <<    ⺍
 & 尢
-    =   尢
    <<<  ⺐
     =   ⼪
   <<    ⺎
   <<    ⺑
 & 尸
    <<<  ⼫
-& 屠
-    =   屠
 & 屮
-    =   屮
    <<<  ⼬
 & 山
    <<<  ⼭
-& 岍
-    =   岍
-& 峀
-    =   峀
-& 嵃
-    =   嵃
-& 嵫
-    =   嵫
-& 嵮
-    =   嵮
-& 嵼
-    =   嵼
-& 嶲
-    =   嶲
 & 巛
    <<<  ⼮
-& 巡
-    =   巡
-& 巢
-    =   巢
 & 工
    <<<  ⼯
 & 左
    <<<  ⼰
 & 巳
    <<<  ⺒
-& 巽
-    =   巽
 & 巾
    <<<  ⼱
-& 帨
-    =   帨
-& 帽
-    =   帽
-& 幩
-    =   幩
 & 干
    <<<  ⼲
 & 平
    <<<  ㉅
 & 广
    <<<  ⼴
-& 庰
-    =   庰
-& 庳
-    =   庳
-& 庶
-    =   庶
-& 廊
-    =   廊
 & 廴
    <<<  ⼵
 & 廾
-    =   廾
    <<<  ⼶
 & 弋
    <<<  ⼷
 & 弓
    <<<  ⼸
-& 弢
-    =   弢
-    =   弢
 & 彐
    <<<  ⼹
   <<    ⺕
 & 彑
    <<<  ⺔
-& 当
-    =   当
 & 彡
    <<<  ⼺
-& 形
-    =   形
-& 彫
-    =   彫
 & 彳
    <<<  ⼻
 & 後
    <<<  🈝
 & 得
    <<<  🉐
-& 徚
-    =   徚
 & 心
    <<<  ⼼
   <<    ⺗
 & 忄
    <<<  ⺖
-& 忍
-    =   忍
-& 志
-    =   志
-& 忹
-    =   忹
-& 悁
-    =   悁
-& 悔
-    =   悔
-& 惇
-    =   惇
-& 慈
-    =   慈
-& 慌
-    =   慌
-    =   慌
-& 慎
-    =   慎
-& 慺
-    =   慺
-& 憎
-    =   憎
-& 憤
-    =   憤
-& 憯
-    =   憯
-& 憲
-    =   憲
-& 懞
-    =   懞
-& 懲
-    =   懲
-& 懶
-    =   懶
 & 戈
    <<<  ⼽
-& 成
-    =   成
-& 戛
-    =   戛
 & 戶
    <<<  ⼾
 & 手
    <<<  ⺘
 & 打
    <<<  🈱
-& 扝
-    =   扝
 & 投
    <<<  🈧
-& 抱
-    =   抱
-& 拔
-    =   拔
-& 拼
-    =   拼
 & 指
    <<<  🈯
-& 挽
-    =   挽
-& 捐
-    =   捐
 & 捕
    <<<  🈨
-& 捨
-    =   捨
-& 掃
-    =   掃
-& 掩
-    =   掩
-& 揅
-    =   揅
-& 揤
-    =   揤
-& 搢
-    =   搢
-& 摩
-    =   摩
-& 摷
-    =   摷
-& 摾
-    =   摾
-& 撝
-    =   撝
 & 支
    <<<  ⽀
 & 攴
    <<<  ⽁
 & 攵
    <<<  ⺙
-& 敏
-    =   敏
-& 敬
-    =   敬
 & 文
    <<<  ⽂
    <<<  ㉆
    <<<  ⽆
 & 旡
    <<<  ⺛
-& 旣
-    =   旣
 & 日
    <<<  ⽇
    <<<  ㊐
    <<<  🈙
 & 昭
  <      ㍼ / 和
-& 晉
-    =   晉
-& 暑
-    =   暑
-& 暜
-    =   暜
 & 曰
    <<<  ⽈
-& 書
-    =   書
-& 最
-    =   最
 & 月
    <<<  ⽉
    <<<  ㊊
 & 有
    <<<  ㊒
    <<<  🈶
-& 朗
-    =   朗
-& 望
-    =   望
-& 朡
-    =   朡
 & 木
    <<<  ⽊
    <<<  ㊍
-& 杓
-    =   杓
-& 杞
-    =   杞
-& 枅
-    =   枅
-& 柺
-    =   柺
-& 栟
-    =   栟
 & 株
    <<<  ㊑
    <<<  ㍿ / 式会社
-& 桒
-    =   桒
-& 梅
-    =   梅
-& 梎
-    =   梎
-& 椔
-    =   椔
-& 楂
-    =   楂
-& 榣
-    =   榣
-& 槪
-    =   槪
-& 檨
-    =   檨
-& 櫛
-    =   櫛
 & 欠
    <<<  ⽋
-& 次
-    =   次
-& 歔
-    =   歔
 & 止
    <<<  ⽌
 & 正
    <<<  ㊣
-& 歲
-    =   歲
 & 歹
    <<<  ⽍
 & 歺
   <<    ⺞
-& 殟
-    =   殟
 & 殳
    <<<  ⽎
-& 殺
-    =   殺
-& 殻
-    =   殻
 & 毋
    <<<  ⽏
 & 母
    <<<  ⺡
 & 氺
    <<<  ⺢
-& 汎
-    =   汎
-& 汧
-    =   汧
-& 沿
-    =   沿
-& 泍
-    =   泍
 & 注
    <<<  ㊟
-& 洖
-    =   洖
-& 洴
-    =   洴
-& 派
-    =   派
-& 流
-    =   流
-& 浩
-    =   浩
-& 海
-    =   海
-& 浸
-    =   浸
-& 涅
-    =   涅
-& 淹
-    =   淹
-& 港
-    =   港
-& 湮
-    =   湮
 & 満
    <<<  🈵
-& 滇
-    =   滇
-& 滋
-    =   滋
 & 演
    <<<  🈦
-& 潮
-    =   潮
-& 濆
-    =   濆
-& 瀛
-    =   瀛
-& 瀞
-    =   瀞
-& 瀹
-    =   瀹
-& 灊
-    =   灊
 & 火
    <<<  ⽕
    <<<  ㊋
 & 灬
    <<<  ⺣
-& 灰
-    =   灰
-& 灷
-    =   灷
-& 災
-    =   災
-& 炭
-    =   炭
 & 無
    <<<  🈚
-& 煅
-    =   煅
-& 熜
-    =   熜
-& 爨
-    =   爨
 & 爪
    <<<  ⽖
 & 爫
    <<<  ⺤
   <<    ⺥
-& 爵
-    =   爵
 & 父
    <<<  ⽗
 & 爻
    <<<  ⽙
 & 片
    <<<  ⽚
-& 牐
-    =   牐
 & 牙
    <<<  ⽛
 & 牛
   <<    ⺧
 & 特
    <<<  ㊕
-& 犀
-    =   犀
-& 犕
-    =   犕
 & 犬
    <<<  ⽝
 & 犭
    <<<  ⺨
-& 獺
-    =   獺
 & 玄
    <<<  ⽞
 & 玉
    <<<  ⽟
 & 王
-    =   王
   <<    ⺩
-& 玥
-    =   玥
-& 瑇
-    =   瑇
-& 瑜
-    =   瑜
-& 瑱
-    =   瑱
-& 璅
-    =   璅
-& 瓊
-    =   瓊
 & 瓜
    <<<  ⽠
 & 瓦
 & 生
    <<<  ⽣
    <<<  🈢
-& 甤
-    =   甤
 & 用
    <<<  ⽤
 & 田
    <<<  🈸
 & 男
    <<<  ㊚
-& 甾
-    =   甾
-& 異
-    =   異
 & 疋
    <<<  ⽦
   <<    ⺪
 & 疒
    <<<  ⽧
-& 瘐
-    =   瘐
 & 癶
    <<<  ⽨
 & 白
 & 目
    <<<  ⽬
   <<    ⺫
-& 直
-    =   直
-& 眞
-    =   眞
-& 真
-    =   真
-    =   真
-& 睊
-    =   睊
-& 瞋
-    =   瞋
 & 矛
    <<<  ⽭
 & 矢
    <<<  ⽮
 & 石
    <<<  ⽯
-& 硎
-    =   硎
-& 碌
-    =   碌
-& 磌
-    =   磌
 & 示
    <<<  ⽰
   <<    ⺬
    <<<  ⺭
 & 社
    <<<  ㊓
-& 祖
-    =   祖
 & 祝
    <<<  ㊗
 & 禁
    <<<  🈲
-& 福
-    =   福
 & 禸
    <<<  ⽱
 & 禾
    <<<  ⽲
 & 秘
    <<<  ㊙
-& 秫
-    =   秫
-& 穀
-    =   穀
-& 穊
-    =   穊
-& 穏
-    =   穏
 & 穴
    <<<  ⽳
 & 空
    <<<  🈳
 & 立
    <<<  ⽴
-& 竮
-    =   竮
 & 竹
    <<<  ⽵
   <<    ⺮
 & 箏
    <<<  ㉇
-& 篆
-    =   篆
-& 築
-    =   築
 & 米
    <<<  ⽶
-& 糒
-    =   糒
-& 糣
-    =   糣
-& 糨
-    =   糨
 & 糸
    <<<  ⽷
 & 糹
    <<<  ⺯
-& 紀
-    =   紀
 & 終
    <<<  🈡
-& 絣
-    =   絣
-& 緇
-    =   緇
-& 縂
-    =   縂
-& 繅
-    =   繅
 & 纟
    <<<  ⺰
 & 缶
    <<<  ⺱
   <<    ⺳
   <<    ⺴
-& 罺
-    =   罺
 & 羊
    <<<  ⽺
   <<    ⺶
   <<    ⺷
 & 羋
    <<<  ⺸
-& 羕
-    =   羕
 & 羽
    <<<  ⽻
-& 翺
-    =   翺
 & 老
    <<<  ⽼
 & 耂
    <<<  ⺹
-& 者
-    =   者
 & 而
    <<<  ⽽
 & 耒
    <<<  ⽾
 & 耳
    <<<  ⽿
-& 聠
-    =   聠
-& 聰
-    =   聰
 & 聿
    <<<  ⾀
   <<    ⺻
 & 肉
    <<<  ⾁
   <<    ⺼
-& 肭
-    =   肭
-& 育
-    =   育
-& 脃
-    =   脃
-& 脾
-    =   脾
 & 臣
    <<<  ⾂
 & 自
 & 臼
    <<<  ⾅
   <<    ⺽
-& 舁
-    =   舁
-    =   舁
-& 舄
-    =   舄
 & 舌
    <<<  ⾆
 & 舛
    <<<  ⺾
   <<    ⺿
   <<    ⻀
-& 芋
-    =   芋
-& 芑
-    =   芑
-& 芝
-    =   芝
-& 花
-    =   花
-& 芳
-    =   芳
-& 芽
-    =   芽
-& 若
-    =   若
-& 苦
-    =   苦
-& 茝
-    =   茝
-& 茣
-    =   茣
-& 荓
-    =   荓
-& 荣
-    =   荣
-& 莭
-    =   莭
-& 莽
-    =   莽
-& 菊
-    =   菊
-& 菌
-    =   菌
-& 菜
-    =   菜
-& 菧
-    =   菧
-& 著
-    =   著
-& 蓱
-    =   蓱
-& 蓳
-    =   蓳
-& 蔖
-    =   蔖
-& 蕤
-    =   蕤
 & 虍
    <<<  ⾌
 & 虎
    <<<  ⻁
-& 虐
-    =   虐
-& 虜
-    =   虜
-& 虧
-    =   虧
-& 虩
-    =   虩
 & 虫
    <<<  ⾍
-& 蚈
-    =   蚈
-& 蚩
-    =   蚩
-& 蛢
-    =   蛢
-& 蜎
-    =   蜎
-& 蜨
-    =   蜨
-& 蝫
-    =   蝫
-& 蝹
-    =   蝹
-& 螆
-    =   螆
-& 蟡
-    =   蟡
-& 蠁
-    =   蠁
 & 血
    <<<  ⾎
 & 行
    <<<  ⾏
-& 衠
-    =   衠
 & 衣
-    =   衣
    <<<  ⾐
 & 衤
    <<<  ⻂
-& 裗
-    =   裗
-& 裞
-    =   裞
-& 裺
-    =   裺
 & 襾
    <<<  ⾑
 & 西
    <<<  🈖
 & 言
    <<<  ⾔
-& 誠
-    =   誠
-& 諭
-    =   諭
-& 變
-    =   變
 & 讠
    <<<  ⻈
 & 谷
 & 豆
    <<<  ⾖
 & 豕
-    =   豕
    <<<  ⾗
 & 豸
    <<<  ⾘
    <<<  ㊖
 & 販
    <<<  🈣
-& 貫
-    =   貫
-& 賁
-    =   賁
 & 資
    <<<  ㊮
-& 贛
-    =   贛
 & 贝
    <<<  ⻉
 & 赤
 & 走
    <<<  ⾛
    <<<  🈰
-& 起
-    =   起
 & 足
    <<<  ⾜
   <<    ⻊
-& 趼
-    =   趼
-& 跋
-    =   跋
-& 跰
-    =   跰
 & 身
    <<<  ⾝
 & 車
    <<<  ⾞
-& 軔
-    =   軔
-& 輸
-    =   輸
 & 车
    <<<  ⻋
 & 辛
    <<<  ⾟
-& 辞
-    =   辞
 & 辰
    <<<  ⾠
 & 辵
 & 邑
    <<<  ⾢
   <<    ⻏
-& 邔
-    =   邔
-& 郱
-    =   郱
-& 鄑
-    =   鄑
-& 鄛
-    =   鄛
 & 酉
    <<<  ⾣
 & 釆
 & 金
    <<<  ⾦
    <<<  ㊎
-& 鈸
-    =   鈸
-& 鉼
-    =   鉼
-& 鋗
-    =   鋗
-& 鋘
-    =   鋘
-& 鏹
-    =   鏹
-& 鐕
-    =   鐕
 & 钅
    <<<  ⻐
 & 長
    <<<  ⻓
 & 門
    <<<  ⾨
-& 開
-    =   開
-& 閷
-    =   閷
 & 门
    <<<  ⻔
 & 阜
    <<<  ⾪
 & 隹
    <<<  ⾫
-& 雃
-    =   雃
 & 雨
    <<<  ⾬
   <<    ⻗
-& 霣
-    =   霣
 & 靑
    <<<  ⾭
 & 青
    <<<  ⾰
 & 韋
    <<<  ⾱
-& 韠
-    =   韠
 & 韦
    <<<  ⻙
 & 韭
    <<<  ⾴
 & 項
    <<<  ㊠
-& 頋
-    =   頋
-    =   頋
-& 頩
-    =   頩
 & 页
    <<<  ⻚
 & 風
 & 飠
    <<<  ⻟
   <<    ⻞
-& 飢
-    =   飢
-& 餩
-    =   餩
 & 饣
    <<<  ⻠
 & 首
   <<    ⻡
 & 香
    <<<  ⾹
-& 馧
-    =   馧
 & 馬
    <<<  ⾺
-& 駂
-    =   駂
-& 駾
-    =   駾
 & 马
    <<<  ⻢
 & 骨
    <<<  ⾼
 & 髟
    <<<  ⾽
-& 鬒
-    =   鬒
 & 鬥
    <<<  ⾾
 & 鬯
   <<    ⻤
 & 魚
    <<<  ⿂
-& 鱀
-    =   鱀
 & 鱼
    <<<  ⻥
 & 鳥
    <<<  ⿃
-& 鳽
-    =   鳽
-& 鵧
-    =   鵧
 & 鸟
    <<<  ⻦
 & 鹵
 & 麦
    <<<  ⻨
 & 麻
-    =   麻
    <<<  ⿇
 & 黃
    <<<  ⿈
 & 黑
    <<<  ⿊
 & 黹
-    =   黹
    <<<  ⿋
 & 黽
    <<<  ⿌
 & 黾
-    =   黾
    <<<  ⻪
-& 鼅
-    =   鼅
 & 鼎
    <<<  ⿍
-& 鼏
-    =   鼏
 & 鼓
    <<<  ⿎
-& 鼖
-    =   鼖
 & 鼠
    <<<  ⿏
 & 鼻
-    =   鼻
    <<<  ⿐
 & 齊
    <<<  ⿑
     =   﨨
 & 﨩
     =   﨩
-& 㒞
-    =   㒞
-& 㒹
-    =   㒹
-& 㒻
-    =   㒻
-& 㓟
-    =   㓟
-& 㔕
-    =   㔕
-& 㛮
-    =   㛮
-& 㛼
-    =   㛼
-& 㞁
-    =   㞁
-& 㠯
-    =   㠯
-& 㡢
-    =   㡢
-& 㡼
-    =   㡼
-& 㣇
-    =   㣇
-& 㣣
-    =   㣣
-& 㤜
-    =   㤜
-& 㤺
-    =   㤺
-& 㨮
-    =   㨮
-& 㩬
-    =   㩬
-& 㫤
-    =   㫤
-& 㬈
-    =   㬈
-& 㬙
-    =   㬙
-& 㭉
-    =   㭉
-& 㮝
-    =   㮝
-& 㰘
-    =   㰘
-& 㱎
-    =   㱎
-& 㴳
-    =   㴳
-& 㶖
-    =   㶖
-& 㺬
-    =   㺬
-& 㺸
-    =   㺸
-    =   㺸
-& 㼛
-    =   㼛
-& 㿼
-    =   㿼
-& 䀈
-    =   䀈
-& 䀹
-    =   䀹
-& 䁆
-    =   䁆
-& 䂖
-    =   䂖
-& 䃣
-    =   䃣
-& 䄯
-    =   䄯
-& 䈂
-    =   䈂
-& 䈧
-    =   䈧
-& 䊠
-    =   䊠
-& 䌁
-    =   䌁
-& 䌴
-    =   䌴
-& 䍙
-    =   䍙
-& 䏕
-    =   䏕
-& 䏙
-    =   䏙
-& 䐋
-    =   䐋
-& 䑫
-    =   䑫
-& 䔫
-    =   䔫
-& 䕝
-    =   䕝
-& 䕡
-    =   䕡
-& 䕫
-    =   䕫
-& 䗗
-    =   䗗
-& 䗹
-    =   䗹
-& 䘵
-    =   䘵
-& 䚾
-    =   䚾
-& 䛇
-    =   䛇
-& 䦕
-    =   䦕
-& 䧦
-    =   䧦
-& 䩮
-    =   䩮
-& 䩶
-    =   䩶
-& 䪲
-    =   䪲
-& 䬳
-    =   䬳
-& 䯎
-    =   䯎
-& 䳎
-    =   䳎
-& 䳭
-    =   䳭
-& 䳸
-    =   䳸
-& 䵖
-    =   䵖
-& 𠄢
-    =   𠄢
-& 𠔜
-    =   𠔜
-& 𠔥
-    =   𠔥
-& 𠕋
-    =   𠕋
-& 𠘺
-    =   𠘺
-& 𠠄
-    =   𠠄
-& 𠣞
-    =   𠣞
-& 𠨬
-    =   𠨬
-& 𠭣
-    =   𠭣
-& 𡓤
-    =   𡓤
-& 𡚨
-    =   𡚨
-& 𡛪
-    =   𡛪
-& 𡧈
-    =   𡧈
-& 𡬘
-    =   𡬘
-& 𡴋
-    =   𡴋
-& 𡷤
-    =   𡷤
-& 𡷦
-    =   𡷦
-& 𢆃
-    =   𢆃
-& 𢆟
-    =   𢆟
-& 𢌱
-    =   𢌱
-    =   𢌱
-& 𢛔
-    =   𢛔
-& 𢬌
-    =   𢬌
-& 𢯱
-    =   𢯱
-& 𣀊
-    =   𣀊
-& 𣊸
-    =   𣊸
-& 𣍟
-    =   𣍟
-& 𣎓
-    =   𣎓
-& 𣎜
-    =   𣎜
-& 𣏃
-    =   𣏃
-& 𣑭
-    =   𣑭
-& 𣚣
-    =   𣚣
-& 𣢧
-    =   𣢧
-& 𣪍
-    =   𣪍
-& 𣫺
-    =   𣫺
-& 𣲼
-    =   𣲼
-& 𣴞
-    =   𣴞
-& 𣻑
-    =   𣻑
-& 𣽞
-    =   𣽞
-& 𣾎
-    =   𣾎
-& 𤉣
-    =   𤉣
-& 𤎫
-    =   𤎫
-& 𤘈
-    =   𤘈
-& 𤜵
-    =   𤜵
-& 𤠔
-    =   𤠔
-& 𤰶
-    =   𤰶
-& 𤲒
-    =   𤲒
-& 𤾡
-    =   𤾡
-& 𤾸
-    =   𤾸
-& 𥁄
-    =   𥁄
-& 𥃲
-    =   𥃲
-& 𥃳
-    =   𥃳
-& 𥄙
-    =   𥄙
-& 𥄳
-    =   𥄳
-& 𥐝
-    =   𥐝
-& 𥘦
-    =   𥘦
-& 𥚚
-    =   𥚚
-& 𥛅
-    =   𥛅
-& 𥥼
-    =   𥥼
-& 𥪧
-    =   𥪧
-    =   𥪧
-& 𥮫
-    =   𥮫
-& 𥲀
-    =   𥲀
-& 𥾆
-    =   𥾆
-& 𦇚
-    =   𦇚
-& 𦈨
-    =   𦈨
-& 𦉇
-    =   𦉇
-& 𦋙
-    =   𦋙
-& 𦌾
-    =   𦌾
-& 𦓚
-    =   𦓚
-& 𦔣
-    =   𦔣
-& 𦖨
-    =   𦖨
-& 𦞧
-    =   𦞧
-& 𦞵
-    =   𦞵
-& 𦬼
-    =   𦬼
-& 𦰶
-    =   𦰶
-& 𦳕
-    =   𦳕
-& 𦵫
-    =   𦵫
-& 𦼬
-    =   𦼬
-& 𦾱
-    =   𦾱
-& 𧃒
-    =   𧃒
-& 𧏊
-    =   𧏊
-& 𧙧
-    =   𧙧
-& 𧢮
-    =   𧢮
-& 𧥦
-    =   𧥦
-& 𧲨
-    =   𧲨
-& 𧼯
-    =   𧼯
-& 𨗒
-    =   𨗒
-& 𨗭
-    =   𨗭
-& 𨜮
-    =   𨜮
-& 𨯺
-    =   𨯺
-& 𨵷
-    =   𨵷
-& 𩅅
-    =   𩅅
-& 𩇟
-    =   𩇟
-& 𩈚
-    =   𩈚
-& 𩐊
-    =   𩐊
-& 𩒖
-    =   𩒖
-& 𩖶
-    =   𩖶
-& 𩬰
-    =   𩬰
-& 𪃎
-    =   𪃎
-& 𪄅
-    =   𪄅
-& 𪈎
-    =   𪈎
-& 𪊑
-    =   𪊑
-& 𪎒
-    =   𪎒
-& 𪘀
-    =   𪘀
-& [last trailing]
- <      '\uFFFF'
+# TODO: do not tailor to this: & [last trailing]
+# TODO: do not tailor U+FFFD <  �
+# TODO: do not tailor U+FFFF <  '\uFFFF'
 & กเ = เก
 & กแ = แก
 & กโ = โก
index 4f2316fba8a434117646ab257f438071736e1aaa..e20bfa35d693148699846ccf6a34326adea323ed 100644 (file)
@@ -70,8 +70,15 @@ nfrs.o nfrule.o nfsubs.o rbnf.o numsys.o unumsys.o ucsdet.o \
 ucal.o calendar.o gregocal.o timezone.o simpletz.o olsontz.o \
 astro.o taiwncal.o buddhcal.o persncal.o islamcal.o japancal.o gregoimp.o hebrwcal.o \
 indiancal.o chnsecal.o cecal.o coptccal.o dangical.o ethpccal.o \
-coleitr.o coll.o tblcoll.o sortkey.o bocsu.o ucoleitr.o \
-ucol.o ucol_res.o ucol_bld.o ucol_sit.o ucol_tok.o ucol_wgt.o ucol_cnt.o ucol_elm.o \
+coleitr.o coll.o sortkey.o bocsu.o ucoleitr.o \
+ucol.o ucol_res.o ucol_sit.o \
+collation.o collationsettings.o collationdata.o collationtailoring.o \
+collationdatareader.o collationdatawriter.o collationfcd.o \
+collationiterator.o utf16collationiterator.o utf8collationiterator.o uitercollationiterator.o \
+collationsets.o \
+collationcompare.o collationfastlatin.o collationkeys.o rulebasedcollator.o collationroot.o \
+collationrootelements.o collationdatabuilder.o collationbasedatabuilder.o \
+collationweights.o collationruleparser.o collationbuilder.o collationfastlatinbuilder.o \
 strmatch.o usearch.o search.o stsearch.o \
 translit.o utrans.o esctrn.o unesctrn.o funcrepl.o strrepl.o tridpars.o \
 cpdtrans.o rbt.o rbt_data.o rbt_pars.o rbt_rule.o rbt_set.o \
index 88dcaabec1b9eed8ca0c8b6d48dbc4eeb9ebb41f..19fc92fdc8c9259d2af6e61e93bd95681c8a7c38 100644 (file)
@@ -1,20 +1,20 @@
 /*
 *******************************************************************************
-* Copyright (C) 2009-2013, International Business Machines Corporation and
+* Copyright (C) 2009-2014, International Business Machines Corporation and
 * others. All Rights Reserved.
 *******************************************************************************
 */
 
 #include "unicode/utypes.h"
 
-#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_NORMALIZATION
+#if !UCONFIG_NO_COLLATION
 
 #include "unicode/alphaindex.h"
-#include "unicode/coleitr.h"
 #include "unicode/coll.h"
 #include "unicode/localpointer.h"
 #include "unicode/normalizer2.h"
 #include "unicode/tblcoll.h"
+#include "unicode/uchar.h"
 #include "unicode/ulocdata.h"
 #include "unicode/uniset.h"
 #include "unicode/uobject.h"
@@ -25,6 +25,7 @@
 #include "cstring.h"
 #include "uassert.h"
 #include "uvector.h"
+#include "uvectr64.h"
 
 //#include <string>
 //#include <iostream>
@@ -329,7 +330,7 @@ void AlphabeticIndex::initLabels(UVector &indexCharacters, UErrorCode &errorCode
         if (collatorPrimaryOnly_->compare(*item, firstScriptBoundary, errorCode) < 0) {
             // Ignore a primary-ignorable or non-alphabetic index character.
         } else if (collatorPrimaryOnly_->compare(*item, overflowBoundary, errorCode) >= 0) {
-            // Ignore an index characters that will land in the overflow bucket.
+            // Ignore an index character that will land in the overflow bucket.
         } else if (checkDistinct &&
                 collatorPrimaryOnly_->compare(*item, separated(*item), errorCode) == 0) {
             // Ignore a multi-code point index character that does not sort distinctly
@@ -393,18 +394,17 @@ const UnicodeString &fixLabel(const UnicodeString &current, UnicodeString &temp)
 }
 
 UBool hasMultiplePrimaryWeights(
-        CollationElementIterator &cei, int32_t variableTop,
-        const UnicodeString &s, UErrorCode &errorCode) {
-    cei.setText(s, errorCode);
+        const RuleBasedCollator &coll, uint32_t variableTop,
+        const UnicodeString &s, UVector64 &ces, UErrorCode &errorCode) {
+    ces.removeAllElements();
+    coll.internalGetCEs(s, ces, errorCode);
+    if (U_FAILURE(errorCode)) { return FALSE; }
     UBool seenPrimary = FALSE;
-    for (;;) {
-        int32_t ce32 = cei.next(errorCode);
-        if (ce32 == CollationElementIterator::NULLORDER) {
-            break;
-        }
-        int32_t p = CollationElementIterator::primaryOrder(ce32);
-        if (p > variableTop && (ce32 & 0xc0) != 0xc0) {
-            // not primary ignorable, and not a continuation CE
+    for (int32_t i = 0; i < ces.size(); ++i) {
+        int64_t ce = ces.elementAti(i);
+        uint32_t p = (uint32_t)(ce >> 32);
+        if (p > variableTop) {
+            // not primary ignorable
             if (seenPrimary) {
                 return TRUE;
             }
@@ -424,16 +424,10 @@ BucketList *AlphabeticIndex::createBucketList(UErrorCode &errorCode) const {
     if (U_FAILURE(errorCode)) { return NULL; }
 
     // Variables for hasMultiplePrimaryWeights().
-    LocalPointer<CollationElementIterator> cei(
-        collatorPrimaryOnly_->createCollationElementIterator(emptyString_));
-    if (cei.isNull()) {
-        errorCode = U_MEMORY_ALLOCATION_ERROR;
-        return NULL;
-    }
-    int32_t variableTop;
+    UVector64 ces(errorCode);
+    uint32_t variableTop;
     if (collatorPrimaryOnly_->getAttribute(UCOL_ALTERNATE_HANDLING, errorCode) == UCOL_SHIFTED) {
-        variableTop = CollationElementIterator::primaryOrder(
-            (int32_t)collatorPrimaryOnly_->getVariableTop(errorCode));
+        variableTop = collatorPrimaryOnly_->getVariableTop(errorCode);
     } else {
         variableTop = 0;
     }
@@ -514,7 +508,8 @@ BucketList *AlphabeticIndex::createBucketList(UErrorCode &errorCode) const {
         }
         // Check for multiple primary weights.
         if (!current.startsWith(BASE, BASE_LENGTH) &&
-                hasMultiplePrimaryWeights(*cei, variableTop, current, errorCode) &&
+                hasMultiplePrimaryWeights(*collatorPrimaryOnly_, variableTop, current,
+                                          ces, errorCode) &&
                 current.charAt(current.length() - 1) != 0xFFFF /* !current.endsWith("\uffff") */) {
             // "AE-ligature" or "Sch" etc.
             for (int32_t i = bucketList->size() - 2;; --i) {
@@ -525,8 +520,9 @@ BucketList *AlphabeticIndex::createBucketList(UErrorCode &errorCode) const {
                     break;
                 }
                 if (singleBucket->displayBucket_ == NULL &&
-                        !hasMultiplePrimaryWeights(
-                            *cei, variableTop, singleBucket->lowerBoundary_, errorCode)) {
+                        !hasMultiplePrimaryWeights(*collatorPrimaryOnly_, variableTop,
+                                                   singleBucket->lowerBoundary_,
+                                                   ces, errorCode)) {
                     // Add an invisible bucket that redirects strings greater than the expansion
                     // to the previous single-character bucket.
                     // For example, after ... Q R S Sch we add Sch\uFFFF->S
@@ -710,20 +706,6 @@ void AlphabeticIndex::internalResetBucketIterator() {
 
 
 void AlphabeticIndex::addIndexExemplars(const Locale &locale, UErrorCode &status) {
-    if (U_FAILURE(status)) { return; }
-    // Chinese index characters, which are specific to each of the several Chinese tailorings,
-    // take precedence over the single locale data exemplar set per language.
-    const char *language = locale.getLanguage();
-    if (uprv_strcmp(language, "zh") == 0 || uprv_strcmp(language, "ja") == 0 ||
-            uprv_strcmp(language, "ko") == 0) {
-        // TODO: This should be done regardless of the language, but it's expensive.
-        // We should add a Collator function (can be @internal)
-        // to enumerate just the contractions that start with a given code point or string.
-        if (addChineseIndexCharacters(status) || U_FAILURE(status)) {
-            return;
-        }
-    }
-
     LocalULocaleDataPointer uld(ulocdata_open(locale.getName(), &status));
     if (U_FAILURE(status)) {
         return;
@@ -784,50 +766,21 @@ void AlphabeticIndex::addIndexExemplars(const Locale &locale, UErrorCode &status
 
 UBool AlphabeticIndex::addChineseIndexCharacters(UErrorCode &errorCode) {
     UnicodeSet contractions;
-    ucol_getContractionsAndExpansions(collatorPrimaryOnly_->getUCollator(),
-                                      contractions.toUSet(), NULL, FALSE, &errorCode);
-    if (U_FAILURE(errorCode)) { return FALSE; }
-    UnicodeString firstHanBoundary;
-    UBool hasPinyin = FALSE;
+    collatorPrimaryOnly_->internalAddContractions(BASE[0], contractions, errorCode);
+    if (U_FAILURE(errorCode) || contractions.isEmpty()) { return FALSE; }
+    initialLabels_->addAll(contractions);
     UnicodeSetIterator iter(contractions);
     while (iter.next()) {
         const UnicodeString &s = iter.getString();
-        if (s.startsWith(BASE, BASE_LENGTH)) {
-            initialLabels_->add(s);
-            if (firstHanBoundary.isEmpty() ||
-                    collatorPrimaryOnly_->compare(s, firstHanBoundary, errorCode) < 0) {
-                firstHanBoundary = s;
-            }
-            UChar c = s.charAt(s.length() - 1);
-            if (0x41 <= c && c <= 0x5A) {  // A-Z
-                hasPinyin = TRUE;
-            }
-        }
-    }
-    if (hasPinyin) {
-        initialLabels_->add(0x41, 0x5A);  // A-Z
-    }
-    if (!firstHanBoundary.isEmpty()) {
-        // The hardcoded list of script boundaries includes U+4E00
-        // which is tailored to not be the first primary
-        // in all Chinese tailorings except "unihan".
-        // Replace U+4E00 with the first boundary string from the tailoring.
-        // TODO: This becomes obsolete when the root collator gets
-        // reliable script-first-primary mappings.
-        int32_t hanIndex = binarySearch(
-                *firstCharsInScripts_, UnicodeString((UChar)0x4E00), *collatorPrimaryOnly_);
-        if (hanIndex >= 0) {
-            UnicodeString *fh = new UnicodeString(firstHanBoundary);
-            if (fh == NULL) {
-                errorCode = U_MEMORY_ALLOCATION_ERROR;
-                return FALSE;
-            }
-            firstCharsInScripts_->setElementAt(fh, hanIndex);
+        U_ASSERT (s.startsWith(BASE, BASE_LENGTH));
+        UChar c = s.charAt(s.length() - 1);
+        if (0x41 <= c && c <= 0x5A) {  // A-Z
+            // There are Pinyin labels, add ASCII A-Z labels as well.
+            initialLabels_->add(0x41, 0x5A);  // A-Z
+            break;
         }
-        return TRUE;
-    } else {
-        return FALSE;
     }
+    return TRUE;
 }
 
 
@@ -865,9 +818,7 @@ UBool AlphabeticIndex::operator!=(const AlphabeticIndex& /* other */) const {
 
 
 const RuleBasedCollator &AlphabeticIndex::getCollator() const {
-    // There are no known non-RuleBasedCollator collators, and none ever expected.
-    // But, in case that changes, better a null pointer than a wrong type.
-    return *dynamic_cast<RuleBasedCollator *>(collator_);
+    return *collator_;
 }
 
 
@@ -947,12 +898,21 @@ void AlphabeticIndex::init(const Locale *locale, UErrorCode &status) {
     underflowLabel_ = inflowLabel_;
 
     if (collator_ == NULL) {
-        collator_ = static_cast<RuleBasedCollator *>(Collator::createInstance(*locale, status));
-        if (U_FAILURE(status)) { return; }
-        if (collator_ == NULL) {
+        Collator *coll = Collator::createInstance(*locale, status);
+        if (U_FAILURE(status)) {
+            delete coll;
+            return;
+        }
+        if (coll == NULL) {
             status = U_MEMORY_ALLOCATION_ERROR;
             return;
         }
+        collator_ = dynamic_cast<RuleBasedCollator *>(coll);
+        if (collator_ == NULL) {
+            delete coll;
+            status = U_UNSUPPORTED_ERROR;
+            return;
+        }
     }
     collatorPrimaryOnly_ = static_cast<RuleBasedCollator *>(collator_->clone());
     if (collatorPrimaryOnly_ == NULL) {
@@ -963,22 +923,6 @@ void AlphabeticIndex::init(const Locale *locale, UErrorCode &status) {
     firstCharsInScripts_ = firstStringsInScript(status);
     if (U_FAILURE(status)) { return; }
     firstCharsInScripts_->sortWithUComparator(collatorComparator, collatorPrimaryOnly_, status);
-    UnicodeString _4E00((UChar)0x4E00);
-    UnicodeString _1100((UChar)0x1100);
-    UnicodeString _1112((UChar)0x1112);
-    if (collatorPrimaryOnly_->compare(_4E00, _1112, status) <= 0 &&
-            collatorPrimaryOnly_->compare(_1100, _4E00, status) <= 0) {
-        // The standard Korean tailoring sorts Hanja (Han characters)
-        // as secondary differences from Hangul syllables.
-        // This makes U+4E00 not useful as a Han-script boundary.
-        // TODO: This becomes obsolete when the root collator gets
-        // reliable script-first-primary mappings.
-        int32_t hanIndex = binarySearch(
-                *firstCharsInScripts_, _4E00, *collatorPrimaryOnly_);
-        if (hanIndex >= 0) {
-            firstCharsInScripts_->removeElementAt(hanIndex);
-        }
-    }
     // Guard against a degenerate collator where
     // some script boundary strings are primary ignorable.
     for (;;) {
@@ -997,7 +941,9 @@ void AlphabeticIndex::init(const Locale *locale, UErrorCode &status) {
         }
     }
 
-    if (locale != NULL) {
+    // Chinese index characters, which are specific to each of the several Chinese tailorings,
+    // take precedence over the single locale data exemplar set per language.
+    if (!addChineseIndexCharacters(status) && locale != NULL) {
         addIndexExemplars(*locale, status);
     }
 }
@@ -1042,90 +988,45 @@ recordCompareFn(const void *context, const void *left, const void *right) {
     return col->compare(leftRec->name_, rightRec->name_, errorCode);
 }
 
-
-/**
- * This list contains one character per script that has the
- * lowest primary weight for that script in the root collator.
- * This list will be copied and sorted to account for script reordering.
- *
- * <p>TODO: This is fragile. If the first character of a script is tailored
- * so that it does not map to the script's lowest primary weight any more,
- * then the buckets will be off.
- * There are hacks in the code to handle the known CJK tailorings of U+4E00.
- *
- * <p>We use "A" not "a" because the en_US_POSIX tailoring sorts A primary-before a.
- *
- * Keep this in sync with HACK_FIRST_CHARS_IN_SCRIPTS in
- * ICU4J main/classes/collate/src/com/ibm/icu/text/AlphabeticIndex.java
- */
-static const UChar HACK_FIRST_CHARS_IN_SCRIPTS[] =  {
-    0x41, 0, 0x03B1, 0,
-    0x2C81, 0, 0x0430, 0, 0x2C30, 0, 0x10D0, 0, 0x0561, 0, 0x05D0, 0, 0xD802, 0xDD00, 0, 0x0800, 0, 0x0621, 0, 0x0710, 0,
-    0x0780, 0, 0x07CA, 0, 0x2D30, 0, 0x1200, 0, 0x0950, 0, 0x0985, 0, 0x0A74, 0, 0x0AD0, 0, 0x0B05, 0, 0x0BD0, 0,
-    0x0C05, 0, 0x0C85, 0, 0x0D05, 0, 0x0D85, 0,
-    0xAAF2, 0,  // Meetei Mayek
-    0xA800, 0, 0xA882, 0, 0xD804, 0xDC83, 0,
-    U16_LEAD(0x111C4), U16_TRAIL(0x111C4), 0,  // Sharada
-    U16_LEAD(0x11680), U16_TRAIL(0x11680), 0,  // Takri
-    0x1B83, 0,
-    0xD802, 0xDE00, 0, 0x0E01, 0,
-    0x0EDE, 0,  // Lao
-    0xAA80, 0, 0x0F40, 0, 0x1C00, 0, 0xA840, 0, 0x1900, 0, 0x1700, 0, 0x1720, 0,
-    0x1740, 0, 0x1760, 0, 0x1A00, 0, 0xA930, 0, 0xA90A, 0, 0x1000, 0,
-    U16_LEAD(0x11103), U16_TRAIL(0x11103), 0,  // Chakma
-    0x1780, 0, 0x1950, 0, 0x1980, 0, 0x1A20, 0,
-    0xAA00, 0, 0x1B05, 0, 0xA984, 0, 0x1880, 0, 0x1C5A, 0, 0x13A0, 0, 0x1401, 0, 0x1681, 0, 0x16A0, 0, 0xD803, 0xDC00, 0,
-    0xA500, 0, 0xA6A0, 0, 0x1100, 0, 0x3041, 0, 0x30A1, 0, 0x3105, 0, 0xA000, 0, 0xA4F8, 0,
-    U16_LEAD(0x16F00), U16_TRAIL(0x16F00), 0,  // Miao
-    0xD800, 0xDE80, 0,
-    0xD800, 0xDEA0, 0, 0xD802, 0xDD20, 0, 0xD800, 0xDF00, 0, 0xD800, 0xDF30, 0, 0xD801, 0xDC28, 0, 0xD801, 0xDC50, 0,
-    0xD801, 0xDC80, 0,
-    U16_LEAD(0x110D0), U16_TRAIL(0x110D0), 0,  // Sora Sompeng
-    0xD800, 0xDC00, 0, 0xD802, 0xDC00, 0, 0xD802, 0xDE60, 0, 0xD802, 0xDF00, 0, 0xD802, 0xDC40, 0,
-    0xD802, 0xDF40, 0, 0xD802, 0xDF60, 0, 0xD800, 0xDF80, 0, 0xD800, 0xDFA0, 0, 0xD808, 0xDC00, 0, 0xD80C, 0xDC00, 0,
-    U16_LEAD(0x109A0), U16_TRAIL(0x109A0), 0,  // Meroitic Cursive
-    U16_LEAD(0x10980), U16_TRAIL(0x10980), 0,  // Meroitic Hieroglyphs
-    0x4E00, 0,
-    // TODO: The overflow bucket's lowerBoundary string should be the
-    // first item after the last reordering group in the collator's script order.
-    // This should normally be the first Unicode code point
-    // that is unassigned (U+0378 in Unicode 6.3) and untailored.
-    // However, at least up to ICU 51 the Hani reordering group includes
-    // unassigned code points,
-    // and there is no stable string for the start of the trailing-weights range.
-    // The only known string that sorts "high" is U+FFFF.
-    // When ICU separates Hani vs. unassigned reordering groups, we need to fix this,
-    // and fix relevant test code.
-    // Ideally, FractionalUCA.txt will have a "script first primary"
-    // for unassigned code points.
-    0xFFFF, 0
-};
-
 UVector *AlphabeticIndex::firstStringsInScript(UErrorCode &status) {
     if (U_FAILURE(status)) {
         return NULL;
     }
-    UVector *dest = new UVector(status);
-    if (dest == NULL) {
+    LocalPointer<UVector> dest(new UVector(status));
+    if (dest.isNull()) {
         status = U_MEMORY_ALLOCATION_ERROR;
         return NULL;
     }
     dest->setDeleter(uprv_deleteUObject);
-    const UChar *src  = HACK_FIRST_CHARS_IN_SCRIPTS;
-    const UChar *limit = src + LENGTHOF(HACK_FIRST_CHARS_IN_SCRIPTS);
-    do {
-        if (U_FAILURE(status)) {
-            return dest;
+    // Fetch the script-first-primary contractions which are defined in the root collator.
+    // They all start with U+FDD1.
+    UnicodeSet set;
+    collatorPrimaryOnly_->internalAddContractions(0xFDD1, set, status);
+    if (U_FAILURE(status)) {
+        return NULL;
+    }
+    if (set.isEmpty()) {
+        status = U_UNSUPPORTED_ERROR;
+        return NULL;
+    }
+    UnicodeSetIterator iter(set);
+    while (iter.next()) {
+        const UnicodeString &boundary = iter.getString();
+        uint32_t gcMask = U_GET_GC_MASK(boundary.char32At(1));
+        if ((gcMask & (U_GC_L_MASK | U_GC_CN_MASK)) == 0) {
+            // Ignore boundaries for the special reordering groups.
+            // Take only those for "real scripts" (where the sample character is a Letter,
+            // and the one for unassigned implicit weights (Cn).
+            continue;
         }
-        UnicodeString *str = new UnicodeString(src, -1);
-        if (str == NULL) {
+        UnicodeString *s = new UnicodeString(boundary);
+        if (s == NULL) {
             status = U_MEMORY_ALLOCATION_ERROR;
-            return dest;
+            return NULL;
         }
-        dest->addElement(str, status);
-        src += str->length() + 1;
-    } while (src < limit);
-    return dest;
+        dest->addElement(s, status);
+    }
+    return dest.orphan();
 }
 
 
@@ -1347,4 +1248,4 @@ AlphabeticIndex::Bucket::~Bucket() {
 
 U_NAMESPACE_END
 
-#endif
+#endif  // !UCONFIG_NO_COLLATION
index 6e771a88b8eb9585d5f7ca2d8ff4a9e6f3c852e3..cfc9816693bc9e0651abc78004877dde9444ade9 100644 (file)
@@ -1,6 +1,6 @@
 /*
 *******************************************************************************
-*   Copyright (C) 2001-2011, International Business Machines
+*   Copyright (C) 2001-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
 *   file name:  bocsu.cpp
 #include "bocsu.h"
 
 /*
- * encode one difference value -0x10ffff..+0x10ffff in 1..3 bytes,
+ * encode one difference value -0x10ffff..+0x10ffff in 1..4 bytes,
  * preserving lexical order
  */
-U_CFUNC uint8_t *
+static uint8_t *
 u_writeDiff(int32_t diff, uint8_t *p) {
     if(diff>=SLOPE_REACH_NEG_1) {
         if(diff<=SLOPE_REACH_POS_1) {
@@ -95,12 +95,11 @@ u_writeDiff(int32_t diff, uint8_t *p) {
  * Note that the identical-level run in a sort key is generated from
  * NFD text - there are never Hangul characters included.
  */
-U_CFUNC void
-u_writeIdenticalLevelRun(const UChar *s, int32_t length, icu::ByteSink &sink) {
+U_CFUNC UChar32
+u_writeIdenticalLevelRun(UChar32 prev, const UChar *s, int32_t length, icu::ByteSink &sink) {
     char scratch[64];
     int32_t capacity;
 
-    UChar32 prev=0;
     int32_t i=0;
     while(i<length) {
         char *buffer=sink.GetAppendBuffer(1, length*2, scratch, (int32_t)sizeof(scratch), &capacity);
@@ -127,28 +126,17 @@ u_writeIdenticalLevelRun(const UChar *s, int32_t length, icu::ByteSink &sink) {
 
             UChar32 c;
             U16_NEXT(s, i, length, c);
-            p=u_writeDiff(c-prev, p);
-            prev=c;
+            if(c==0xfffe) {
+                *p++=2;  // merge separator
+                prev=0;
+            } else {
+                p=u_writeDiff(c-prev, p);
+                prev=c;
+            }
         }
         sink.Append(buffer, (int32_t)(p-reinterpret_cast<uint8_t *>(buffer)));
     }
-}
-
-U_CFUNC int32_t
-u_writeIdenticalLevelRunTwoChars(UChar32 first, UChar32 second, uint8_t *p) {
-    uint8_t *p0 = p;
-    if(first<0x4e00 || first>=0xa000) {
-        first=(first&~0x7f)-SLOPE_REACH_NEG_1;
-    } else {
-        /*
-         * Unihan U+4e00..U+9fa5:
-         * double-bytes down from the upper end
-         */
-        first=0x9fff-SLOPE_REACH_POS_2;
-    }
-
-    p=u_writeDiff(second-first, p);
-    return (int32_t)(p-p0);
+    return prev;
 }
 
 #endif /* #if !UCONFIG_NO_COLLATION */
index 37165b5e77e5d0b3309d1da59fd2162754e3bdc3..0f89a0fbeb06dab84eedb9ff24b86b3e6b1b3cd9 100644 (file)
@@ -1,9 +1,9 @@
 /*
 *******************************************************************************
-*   Copyright (C) 2001-2011, International Business Machines
+*   Copyright (C) 2001-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
-*   file name:  bocsu.c
+*   file name:  bocsu.h
 *   encoding:   US-ASCII
 *   tab size:   8 (not used)
 *   indentation:4
@@ -151,14 +151,8 @@ U_NAMESPACE_END
     } \
 }
 
-U_CFUNC void
-u_writeIdenticalLevelRun(const UChar *s, int32_t length, icu::ByteSink &sink);
-
-U_CFUNC int32_t
-u_writeIdenticalLevelRunTwoChars(UChar32 first, UChar32 second, uint8_t *p);
-
-U_CFUNC uint8_t *
-u_writeDiff(int32_t diff, uint8_t *p);
+U_CFUNC UChar32
+u_writeIdenticalLevelRun(UChar32 prev, const UChar *s, int32_t length, icu::ByteSink &sink);
 
 #endif /* #if !UCONFIG_NO_COLLATION */
 
index 7db3e5f752733a0df6dd47ec890e7a14261af6a9..40dfd11c28e6e00fe15f9554d30d4305a9f2f450 100644 (file)
@@ -1,15 +1,13 @@
 /*
 *******************************************************************************
-* Copyright (C) 1996-2011, International Business Machines Corporation and    *
-* others. All Rights Reserved.                                                *
+* Copyright (C) 1996-2014, International Business Machines Corporation and
+* others. All Rights Reserved.
 *******************************************************************************
 */
 
 /*
 * File coleitr.cpp
 *
-* 
-*
 * Created by: Helena Shih
 *
 * Modification History:
@@ -20,8 +18,9 @@
 * 08/03/98   erm         Synched with 1.2 version of CollationElementIterator.java
 * 12/10/99   aliu        Ported Thai collation support from Java.
 * 01/25/01   swquek      Modified to a C++ wrapper calling C APIs (ucoliter.h)
-* 02/19/01   swquek      Removed CollationElementsIterator() since it is 
+* 02/19/01   swquek      Removed CollationElementIterator() since it is 
 *                        private constructor and no calls are made to it
+* 2012-2014  markus      Rewritten in C++ again.
 */
 
 #include "unicode/utypes.h"
 #if !UCONFIG_NO_COLLATION
 
 #include "unicode/coleitr.h"
+#include "unicode/tblcoll.h"
 #include "unicode/ustring.h"
-#include "ucol_imp.h"
-#include "uassert.h"
 #include "cmemory.h"
-
+#include "collation.h"
+#include "collationdata.h"
+#include "collationiterator.h"
+#include "collationsets.h"
+#include "collationtailoring.h"
+#include "uassert.h"
+#include "uhash.h"
+#include "utf16collationiterator.h"
+#include "uvectr32.h"
 
 /* Constants --------------------------------------------------------------- */
 
@@ -45,27 +51,46 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CollationElementIterator)
 
 CollationElementIterator::CollationElementIterator(
                                          const CollationElementIterator& other) 
-                                         : UObject(other), isDataOwned_(TRUE)
-{
-    UErrorCode status = U_ZERO_ERROR;
-    m_data_ = ucol_openElements(other.m_data_->iteratordata_.coll, NULL, 0, 
-                                &status);
-
+        : UObject(other), iter_(NULL), rbc_(NULL), otherHalf_(0), dir_(0), offsets_(NULL) {
     *this = other;
 }
 
 CollationElementIterator::~CollationElementIterator()
 {
-    if (isDataOwned_) {
-        ucol_closeElements(m_data_);
-    }
+    delete iter_;
+    delete offsets_;
 }
 
 /* CollationElementIterator public methods --------------------------------- */
 
+namespace {
+
+uint32_t getFirstHalf(uint32_t p, uint32_t lower32) {
+    return (p & 0xffff0000) | ((lower32 >> 16) & 0xff00) | ((lower32 >> 8) & 0xff);
+}
+uint32_t getSecondHalf(uint32_t p, uint32_t lower32) {
+    return (p << 16) | ((lower32 >> 8) & 0xff00) | (lower32 & 0x3f);
+}
+UBool ceNeedsTwoParts(int64_t ce) {
+    return (ce & INT64_C(0xffff00ff003f)) != 0;
+}
+
+}  // namespace
+
 int32_t CollationElementIterator::getOffset() const
 {
-    return ucol_getOffset(m_data_);
+    if (dir_ < 0 && offsets_ != NULL && !offsets_->isEmpty()) {
+        // CollationIterator::previousCE() decrements the CEs length
+        // while it pops CEs from its internal buffer.
+        int32_t i = iter_->getCEsLength();
+        if (otherHalf_ != 0) {
+            // Return the trailing CE offset while we are in the middle of a 64-bit CE.
+            ++i;
+        }
+        U_ASSERT(i < offsets_->size());
+        return offsets_->elementAti(i);
+    }
+    return iter_->getOffset();
 }
 
 /**
@@ -75,7 +100,38 @@ int32_t CollationElementIterator::getOffset() const
 */
 int32_t CollationElementIterator::next(UErrorCode& status)
 {
-    return ucol_next(m_data_, &status);
+    if (U_FAILURE(status)) { return NULLORDER; }
+    if (dir_ > 1) {
+        // Continue forward iteration. Test this first.
+        if (otherHalf_ != 0) {
+            uint32_t oh = otherHalf_;
+            otherHalf_ = 0;
+            return oh;
+        }
+    } else if (dir_ == 1) {
+        // next() after setOffset()
+        dir_ = 2;
+    } else if (dir_ == 0) {
+        // The iter_ is already reset to the start of the text.
+        dir_ = 2;
+    } else /* dir_ < 0 */ {
+        // illegal change of direction
+        status = U_INVALID_STATE_ERROR;
+        return NULLORDER;
+    }
+    // No need to keep all CEs in the buffer when we iterate.
+    iter_->clearCEsIfNoneRemaining();
+    int64_t ce = iter_->nextCE(status);
+    if (ce == Collation::NO_CE) { return NULLORDER; }
+    // Turn the 64-bit CE into two old-style 32-bit CEs, without quaternary bits.
+    uint32_t p = (uint32_t)(ce >> 32);
+    uint32_t lower32 = (uint32_t)ce;
+    uint32_t firstHalf = getFirstHalf(p, lower32);
+    uint32_t secondHalf = getSecondHalf(p, lower32);
+    if (secondHalf != 0) {
+        otherHalf_ = secondHalf | 0xc0;  // continuation CE
+    }
+    return firstHalf;
 }
 
 UBool CollationElementIterator::operator!=(
@@ -87,56 +143,16 @@ UBool CollationElementIterator::operator!=(
 UBool CollationElementIterator::operator==(
                                     const CollationElementIterator& that) const
 {
-    if (this == &that || m_data_ == that.m_data_) {
+    if (this == &that) {
         return TRUE;
     }
 
-    // option comparison
-    if (m_data_->iteratordata_.coll != that.m_data_->iteratordata_.coll)
-    {
-        return FALSE;
-    }
-
-    // the constructor and setText always sets a length
-    // and we only compare the string not the contents of the normalization
-    // buffer
-    int thislength = (int)(m_data_->iteratordata_.endp - m_data_->iteratordata_.string);
-    int thatlength = (int)(that.m_data_->iteratordata_.endp - that.m_data_->iteratordata_.string);
-    
-    if (thislength != thatlength) {
-        return FALSE;
-    }
-
-    if (uprv_memcmp(m_data_->iteratordata_.string, 
-                    that.m_data_->iteratordata_.string, 
-                    thislength * U_SIZEOF_UCHAR) != 0) {
-        return FALSE;
-    }
-    if (getOffset() != that.getOffset()) {
-        return FALSE;
-    }
-
-    // checking normalization buffer
-    if ((m_data_->iteratordata_.flags & UCOL_ITER_HASLEN) == 0) {
-        if ((that.m_data_->iteratordata_.flags & UCOL_ITER_HASLEN) != 0) {
-            return FALSE;
-        }
-        // both are in the normalization buffer
-        if (m_data_->iteratordata_.pos 
-            - m_data_->iteratordata_.writableBuffer.getBuffer()
-            != that.m_data_->iteratordata_.pos 
-            - that.m_data_->iteratordata_.writableBuffer.getBuffer()) {
-            // not in the same position in the normalization buffer
-            return FALSE;
-        }
-    }
-    else if ((that.m_data_->iteratordata_.flags & UCOL_ITER_HASLEN) == 0) {
-        return FALSE;
-    }
-    // checking ce position
-    return (m_data_->iteratordata_.CEpos - m_data_->iteratordata_.CEs)
-            == (that.m_data_->iteratordata_.CEpos 
-                                        - that.m_data_->iteratordata_.CEs);
+    return
+        (rbc_ == that.rbc_ || *rbc_ == *that.rbc_) &&
+        otherHalf_ == that.otherHalf_ &&
+        normalizeDir() == that.normalizeDir() &&
+        string_ == that.string_ &&
+        *iter_ == *that.iter_;
 }
 
 /**
@@ -147,7 +163,55 @@ UBool CollationElementIterator::operator==(
 */
 int32_t CollationElementIterator::previous(UErrorCode& status)
 {
-    return ucol_previous(m_data_, &status);
+    if (U_FAILURE(status)) { return NULLORDER; }
+    if (dir_ < 0) {
+        // Continue backwards iteration. Test this first.
+        if (otherHalf_ != 0) {
+            uint32_t oh = otherHalf_;
+            otherHalf_ = 0;
+            return oh;
+        }
+    } else if (dir_ == 0) {
+        iter_->resetToOffset(string_.length());
+        dir_ = -1;
+    } else if (dir_ == 1) {
+        // previous() after setOffset()
+        dir_ = -1;
+    } else /* dir_ > 1 */ {
+        // illegal change of direction
+        status = U_INVALID_STATE_ERROR;
+        return NULLORDER;
+    }
+    if (offsets_ == NULL) {
+        offsets_ = new UVector32(status);
+        if (offsets_ == NULL) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            return NULLORDER;
+        }
+    }
+    // If we already have expansion CEs, then we also have offsets.
+    // Otherwise remember the trailing offset in case we need to
+    // write offsets for an artificial expansion.
+    int32_t limitOffset = iter_->getCEsLength() == 0 ? iter_->getOffset() : 0;
+    int64_t ce = iter_->previousCE(*offsets_, status);
+    if (ce == Collation::NO_CE) { return NULLORDER; }
+    // Turn the 64-bit CE into two old-style 32-bit CEs, without quaternary bits.
+    uint32_t p = (uint32_t)(ce >> 32);
+    uint32_t lower32 = (uint32_t)ce;
+    uint32_t firstHalf = getFirstHalf(p, lower32);
+    uint32_t secondHalf = getSecondHalf(p, lower32);
+    if (secondHalf != 0) {
+        if (offsets_->isEmpty()) {
+            // When we convert a single 64-bit CE into two 32-bit CEs,
+            // we need to make this artificial expansion behave like a normal expansion.
+            // See CollationIterator::previousCE().
+            offsets_->addElement(iter_->getOffset(), status);
+            offsets_->addElement(limitOffset, status);
+        }
+        otherHalf_ = firstHalf;
+        return secondHalf | 0xc0;  // continuation CE
+    }
+    return firstHalf;
 }
 
 /**
@@ -155,13 +219,49 @@ int32_t CollationElementIterator::previous(UErrorCode& status)
 */
 void CollationElementIterator::reset()
 {
-    ucol_reset(m_data_);
+    iter_ ->resetToOffset(0);
+    otherHalf_ = 0;
+    dir_ = 0;
 }
 
 void CollationElementIterator::setOffset(int32_t newOffset, 
                                          UErrorCode& status)
 {
-    ucol_setOffset(m_data_, newOffset, &status);
+    if (U_FAILURE(status)) { return; }
+    if (0 < newOffset && newOffset < string_.length()) {
+        int32_t offset = newOffset;
+        do {
+            UChar c = string_.charAt(offset);
+            if (!rbc_->isUnsafe(c) ||
+                    (U16_IS_LEAD(c) && !rbc_->isUnsafe(string_.char32At(offset)))) {
+                break;
+            }
+            // Back up to before this unsafe character.
+            --offset;
+        } while (offset > 0);
+        if (offset < newOffset) {
+            // We might have backed up more than necessary.
+            // For example, contractions "ch" and "cu" make both 'h' and 'u' unsafe,
+            // but for text "chu" setOffset(2) should remain at 2
+            // although we initially back up to offset 0.
+            // Find the last safe offset no greater than newOffset by iterating forward.
+            int32_t lastSafeOffset = offset;
+            do {
+                iter_->resetToOffset(lastSafeOffset);
+                do {
+                    iter_->nextCE(status);
+                    if (U_FAILURE(status)) { return; }
+                } while ((offset = iter_->getOffset()) == lastSafeOffset);
+                if (offset <= newOffset) {
+                    lastSafeOffset = offset;
+                }
+            } while (offset < newOffset);
+            newOffset = lastSafeOffset;
+        }
+    }
+    iter_->resetToOffset(newOffset);
+    otherHalf_ = 0;
+    dir_ = 1;
 }
 
 /**
@@ -174,36 +274,23 @@ void CollationElementIterator::setText(const UnicodeString& source,
         return;
     }
 
-    int32_t length = source.length();
-    UChar *string = NULL;
-    if (m_data_->isWritable && m_data_->iteratordata_.string != NULL) {
-        uprv_free((UChar *)m_data_->iteratordata_.string);
+    string_ = source;
+    const UChar *s = string_.getBuffer();
+    CollationIterator *newIter;
+    UBool numeric = rbc_->settings->isNumeric();
+    if (rbc_->settings->dontCheckFCD()) {
+        newIter = new UTF16CollationIterator(rbc_->data, numeric, s, s, s + string_.length());
+    } else {
+        newIter = new FCDUTF16CollationIterator(rbc_->data, numeric, s, s, s + string_.length());
     }
-    m_data_->isWritable = TRUE;
-    if (length > 0) {
-        string = (UChar *)uprv_malloc(U_SIZEOF_UCHAR * length);
-        /* test for NULL */
-        if (string == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        u_memcpy(string, source.getBuffer(), length);
-    }
-    else {
-        string = (UChar *)uprv_malloc(U_SIZEOF_UCHAR);
-        /* test for NULL */
-        if (string == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        *string = 0;
+    if (newIter == NULL) {
+        status = U_MEMORY_ALLOCATION_ERROR;
+        return;
     }
-    /* Free offsetBuffer before initializing it. */
-    ucol_freeOffsetBuffer(&(m_data_->iteratordata_));
-    uprv_init_collIterate(m_data_->iteratordata_.coll, string, length, 
-        &m_data_->iteratordata_, &status);
-
-    m_data_->reset_   = TRUE;
+    delete iter_;
+    iter_ = newIter;
+    otherHalf_ = 0;
+    dir_ = 0;
 }
 
 // Sets the source to the new character iterator.
@@ -213,54 +300,19 @@ void CollationElementIterator::setText(CharacterIterator& source,
     if (U_FAILURE(status)) 
         return;
 
-    int32_t length = source.getLength();
-    UChar *buffer = NULL;
-
-    if (length == 0) {
-        buffer = (UChar *)uprv_malloc(U_SIZEOF_UCHAR);
-        /* test for NULL */
-        if (buffer == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        *buffer = 0;
-    }
-    else {
-        buffer = (UChar *)uprv_malloc(U_SIZEOF_UCHAR * length);
-        /* test for NULL */
-        if (buffer == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        /* 
-        Using this constructor will prevent buffer from being removed when
-        string gets removed
-        */
-        UnicodeString string;
-        source.getText(string);
-        u_memcpy(buffer, string.getBuffer(), length);
-    }
-
-    if (m_data_->isWritable && m_data_->iteratordata_.string != NULL) {
-        uprv_free((UChar *)m_data_->iteratordata_.string);
-    }
-    m_data_->isWritable = TRUE;
-    /* Free offsetBuffer before initializing it. */
-    ucol_freeOffsetBuffer(&(m_data_->iteratordata_));
-    uprv_init_collIterate(m_data_->iteratordata_.coll, buffer, length, 
-        &m_data_->iteratordata_, &status);
-    m_data_->reset_   = TRUE;
+    source.getText(string_);
+    setText(string_, status);
 }
 
 int32_t CollationElementIterator::strengthOrder(int32_t order) const
 {
-    UCollationStrength s = ucol_getStrength(m_data_->iteratordata_.coll);
+    UColAttributeValue s = (UColAttributeValue)rbc_->settings->getStrength();
     // Mask off the unwanted differences.
     if (s == UCOL_PRIMARY) {
-        order &= RuleBasedCollator::PRIMARYDIFFERENCEONLY;
+        order &= 0xffff0000;
     }
     else if (s == UCOL_SECONDARY) {
-        order &= RuleBasedCollator::SECONDARYDIFFERENCEONLY;
+        order &= 0xffffff00;
     }
 
     return order;
@@ -273,47 +325,11 @@ int32_t CollationElementIterator::strengthOrder(int32_t order) const
 * over the source text using the specified collator
 */
 CollationElementIterator::CollationElementIterator(
-                                               const UnicodeString& sourceText,
-                                               const RuleBasedCollator* order,
-                                               UErrorCode& status)
-                                               : isDataOwned_(TRUE)
-{
-    if (U_FAILURE(status)) {
-        return;
-    }
-
-    int32_t length = sourceText.length();
-    UChar *string = NULL;
-
-    if (length > 0) {
-        string = (UChar *)uprv_malloc(U_SIZEOF_UCHAR * length);
-        /* test for NULL */
-        if (string == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        /* 
-        Using this constructor will prevent buffer from being removed when
-        string gets removed
-        */
-        u_memcpy(string, sourceText.getBuffer(), length);
-    }
-    else {
-        string = (UChar *)uprv_malloc(U_SIZEOF_UCHAR);
-        /* test for NULL */
-        if (string == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        *string = 0;
-    }
-    m_data_ = ucol_openElements(order->ucollator, string, length, &status);
-
-    /* Test for buffer overflows */
-    if (U_FAILURE(status)) {
-        return;
-    }
-    m_data_->isWritable = TRUE;
+                                               const UnicodeString &source,
+                                               const RuleBasedCollator *coll,
+                                               UErrorCode &status)
+        : iter_(NULL), rbc_(coll), otherHalf_(0), dir_(0), offsets_(NULL) {
+    setText(source, status);
 }
 
 /** 
@@ -321,168 +337,134 @@ CollationElementIterator::CollationElementIterator(
 * the source text using the specified collator
 */
 CollationElementIterator::CollationElementIterator(
-                                           const CharacterIterator& sourceText,
-                                           const RuleBasedCollator* order,
-                                           UErrorCode& status)
-                                           : isDataOwned_(TRUE)
-{
-    if (U_FAILURE(status))
-        return;
-
-    // **** should I just drop this test? ****
-    /*
-    if ( sourceText.endIndex() != 0 )
-    {
-        // A CollationElementIterator is really a two-layered beast.
-        // Internally it uses a Normalizer to munge the source text into a form 
-        // where all "composed" Unicode characters (such as \u00FC) are split into a 
-        // normal character and a combining accent character.  
-        // Afterward, CollationElementIterator does its own processing to handle
-        // expanding and contracting collation sequences, ignorables, and so on.
-        
-        Normalizer::EMode decomp = order->getStrength() == Collator::IDENTICAL
-                                ? Normalizer::NO_OP : order->getDecomposition();
-          
-        text = new Normalizer(sourceText, decomp);
-        if (text == NULL)
-        status = U_MEMORY_ALLOCATION_ERROR;    
-    }
-    */
-    int32_t length = sourceText.getLength();
-    UChar *buffer;
-    if (length > 0) {
-        buffer = (UChar *)uprv_malloc(U_SIZEOF_UCHAR * length);
-        /* test for NULL */
-        if (buffer == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        /* 
-        Using this constructor will prevent buffer from being removed when
-        string gets removed
-        */
-        UnicodeString string(buffer, length, length);
-        ((CharacterIterator &)sourceText).getText(string);
-        const UChar *temp = string.getBuffer();
-        u_memcpy(buffer, temp, length);
-    }
-    else {
-        buffer = (UChar *)uprv_malloc(U_SIZEOF_UCHAR);
-        /* test for NULL */
-        if (buffer == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        *buffer = 0;
-    }
-    m_data_ = ucol_openElements(order->ucollator, buffer, length, &status);
-
-    /* Test for buffer overflows */
-    if (U_FAILURE(status)) {
-        return;
-    }
-    m_data_->isWritable = TRUE;
+                                           const CharacterIterator &source,
+                                           const RuleBasedCollator *coll,
+                                           UErrorCode &status)
+        : iter_(NULL), rbc_(coll), otherHalf_(0), dir_(0), offsets_(NULL) {
+    // We only call source.getText() which should be const anyway.
+    setText(const_cast<CharacterIterator &>(source), status);
 }
 
-/* CollationElementIterator protected methods ----------------------------- */
+/* CollationElementIterator private methods -------------------------------- */
 
 const CollationElementIterator& CollationElementIterator::operator=(
                                          const CollationElementIterator& other)
 {
-    if (this != &other)
-    {
-        UCollationElements *ucolelem      = this->m_data_;
-        UCollationElements *otherucolelem = other.m_data_;
-        collIterate        *coliter       = &(ucolelem->iteratordata_);
-        collIterate        *othercoliter  = &(otherucolelem->iteratordata_);
-        int                length         = 0;
-
-        // checking only UCOL_ITER_HASLEN is not enough here as we may be in 
-        // the normalization buffer
-        length = (int)(othercoliter->endp - othercoliter->string);
-
-        ucolelem->reset_         = otherucolelem->reset_;
-        ucolelem->isWritable     = TRUE;
-
-        /* create a duplicate of string */
-        if (length > 0) {
-            coliter->string = (UChar *)uprv_malloc(length * U_SIZEOF_UCHAR);
-            if(coliter->string != NULL) {
-                uprv_memcpy((UChar *)coliter->string, othercoliter->string,
-                    length * U_SIZEOF_UCHAR);
-            } else { // Error: couldn't allocate memory. No copying should be done
-                length = 0;
-            }
+    if (this == &other) {
+        return *this;
+    }
+
+    CollationIterator *newIter;
+    const FCDUTF16CollationIterator *otherFCDIter =
+            dynamic_cast<const FCDUTF16CollationIterator *>(other.iter_);
+    if(otherFCDIter != NULL) {
+        newIter = new FCDUTF16CollationIterator(*otherFCDIter, string_.getBuffer());
+    } else {
+        const UTF16CollationIterator *otherIter =
+                dynamic_cast<const UTF16CollationIterator *>(other.iter_);
+        if(otherIter != NULL) {
+            newIter = new UTF16CollationIterator(*otherIter, string_.getBuffer());
+        } else {
+            newIter = NULL;
         }
-        else {
-            coliter->string = NULL;
+    }
+    if(newIter != NULL) {
+        delete iter_;
+        iter_ = newIter;
+        rbc_ = other.rbc_;
+        otherHalf_ = other.otherHalf_;
+        dir_ = other.dir_;
+
+        string_ = other.string_;
+    }
+    if(other.dir_ < 0 && other.offsets_ != NULL && !other.offsets_->isEmpty()) {
+        UErrorCode errorCode = U_ZERO_ERROR;
+        if(offsets_ == NULL) {
+            offsets_ = new UVector32(other.offsets_->size(), errorCode);
         }
-
-        /* start and end of string */
-        coliter->endp = coliter->string == NULL ? NULL : coliter->string + length;
-
-        /* handle writable buffer here */
-
-        if (othercoliter->flags & UCOL_ITER_INNORMBUF) {
-            coliter->writableBuffer = othercoliter->writableBuffer;
-            coliter->writableBuffer.getTerminatedBuffer();
+        if(offsets_ != NULL) {
+            offsets_->assign(*other.offsets_, errorCode);
         }
+    }
+    return *this;
+}
+
+namespace {
 
-        /* current position */
-        if (othercoliter->pos >= othercoliter->string && 
-            othercoliter->pos <= othercoliter->endp)
-        {
-            U_ASSERT(coliter->string != NULL);
-            coliter->pos = coliter->string + 
-                (othercoliter->pos - othercoliter->string);
+class MaxExpSink : public ContractionsAndExpansions::CESink {
+public:
+    MaxExpSink(UHashtable *h, UErrorCode &ec) : maxExpansions(h), errorCode(ec) {}
+    virtual ~MaxExpSink();
+    virtual void handleCE(int64_t /*ce*/) {}
+    virtual void handleExpansion(const int64_t ces[], int32_t length) {
+        if (length <= 1) {
+            // We do not need to add single CEs into the map.
+            return;
         }
-        else {
-            coliter->pos = coliter->writableBuffer.getTerminatedBuffer() + 
-                (othercoliter->pos - othercoliter->writableBuffer.getBuffer());
+        int32_t count = 0;  // number of CE "halves"
+        for (int32_t i = 0; i < length; ++i) {
+            count += ceNeedsTwoParts(ces[i]) ? 2 : 1;
         }
-
-        /* CE buffer */
-        int32_t CEsize;
-        if (coliter->extendCEs) {
-            uprv_memcpy(coliter->CEs, othercoliter->CEs, sizeof(uint32_t) * UCOL_EXPAND_CE_BUFFER_SIZE);
-            CEsize = sizeof(othercoliter->extendCEs);
-            if (CEsize > 0) {
-                othercoliter->extendCEs = (uint32_t *)uprv_malloc(CEsize);
-                uprv_memcpy(coliter->extendCEs, othercoliter->extendCEs, CEsize);
-            }
-            coliter->toReturn = coliter->extendCEs + 
-                (othercoliter->toReturn - othercoliter->extendCEs);
-            coliter->CEpos    = coliter->extendCEs + CEsize;
+        // last "half" of the last CE
+        int64_t ce = ces[length - 1];
+        uint32_t p = (uint32_t)(ce >> 32);
+        uint32_t lower32 = (uint32_t)ce;
+        uint32_t lastHalf = getSecondHalf(p, lower32);
+        if (lastHalf == 0) {
+            lastHalf = getFirstHalf(p, lower32);
+            U_ASSERT(lastHalf != 0);
         } else {
-            CEsize = (int32_t)(othercoliter->CEpos - othercoliter->CEs);
-            if (CEsize > 0) {
-                uprv_memcpy(coliter->CEs, othercoliter->CEs, CEsize);
-            }
-            coliter->toReturn = coliter->CEs + 
-                (othercoliter->toReturn - othercoliter->CEs);
-            coliter->CEpos    = coliter->CEs + CEsize;
+            lastHalf |= 0xc0;  // old-style continuation CE
         }
-
-        if (othercoliter->fcdPosition != NULL) {
-            U_ASSERT(coliter->string != NULL);
-            coliter->fcdPosition = coliter->string + 
-                (othercoliter->fcdPosition 
-                - othercoliter->string);
-        }
-        else {
-            coliter->fcdPosition = NULL;
+        if (count > uhash_igeti(maxExpansions, (int32_t)lastHalf)) {
+            uhash_iputi(maxExpansions, (int32_t)lastHalf, count, &errorCode);
         }
-        coliter->flags       = othercoliter->flags/*| UCOL_ITER_HASLEN*/;
-        coliter->origFlags   = othercoliter->origFlags;
-        coliter->coll = othercoliter->coll;
-        this->isDataOwned_ = TRUE;
     }
 
-    return *this;
+private:
+    UHashtable *maxExpansions;
+    UErrorCode &errorCode;
+};
+
+MaxExpSink::~MaxExpSink() {}
+
+}  // namespace
+
+UHashtable *
+CollationElementIterator::computeMaxExpansions(const CollationData *data, UErrorCode &errorCode) {
+    if (U_FAILURE(errorCode)) { return NULL; }
+    UHashtable *maxExpansions = uhash_open(uhash_hashLong, uhash_compareLong,
+                                           uhash_compareLong, &errorCode);
+    if (U_FAILURE(errorCode)) { return NULL; }
+    MaxExpSink sink(maxExpansions, errorCode);
+    ContractionsAndExpansions(NULL, NULL, &sink, TRUE).forData(data, errorCode);
+    if (U_FAILURE(errorCode)) {
+        uhash_close(maxExpansions);
+        return NULL;
+    }
+    return maxExpansions;
+}
+
+int32_t
+CollationElementIterator::getMaxExpansion(int32_t order) const {
+    return getMaxExpansion(rbc_->tailoring->maxExpansions, order);
+}
+
+int32_t
+CollationElementIterator::getMaxExpansion(const UHashtable *maxExpansions, int32_t order) {
+    if (order == 0) { return 1; }
+    int32_t max;
+    if(maxExpansions != NULL && (max = uhash_igeti(maxExpansions, order)) != 0) {
+        return max;
+    }
+    if ((order & 0xc0) == 0xc0) {
+        // old-style continuation CE
+        return 2;
+    } else {
+        return 1;
+    }
 }
 
 U_NAMESPACE_END
 
 #endif /* #if !UCONFIG_NO_COLLATION */
-
-/* eof */
index d4224ba39e5a5ed94ae5135e9b2805fbb51918e3..54a1301a42c2fc5a1547773241b7497d001abec4 100644 (file)
@@ -1,6 +1,6 @@
 /*
  ******************************************************************************
- * Copyright (C) 1996-2013, International Business Machines Corporation and
+ * Copyright (C) 1996-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ******************************************************************************
  */
  *                          Normalizer::EMode
  * 11/23/9      srl         Inlining of some critical functions
  * 01/29/01     synwee      Modified into a C++ wrapper calling C APIs (ucol.h)
+ * 2012-2014    markus      Rewritten in C++ again.
  */
 
-#include "utypeinfo.h"  // for 'typeid' to work
+#include "utypeinfo.h"  // for 'typeid' to work 
 
 #include "unicode/utypes.h"
 
@@ -45,6 +46,9 @@
 
 #include "unicode/coll.h"
 #include "unicode/tblcoll.h"
+#include "collationdata.h"
+#include "collationroot.h"
+#include "collationtailoring.h"
 #include "ucol_imp.h"
 #include "cstring.h"
 #include "cmemory.h"
@@ -176,22 +180,7 @@ public:
         if (actualReturn == NULL) {
             actualReturn = &ar;
         }
-        Collator* result = (Collator*)ICULocaleService::getKey(key, actualReturn, status);
-        // Ugly Hack Alert! If the actualReturn length is zero, this
-        // means we got a default object, not a "real" service-created
-        // object.  We don't call setLocales() on a default object,
-        // because that will overwrite its correct built-in locale
-        // metadata (valid & actual) with our incorrect data (all we
-        // have is the requested locale). (TODO remove in 3.0) [aliu]
-        if (result && actualReturn->length() > 0) {
-            const LocaleKey& lkey = (const LocaleKey&)key;
-            Locale canonicalLocale("");
-            Locale currentLocale("");
-            
-            LocaleUtility::initLocaleFromName(*actualReturn, currentLocale);
-            result->setLocales(lkey.canonicalLocale(canonicalLocale), currentLocale, currentLocale);
-        }
-        return result;
+        return (Collator*)ICULocaleService::getKey(key, actualReturn, status);
     }
 
     virtual UBool isDefault() const {
@@ -225,40 +214,6 @@ hasService(void)
     return retVal;
 }
 
-// -------------------------------------
-
-UCollator* 
-Collator::createUCollator(const char *loc,
-                          UErrorCode *status)
-{
-    UCollator *result = 0;
-    if (status && U_SUCCESS(*status) && hasService()) {
-        Locale desiredLocale(loc);
-        Collator *col = (Collator*)gService->get(desiredLocale, *status);
-        RuleBasedCollator *rbc;
-        if (col && (rbc = dynamic_cast<RuleBasedCollator *>(col))) {
-            if (!rbc->dataIsOwned) {
-                result = ucol_safeClone(rbc->ucollator, NULL, NULL, status);
-            } else {
-                result = rbc->ucollator;
-                rbc->ucollator = NULL; // to prevent free on delete
-            }
-        } else {
-          // should go in a function- ucol_initDelegate(delegate)
-          result = (UCollator *)uprv_malloc(sizeof(UCollator));
-          if(result == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-          } else {
-            uprv_memset(result, 0, sizeof(UCollator));
-            result->delegate = col;
-            result->freeOnClose = TRUE; // do free on close.
-            col = NULL; // to prevent free on delete.
-          }
-        }
-        delete col;
-    }
-    return result;
-}
 #endif /* UCONFIG_NO_SERVICE */
 
 static void U_CALLCONV 
@@ -315,19 +270,7 @@ Collator* U_EXPORT2 Collator::createInstance(const Locale& desiredLocale,
 #if !UCONFIG_NO_SERVICE
     if (hasService()) {
         Locale actualLoc;
-        Collator *result =
-            (Collator*)gService->get(desiredLocale, &actualLoc, status);
-
-        // Ugly Hack Alert! If the returned locale is empty (not root,
-        // but empty -- getName() == "") then that means the service
-        // returned a default object, not a "real" service object.  In
-        // that case, the locale metadata (valid & actual) is setup
-        // correctly already, and we don't want to overwrite it. (TODO
-        // remove in 3.0) [aliu]
-        if (*actualLoc.getName() != 0) {
-            result->setLocales(desiredLocale, actualLoc, actualLoc);
-        }
-        return result;
+        return (Collator*)gService->get(desiredLocale, &actualLoc, status);
     }
 #endif
     return makeInstance(desiredLocale, status);
@@ -337,71 +280,21 @@ Collator* U_EXPORT2 Collator::createInstance(const Locale& desiredLocale,
 Collator* Collator::makeInstance(const Locale&  desiredLocale, 
                                          UErrorCode& status)
 {
-    // A bit of explanation is required here. Although in the current 
-    // implementation
-    // Collator::createInstance() is just turning around and calling 
-    // RuleBasedCollator(Locale&), this will not necessarily always be the 
-    // case. For example, suppose we modify this code to handle a 
-    // non-table-based Collator, such as that for Thai. In this case, 
-    // createInstance() will have to be modified to somehow determine this fact
-    // (perhaps a field in the resource bundle). Then it can construct the 
-    // non-table-based Collator in some other way, when it sees that it needs 
-    // to.
-    // The specific caution is this: RuleBasedCollator(Locale&) will ALWAYS 
-    // return a valid collation object, if the system is functioning properly.  
-    // The reason is that it will fall back, use the default locale, and even 
-    // use the built-in default collation rules. THEREFORE, createInstance() 
-    // should in general ONLY CALL RuleBasedCollator(Locale&) IF IT KNOWS IN 
-    // ADVANCE that the given locale's collation is properly implemented as a 
-    // RuleBasedCollator.
-    // Currently, we don't do this...we always return a RuleBasedCollator, 
-    // whether it is strictly correct to do so or not, without checking, because 
-    // we currently have no way of checking.
-    
-    RuleBasedCollator* collation = new RuleBasedCollator(desiredLocale, 
-        status);
-    /* test for NULL */
-    if (collation == 0) {
+    Locale validLocale("");
+    const CollationTailoring *t =
+        CollationLoader::loadTailoring(desiredLocale, validLocale, status);
+    if (U_SUCCESS(status)) {
+        Collator *result = new RuleBasedCollator(t, validLocale);
+        if (result != NULL) {
+            return result;
+        }
         status = U_MEMORY_ALLOCATION_ERROR;
-        return 0;
     }
-    if (U_FAILURE(status))
-    {
-        delete collation;
-        collation = 0;
-    }
-    return collation;
-}
-
-#ifdef U_USE_COLLATION_OBSOLETE_2_6
-// !!! dlf the following is obsolete, ignore registration for this
-
-Collator *
-Collator::createInstance(const Locale &loc,
-                         UVersionInfo version,
-                         UErrorCode &status)
-{
-    Collator *collator;
-    UVersionInfo info;
-    
-    collator=new RuleBasedCollator(loc, status);
-    /* test for NULL */
-    if (collator == 0) {
-        status = U_MEMORY_ALLOCATION_ERROR;
-        return 0;
+    if (t != NULL) {
+        t->deleteIfZeroRefCount();
     }
-    
-    if(U_SUCCESS(status)) {
-        collator->getVersion(info);
-        if(0!=uprv_memcmp(version, info, sizeof(UVersionInfo))) {
-            delete collator;
-            status=U_MISSING_RESOURCE_ERROR;
-            return 0;
-        }
-    }
-    return collator;
+    return NULL;
 }
-#endif
 
 Collator *
 Collator::safeClone() const {
@@ -599,6 +492,10 @@ URegistryKey U_EXPORT2
 Collator::registerInstance(Collator* toAdopt, const Locale& locale, UErrorCode& status) 
 {
     if (U_SUCCESS(status)) {
+        // Set the collator locales while registering so that createInstance()
+        // need not guess whether the collator's locales are already set properly
+        // (as they are by the data loader).
+        toAdopt->setLocales(locale, locale, locale);
         return getService()->registerInstance(toAdopt, locale, status);
     }
     return NULL;
@@ -853,6 +750,19 @@ Collator::setStrength(ECollationStrength newStrength) {
     setAttribute(UCOL_STRENGTH, (UColAttributeValue)newStrength, intStatus);
 }
 
+Collator &
+Collator::setMaxVariable(UColReorderCode /*group*/, UErrorCode &errorCode) {
+    if (U_SUCCESS(errorCode)) {
+        errorCode = U_UNSUPPORTED_ERROR;
+    }
+    return *this;
+}
+
+UColReorderCode
+Collator::getMaxVariable() const {
+    return UCOL_REORDER_CODE_PUNCTUATION;
+}
+
 int32_t
 Collator::getReorderCodes(int32_t* /* dest*/,
                           int32_t /* destCapacity*/,
@@ -874,16 +784,18 @@ Collator::setReorderCodes(const int32_t* /* reorderCodes */,
     }
 }
 
-int32_t U_EXPORT2
-Collator::getEquivalentReorderCodes(int32_t /* reorderCode */,
-                                    int32_t* /* dest */,
-                                    int32_t /* destCapacity */,
-                                    UErrorCode& status)
-{
-    if (U_SUCCESS(status)) {
-        status = U_UNSUPPORTED_ERROR;
+int32_t
+Collator::getEquivalentReorderCodes(int32_t reorderCode,
+                                    int32_t *dest, int32_t capacity,
+                                    UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    if(capacity < 0 || (dest == NULL && capacity > 0)) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return 0;
     }
-    return 0;
+    const CollationData *baseData = CollationRoot::getData(errorCode);
+    if(U_FAILURE(errorCode)) { return 0; }
+    return baseData->getEquivalentScripts(reorderCode, dest, capacity, errorCode);
 }
 
 int32_t
@@ -897,6 +809,30 @@ Collator::internalGetShortDefinitionString(const char * /*locale*/,
   return 0;
 }
 
+UCollationResult
+Collator::internalCompareUTF8(const char *left, int32_t leftLength,
+                              const char *right, int32_t rightLength,
+                              UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return UCOL_EQUAL; }
+    if((left == NULL && leftLength != 0) || (right == NULL && rightLength != 0)) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return UCOL_EQUAL;
+    }
+    return compareUTF8(
+            StringPiece(left, (leftLength < 0) ? uprv_strlen(left) : leftLength),
+            StringPiece(right, (rightLength < 0) ? uprv_strlen(right) : rightLength),
+            errorCode);
+}
+
+int32_t
+Collator::internalNextSortKeyPart(UCharIterator * /*iter*/, uint32_t /*state*/[2],
+                                  uint8_t * /*dest*/, int32_t /*count*/, UErrorCode &errorCode) const {
+    if (U_SUCCESS(errorCode)) {
+        errorCode = U_UNSUPPORTED_ERROR;
+    }
+    return 0;
+}
+
 // UCollator private data members ----------------------------------------
 
 /* This is useless information */
diff --git a/icu4c/source/i18n/collation.cpp b/icu4c/source/i18n/collation.cpp
new file mode 100644 (file)
index 0000000..e5d07b8
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+*******************************************************************************
+* Copyright (C) 2010-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collation.cpp
+*
+* created on: 2010oct27
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "collation.h"
+#include "uassert.h"
+
+U_NAMESPACE_BEGIN
+
+// Some compilers don't care if constants are defined in the .cpp file.
+// MS Visual C++ does not like it, but gcc requires it. clang does not care.
+#ifndef _MSC_VER
+const uint32_t Collation::ONLY_TERTIARY_MASK;
+const uint32_t Collation::CASE_AND_TERTIARY_MASK;
+#endif
+
+uint32_t
+Collation::incTwoBytePrimaryByOffset(uint32_t basePrimary, UBool isCompressible, int32_t offset) {
+    // Extract the second byte, minus the minimum byte value,
+    // plus the offset, modulo the number of usable byte values, plus the minimum.
+    // Reserve the PRIMARY_COMPRESSION_LOW_BYTE and high byte if necessary.
+    uint32_t primary;
+    if(isCompressible) {
+        offset += ((int32_t)(basePrimary >> 16) & 0xff) - 4;
+        primary = (uint32_t)((offset % 251) + 4) << 16;
+        offset /= 251;
+    } else {
+        offset += ((int32_t)(basePrimary >> 16) & 0xff) - 2;
+        primary = (uint32_t)((offset % 254) + 2) << 16;
+        offset /= 254;
+    }
+    // First byte, assume no further overflow.
+    return primary | ((basePrimary & 0xff000000) + (uint32_t)(offset << 24));
+}
+
+uint32_t
+Collation::incThreeBytePrimaryByOffset(uint32_t basePrimary, UBool isCompressible, int32_t offset) {
+    // Extract the third byte, minus the minimum byte value,
+    // plus the offset, modulo the number of usable byte values, plus the minimum.
+    offset += ((int32_t)(basePrimary >> 8) & 0xff) - 2;
+    uint32_t primary = (uint32_t)((offset % 254) + 2) << 8;
+    offset /= 254;
+    // Same with the second byte,
+    // but reserve the PRIMARY_COMPRESSION_LOW_BYTE and high byte if necessary.
+    if(isCompressible) {
+        offset += ((int32_t)(basePrimary >> 16) & 0xff) - 4;
+        primary |= (uint32_t)((offset % 251) + 4) << 16;
+        offset /= 251;
+    } else {
+        offset += ((int32_t)(basePrimary >> 16) & 0xff) - 2;
+        primary |= (uint32_t)((offset % 254) + 2) << 16;
+        offset /= 254;
+    }
+    // First byte, assume no further overflow.
+    return primary | ((basePrimary & 0xff000000) + (uint32_t)(offset << 24));
+}
+
+uint32_t
+Collation::decTwoBytePrimaryByOneStep(uint32_t basePrimary, UBool isCompressible, int32_t step) {
+    // Extract the second byte, minus the minimum byte value,
+    // minus the step, modulo the number of usable byte values, plus the minimum.
+    // Reserve the PRIMARY_COMPRESSION_LOW_BYTE and high byte if necessary.
+    // Assume no further underflow for the first byte.
+    U_ASSERT(0 < step && step <= 0x7f);
+    int32_t byte2 = ((int32_t)(basePrimary >> 16) & 0xff) - step;
+    if(isCompressible) {
+        if(byte2 < 4) {
+            byte2 += 251;
+            basePrimary -= 0x1000000;
+        }
+    } else {
+        if(byte2 < 2) {
+            byte2 += 254;
+            basePrimary -= 0x1000000;
+        }
+    }
+    return (basePrimary & 0xff000000) | ((uint32_t)byte2 << 16);
+}
+
+uint32_t
+Collation::decThreeBytePrimaryByOneStep(uint32_t basePrimary, UBool isCompressible, int32_t step) {
+    // Extract the third byte, minus the minimum byte value,
+    // minus the step, modulo the number of usable byte values, plus the minimum.
+    U_ASSERT(0 < step && step <= 0x7f);
+    int32_t byte3 = ((int32_t)(basePrimary >> 8) & 0xff) - step;
+    if(byte3 >= 2) {
+        return (basePrimary & 0xffff0000) | ((uint32_t)byte3 << 8);
+    }
+    byte3 += 254;
+    // Same with the second byte,
+    // but reserve the PRIMARY_COMPRESSION_LOW_BYTE and high byte if necessary.
+    int32_t byte2 = ((int32_t)(basePrimary >> 16) & 0xff) - 1;
+    if(isCompressible) {
+        if(byte2 < 4) {
+            byte2 = 0xfe;
+            basePrimary -= 0x1000000;
+        }
+    } else {
+        if(byte2 < 2) {
+            byte2 = 0xff;
+            basePrimary -= 0x1000000;
+        }
+    }
+    // First byte, assume no further underflow.
+    return (basePrimary & 0xff000000) | ((uint32_t)byte2 << 16) | ((uint32_t)byte3 << 8);
+}
+
+uint32_t
+Collation::getThreeBytePrimaryForOffsetData(UChar32 c, int64_t dataCE) {
+    uint32_t p = (uint32_t)(dataCE >> 32);  // three-byte primary pppppp00
+    int32_t lower32 = (int32_t)dataCE;  // base code point b & step s: bbbbbbss (bit 7: isCompressible)
+    int32_t offset = (c - (lower32 >> 8)) * (lower32 & 0x7f);  // delta * increment
+    UBool isCompressible = (lower32 & 0x80) != 0;
+    return Collation::incThreeBytePrimaryByOffset(p, isCompressible, offset);
+}
+
+uint32_t
+Collation::unassignedPrimaryFromCodePoint(UChar32 c) {
+    // Create a gap before U+0000. Use c=-1 for [first unassigned].
+    ++c;
+    // Fourth byte: 18 values, every 14th byte value (gap of 13).
+    uint32_t primary = 2 + (c % 18) * 14;
+    c /= 18;
+    // Third byte: 254 values.
+    primary |= (2 + (c % 254)) << 8;
+    c /= 254;
+    // Second byte: 251 values 04..FE excluding the primary compression bytes.
+    primary |= (4 + (c % 251)) << 16;
+    // One lead byte covers all code points (c < 0x1182B4 = 1*251*254*18).
+    return primary | (UNASSIGNED_IMPLICIT_BYTE << 24);
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collation.h b/icu4c/source/i18n/collation.h
new file mode 100644 (file)
index 0000000..3d2ea8c
--- /dev/null
@@ -0,0 +1,500 @@
+/*
+*******************************************************************************
+* Copyright (C) 2010-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collation.h
+*
+* created on: 2010oct27
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATION_H__
+#define __COLLATION_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+U_NAMESPACE_BEGIN
+
+/**
+ * Collation v2 basic definitions and static helper functions.
+ *
+ * Data structures except for expansion tables store 32-bit CEs which are
+ * either specials (see tags below) or are compact forms of 64-bit CEs.
+ */
+class U_I18N_API Collation {
+public:
+    // Special sort key bytes for all levels.
+    static const uint8_t TERMINATOR_BYTE = 0;
+    static const uint8_t LEVEL_SEPARATOR_BYTE = 1;
+    /**
+     * Merge-sort-key separator.
+     * Must not be used as the lead byte of any CE weight,
+     * nor as primary compression low terminator.
+     * Otherwise usable.
+     */
+    static const uint8_t MERGE_SEPARATOR_BYTE = 2;
+    static const uint32_t MERGE_SEPARATOR_PRIMARY = 0x02000000;  // U+FFFE
+    static const uint32_t MERGE_SEPARATOR_WEIGHT16 = 0x0200;  // U+FFFE
+    static const uint32_t MERGE_SEPARATOR_LOWER32 = 0x02000200;  // U+FFFE
+    static const uint32_t MERGE_SEPARATOR_CE32 = 0x02000202;  // U+FFFE
+
+    /**
+     * Primary compression low terminator, must be greater than MERGE_SEPARATOR_BYTE.
+     * Reserved value in primary second byte if the lead byte is compressible.
+     * Otherwise usable in all CE weight bytes.
+     */
+    static const uint8_t PRIMARY_COMPRESSION_LOW_BYTE = 3;
+    /**
+     * Primary compression high terminator.
+     * Reserved value in primary second byte if the lead byte is compressible.
+     * Otherwise usable in all CE weight bytes.
+     */
+    static const uint8_t PRIMARY_COMPRESSION_HIGH_BYTE = 0xff;
+
+    /** Default secondary/tertiary weight lead byte. */
+    static const uint8_t COMMON_BYTE = 5;
+    static const uint32_t COMMON_WEIGHT16 = 0x0500;
+    /** Middle 16 bits of a CE with a common secondary weight. */
+    static const uint32_t COMMON_SECONDARY_CE = 0x05000000;
+    /** Lower 16 bits of a CE with a common tertiary weight. */
+    static const uint32_t COMMON_TERTIARY_CE = 0x0500;
+    /** Lower 32 bits of a CE with common secondary and tertiary weights. */
+    static const uint32_t COMMON_SEC_AND_TER_CE = 0x05000500;
+
+    static const uint32_t SECONDARY_MASK = 0xffff0000;
+    static const uint32_t CASE_MASK = 0xc000;
+    static const uint32_t SECONDARY_AND_CASE_MASK = SECONDARY_MASK | CASE_MASK;
+    /** Only the 2*6 bits for the pure tertiary weight. */
+    static const uint32_t ONLY_TERTIARY_MASK = 0x3f3f;
+    /** Only the secondary & tertiary bits; no case, no quaternary. */
+    static const uint32_t ONLY_SEC_TER_MASK = SECONDARY_MASK | ONLY_TERTIARY_MASK;
+    /** Case bits and tertiary bits. */
+    static const uint32_t CASE_AND_TERTIARY_MASK = CASE_MASK | ONLY_TERTIARY_MASK;
+    static const uint32_t QUATERNARY_MASK = 0xc0;
+    /** Case bits and quaternary bits. */
+    static const uint32_t CASE_AND_QUATERNARY_MASK = CASE_MASK | QUATERNARY_MASK;
+
+    static const uint8_t UNASSIGNED_IMPLICIT_BYTE = 0xfe;  // compressible
+    /**
+     * First unassigned: AlphabeticIndex overflow boundary.
+     * We want a 3-byte primary so that it fits into the root elements table.
+     *
+     * This 3-byte primary will not collide with
+     * any unassigned-implicit 4-byte primaries because
+     * the first few hundred Unicode code points all have real mappings.
+     */
+    static const uint32_t FIRST_UNASSIGNED_PRIMARY = 0xfe040200;
+
+    static const uint8_t TRAIL_WEIGHT_BYTE = 0xff;  // not compressible
+    static const uint32_t FIRST_TRAILING_PRIMARY = 0xff020200;  // [first trailing]
+    static const uint32_t MAX_PRIMARY = 0xffff0000;  // U+FFFF
+    static const uint32_t MAX_REGULAR_CE32 = 0xffff0505;  // U+FFFF
+
+    // CE32 value for U+FFFD as well as illegal UTF-8 byte sequences (which behave like U+FFFD).
+    // We use the third-highest primary weight for U+FFFD (as in UCA 6.3+).
+    static const uint32_t FFFD_PRIMARY = MAX_PRIMARY - 0x20000;
+    static const uint32_t FFFD_CE32 = MAX_REGULAR_CE32 - 0x20000;
+
+    /**
+     * A CE32 is special if its low byte is this or greater.
+     * Impossible case bits 11 mark special CE32s.
+     * This value itself is used to indicate a fallback to the base collator.
+     */
+    static const uint8_t SPECIAL_CE32_LOW_BYTE = 0xc0;
+    static const uint32_t FALLBACK_CE32 = SPECIAL_CE32_LOW_BYTE;
+    /**
+     * Low byte of a long-primary special CE32.
+     */
+    static const uint8_t LONG_PRIMARY_CE32_LOW_BYTE = 0xc1;  // SPECIAL_CE32_LOW_BYTE | LONG_PRIMARY_TAG
+
+    static const uint32_t UNASSIGNED_CE32 = 0xffffffff;  // Compute an unassigned-implicit CE.
+
+    static const uint32_t NO_CE32 = 1;
+
+    /** No CE: End of input. Only used in runtime code, not stored in data. */
+    static const uint32_t NO_CE_PRIMARY = 1;  // not a left-adjusted weight
+    static const uint32_t NO_CE_WEIGHT16 = 0x0100;  // weight of LEVEL_SEPARATOR_BYTE
+    static const int64_t NO_CE = INT64_C(0x101000100);  // NO_CE_PRIMARY, NO_CE_WEIGHT16, NO_CE_WEIGHT16
+
+    /** Sort key levels. */
+    enum Level {
+        /** Unspecified level. */
+        NO_LEVEL,
+        PRIMARY_LEVEL,
+        SECONDARY_LEVEL,
+        CASE_LEVEL,
+        TERTIARY_LEVEL,
+        QUATERNARY_LEVEL,
+        IDENTICAL_LEVEL,
+        /** Beyond sort key bytes. */
+        ZERO_LEVEL
+    };
+
+    /**
+     * Sort key level flags: xx_FLAG = 1 << xx_LEVEL.
+     * In Java, use enum Level with flag() getters, or use EnumSet rather than hand-made bit sets.
+     */
+    static const uint32_t NO_LEVEL_FLAG = 1;
+    static const uint32_t PRIMARY_LEVEL_FLAG = 2;
+    static const uint32_t SECONDARY_LEVEL_FLAG = 4;
+    static const uint32_t CASE_LEVEL_FLAG = 8;
+    static const uint32_t TERTIARY_LEVEL_FLAG = 0x10;
+    static const uint32_t QUATERNARY_LEVEL_FLAG = 0x20;
+    static const uint32_t IDENTICAL_LEVEL_FLAG = 0x40;
+    static const uint32_t ZERO_LEVEL_FLAG = 0x80;
+
+    /**
+     * Special-CE32 tags, from bits 3..0 of a special 32-bit CE.
+     * Bits 31..8 are available for tag-specific data.
+     * Bits  5..4: Reserved. May be used in the future to indicate lccc!=0 and tccc!=0.
+     */
+    enum {
+        /**
+         * Fall back to the base collator.
+         * This is the tag value in SPECIAL_CE32_LOW_BYTE and FALLBACK_CE32.
+         * Bits 31..8: Unused, 0.
+         */
+        FALLBACK_TAG = 0,
+        /**
+         * Long-primary CE with COMMON_SEC_AND_TER_CE.
+         * Bits 31..8: Three-byte primary.
+         */
+        LONG_PRIMARY_TAG = 1,
+        /**
+         * Long-secondary CE with zero primary.
+         * Bits 31..16: Secondary weight.
+         * Bits 15.. 8: Tertiary weight.
+         */
+        LONG_SECONDARY_TAG = 2,
+        /**
+         * Unused.
+         * May be used in the future for single-byte secondary CEs (SHORT_SECONDARY_TAG),
+         * storing the secondary in bits 31..24, the ccc in bits 23..16,
+         * and the tertiary in bits 15..8.
+         */
+        RESERVED_TAG_3 = 3,
+        /**
+         * Latin mini expansions of two simple CEs [pp, 05, tt] [00, ss, 05].
+         * Bits 31..24: Single-byte primary weight pp of the first CE.
+         * Bits 23..16: Tertiary weight tt of the first CE.
+         * Bits 15.. 8: Secondary weight ss of the second CE.
+         */
+        LATIN_EXPANSION_TAG = 4,
+        /**
+         * Points to one or more simple/long-primary/long-secondary 32-bit CE32s.
+         * Bits 31..13: Index into uint32_t table.
+         * Bits 12.. 8: Length=1..31.
+         */
+        EXPANSION32_TAG = 5,
+        /**
+         * Points to one or more 64-bit CEs.
+         * Bits 31..13: Index into CE table.
+         * Bits 12.. 8: Length=1..31.
+         */
+        EXPANSION_TAG = 6,
+        /**
+         * Builder data, used only in the CollationDataBuilder, not in runtime data.
+         *
+         * If bit 8 is 0: Builder context, points to a list of context-sensitive mappings.
+         * Bits 31..13: Index to the builder's list of ConditionalCE32 for this character.
+         * Bits 12.. 9: Unused, 0.
+         *
+         * If bit 8 is 1 (IS_BUILDER_JAMO_CE32): Builder-only jamoCE32 value.
+         * The builder fetches the Jamo CE32 from the trie.
+         * Bits 31..13: Jamo code point.
+         * Bits 12.. 9: Unused, 0.
+         */
+        BUILDER_DATA_TAG = 7,
+        /**
+         * Points to prefix trie.
+         * Bits 31..13: Index into prefix/contraction data.
+         * Bits 12.. 8: Unused, 0.
+         */
+        PREFIX_TAG = 8,
+        /**
+         * Points to contraction data.
+         * Bits 31..13: Index into prefix/contraction data.
+         * Bits 12..11: Unused, 0.
+         * Bit      10: CONTRACT_TRAILING_CCC flag.
+         * Bit       9: CONTRACT_NEXT_CCC flag.
+         * Bit       8: CONTRACT_SINGLE_CP_NO_MATCH flag.
+         */
+        CONTRACTION_TAG = 9,
+        /**
+         * Decimal digit.
+         * Bits 31..13: Index into uint32_t table for non-numeric-collation CE32.
+         * Bit      12: Unused, 0.
+         * Bits 11.. 8: Digit value 0..9.
+         */
+        DIGIT_TAG = 10,
+        /**
+         * Tag for U+0000, for moving the NUL-termination handling
+         * from the regular fastpath into specials-handling code.
+         * Bits 31..8: Unused, 0.
+         */
+        U0000_TAG = 11,
+        /**
+         * Tag for a Hangul syllable.
+         * Bits 31..9: Unused, 0.
+         * Bit      8: HANGUL_NO_SPECIAL_JAMO flag.
+         */
+        HANGUL_TAG = 12,
+        /**
+         * Tag for a lead surrogate code unit.
+         * Optional optimization for UTF-16 string processing.
+         * Bits 31..10: Unused, 0.
+         *       9.. 8: =0: All associated supplementary code points are unassigned-implict.
+         *              =1: All associated supplementary code points fall back to the base data.
+         *              else: (Normally 2) Look up the data for the supplementary code point.
+         */
+        LEAD_SURROGATE_TAG = 13,
+        /**
+         * Tag for CEs with primary weights in code point order.
+         * Bits 31..13: Index into CE table, for one data "CE".
+         * Bits 12.. 8: Unused, 0.
+         *
+         * This data "CE" has the following bit fields:
+         * Bits 63..32: Three-byte primary pppppp00.
+         *      31.. 8: Start/base code point of the in-order range.
+         *           7: Flag isCompressible primary.
+         *       6.. 0: Per-code point primary-weight increment.
+         */
+        OFFSET_TAG = 14,
+        /**
+         * Implicit CE tag. Compute an unassigned-implicit CE.
+         * All bits are set (UNASSIGNED_CE32=0xffffffff).
+         */
+        IMPLICIT_TAG = 15
+    };
+
+    static UBool isAssignedCE32(uint32_t ce32) {
+        return ce32 != FALLBACK_CE32 && ce32 != UNASSIGNED_CE32;
+    }
+
+    /**
+     * We limit the number of CEs in an expansion
+     * so that we can use a small number of length bits in the data structure,
+     * and so that an implementation can copy CEs at runtime without growing a destination buffer.
+     */
+    static const int32_t MAX_EXPANSION_LENGTH = 31;
+    static const int32_t MAX_INDEX = 0x7ffff;
+
+    /**
+     * Set if there is no match for the single (no-suffix) character itself.
+     * This is only possible if there is a prefix.
+     * In this case, discontiguous contraction matching cannot add combining marks
+     * starting from an empty suffix.
+     * The default CE32 is used anyway if there is no suffix match.
+     */
+    static const uint32_t CONTRACT_SINGLE_CP_NO_MATCH = 0x100;
+    /** Set if the first character of every contraction suffix has lccc!=0. */
+    static const uint32_t CONTRACT_NEXT_CCC = 0x200;
+    /** Set if any contraction suffix ends with lccc!=0. */
+    static const uint32_t CONTRACT_TRAILING_CCC = 0x400;
+
+    /** For HANGUL_TAG: None of its Jamo CE32s isSpecialCE32(). */
+    static const uint32_t HANGUL_NO_SPECIAL_JAMO = 0x100;
+
+    static const uint32_t LEAD_ALL_UNASSIGNED = 0;
+    static const uint32_t LEAD_ALL_FALLBACK = 0x100;
+    static const uint32_t LEAD_MIXED = 0x200;
+    static const uint32_t LEAD_TYPE_MASK = 0x300;
+
+    static uint32_t makeLongPrimaryCE32(uint32_t p) { return p | LONG_PRIMARY_CE32_LOW_BYTE; }
+
+    /** Turns the long-primary CE32 into a primary weight pppppp00. */
+    static inline uint32_t primaryFromLongPrimaryCE32(uint32_t ce32) {
+        return ce32 & 0xffffff00;
+    }
+    static inline int64_t ceFromLongPrimaryCE32(uint32_t ce32) {
+        return ((int64_t)(ce32 & 0xffffff00) << 32) | COMMON_SEC_AND_TER_CE;
+    }
+
+    static uint32_t makeLongSecondaryCE32(uint32_t lower32) {
+        return lower32 | SPECIAL_CE32_LOW_BYTE | LONG_SECONDARY_TAG;
+    }
+    static inline int64_t ceFromLongSecondaryCE32(uint32_t ce32) {
+        return ce32 & 0xffffff00;
+    }
+
+    /** Makes a special CE32 with tag, index and length. */
+    static uint32_t makeCE32FromTagIndexAndLength(int32_t tag, int32_t index, int32_t length) {
+        return (index << 13) | (length << 8) | SPECIAL_CE32_LOW_BYTE | tag;
+    }
+    /** Makes a special CE32 with only tag and index. */
+    static uint32_t makeCE32FromTagAndIndex(int32_t tag, int32_t index) {
+        return (index << 13) | SPECIAL_CE32_LOW_BYTE | tag;
+    }
+
+    static inline UBool isSpecialCE32(uint32_t ce32) {
+        return (ce32 & 0xff) >= SPECIAL_CE32_LOW_BYTE;
+    }
+
+    static inline int32_t tagFromCE32(uint32_t ce32) {
+        return (int32_t)(ce32 & 0xf);
+    }
+
+    static inline UBool hasCE32Tag(uint32_t ce32, int32_t tag) {
+        return isSpecialCE32(ce32) && tagFromCE32(ce32) == tag;
+    }
+
+    static inline UBool isLongPrimaryCE32(uint32_t ce32) {
+        return hasCE32Tag(ce32, LONG_PRIMARY_TAG);
+    }
+
+    static UBool isSimpleOrLongCE32(uint32_t ce32) {
+        return !isSpecialCE32(ce32) ||
+                tagFromCE32(ce32) == LONG_PRIMARY_TAG ||
+                tagFromCE32(ce32) == LONG_SECONDARY_TAG;
+    }
+
+    /**
+     * @return TRUE if the ce32 yields one or more CEs without further data lookups
+     */
+    static UBool isSelfContainedCE32(uint32_t ce32) {
+        return !isSpecialCE32(ce32) ||
+                tagFromCE32(ce32) == LONG_PRIMARY_TAG ||
+                tagFromCE32(ce32) == LONG_SECONDARY_TAG ||
+                tagFromCE32(ce32) == LATIN_EXPANSION_TAG;
+    }
+
+    static inline UBool isPrefixCE32(uint32_t ce32) {
+        return hasCE32Tag(ce32, PREFIX_TAG);
+    }
+
+    static inline UBool isContractionCE32(uint32_t ce32) {
+        return hasCE32Tag(ce32, CONTRACTION_TAG);
+    }
+
+    static inline UBool ce32HasContext(uint32_t ce32) {
+        return isSpecialCE32(ce32) &&
+                (tagFromCE32(ce32) == PREFIX_TAG ||
+                tagFromCE32(ce32) == CONTRACTION_TAG);
+    }
+
+    /**
+     * Get the first of the two Latin-expansion CEs encoded in ce32.
+     * @see LATIN_EXPANSION_TAG
+     */
+    static inline int64_t latinCE0FromCE32(uint32_t ce32) {
+        return ((int64_t)(ce32 & 0xff000000) << 32) | COMMON_SECONDARY_CE | ((ce32 & 0xff0000) >> 8);
+    }
+
+    /**
+     * Get the second of the two Latin-expansion CEs encoded in ce32.
+     * @see LATIN_EXPANSION_TAG
+     */
+    static inline int64_t latinCE1FromCE32(uint32_t ce32) {
+        return ((ce32 & 0xff00) << 16) | COMMON_TERTIARY_CE;
+    }
+
+    /**
+     * Returns the data index from a special CE32.
+     */
+    static inline int32_t indexFromCE32(uint32_t ce32) {
+        return (int32_t)(ce32 >> 13);
+    }
+
+    /**
+     * Returns the data length from a ce32.
+     */
+    static inline int32_t lengthFromCE32(uint32_t ce32) {
+        return (ce32 >> 8) & 31;
+    }
+
+    /**
+     * Returns the digit value from a DIGIT_TAG ce32.
+     */
+    static inline char digitFromCE32(uint32_t ce32) {
+        return (char)((ce32 >> 8) & 0xf);
+    }
+
+    /** Returns a 64-bit CE from a simple CE32 (not special). */
+    static inline int64_t ceFromSimpleCE32(uint32_t ce32) {
+        // normal form ppppsstt -> pppp0000ss00tt00
+        // assert (ce32 & 0xff) < SPECIAL_CE32_LOW_BYTE
+        return ((int64_t)(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | ((ce32 & 0xff) << 8);
+    }
+
+    /** Returns a 64-bit CE from a simple/long-primary/long-secondary CE32. */
+    static inline int64_t ceFromCE32(uint32_t ce32) {
+        uint32_t tertiary = ce32 & 0xff;
+        if(tertiary < SPECIAL_CE32_LOW_BYTE) {
+            // normal form ppppsstt -> pppp0000ss00tt00
+            return ((int64_t)(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | (tertiary << 8);
+        } else {
+            ce32 -= tertiary;
+            if((tertiary & 0xf) == LONG_PRIMARY_TAG) {
+                // long-primary form ppppppC1 -> pppppp00050000500
+                return ((int64_t)ce32 << 32) | COMMON_SEC_AND_TER_CE;
+            } else {
+                // long-secondary form ssssttC2 -> 00000000sssstt00
+                // assert (tertiary & 0xf) == LONG_SECONDARY_TAG
+                return ce32;
+            }
+        }
+    }
+
+    /** Creates a CE from a primary weight. */
+    static inline int64_t makeCE(uint32_t p) {
+        return ((int64_t)p << 32) | COMMON_SEC_AND_TER_CE;
+    }
+    /**
+     * Creates a CE from a primary weight,
+     * 16-bit secondary/tertiary weights, and a 2-bit quaternary.
+     */
+    static inline int64_t makeCE(uint32_t p, uint32_t s, uint32_t t, uint32_t q) {
+        return ((int64_t)p << 32) | (s << 16) | t | (q << 6);
+    }
+
+    /**
+     * Increments a 2-byte primary by a code point offset.
+     */
+    static uint32_t incTwoBytePrimaryByOffset(uint32_t basePrimary, UBool isCompressible,
+                                              int32_t offset);
+
+    /**
+     * Increments a 3-byte primary by a code point offset.
+     */
+    static uint32_t incThreeBytePrimaryByOffset(uint32_t basePrimary, UBool isCompressible,
+                                                int32_t offset);
+
+    /**
+     * Decrements a 2-byte primary by one range step (1..0x7f).
+     */
+    static uint32_t decTwoBytePrimaryByOneStep(uint32_t basePrimary, UBool isCompressible, int32_t step);
+
+    /**
+     * Decrements a 3-byte primary by one range step (1..0x7f).
+     */
+    static uint32_t decThreeBytePrimaryByOneStep(uint32_t basePrimary, UBool isCompressible, int32_t step);
+
+    /**
+     * Computes a 3-byte primary for c's OFFSET_TAG data "CE".
+     */
+    static uint32_t getThreeBytePrimaryForOffsetData(UChar32 c, int64_t dataCE);
+
+    /**
+     * Returns the unassigned-character implicit primary weight for any valid code point c.
+     */
+    static uint32_t unassignedPrimaryFromCodePoint(UChar32 c);
+
+    static inline int64_t unassignedCEFromCodePoint(UChar32 c) {
+        return makeCE(unassignedPrimaryFromCodePoint(c));
+    }
+
+    static inline uint32_t reorder(const uint8_t reorderTable[256], uint32_t primary) {
+        return ((uint32_t)reorderTable[primary >> 24] << 24) | (primary & 0xffffff);
+    }
+
+private:
+    Collation();  // No instantiation.
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATION_H__
diff --git a/icu4c/source/i18n/collationbasedatabuilder.cpp b/icu4c/source/i18n/collationbasedatabuilder.cpp
new file mode 100644 (file)
index 0000000..cb09ee6
--- /dev/null
@@ -0,0 +1,492 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationbasedatabuilder.cpp
+*
+* created on: 2012aug11
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/localpointer.h"
+#include "unicode/ucharstriebuilder.h"
+#include "unicode/uniset.h"
+#include "unicode/unistr.h"
+#include "unicode/utf16.h"
+#include "collation.h"
+#include "collationbasedatabuilder.h"
+#include "collationdata.h"
+#include "collationdatabuilder.h"
+#include "collationrootelements.h"
+#include "normalizer2impl.h"
+#include "uassert.h"
+#include "utrie2.h"
+#include "uvectr32.h"
+#include "uvectr64.h"
+#include "uvector.h"
+
+U_NAMESPACE_BEGIN
+
+namespace {
+
+/**
+ * Compare two signed int64_t values as if they were unsigned.
+ */
+int32_t
+compareInt64AsUnsigned(int64_t a, int64_t b) {
+    if((uint64_t)a < (uint64_t)b) {
+        return -1;
+    } else if((uint64_t)a > (uint64_t)b) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+// TODO: Try to merge this with the binarySearch in alphaindex.cpp.
+/**
+ * Like Java Collections.binarySearch(List, String, Comparator).
+ *
+ * @return the index>=0 where the item was found,
+ *         or the index<0 for inserting the string at ~index in sorted order
+ */
+int32_t
+binarySearch(const UVector64 &list, int64_t ce) {
+    if (list.size() == 0) { return ~0; }
+    int32_t start = 0;
+    int32_t limit = list.size();
+    for (;;) {
+        int32_t i = (start + limit) / 2;
+        int32_t cmp = compareInt64AsUnsigned(ce, list.elementAti(i));
+        if (cmp == 0) {
+            return i;
+        } else if (cmp < 0) {
+            if (i == start) {
+                return ~start;  // insert ce before i
+            }
+            limit = i;
+        } else {
+            if (i == start) {
+                return ~(start + 1);  // insert ce after i
+            }
+            start = i;
+        }
+    }
+}
+
+}  // namespace
+
+CollationBaseDataBuilder::CollationBaseDataBuilder(UErrorCode &errorCode)
+        : CollationDataBuilder(errorCode),
+          numericPrimary(0x12000000),
+          firstHanPrimary(0), lastHanPrimary(0), hanStep(2),
+          rootElements(errorCode) {
+}
+
+CollationBaseDataBuilder::~CollationBaseDataBuilder() {
+}
+
+void
+CollationBaseDataBuilder::init(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    if(trie != NULL) {
+        errorCode = U_INVALID_STATE_ERROR;
+        return;
+    }
+
+    // Not compressible:
+    // - digits
+    // - Latin
+    // - Hani
+    // - trail weights
+    // Some scripts are compressible, some are not.
+    uprv_memset(compressibleBytes, FALSE, 256);
+    compressibleBytes[Collation::UNASSIGNED_IMPLICIT_BYTE] = TRUE;
+
+    // For a base, the default is to compute an unassigned-character implicit CE.
+    // This includes surrogate code points; see the last option in
+    // UCA section 7.1.1 Handling Ill-Formed Code Unit Sequences.
+    trie = utrie2_open(Collation::UNASSIGNED_CE32, Collation::FFFD_CE32, &errorCode);
+
+    // Preallocate trie blocks for Latin in the hope that proximity helps with CPU caches.
+    for(UChar32 c = 0; c < 0x180; ++c) {
+        utrie2_set32(trie, c, Collation::UNASSIGNED_CE32, &errorCode);
+    }
+
+    utrie2_set32(trie, 0xfffe, Collation::MERGE_SEPARATOR_CE32, &errorCode);
+    // No root element for the merge separator which has 02 weights.
+    // Some code assumes that the root first primary CE is the "space first primary"
+    // from FractionalUCA.txt.
+
+    uint32_t hangulCE32 = Collation::makeCE32FromTagAndIndex(Collation::HANGUL_TAG, 0);
+    utrie2_setRange32(trie, Hangul::HANGUL_BASE, Hangul::HANGUL_END, hangulCE32, TRUE, &errorCode);
+
+    // Add a mapping for the first-unassigned boundary,
+    // which is the AlphabeticIndex overflow boundary.
+    UnicodeString s((UChar)0xfdd1);  // Script boundary contractions start with U+FDD1.
+    s.append((UChar)0xfdd0);  // Zzzz script sample character U+FDD0.
+    int64_t ce = Collation::makeCE(Collation::FIRST_UNASSIGNED_PRIMARY);
+    add(UnicodeString(), s, &ce, 1, errorCode);
+
+    // Add a tailoring boundary, but not a mapping, for [first trailing].
+    ce = Collation::makeCE(Collation::FIRST_TRAILING_PRIMARY);
+    rootElements.addElement(ce, errorCode);
+
+    // U+FFFD maps to a CE with the third-highest primary weight,
+    // for predictable handling of ill-formed UTF-8.
+    uint32_t ce32 = Collation::FFFD_CE32;
+    utrie2_set32(trie, 0xfffd, ce32, &errorCode);
+    addRootElement(Collation::ceFromSimpleCE32(ce32), errorCode);
+
+    // U+FFFF maps to a CE with the highest primary weight.
+    ce32 = Collation::MAX_REGULAR_CE32;
+    utrie2_set32(trie, 0xffff, ce32, &errorCode);
+    addRootElement(Collation::ceFromSimpleCE32(ce32), errorCode);
+}
+
+void
+CollationBaseDataBuilder::initHanRanges(const UChar32 ranges[], int32_t length,
+                                        UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode) || length == 0) { return; }
+    if((length & 1) != 0) {  // incomplete start/end pairs
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
+    if(isAssigned(0x4e00)) {  // already set
+        errorCode = U_INVALID_STATE_ERROR;
+        return;
+    }
+    int32_t numHanCodePoints = 0;
+    for(int32_t i = 0; i < length; i += 2) {
+        UChar32 start = ranges[i];
+        UChar32 end = ranges[i + 1];
+        numHanCodePoints += end - start + 1;
+    }
+    // Multiply the number of code points by (gap+1).
+    // Add hanStep+2 for tailoring after the last Han character.
+    int32_t gap = 1;
+    hanStep = gap + 1;
+    int32_t numHan = numHanCodePoints * hanStep + hanStep + 2;
+    // Numbers of Han primaries per lead byte determined by
+    // numbers of 2nd (not compressible) times 3rd primary byte values.
+    int32_t numHanPerLeadByte = 254 * 254;
+    int32_t numHanLeadBytes = (numHan + numHanPerLeadByte - 1) / numHanPerLeadByte;
+    uint32_t hanPrimary = (uint32_t)(Collation::UNASSIGNED_IMPLICIT_BYTE - numHanLeadBytes) << 24;
+    hanPrimary |= 0x20200;
+    firstHanPrimary = hanPrimary;
+    for(int32_t i = 0; i < length; i += 2) {
+        UChar32 start = ranges[i];
+        UChar32 end = ranges[i + 1];
+        hanPrimary = setPrimaryRangeAndReturnNext(start, end, hanPrimary, hanStep, errorCode);
+    }
+    // One past the actual last one, but that is harmless for tailoring.
+    // It saves us from subtracting "hanStep" and handling underflows.
+    lastHanPrimary = hanPrimary;
+}
+
+UBool
+CollationBaseDataBuilder::isCompressibleLeadByte(uint32_t b) const {
+    return compressibleBytes[b];
+}
+
+void
+CollationBaseDataBuilder::setCompressibleLeadByte(uint32_t b) {
+    compressibleBytes[b] = TRUE;
+}
+
+int32_t
+CollationBaseDataBuilder::diffTwoBytePrimaries(uint32_t p1, uint32_t p2, UBool isCompressible) {
+    if((p1 & 0xff000000) == (p2 & 0xff000000)) {
+        // Same lead bytes.
+        return (int32_t)(p2 - p1) >> 16;
+    } else {
+        int32_t linear1;
+        int32_t linear2;
+        int32_t factor;
+        if(isCompressible) {
+            // Second byte for compressible lead byte: 251 bytes 04..FE
+            linear1 = (int32_t)((p1 >> 16) & 0xff) - 4;
+            linear2 = (int32_t)((p2 >> 16) & 0xff) - 4;
+            factor = 251;
+        } else {
+            // Second byte for incompressible lead byte: 254 bytes 02..FF
+            linear1 = (int32_t)((p1 >> 16) & 0xff) - 2;
+            linear2 = (int32_t)((p2 >> 16) & 0xff) - 2;
+            factor = 254;
+        }
+        linear1 += factor * (int32_t)((p1 >> 24) & 0xff);
+        linear2 += factor * (int32_t)((p2 >> 24) & 0xff);
+        return linear2 - linear1;
+    }
+}
+
+int32_t
+CollationBaseDataBuilder::diffThreeBytePrimaries(uint32_t p1, uint32_t p2, UBool isCompressible) {
+    if((p1 & 0xffff0000) == (p2 & 0xffff0000)) {
+        // Same first two bytes.
+        return (int32_t)(p2 - p1) >> 8;
+    } else {
+        // Third byte: 254 bytes 02..FF
+        int32_t linear1 = (int32_t)((p1 >> 8) & 0xff) - 2;
+        int32_t linear2 = (int32_t)((p2 >> 8) & 0xff) - 2;
+        int32_t factor;
+        if(isCompressible) {
+            // Second byte for compressible lead byte: 251 bytes 04..FE
+            linear1 += 254 * ((int32_t)((p1 >> 16) & 0xff) - 4);
+            linear2 += 254 * ((int32_t)((p2 >> 16) & 0xff) - 4);
+            factor = 251 * 254;
+        } else {
+            // Second byte for incompressible lead byte: 254 bytes 02..FF
+            linear1 += 254 * ((int32_t)((p1 >> 16) & 0xff) - 2);
+            linear2 += 254 * ((int32_t)((p2 >> 16) & 0xff) - 2);
+            factor = 254 * 254;
+        }
+        linear1 += factor * (int32_t)((p1 >> 24) & 0xff);
+        linear2 += factor * (int32_t)((p2 >> 24) & 0xff);
+        return linear2 - linear1;
+    }
+}
+
+uint32_t
+CollationBaseDataBuilder::encodeCEs(const int64_t ces[], int32_t cesLength, UErrorCode &errorCode) {
+    addRootElements(ces, cesLength, errorCode);
+    return CollationDataBuilder::encodeCEs(ces, cesLength, errorCode);
+}
+
+void
+CollationBaseDataBuilder::addRootElements(const int64_t ces[], int32_t cesLength,
+                                          UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    for(int32_t i = 0; i < cesLength; ++i) {
+        addRootElement(ces[i], errorCode);
+    }
+}
+
+void
+CollationBaseDataBuilder::addRootElement(int64_t ce, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode) || ce == 0) { return; }
+    // Remove case bits.
+    ce &= INT64_C(0xffffffffffff3fff);
+    U_ASSERT((ce & 0xc0) == 0);  // quaternary==0
+    // Ignore the CE if it has a Han primary weight and common secondary/tertiary weights.
+    // We will add it later, as part of the Han ranges.
+    uint32_t p = (uint32_t)(ce >> 32);
+    uint32_t secTer = (uint32_t)ce;
+    if(secTer == Collation::COMMON_SEC_AND_TER_CE) {
+        if(firstHanPrimary <= p && p <= lastHanPrimary) {
+            return;
+        }
+    } else {
+        // Check that secondary and tertiary weights are >= "common".
+        uint32_t s = secTer >> 16;
+        uint32_t t = secTer & Collation::ONLY_TERTIARY_MASK;
+        if((s != 0 && s < Collation::COMMON_WEIGHT16) || (t != 0 && t < Collation::COMMON_WEIGHT16)) {
+            errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+            return;
+        }
+    }
+    // Check that primaries have at most 3 bytes.
+    if((p & 0xff) != 0) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
+    int32_t i = binarySearch(rootElements, ce);
+    if(i < 0) {
+        rootElements.insertElementAt(ce, ~i, errorCode);
+    }
+}
+
+void
+CollationBaseDataBuilder::addReorderingGroup(uint32_t firstByte, uint32_t lastByte,
+                                             const UnicodeString &groupScripts,
+                                             UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    if(groupScripts.isEmpty()) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
+    if(groupScripts.indexOf((UChar)USCRIPT_UNKNOWN) >= 0) {
+        // Zzzz must not occur.
+        // It is the code used in the API to separate low and high scripts.
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
+    // Note: We are mostly trusting the input data,
+    // rather than verifying that reordering groups do not intersect
+    // with their lead byte ranges nor their sets of scripts,
+    // and that all script codes are valid.
+    scripts.append((UChar)((firstByte << 8) | lastByte));
+    scripts.append((UChar)groupScripts.length());
+    scripts.append(groupScripts);
+}
+
+void
+CollationBaseDataBuilder::build(CollationData &data, UErrorCode &errorCode) {
+    buildMappings(data, errorCode);
+    data.numericPrimary = numericPrimary;
+    data.compressibleBytes = compressibleBytes;
+    data.scripts = reinterpret_cast<const uint16_t *>(scripts.getBuffer());
+    data.scriptsLength = scripts.length();
+    buildFastLatinTable(data, errorCode);
+}
+
+void
+CollationBaseDataBuilder::buildRootElementsTable(UVector32 &table, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    uint32_t nextHanPrimary = firstHanPrimary;  // Set to 0xffffffff after the last Han range.
+    uint32_t prevPrimary = 0;  // Start with primary ignorable CEs.
+    UBool tryRange = FALSE;
+    for(int32_t i = 0; i < rootElements.size(); ++i) {
+        int64_t ce = rootElements.elementAti(i);
+        uint32_t p = (uint32_t)(ce >> 32);
+        uint32_t secTer = (uint32_t)ce & Collation::ONLY_SEC_TER_MASK;
+        if(p != prevPrimary) {
+            U_ASSERT((p & 0xff) == 0);
+            int32_t end;
+            if(p >= nextHanPrimary) {
+                // Add a Han primary weight or range.
+                // We omitted them initially, and omitted all CEs with Han primaries
+                // and common secondary/tertiary weights.
+                U_ASSERT(p > lastHanPrimary || secTer != Collation::COMMON_SEC_AND_TER_CE);
+                if(p == nextHanPrimary) {
+                    // One single Han primary with non-common secondary/tertiary weights.
+                    table.addElement((int32_t)p, errorCode);
+                    if(p < lastHanPrimary) {
+                        // Prepare for the next Han range.
+                        nextHanPrimary = Collation::incThreeBytePrimaryByOffset(p, FALSE, hanStep);
+                    } else {
+                        // p is the last Han primary.
+                        nextHanPrimary = 0xffffffff;
+                    }
+                } else {
+                    // p > nextHanPrimary: Add a Han primary range, starting with nextHanPrimary.
+                    table.addElement((int32_t)nextHanPrimary, errorCode);
+                    if(nextHanPrimary == lastHanPrimary) {
+                        // nextHanPrimary == lastHanPrimary < p
+                        // We just wrote the single last Han primary.
+                        nextHanPrimary = 0xffffffff;
+                    } else if(p < lastHanPrimary) {
+                        // nextHanPrimary < p < lastHanPrimary
+                        // End the Han range on p, prepare for the next range.
+                        table.addElement((int32_t)p | hanStep, errorCode);
+                        nextHanPrimary = Collation::incThreeBytePrimaryByOffset(p, FALSE, hanStep);
+                    } else if(p == lastHanPrimary) {
+                        // nextHanPrimary < p == lastHanPrimary
+                        // End the last Han range on p.
+                        table.addElement((int32_t)p | hanStep, errorCode);
+                        nextHanPrimary = 0xffffffff;
+                    } else {
+                        // nextHanPrimary < lastHanPrimary < p
+                        // End the last Han range, then write p.
+                        table.addElement((int32_t)lastHanPrimary | hanStep, errorCode);
+                        nextHanPrimary = 0xffffffff;
+                        table.addElement((int32_t)p, errorCode);
+                    }
+                }
+            } else if(tryRange && secTer == Collation::COMMON_SEC_AND_TER_CE &&
+                    (end = writeRootElementsRange(prevPrimary, p, i + 1, table, errorCode)) != 0) {
+                // Multiple CEs with only common secondary/tertiary weights were
+                // combined into a primary range.
+                // The range end was written, ending with the primary of rootElements[end].
+                ce = rootElements.elementAti(end);
+                p = (uint32_t)(ce >> 32);
+                secTer = (uint32_t)ce & Collation::ONLY_SEC_TER_MASK;
+                i = end;
+            } else {
+                // Write the primary weight of a normal CE.
+                table.addElement((int32_t)p, errorCode);
+            }
+            prevPrimary = p;
+        }
+        if(secTer == Collation::COMMON_SEC_AND_TER_CE) {
+            // The common secondar/tertiary weights are implied in the primary unit.
+            // If there is no intervening delta unit, then we will try to combine
+            // the next several primaries into a range.
+            tryRange = TRUE;
+        } else {
+            // For each new set of secondary/tertiary weights we write a delta unit.
+            table.addElement((int32_t)secTer | CollationRootElements::SEC_TER_DELTA_FLAG, errorCode);
+            tryRange = FALSE;
+        }
+    }
+
+    // Limit sentinel for root elements.
+    // This allows us to reduce range checks at runtime.
+    table.addElement(CollationRootElements::PRIMARY_SENTINEL, errorCode);
+}
+
+int32_t
+CollationBaseDataBuilder::writeRootElementsRange(
+        uint32_t prevPrimary, uint32_t p, int32_t i,
+        UVector32 &table, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode) || i >= rootElements.size()) { return 0; }
+    U_ASSERT(prevPrimary < p);
+    // No ranges of single-byte primaries.
+    if((p & prevPrimary & 0xff0000) == 0) { return 0; }
+    // Lead bytes of compressible primaries must match.
+    UBool isCompressible = isCompressiblePrimary(p);
+    if((isCompressible || isCompressiblePrimary(prevPrimary)) &&
+            (p & 0xff000000) != (prevPrimary & 0xff000000)) {
+        return 0;
+    }
+    // Number of bytes in the primaries.
+    UBool twoBytes;
+    // Number of primaries from prevPrimary to p.
+    int32_t step;
+    if((p & 0xff00) == 0) {
+        // 2-byte primary
+        if((prevPrimary & 0xff00) != 0) { return 0; }  // length mismatch
+        twoBytes = TRUE;
+        step = diffTwoBytePrimaries(prevPrimary, p, isCompressible);
+    } else {
+        // 3-byte primary
+        if((prevPrimary & 0xff00) == 0) { return 0; }  // length mismatch
+        twoBytes = FALSE;
+        step = diffThreeBytePrimaries(prevPrimary, p, isCompressible);
+    }
+    if(step > (int32_t)CollationRootElements::PRIMARY_STEP_MASK) { return 0; }
+    // See if there are more than two CEs with primaries increasing by "step"
+    // and with only common secondary/tertiary weights on all but the last one.
+    int32_t end = 0;  // Initially 0: No range for just two primaries.
+    for(;;) {
+        prevPrimary = p;
+        // Calculate which primary we expect next.
+        uint32_t nextPrimary;  // = p + step
+        if(twoBytes) {
+            nextPrimary = Collation::incTwoBytePrimaryByOffset(p, isCompressible, step);
+        } else {
+            nextPrimary = Collation::incThreeBytePrimaryByOffset(p, isCompressible, step);
+        }
+        // Fetch the actual next CE.
+        int64_t ce = rootElements.elementAti(i);
+        p = (uint32_t)(ce >> 32);
+        uint32_t secTer = (uint32_t)ce & Collation::ONLY_SEC_TER_MASK;
+        // Does this primary increase by "step" from the last one?
+        if(p != nextPrimary ||
+                // Do not cross into a new lead byte if either is compressible.
+                ((p & 0xff000000) != (prevPrimary & 0xff000000) &&
+                    (isCompressible || isCompressiblePrimary(p)))) {
+            // The range ends with the previous CE.
+            p = prevPrimary;
+            break;
+        }
+        // Extend the range to include this primary.
+        end = i++;
+        // This primary is the last in the range if it has non-common weights
+        // or if we are at the end of the list.
+        if(secTer != Collation::COMMON_SEC_AND_TER_CE || i >= rootElements.size()) { break; }
+    }
+    if(end != 0) {
+        table.addElement((int32_t)p | step, errorCode);
+    }
+    return end;
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationbasedatabuilder.h b/icu4c/source/i18n/collationbasedatabuilder.h
new file mode 100644 (file)
index 0000000..aaa6be1
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationbasedatabuilder.h
+*
+* created on: 2012aug11
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONBASEDATABUILDER_H__
+#define __COLLATIONBASEDATABUILDER_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/uniset.h"
+#include "unicode/unistr.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationdatabuilder.h"
+#include "normalizer2impl.h"
+#include "utrie2.h"
+#include "uvectr32.h"
+#include "uvectr64.h"
+#include "uvector.h"
+
+U_NAMESPACE_BEGIN
+
+/**
+ * Low-level base CollationData builder.
+ */
+class U_I18N_API CollationBaseDataBuilder : public CollationDataBuilder {
+public:
+    CollationBaseDataBuilder(UErrorCode &errorCode);
+
+    virtual ~CollationBaseDataBuilder();
+
+    void init(UErrorCode &errorCode);
+
+    /**
+     * Sets the Han ranges as ranges of offset CE32s.
+     * Note: Unihan extension A sorts after the other BMP ranges.
+     * See http://www.unicode.org/reports/tr10/#Implicit_Weights
+     *
+     * @param ranges array of ranges of [:Unified_Ideograph:] in collation order,
+     *               as (start, end) code point pairs
+     * @param length number of code points (not pairs)
+     * @param errorCode in/out error code
+     */
+    void initHanRanges(const UChar32 ranges[], int32_t length, UErrorCode &errorCode);
+
+    void setNumericPrimary(uint32_t np) { numericPrimary = np; }
+
+    virtual UBool isCompressibleLeadByte(uint32_t b) const;
+
+    void setCompressibleLeadByte(uint32_t b);
+
+    static int32_t diffTwoBytePrimaries(uint32_t p1, uint32_t p2, UBool isCompressible);
+    static int32_t diffThreeBytePrimaries(uint32_t p1, uint32_t p2, UBool isCompressible);
+
+    virtual uint32_t encodeCEs(const int64_t ces[], int32_t cesLength, UErrorCode &errorCode);
+
+    void addRootElements(const int64_t ces[], int32_t cesLength, UErrorCode &errorCode);
+    void addRootElement(int64_t ce, UErrorCode &errorCode);
+
+    void addReorderingGroup(uint32_t firstByte, uint32_t lastByte,
+                            const UnicodeString &groupScripts,
+                            UErrorCode &errorCode);
+
+    virtual void build(CollationData &data, UErrorCode &errorCode);
+
+    void buildRootElementsTable(UVector32 &table, UErrorCode &errorCode);
+
+private:
+    int32_t writeRootElementsRange(
+            uint32_t prevPrimary, uint32_t p, int32_t i,
+            UVector32 &table, UErrorCode &errorCode);
+
+    // Flags for which primary-weight lead bytes are compressible.
+    UBool compressibleBytes[256];
+    uint32_t numericPrimary;
+    uint32_t firstHanPrimary;
+    uint32_t lastHanPrimary;
+    int32_t hanStep;
+    UVector64 rootElements;
+    UnicodeString scripts;
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONBASEDATABUILDER_H__
diff --git a/icu4c/source/i18n/collationbuilder.cpp b/icu4c/source/i18n/collationbuilder.cpp
new file mode 100644 (file)
index 0000000..2d7ae9d
--- /dev/null
@@ -0,0 +1,1691 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationbuilder.cpp
+*
+* (replaced the former ucol_bld.cpp)
+*
+* created on: 2013may06
+* created by: Markus W. Scherer
+*/
+
+#ifdef DEBUG_COLLATION_BUILDER
+#include <stdio.h>
+#endif
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/caniter.h"
+#include "unicode/normalizer2.h"
+#include "unicode/tblcoll.h"
+#include "unicode/parseerr.h"
+#include "unicode/uchar.h"
+#include "unicode/ucol.h"
+#include "unicode/unistr.h"
+#include "unicode/usetiter.h"
+#include "unicode/utf16.h"
+#include "unicode/uversion.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationbuilder.h"
+#include "collationdata.h"
+#include "collationdatabuilder.h"
+#include "collationfastlatin.h"
+#include "collationroot.h"
+#include "collationrootelements.h"
+#include "collationruleparser.h"
+#include "collationsettings.h"
+#include "collationtailoring.h"
+#include "collationweights.h"
+#include "normalizer2impl.h"
+#include "uassert.h"
+#include "ucol_imp.h"
+#include "utf16collationiterator.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
+
+U_NAMESPACE_BEGIN
+
+namespace {
+
+class BundleImporter : public CollationRuleParser::Importer {
+public:
+    BundleImporter() : rules(NULL) {}
+    virtual ~BundleImporter();
+    virtual const UnicodeString *getRules(
+            const char *localeID, const char *collationType,
+            const char *&errorReason, UErrorCode &errorCode);
+
+private:
+    UnicodeString *rules;
+};
+
+BundleImporter::~BundleImporter() {
+    delete rules;
+}
+
+const UnicodeString *
+BundleImporter::getRules(
+        const char *localeID, const char *collationType,
+        const char *& /*errorReason*/, UErrorCode &errorCode) {
+    delete rules;
+    return rules = CollationLoader::loadRules(localeID, collationType, errorCode);
+}
+
+}  // namespace
+
+// RuleBasedCollator implementation ---------------------------------------- ***
+
+// These methods are here, rather than in rulebasedcollator.cpp,
+// for modularization:
+// Most code using Collator does not need to build a Collator from rules.
+// By moving these constructors and helper methods to a separate file,
+// most code will not have a static dependency on the builder code.
+
+RuleBasedCollator::RuleBasedCollator()
+        : data(NULL),
+          settings(NULL),
+          tailoring(NULL),
+          validLocale(""),
+          explicitlySetAttributes(0),
+          actualLocaleIsSameAsValid(FALSE) {
+}
+
+RuleBasedCollator::RuleBasedCollator(const UnicodeString &rules, UErrorCode &errorCode)
+        : data(NULL),
+          settings(NULL),
+          tailoring(NULL),
+          validLocale(""),
+          explicitlySetAttributes(0),
+          actualLocaleIsSameAsValid(FALSE) {
+    internalBuildTailoring(rules, UCOL_DEFAULT, UCOL_DEFAULT, NULL, NULL, errorCode);
+}
+
+RuleBasedCollator::RuleBasedCollator(const UnicodeString &rules, ECollationStrength strength,
+                                     UErrorCode &errorCode)
+        : data(NULL),
+          settings(NULL),
+          tailoring(NULL),
+          validLocale(""),
+          explicitlySetAttributes(0),
+          actualLocaleIsSameAsValid(FALSE) {
+    internalBuildTailoring(rules, strength, UCOL_DEFAULT, NULL, NULL, errorCode);
+}
+
+RuleBasedCollator::RuleBasedCollator(const UnicodeString &rules,
+                                     UColAttributeValue decompositionMode,
+                                     UErrorCode &errorCode)
+        : data(NULL),
+          settings(NULL),
+          tailoring(NULL),
+          validLocale(""),
+          explicitlySetAttributes(0),
+          actualLocaleIsSameAsValid(FALSE) {
+    internalBuildTailoring(rules, UCOL_DEFAULT, decompositionMode, NULL, NULL, errorCode);
+}
+
+RuleBasedCollator::RuleBasedCollator(const UnicodeString &rules,
+                                     ECollationStrength strength,
+                                     UColAttributeValue decompositionMode,
+                                     UErrorCode &errorCode)
+        : data(NULL),
+          settings(NULL),
+          tailoring(NULL),
+          validLocale(""),
+          explicitlySetAttributes(0),
+          actualLocaleIsSameAsValid(FALSE) {
+    internalBuildTailoring(rules, strength, decompositionMode, NULL, NULL, errorCode);
+}
+
+RuleBasedCollator::RuleBasedCollator(const UnicodeString &rules,
+                                     UParseError &parseError, UnicodeString &reason,
+                                     UErrorCode &errorCode)
+        : data(NULL),
+          settings(NULL),
+          tailoring(NULL),
+          validLocale(""),
+          explicitlySetAttributes(0),
+          actualLocaleIsSameAsValid(FALSE) {
+    internalBuildTailoring(rules, UCOL_DEFAULT, UCOL_DEFAULT, &parseError, &reason, errorCode);
+}
+
+void
+RuleBasedCollator::internalBuildTailoring(const UnicodeString &rules,
+                                          int32_t strength,
+                                          UColAttributeValue decompositionMode,
+                                          UParseError *outParseError, UnicodeString *outReason,
+                                          UErrorCode &errorCode) {
+    const CollationTailoring *base = CollationRoot::getRoot(errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    if(outReason != NULL) { outReason->remove(); }
+    CollationBuilder builder(base, errorCode);
+    UVersionInfo noVersion = { 0, 0, 0, 0 };
+    BundleImporter importer;
+    LocalPointer<CollationTailoring> t(builder.parseAndBuild(rules, noVersion,
+                                                             &importer,
+                                                             outParseError, errorCode));
+    if(U_FAILURE(errorCode)) {
+        const char *reason = builder.getErrorReason();
+        if(reason != NULL && outReason != NULL) {
+            *outReason = UnicodeString(reason, -1, US_INV);
+        }
+        return;
+    }
+    const CollationSettings &ts = *t->settings;
+    uint16_t fastLatinPrimaries[CollationFastLatin::LATIN_LIMIT];
+    int32_t fastLatinOptions = CollationFastLatin::getOptions(
+            t->data, ts, fastLatinPrimaries, LENGTHOF(fastLatinPrimaries));
+    if((strength != UCOL_DEFAULT && strength != ts.getStrength()) ||
+            (decompositionMode != UCOL_DEFAULT &&
+                decompositionMode != ts.getFlag(CollationSettings::CHECK_FCD)) ||
+            fastLatinOptions != ts.fastLatinOptions ||
+            (fastLatinOptions >= 0 &&
+                uprv_memcmp(fastLatinPrimaries, ts.fastLatinPrimaries,
+                            sizeof(fastLatinPrimaries)) != 0)) {
+        CollationSettings *ownedSettings = SharedObject::copyOnWrite(t->settings);
+        if(ownedSettings == NULL) {
+            errorCode = U_MEMORY_ALLOCATION_ERROR;
+            return;
+        }
+        if(strength != UCOL_DEFAULT) {
+            ownedSettings->setStrength(strength, 0, errorCode);
+        }
+        if(decompositionMode != UCOL_DEFAULT) {
+            ownedSettings->setFlag(CollationSettings::CHECK_FCD, decompositionMode, 0, errorCode);
+        }
+        ownedSettings->fastLatinOptions = CollationFastLatin::getOptions(
+            t->data, *ownedSettings,
+            ownedSettings->fastLatinPrimaries, LENGTHOF(ownedSettings->fastLatinPrimaries));
+    }
+    if(U_FAILURE(errorCode)) { return; }
+    t->actualLocale.setToBogus();
+    adoptTailoring(t.orphan());
+}
+
+// CollationBuilder implementation ----------------------------------------- ***
+
+CollationBuilder::CollationBuilder(const CollationTailoring *b, UErrorCode &errorCode)
+        : nfd(*Normalizer2::getNFDInstance(errorCode)),
+          fcd(*Normalizer2Factory::getFCDInstance(errorCode)),
+          nfcImpl(*Normalizer2Factory::getNFCImpl(errorCode)),
+          base(b),
+          baseData(b->data),
+          rootElements(b->data->rootElements, b->data->rootElementsLength),
+          variableTop(0),
+          dataBuilder(new CollationDataBuilder(errorCode)), fastLatinEnabled(TRUE),
+          errorReason(NULL),
+          cesLength(0),
+          rootPrimaryIndexes(errorCode), nodes(errorCode) {
+    nfcImpl.ensureCanonIterData(errorCode);
+    if(U_FAILURE(errorCode)) {
+        errorReason = "CollationBuilder fields initialization failed";
+        return;
+    }
+    if(dataBuilder == NULL) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return;
+    }
+    dataBuilder->initForTailoring(baseData, errorCode);
+    if(U_FAILURE(errorCode)) {
+        errorReason = "CollationBuilder initialization failed";
+    }
+}
+
+CollationBuilder::~CollationBuilder() {
+    delete dataBuilder;
+}
+
+CollationTailoring *
+CollationBuilder::parseAndBuild(const UnicodeString &ruleString,
+                                const UVersionInfo rulesVersion,
+                                CollationRuleParser::Importer *importer,
+                                UParseError *outParseError,
+                                UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return NULL; }
+    if(baseData->rootElements == NULL) {
+        errorCode = U_MISSING_RESOURCE_ERROR;
+        errorReason = "missing root elements data, tailoring not supported";
+        return NULL;
+    }
+    LocalPointer<CollationTailoring> tailoring(new CollationTailoring(base->settings));
+    if(tailoring.isNull() || tailoring->isBogus()) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return NULL;
+    }
+    CollationRuleParser parser(baseData, errorCode);
+    if(U_FAILURE(errorCode)) { return NULL; }
+    // Note: This always bases &[last variable] and &[first regular]
+    // on the root collator's maxVariable/variableTop.
+    // If we wanted this to change after [maxVariable x], then we would keep
+    // the tailoring.settings pointer here and read its variableTop when we need it.
+    // See http://unicode.org/cldr/trac/ticket/6070
+    variableTop = base->settings->variableTop;
+    parser.setSink(this);
+    parser.setImporter(importer);
+    parser.parse(ruleString, *SharedObject::copyOnWrite(tailoring->settings),
+                 outParseError, errorCode);
+    errorReason = parser.getErrorReason();
+    if(U_FAILURE(errorCode)) { return NULL; }
+    if(dataBuilder->hasMappings()) {
+        makeTailoredCEs(errorCode);
+        closeOverComposites(errorCode);
+        finalizeCEs(errorCode);
+        // Copy all of ASCII, and Latin-1 letters, into each tailoring.
+        optimizeSet.add(0, 0x7f);
+        optimizeSet.add(0xc0, 0xff);
+        // Hangul is decomposed on the fly during collation,
+        // and the tailoring data is always built with HANGUL_TAG specials.
+        optimizeSet.remove(Hangul::HANGUL_BASE, Hangul::HANGUL_END);
+        dataBuilder->optimize(optimizeSet, errorCode);
+        tailoring->ensureOwnedData(errorCode);
+        if(U_FAILURE(errorCode)) { return NULL; }
+        if(fastLatinEnabled) { dataBuilder->enableFastLatin(); }
+        dataBuilder->build(*tailoring->ownedData, errorCode);
+        tailoring->builder = dataBuilder;
+        dataBuilder = NULL;
+    } else {
+        tailoring->data = baseData;
+    }
+    if(U_FAILURE(errorCode)) { return NULL; }
+    tailoring->rules = ruleString;
+    tailoring->rules.getTerminatedBuffer();  // ensure NUL-termination
+    tailoring->setVersion(base->version, rulesVersion);
+    return tailoring.orphan();
+}
+
+void
+CollationBuilder::addReset(int32_t strength, const UnicodeString &str,
+                           const char *&parserErrorReason, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    U_ASSERT(!str.isEmpty());
+    if(str.charAt(0) == CollationRuleParser::POS_LEAD) {
+        ces[0] = getSpecialResetPosition(str, parserErrorReason, errorCode);
+        cesLength = 1;
+        if(U_FAILURE(errorCode)) { return; }
+        U_ASSERT((ces[0] & Collation::CASE_AND_QUATERNARY_MASK) == 0);
+    } else {
+        // normal reset to a character or string
+        UnicodeString nfdString = nfd.normalize(str, errorCode);
+        if(U_FAILURE(errorCode)) {
+            parserErrorReason = "normalizing the reset position";
+            return;
+        }
+        cesLength = dataBuilder->getCEs(nfdString, ces, 0);
+        if(cesLength > Collation::MAX_EXPANSION_LENGTH) {
+            errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+            parserErrorReason = "reset position maps to too many collation elements (more than 31)";
+            return;
+        }
+    }
+    if(strength == UCOL_IDENTICAL) { return; }  // simple reset-at-position
+
+    // &[before strength]position
+    U_ASSERT(UCOL_PRIMARY <= strength && strength <= UCOL_TERTIARY);
+    int32_t index = findOrInsertNodeForCEs(strength, parserErrorReason, errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+
+    int64_t node = nodes.elementAti(index);
+    // If the index is for a "weaker" tailored node,
+    // then skip backwards over this and further "weaker" nodes.
+    while(strengthFromNode(node) > strength) {
+        index = previousIndexFromNode(node);
+        node = nodes.elementAti(index);
+    }
+
+    // Find or insert a node whose index we will put into a temporary CE.
+    if(strengthFromNode(node) == strength && isTailoredNode(node)) {
+        // Reset to just before this same-strength tailored node.
+        index = previousIndexFromNode(node);
+    } else if(strength == UCOL_PRIMARY) {
+        // root primary node (has no previous index)
+        uint32_t p = weight32FromNode(node);
+        if(p == 0) {
+            errorCode = U_UNSUPPORTED_ERROR;
+            parserErrorReason = "reset primary-before ignorable not possible";
+            return;
+        }
+        if(p <= rootElements.getFirstPrimary()) {
+            // There is no primary gap between ignorables and the space-first-primary.
+            errorCode = U_UNSUPPORTED_ERROR;
+            parserErrorReason = "reset primary-before first non-ignorable not supported";
+            return;
+        }
+        if(p == Collation::FIRST_TRAILING_PRIMARY) {
+            // We do not support tailoring to an unassigned-implicit CE.
+            errorCode = U_UNSUPPORTED_ERROR;
+            parserErrorReason = "reset primary-before [first trailing] not supported";
+            return;
+        }
+        p = rootElements.getPrimaryBefore(p, baseData->isCompressiblePrimary(p));
+        index = findOrInsertNodeForPrimary(p, errorCode);
+        // Go to the last node in this list:
+        // Tailor after the last node between adjacent root nodes.
+        for(;;) {
+            node = nodes.elementAti(index);
+            int32_t nextIndex = nextIndexFromNode(node);
+            if(nextIndex == 0) { break; }
+            index = nextIndex;
+        }
+    } else {
+        // &[before 2] or &[before 3]
+        index = findCommonNode(index, UCOL_SECONDARY);
+        if(strength >= UCOL_TERTIARY) {
+            index = findCommonNode(index, UCOL_TERTIARY);
+        }
+        node = nodes.elementAti(index);
+        if(strengthFromNode(node) == strength) {
+            // Found a same-strength node with an explicit weight.
+            uint32_t weight16 = weight16FromNode(node);
+            if(weight16 == 0) {
+                errorCode = U_UNSUPPORTED_ERROR;
+                if(strength == UCOL_SECONDARY) {
+                    parserErrorReason = "reset secondary-before secondary ignorable not possible";
+                } else {
+                    parserErrorReason = "reset tertiary-before completely ignorable not possible";
+                }
+                return;
+            }
+            U_ASSERT(weight16 >= Collation::COMMON_WEIGHT16);
+            int32_t previousIndex = previousIndexFromNode(node);
+            if(weight16 == Collation::COMMON_WEIGHT16) {
+                // Reset to just before this same-strength common-weight node.
+                index = previousIndex;
+            } else {
+                // A non-common weight is only possible from a root CE.
+                // Find the higher-level weights, which must all be explicit,
+                // and then find the preceding weight for this level.
+                uint32_t previousWeight16 = 0;
+                int32_t previousWeightIndex = -1;
+                int32_t i = index;
+                if(strength == UCOL_SECONDARY) {
+                    uint32_t p;
+                    do {
+                        i = previousIndexFromNode(node);
+                        node = nodes.elementAti(i);
+                        if(strengthFromNode(node) == UCOL_SECONDARY && !isTailoredNode(node) &&
+                                previousWeightIndex < 0) {
+                            previousWeightIndex = i;
+                            previousWeight16 = weight16FromNode(node);
+                        }
+                    } while(strengthFromNode(node) > UCOL_PRIMARY);
+                    U_ASSERT(!isTailoredNode(node));
+                    p = weight32FromNode(node);
+                    weight16 = rootElements.getSecondaryBefore(p, weight16);
+                } else {
+                    uint32_t p, s;
+                    do {
+                        i = previousIndexFromNode(node);
+                        node = nodes.elementAti(i);
+                        if(strengthFromNode(node) == UCOL_TERTIARY && !isTailoredNode(node) &&
+                                previousWeightIndex < 0) {
+                            previousWeightIndex = i;
+                            previousWeight16 = weight16FromNode(node);
+                        }
+                    } while(strengthFromNode(node) > UCOL_SECONDARY);
+                    U_ASSERT(!isTailoredNode(node));
+                    if(strengthFromNode(node) == UCOL_SECONDARY) {
+                        s = weight16FromNode(node);
+                        do {
+                            i = previousIndexFromNode(node);
+                            node = nodes.elementAti(i);
+                        } while(strengthFromNode(node) > UCOL_PRIMARY);
+                        U_ASSERT(!isTailoredNode(node));
+                    } else {
+                        U_ASSERT(!nodeHasBefore2(node));
+                        s = Collation::COMMON_WEIGHT16;
+                    }
+                    p = weight32FromNode(node);
+                    weight16 = rootElements.getTertiaryBefore(p, s, weight16);
+                    U_ASSERT((weight16 & ~Collation::ONLY_TERTIARY_MASK) == 0);
+                }
+                // Find or insert the new explicit weight before the current one.
+                if(previousWeightIndex >= 0 && weight16 == previousWeight16) {
+                    // Tailor after the last node between adjacent root nodes.
+                    index = previousIndex;
+                } else {
+                    node = nodeFromWeight16(weight16) | nodeFromStrength(strength);
+                    index = insertNodeBetween(previousIndex, index, node, errorCode);
+                }
+            }
+        } else {
+            // Found a stronger node with implied strength-common weight.
+            int64_t hasBefore3 = 0;
+            if(strength == UCOL_SECONDARY) {
+                U_ASSERT(!nodeHasBefore2(node));
+                // Move the HAS_BEFORE3 flag from the parent node
+                // to the new secondary common node.
+                hasBefore3 = node & HAS_BEFORE3;
+                node = (node & ~(int64_t)HAS_BEFORE3) | HAS_BEFORE2;
+            } else {
+                U_ASSERT(!nodeHasBefore3(node));
+                node |= HAS_BEFORE3;
+            }
+            nodes.setElementAt(node, index);
+            int32_t nextIndex = nextIndexFromNode(node);
+            // Insert default nodes with weights 02 and 05, reset to the 02 node.
+            node = nodeFromWeight16(BEFORE_WEIGHT16) | nodeFromStrength(strength);
+            index = insertNodeBetween(index, nextIndex, node, errorCode);
+            node = nodeFromWeight16(Collation::COMMON_WEIGHT16) | hasBefore3 |
+                    nodeFromStrength(strength);
+            insertNodeBetween(index, nextIndex, node, errorCode);
+        }
+        // Strength of the temporary CE = strength of its reset position.
+        // Code above raises an error if the before-strength is stronger.
+        strength = ceStrength(ces[cesLength - 1]);
+    }
+    if(U_FAILURE(errorCode)) {
+        parserErrorReason = "inserting reset position for &[before n]";
+        return;
+    }
+    ces[cesLength - 1] = tempCEFromIndexAndStrength(index, strength);
+}
+
+int64_t
+CollationBuilder::getSpecialResetPosition(const UnicodeString &str,
+                                          const char *&parserErrorReason, UErrorCode &errorCode) {
+    U_ASSERT(str.length() == 2);
+    int64_t ce;
+    int32_t strength = UCOL_PRIMARY;
+    UBool isBoundary = FALSE;
+    UChar32 pos = str.charAt(1) - CollationRuleParser::POS_BASE;
+    U_ASSERT(0 <= pos && pos <= CollationRuleParser::LAST_TRAILING);
+    switch(pos) {
+    case CollationRuleParser::FIRST_TERTIARY_IGNORABLE:
+        // Quaternary CEs are not supported.
+        // Non-zero quaternary weights are possible only on tertiary or stronger CEs.
+        return 0;
+    case CollationRuleParser::LAST_TERTIARY_IGNORABLE:
+        return 0;
+    case CollationRuleParser::FIRST_SECONDARY_IGNORABLE: {
+        // Look for a tailored tertiary node after [0, 0, 0].
+        int32_t index = findOrInsertNodeForRootCE(0, UCOL_TERTIARY, errorCode);
+        if(U_FAILURE(errorCode)) { return 0; }
+        int64_t node = nodes.elementAti(index);
+        if((index = nextIndexFromNode(node)) != 0) {
+            node = nodes.elementAti(index);
+            U_ASSERT(strengthFromNode(node) <= UCOL_TERTIARY);
+            if(isTailoredNode(node) && strengthFromNode(node) == UCOL_TERTIARY) {
+                return tempCEFromIndexAndStrength(index, UCOL_TERTIARY);
+            }
+        }
+        return rootElements.getFirstTertiaryCE();
+        // No need to look for nodeHasAnyBefore() on a tertiary node.
+    }
+    case CollationRuleParser::LAST_SECONDARY_IGNORABLE:
+        ce = rootElements.getLastTertiaryCE();
+        strength = UCOL_TERTIARY;
+        break;
+    case CollationRuleParser::FIRST_PRIMARY_IGNORABLE: {
+        // Look for a tailored secondary node after [0, 0, *].
+        int32_t index = findOrInsertNodeForRootCE(0, UCOL_SECONDARY, errorCode);
+        if(U_FAILURE(errorCode)) { return 0; }
+        int64_t node = nodes.elementAti(index);
+        while((index = nextIndexFromNode(node)) != 0) {
+            node = nodes.elementAti(index);
+            strength = strengthFromNode(node);
+            if(strength < UCOL_SECONDARY) { break; }
+            if(strength == UCOL_SECONDARY) {
+                if(isTailoredNode(node)) {
+                    if(nodeHasBefore3(node)) {
+                        index = nextIndexFromNode(nodes.elementAti(nextIndexFromNode(node)));
+                        U_ASSERT(isTailoredNode(nodes.elementAti(index)));
+                    }
+                    return tempCEFromIndexAndStrength(index, UCOL_SECONDARY);
+                } else {
+                    break;
+                }
+            }
+        }
+        ce = rootElements.getFirstSecondaryCE();
+        strength = UCOL_SECONDARY;
+        break;
+    }
+    case CollationRuleParser::LAST_PRIMARY_IGNORABLE:
+        ce = rootElements.getLastSecondaryCE();
+        strength = UCOL_SECONDARY;
+        break;
+    case CollationRuleParser::FIRST_VARIABLE:
+        ce = rootElements.getFirstPrimaryCE();
+        isBoundary = TRUE;  // FractionalUCA.txt: FDD1 00A0, SPACE first primary
+        break;
+    case CollationRuleParser::LAST_VARIABLE:
+        ce = rootElements.lastCEWithPrimaryBefore(variableTop + 1);
+        break;
+    case CollationRuleParser::FIRST_REGULAR:
+        ce = rootElements.firstCEWithPrimaryAtLeast(variableTop + 1);
+        isBoundary = TRUE;  // FractionalUCA.txt: FDD1 263A, SYMBOL first primary
+        break;
+    case CollationRuleParser::LAST_REGULAR:
+        // Use the Hani-first-primary rather than the actual last "regular" CE before it,
+        // for backward compatibility with behavior before the introduction of
+        // script-first-primary CEs in the root collator.
+        ce = rootElements.firstCEWithPrimaryAtLeast(
+            baseData->getFirstPrimaryForGroup(USCRIPT_HAN));
+        break;
+    case CollationRuleParser::FIRST_IMPLICIT: {
+        uint32_t ce32 = baseData->getCE32(0x4e00);
+        U_ASSERT(Collation::hasCE32Tag(ce32, Collation::OFFSET_TAG));
+        ce = baseData->getCEFromOffsetCE32(0x4e00, ce32);
+        break;
+    }
+    case CollationRuleParser::LAST_IMPLICIT:
+        // We do not support tailoring to an unassigned-implicit CE.
+        errorCode = U_UNSUPPORTED_ERROR;
+        parserErrorReason = "reset to [last implicit] not supported";
+        return 0;
+    case CollationRuleParser::FIRST_TRAILING:
+        ce = Collation::makeCE(Collation::FIRST_TRAILING_PRIMARY);
+        isBoundary = TRUE;  // trailing first primary (there is no mapping for it)
+        break;
+    case CollationRuleParser::LAST_TRAILING:
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        parserErrorReason = "LDML forbids tailoring to U+FFFF";
+        return 0;
+    default:
+        U_ASSERT(FALSE);
+        return 0;
+    }
+
+    int32_t index = findOrInsertNodeForRootCE(ce, strength, errorCode);
+    if(U_FAILURE(errorCode)) { return 0; }
+    int64_t node = nodes.elementAti(index);
+    if((pos & 1) == 0) {
+        // even pos = [first xyz]
+        if(!nodeHasAnyBefore(node) && isBoundary) {
+            // A <group> first primary boundary is artificially added to FractionalUCA.txt.
+            // It is reachable via its special contraction, but is not normally used.
+            // Find the first character tailored after the boundary CE,
+            // or the first real root CE after it.
+            if((index = nextIndexFromNode(node)) != 0) {
+                // If there is a following node, then it must be tailored
+                // because there are no root CEs with a boundary primary
+                // and non-common secondary/tertiary weights.
+                node = nodes.elementAti(index);
+                U_ASSERT(isTailoredNode(node));
+                ce = tempCEFromIndexAndStrength(index, strength);
+            } else {
+                U_ASSERT(strength == UCOL_PRIMARY);
+                uint32_t p = (uint32_t)(ce >> 32);
+                int32_t pIndex = rootElements.findPrimary(p);
+                UBool isCompressible = baseData->isCompressiblePrimary(p);
+                p = rootElements.getPrimaryAfter(p, pIndex, isCompressible);
+                ce = Collation::makeCE(p);
+                index = findOrInsertNodeForRootCE(ce, UCOL_PRIMARY, errorCode);
+                if(U_FAILURE(errorCode)) { return 0; }
+                node = nodes.elementAti(index);
+            }
+        }
+        if(nodeHasAnyBefore(node)) {
+            // Get the first node that was tailored before this one at a weaker strength.
+            if(nodeHasBefore2(node)) {
+                index = nextIndexFromNode(nodes.elementAti(nextIndexFromNode(node)));
+                node = nodes.elementAti(index);
+            }
+            if(nodeHasBefore3(node)) {
+                index = nextIndexFromNode(nodes.elementAti(nextIndexFromNode(node)));
+            }
+            U_ASSERT(isTailoredNode(nodes.elementAti(index)));
+            ce = tempCEFromIndexAndStrength(index, strength);
+        }
+    } else {
+        // odd pos = [last xyz]
+        // Find the last node that was tailored after the [last xyz]
+        // at a strength no greater than the position's strength.
+        for(;;) {
+            int32_t nextIndex = nextIndexFromNode(node);
+            if(nextIndex == 0) { break; }
+            int64_t nextNode = nodes.elementAti(nextIndex);
+            if(strengthFromNode(nextNode) < strength) { break; }
+            index = nextIndex;
+            node = nextNode;
+        }
+        // Do not make a temporary CE for a root node.
+        // This last node might be the node for the root CE itself,
+        // or a node with a common secondary or tertiary weight.
+        if(isTailoredNode(node)) {
+            ce = tempCEFromIndexAndStrength(index, strength);
+        }
+    }
+    return ce;
+}
+
+void
+CollationBuilder::addRelation(int32_t strength, const UnicodeString &prefix,
+                              const UnicodeString &str, const UnicodeString &extension,
+                              const char *&parserErrorReason, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    UnicodeString nfdPrefix;
+    if(!prefix.isEmpty()) {
+        nfd.normalize(prefix, nfdPrefix, errorCode);
+        if(U_FAILURE(errorCode)) {
+            parserErrorReason = "normalizing the relation prefix";
+            return;
+        }
+    }
+    UnicodeString nfdString = nfd.normalize(str, errorCode);
+    if(U_FAILURE(errorCode)) {
+        parserErrorReason = "normalizing the relation string";
+        return;
+    }
+
+    // The runtime code decomposes Hangul syllables on the fly,
+    // with recursive processing but without making the Jamo pieces visible for matching.
+    // It does not work with certain types of contextual mappings.
+    int32_t nfdLength = nfdString.length();
+    if(nfdLength >= 2) {
+        UChar c = nfdString.charAt(0);
+        if(Hangul::isJamoL(c) || Hangul::isJamoV(c)) {
+            // While handling a Hangul syllable, contractions starting with Jamo L or V
+            // would not see the following Jamo of that syllable.
+            errorCode = U_UNSUPPORTED_ERROR;
+            parserErrorReason = "contractions starting with conjoining Jamo L or V not supported";
+            return;
+        }
+        c = nfdString.charAt(nfdLength - 1);
+        if(Hangul::isJamoL(c) ||
+                (Hangul::isJamoV(c) && Hangul::isJamoL(nfdString.charAt(nfdLength - 2)))) {
+            // A contraction ending with Jamo L or L+V would require
+            // generating Hangul syllables in addTailComposites() (588 for a Jamo L),
+            // or decomposing a following Hangul syllable on the fly, during contraction matching.
+            errorCode = U_UNSUPPORTED_ERROR;
+            parserErrorReason = "contractions ending with conjoining Jamo L or L+V not supported";
+            return;
+        }
+        // A Hangul syllable completely inside a contraction is ok.
+    }
+    // Note: If there is a prefix, then the parser checked that
+    // both the prefix and the string beging with NFC boundaries (not Jamo V or T).
+    // Therefore: prefix.isEmpty() || !isJamoVOrT(nfdString.charAt(0))
+    // (While handling a Hangul syllable, prefixes on Jamo V or T
+    // would not see the previous Jamo of that syllable.)
+
+    if(strength != UCOL_IDENTICAL) {
+        // Find the node index after which we insert the new tailored node.
+        int32_t index = findOrInsertNodeForCEs(strength, parserErrorReason, errorCode);
+        U_ASSERT(cesLength > 0);
+        int64_t ce = ces[cesLength - 1];
+        if(strength == UCOL_PRIMARY && !isTempCE(ce) && (uint32_t)(ce >> 32) == 0) {
+            // There is no primary gap between ignorables and the space-first-primary.
+            errorCode = U_UNSUPPORTED_ERROR;
+            parserErrorReason = "tailoring primary after ignorables not supported";
+            return;
+        }
+        if(strength == UCOL_QUATERNARY && ce == 0) {
+            // The CE data structure does not support non-zero quaternary weights
+            // on tertiary ignorables.
+            errorCode = U_UNSUPPORTED_ERROR;
+            parserErrorReason = "tailoring quaternary after tertiary ignorables not supported";
+            return;
+        }
+        // Insert the new tailored node.
+        index = insertTailoredNodeAfter(index, strength, errorCode);
+        if(U_FAILURE(errorCode)) {
+            parserErrorReason = "modifying collation elements";
+            return;
+        }
+        // Strength of the temporary CE:
+        // The new relation may yield a stronger CE but not a weaker one.
+        int32_t tempStrength = ceStrength(ce);
+        if(strength < tempStrength) { tempStrength = strength; }
+        ces[cesLength - 1] = tempCEFromIndexAndStrength(index, tempStrength);
+    }
+
+    setCaseBits(nfdString, parserErrorReason, errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+
+    int32_t cesLengthBeforeExtension = cesLength;
+    if(!extension.isEmpty()) {
+        UnicodeString nfdExtension = nfd.normalize(extension, errorCode);
+        if(U_FAILURE(errorCode)) {
+            parserErrorReason = "normalizing the relation extension";
+            return;
+        }
+        cesLength = dataBuilder->getCEs(nfdExtension, ces, cesLength);
+        if(cesLength > Collation::MAX_EXPANSION_LENGTH) {
+            errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+            parserErrorReason =
+                "extension string adds too many collation elements (more than 31 total)";
+            return;
+        }
+    }
+    uint32_t ce32 = Collation::UNASSIGNED_CE32;
+    if((prefix != nfdPrefix || str != nfdString) &&
+            !ignorePrefix(prefix, errorCode) && !ignoreString(str, errorCode)) {
+        // Map from the original input to the CEs.
+        // We do this in case the canonical closure is incomplete,
+        // so that it is possible to explicitly provide the missing mappings.
+        ce32 = addIfDifferent(prefix, str, ces, cesLength, ce32, errorCode);
+    }
+    addWithClosure(nfdPrefix, nfdString, ces, cesLength, ce32, errorCode);
+    if(U_FAILURE(errorCode)) {
+        parserErrorReason = "writing collation elements";
+        return;
+    }
+    cesLength = cesLengthBeforeExtension;
+}
+
+int32_t
+CollationBuilder::findOrInsertNodeForCEs(int32_t strength, const char *&parserErrorReason,
+                                         UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    U_ASSERT(UCOL_PRIMARY <= strength && strength <= UCOL_QUATERNARY);
+
+    // Find the last CE that is at least as "strong" as the requested difference.
+    // Note: Stronger is smaller (UCOL_PRIMARY=0).
+    int64_t ce;
+    for(;; --cesLength) {
+        if(cesLength == 0) {
+            ce = ces[0] = 0;
+            cesLength = 1;
+            break;
+        } else {
+            ce = ces[cesLength - 1];
+        }
+        if(ceStrength(ce) <= strength) { break; }
+    }
+
+    if(isTempCE(ce)) {
+        // No need to findCommonNode() here for lower levels
+        // because insertTailoredNodeAfter() will do that anyway.
+        return indexFromTempCE(ce);
+    }
+
+    // root CE
+    if((uint8_t)(ce >> 56) == Collation::UNASSIGNED_IMPLICIT_BYTE) {
+        errorCode = U_UNSUPPORTED_ERROR;
+        parserErrorReason = "tailoring relative to an unassigned code point not supported";
+        return 0;
+    }
+    return findOrInsertNodeForRootCE(ce, strength, errorCode);
+}
+
+int32_t
+CollationBuilder::findOrInsertNodeForRootCE(int64_t ce, int32_t strength, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    U_ASSERT((uint8_t)(ce >> 56) != Collation::UNASSIGNED_IMPLICIT_BYTE);
+
+    // Find or insert the node for each of the root CE's weights,
+    // down to the requested level/strength.
+    // Root CEs must have common=zero quaternary weights (for which we never insert any nodes).
+    U_ASSERT((ce & 0xc0) == 0);
+    int32_t index = findOrInsertNodeForPrimary((uint32_t)(ce >> 32) , errorCode);
+    if(strength >= UCOL_SECONDARY) {
+        uint32_t lower32 = (uint32_t)ce;
+        index = findOrInsertWeakNode(index, lower32 >> 16, UCOL_SECONDARY, errorCode);
+        if(strength >= UCOL_TERTIARY) {
+            index = findOrInsertWeakNode(index, lower32 & Collation::ONLY_TERTIARY_MASK,
+                                         UCOL_TERTIARY, errorCode);
+        }
+    }
+    return index;
+}
+
+namespace {
+
+/**
+ * Like Java Collections.binarySearch(List, key, Comparator).
+ *
+ * @return the index>=0 where the item was found,
+ *         or the index<0 for inserting the string at ~index in sorted order
+ *         (index into rootPrimaryIndexes)
+ */
+int32_t
+binarySearchForRootPrimaryNode(const int32_t *rootPrimaryIndexes, int32_t length,
+                               const int64_t *nodes, uint32_t p) {
+    if(length == 0) { return ~0; }
+    int32_t start = 0;
+    int32_t limit = length;
+    for (;;) {
+        int32_t i = (start + limit) / 2;
+        int64_t node = nodes[rootPrimaryIndexes[i]];
+        uint32_t nodePrimary = (uint32_t)(node >> 32);  // weight32FromNode(node)
+        if (p == nodePrimary) {
+            return i;
+        } else if (p < nodePrimary) {
+            if (i == start) {
+                return ~start;  // insert s before i
+            }
+            limit = i;
+        } else {
+            if (i == start) {
+                return ~(start + 1);  // insert s after i
+            }
+            start = i;
+        }
+    }
+}
+
+}  // namespace
+
+int32_t
+CollationBuilder::findOrInsertNodeForPrimary(uint32_t p, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+
+    int32_t rootIndex = binarySearchForRootPrimaryNode(
+        rootPrimaryIndexes.getBuffer(), rootPrimaryIndexes.size(), nodes.getBuffer(), p);
+    if(rootIndex >= 0) {
+        return rootPrimaryIndexes.elementAti(rootIndex);
+    } else {
+        // Start a new list of nodes with this primary.
+        int32_t index = nodes.size();
+        nodes.addElement(nodeFromWeight32(p), errorCode);
+        rootPrimaryIndexes.insertElementAt(index, ~rootIndex, errorCode);
+        return index;
+    }
+}
+
+int32_t
+CollationBuilder::findOrInsertWeakNode(int32_t index, uint32_t weight16, int32_t level, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    U_ASSERT(0 <= index && index < nodes.size());
+
+    U_ASSERT(weight16 == 0 || weight16 >= Collation::COMMON_WEIGHT16);
+    // Only reset-before inserts common weights.
+    if(weight16 == Collation::COMMON_WEIGHT16) {
+        return findCommonNode(index, level);
+    }
+    // Find the root CE's weight for this level.
+    // Postpone insertion if not found:
+    // Insert the new root node before the next stronger node,
+    // or before the next root node with the same strength and a larger weight.
+    int64_t node = nodes.elementAti(index);
+    int32_t nextIndex;
+    while((nextIndex = nextIndexFromNode(node)) != 0) {
+        node = nodes.elementAti(nextIndex);
+        int32_t nextStrength = strengthFromNode(node);
+        if(nextStrength <= level) {
+            // Insert before a stronger node.
+            if(nextStrength < level) { break; }
+            // nextStrength == level
+            if(!isTailoredNode(node)) {
+                uint32_t nextWeight16 = weight16FromNode(node);
+                if(nextWeight16 == weight16) {
+                    // Found the node for the root CE up to this level.
+                    return nextIndex;
+                }
+                // Insert before a node with a larger same-strength weight.
+                if(nextWeight16 > weight16) { break; }
+            }
+        }
+        // Skip the next node.
+        index = nextIndex;
+    }
+    node = nodeFromWeight16(weight16) | nodeFromStrength(level);
+    return insertNodeBetween(index, nextIndex, node, errorCode);
+}
+
+int32_t
+CollationBuilder::insertTailoredNodeAfter(int32_t index, int32_t strength, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    U_ASSERT(0 <= index && index < nodes.size());
+    if(strength >= UCOL_SECONDARY) {
+        index = findCommonNode(index, UCOL_SECONDARY);
+        if(strength >= UCOL_TERTIARY) {
+            index = findCommonNode(index, UCOL_TERTIARY);
+        }
+    }
+    // Postpone insertion:
+    // Insert the new node before the next one with a strength at least as strong.
+    int64_t node = nodes.elementAti(index);
+    int32_t nextIndex;
+    while((nextIndex = nextIndexFromNode(node)) != 0) {
+        node = nodes.elementAti(nextIndex);
+        if(strengthFromNode(node) <= strength) { break; }
+        // Skip the next node which has a weaker (larger) strength than the new one.
+        index = nextIndex;
+    }
+    node = IS_TAILORED | nodeFromStrength(strength);
+    return insertNodeBetween(index, nextIndex, node, errorCode);
+}
+
+int32_t
+CollationBuilder::insertNodeBetween(int32_t index, int32_t nextIndex, int64_t node,
+                                    UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    U_ASSERT(previousIndexFromNode(node) == 0);
+    U_ASSERT(nextIndexFromNode(node) == 0);
+    U_ASSERT(nextIndexFromNode(nodes.elementAti(index)) == nextIndex);
+    // Append the new node and link it to the existing nodes.
+    int32_t newIndex = nodes.size();
+    node |= nodeFromPreviousIndex(index) | nodeFromNextIndex(nextIndex);
+    nodes.addElement(node, errorCode);
+    if(U_FAILURE(errorCode)) { return 0; }
+    // nodes[index].nextIndex = newIndex
+    node = nodes.elementAti(index);
+    nodes.setElementAt(changeNodeNextIndex(node, newIndex), index);
+    // nodes[nextIndex].previousIndex = newIndex
+    if(nextIndex != 0) {
+        node = nodes.elementAti(nextIndex);
+        nodes.setElementAt(changeNodePreviousIndex(node, newIndex), nextIndex);
+    }
+    return newIndex;
+}
+
+int32_t
+CollationBuilder::findCommonNode(int32_t index, int32_t strength) const {
+    U_ASSERT(UCOL_SECONDARY <= strength && strength <= UCOL_TERTIARY);
+    int64_t node = nodes.elementAti(index);
+    if(strengthFromNode(node) >= strength) {
+        // The current node is no stronger.
+        return index;
+    }
+    if(strength == UCOL_SECONDARY ? !nodeHasBefore2(node) : !nodeHasBefore3(node)) {
+        // The current node implies the strength-common weight.
+        return index;
+    }
+    index = nextIndexFromNode(node);
+    node = nodes.elementAti(index);
+    U_ASSERT(!isTailoredNode(node) && strengthFromNode(node) == strength &&
+            weight16FromNode(node) == BEFORE_WEIGHT16);
+    // Skip to the explicit common node.
+    do {
+        index = nextIndexFromNode(node);
+        node = nodes.elementAti(index);
+        U_ASSERT(strengthFromNode(node) >= strength);
+    } while(isTailoredNode(node) || strengthFromNode(node) > strength);
+    U_ASSERT(weight16FromNode(node) == Collation::COMMON_WEIGHT16);
+    return index;
+}
+
+void
+CollationBuilder::setCaseBits(const UnicodeString &nfdString,
+                              const char *&parserErrorReason, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    int32_t numTailoredPrimaries = 0;
+    for(int32_t i = 0; i < cesLength; ++i) {
+        if(ceStrength(ces[i]) == UCOL_PRIMARY) { ++numTailoredPrimaries; }
+    }
+    // We should not be able to get too many case bits because
+    // cesLength<=31==MAX_EXPANSION_LENGTH.
+    // 31 pairs of case bits fit into an int64_t without setting its sign bit.
+    U_ASSERT(numTailoredPrimaries <= 31);
+
+    int64_t cases = 0;
+    if(numTailoredPrimaries > 0) {
+        const UChar *s = nfdString.getBuffer();
+        UTF16CollationIterator baseCEs(baseData, FALSE, s, s, s + nfdString.length());
+        int32_t baseCEsLength = baseCEs.fetchCEs(errorCode) - 1;
+        if(U_FAILURE(errorCode)) {
+            parserErrorReason = "fetching root CEs for tailored string";
+            return;
+        }
+        U_ASSERT(baseCEsLength >= 0 && baseCEs.getCE(baseCEsLength) == Collation::NO_CE);
+
+        uint32_t lastCase = 0;
+        int32_t numBasePrimaries = 0;
+        for(int32_t i = 0; i < baseCEsLength; ++i) {
+            int64_t ce = baseCEs.getCE(i);
+            if((ce >> 32) != 0) {
+                ++numBasePrimaries;
+                uint32_t c = ((uint32_t)ce >> 14) & 3;
+                U_ASSERT(c == 0 || c == 2);  // lowercase or uppercase, no mixed case in any base CE
+                if(numBasePrimaries < numTailoredPrimaries) {
+                    cases |= (int64_t)c << ((numBasePrimaries - 1) * 2);
+                } else if(numBasePrimaries == numTailoredPrimaries) {
+                    lastCase = c;
+                } else if(c != lastCase) {
+                    // There are more base primary CEs than tailored primaries.
+                    // Set mixed case if the case bits of the remainder differ.
+                    lastCase = 1;
+                    // Nothing more can change.
+                    break;
+                }
+            }
+        }
+        if(numBasePrimaries >= numTailoredPrimaries) {
+            cases |= (int64_t)lastCase << ((numTailoredPrimaries - 1) * 2);
+        }
+    }
+
+    for(int32_t i = 0; i < cesLength; ++i) {
+        int64_t ce = ces[i] & INT64_C(0xffffffffffff3fff);  // clear old case bits
+        int32_t strength = ceStrength(ce);
+        if(strength == UCOL_PRIMARY) {
+            ce |= (cases & 3) << 14;
+            cases >>= 2;
+        } else if(strength == UCOL_TERTIARY) {
+            // Tertiary CEs must have uppercase bits.
+            // See the LDML spec, and comments in class CollationCompare.
+            ce |= 0x8000;
+        }
+        // Tertiary ignorable CEs must have 0 case bits.
+        // We set 0 case bits for secondary CEs too
+        // since currently only U+0345 is cased and maps to a secondary CE,
+        // and it is lowercase. Other secondaries are uncased.
+        // See [[:Cased:]&[:uca1=:]] where uca1 queries the root primary weight.
+        ces[i] = ce;
+    }
+}
+
+void
+CollationBuilder::suppressContractions(const UnicodeSet &set, const char *&parserErrorReason,
+                                       UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    dataBuilder->suppressContractions(set, errorCode);
+    if(U_FAILURE(errorCode)) {
+        parserErrorReason = "application of [suppressContractions [set]] failed";
+    }
+}
+
+void
+CollationBuilder::optimize(const UnicodeSet &set, const char *& /* parserErrorReason */,
+                           UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    optimizeSet.addAll(set);
+}
+
+uint32_t
+CollationBuilder::addWithClosure(const UnicodeString &nfdPrefix, const UnicodeString &nfdString,
+                                 const int64_t newCEs[], int32_t newCEsLength, uint32_t ce32,
+                                 UErrorCode &errorCode) {
+    // Map from the NFD input to the CEs.
+    ce32 = addIfDifferent(nfdPrefix, nfdString, newCEs, newCEsLength, ce32, errorCode);
+    ce32 = addOnlyClosure(nfdPrefix, nfdString, newCEs, newCEsLength, ce32, errorCode);
+    addTailComposites(nfdPrefix, nfdString, errorCode);
+    return ce32;
+}
+
+uint32_t
+CollationBuilder::addOnlyClosure(const UnicodeString &nfdPrefix, const UnicodeString &nfdString,
+                                 const int64_t newCEs[], int32_t newCEsLength, uint32_t ce32,
+                                 UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return ce32; }
+
+    // Map from canonically equivalent input to the CEs. (But not from the all-NFD input.)
+    if(nfdPrefix.isEmpty()) {
+        CanonicalIterator stringIter(nfdString, errorCode);
+        if(U_FAILURE(errorCode)) { return ce32; }
+        UnicodeString prefix;
+        for(;;) {
+            UnicodeString str = stringIter.next();
+            if(str.isBogus()) { break; }
+            if(ignoreString(str, errorCode) || str == nfdString) { continue; }
+            ce32 = addIfDifferent(prefix, str, newCEs, newCEsLength, ce32, errorCode);
+            if(U_FAILURE(errorCode)) { return ce32; }
+        }
+    } else {
+        CanonicalIterator prefixIter(nfdPrefix, errorCode);
+        CanonicalIterator stringIter(nfdString, errorCode);
+        if(U_FAILURE(errorCode)) { return ce32; }
+        for(;;) {
+            UnicodeString prefix = prefixIter.next();
+            if(prefix.isBogus()) { break; }
+            if(ignorePrefix(prefix, errorCode)) { continue; }
+            UBool samePrefix = prefix == nfdPrefix;
+            for(;;) {
+                UnicodeString str = stringIter.next();
+                if(str.isBogus()) { break; }
+                if(ignoreString(str, errorCode) || (samePrefix && str == nfdString)) { continue; }
+                ce32 = addIfDifferent(prefix, str, newCEs, newCEsLength, ce32, errorCode);
+                if(U_FAILURE(errorCode)) { return ce32; }
+            }
+            stringIter.reset();
+        }
+    }
+    return ce32;
+}
+
+void
+CollationBuilder::addTailComposites(const UnicodeString &nfdPrefix, const UnicodeString &nfdString,
+                                    UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+
+    // Look for the last starter in the NFD string.
+    UChar32 lastStarter;
+    int32_t indexAfterLastStarter = nfdString.length();
+    for(;;) {
+        if(indexAfterLastStarter == 0) { return; }  // no starter at all
+        lastStarter = nfdString.char32At(indexAfterLastStarter - 1);
+        if(nfd.getCombiningClass(lastStarter) == 0) { break; }
+        indexAfterLastStarter -= U16_LENGTH(lastStarter);
+    }
+    // No closure to Hangul syllables since we decompose them on the fly.
+    if(Hangul::isJamoL(lastStarter)) { return; }
+
+    // Are there any composites whose decomposition starts with the lastStarter?
+    // Note: Normalizer2Impl does not currently return start sets for NFC_QC=Maybe characters.
+    // We might find some more equivalent mappings here if it did.
+    UnicodeSet composites;
+    if(!nfcImpl.getCanonStartSet(lastStarter, composites)) { return; }
+
+    UnicodeString decomp;
+    UnicodeString newNFDString, newString;
+    int64_t newCEs[Collation::MAX_EXPANSION_LENGTH];
+    UnicodeSetIterator iter(composites);
+    while(iter.next()) {
+        U_ASSERT(!iter.isString());
+        UChar32 composite = iter.getCodepoint();
+        nfd.getDecomposition(composite, decomp);
+        if(!mergeCompositeIntoString(nfdString, indexAfterLastStarter, composite, decomp,
+                                     newNFDString, newString, errorCode)) {
+            continue;
+        }
+        int32_t newCEsLength = dataBuilder->getCEs(nfdPrefix, newNFDString, newCEs, 0);
+        if(newCEsLength > Collation::MAX_EXPANSION_LENGTH) {
+            // Ignore mappings that we cannot store.
+            continue;
+        }
+        // Note: It is possible that the newCEs do not make use of the mapping
+        // for which we are adding the tail composites, in which case we might be adding
+        // unnecessary mappings.
+        // For example, when we add tail composites for ae^ (^=combining circumflex),
+        // UCA discontiguous-contraction matching does not find any matches
+        // for ae_^ (_=any combining diacritic below) *unless* there is also
+        // a contraction mapping for ae.
+        // Thus, if there is no ae contraction, then the ae^ mapping is ignored
+        // while fetching the newCEs for ae_^.
+        // TODO: Try to detect this effectively.
+        // (Alternatively, print a warning when prefix contractions are missing.)
+
+        // We do not need an explicit mapping for the NFD strings.
+        // It is fine if the NFD input collates like this via a sequence of mappings.
+        // It also saves a little bit of space, and may reduce the set of characters with contractions.
+        uint32_t ce32 = addIfDifferent(nfdPrefix, newString,
+                                       newCEs, newCEsLength, Collation::UNASSIGNED_CE32, errorCode);
+        if(ce32 != Collation::UNASSIGNED_CE32) {
+            // was different, was added
+            addOnlyClosure(nfdPrefix, newNFDString, newCEs, newCEsLength, ce32, errorCode);
+        }
+    }
+}
+
+UBool
+CollationBuilder::mergeCompositeIntoString(const UnicodeString &nfdString,
+                                           int32_t indexAfterLastStarter,
+                                           UChar32 composite, const UnicodeString &decomp,
+                                           UnicodeString &newNFDString, UnicodeString &newString,
+                                           UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    U_ASSERT(nfdString.char32At(indexAfterLastStarter - 1) == decomp.char32At(0));
+    int32_t lastStarterLength = decomp.moveIndex32(0, 1);
+    if(lastStarterLength == decomp.length()) {
+        // Singleton decompositions should be found by addWithClosure()
+        // and the CanonicalIterator, so we can ignore them here.
+        return FALSE;
+    }
+    if(nfdString.compare(indexAfterLastStarter, 0x7fffffff,
+                         decomp, lastStarterLength, 0x7fffffff) == 0) {
+        // same strings, nothing new to be found here
+        return FALSE;
+    }
+
+    // Make new FCD strings that combine a composite, or its decomposition,
+    // into the nfdString's last starter and the combining marks following it.
+    // Make an NFD version, and a version with the composite.
+    newNFDString.setTo(nfdString, 0, indexAfterLastStarter);
+    newString.setTo(nfdString, 0, indexAfterLastStarter - lastStarterLength).append(composite);
+
+    // The following is related to discontiguous contraction matching,
+    // but builds only FCD strings (or else returns FALSE).
+    int32_t sourceIndex = indexAfterLastStarter;
+    int32_t decompIndex = lastStarterLength;
+    // Small optimization: We keep the source character across loop iterations
+    // because we do not always consume it,
+    // and then need not fetch it again nor look up its combining class again.
+    UChar32 sourceChar = U_SENTINEL;
+    // The cc variables need to be declared before the loop so that at the end
+    // they are set to the last combining classes seen.
+    uint8_t sourceCC = 0;
+    uint8_t decompCC = 0;
+    for(;;) {
+        if(sourceChar < 0) {
+            if(sourceIndex >= nfdString.length()) { break; }
+            sourceChar = nfdString.char32At(sourceIndex);
+            sourceCC = nfd.getCombiningClass(sourceChar);
+            U_ASSERT(sourceCC != 0);
+        }
+        // We consume a decomposition character in each iteration.
+        if(decompIndex >= decomp.length()) { break; }
+        UChar32 decompChar = decomp.char32At(decompIndex);
+        decompCC = nfd.getCombiningClass(decompChar);
+        // Compare the two characters and their combining classes.
+        if(decompCC == 0) {
+            // Unable to merge because the source contains a non-zero combining mark
+            // but the composite's decomposition contains another starter.
+            // The strings would not be equivalent.
+            return FALSE;
+        } else if(sourceCC < decompCC) {
+            // Composite + sourceChar would not be FCD.
+            return FALSE;
+        } else if(decompCC < sourceCC) {
+            newNFDString.append(decompChar);
+            decompIndex += U16_LENGTH(decompChar);
+        } else if(decompChar != sourceChar) {
+            // Blocked because same combining class.
+            return FALSE;
+        } else {  // match: decompChar == sourceChar
+            newNFDString.append(decompChar);
+            decompIndex += U16_LENGTH(decompChar);
+            sourceIndex += U16_LENGTH(decompChar);
+            sourceChar = U_SENTINEL;
+        }
+    }
+    // We are at the end of at least one of the two inputs.
+    if(sourceChar >= 0) {  // more characters from nfdString but not from decomp
+        if(sourceCC < decompCC) {
+            // Appending the next source character to the composite would not be FCD.
+            return FALSE;
+        }
+        newNFDString.append(nfdString, sourceIndex, 0x7fffffff);
+        newString.append(nfdString, sourceIndex, 0x7fffffff);
+    } else if(decompIndex < decomp.length()) {  // more characters from decomp, not from nfdString
+        newNFDString.append(decomp, decompIndex, 0x7fffffff);
+    }
+    U_ASSERT(nfd.isNormalized(newNFDString, errorCode));
+    U_ASSERT(fcd.isNormalized(newString, errorCode));
+    U_ASSERT(nfd.normalize(newString, errorCode) == newNFDString);  // canonically equivalent
+    return TRUE;
+}
+
+UBool
+CollationBuilder::ignorePrefix(const UnicodeString &s, UErrorCode &errorCode) const {
+    // Do not map non-FCD prefixes.
+    return !isFCD(s, errorCode);
+}
+
+UBool
+CollationBuilder::ignoreString(const UnicodeString &s, UErrorCode &errorCode) const {
+    // Do not map non-FCD strings.
+    // Do not map strings that start with Hangul syllables: We decompose those on the fly.
+    return !isFCD(s, errorCode) || Hangul::isHangul(s.charAt(0));
+}
+
+UBool
+CollationBuilder::isFCD(const UnicodeString &s, UErrorCode &errorCode) const {
+    return U_SUCCESS(errorCode) && fcd.isNormalized(s, errorCode);
+}
+
+void
+CollationBuilder::closeOverComposites(UErrorCode &errorCode) {
+    UnicodeSet composites(UNICODE_STRING_SIMPLE("[:NFD_QC=N:]"), errorCode);  // Java: static final
+    if(U_FAILURE(errorCode)) { return; }
+    // Hangul is decomposed on the fly during collation.
+    composites.remove(Hangul::HANGUL_BASE, Hangul::HANGUL_END);
+    UnicodeString prefix;  // empty
+    UnicodeString nfdString;
+    UnicodeSetIterator iter(composites);
+    while(iter.next()) {
+        U_ASSERT(!iter.isString());
+        nfd.getDecomposition(iter.getCodepoint(), nfdString);
+        cesLength = dataBuilder->getCEs(nfdString, ces, 0);
+        if(cesLength > Collation::MAX_EXPANSION_LENGTH) {
+            // Too many CEs from the decomposition (unusual), ignore this composite.
+            // We could add a capacity parameter to getCEs() and reallocate if necessary.
+            // However, this can only really happen in contrived cases.
+            continue;
+        }
+        const UnicodeString &composite(iter.getString());
+        addIfDifferent(prefix, composite, ces, cesLength, Collation::UNASSIGNED_CE32, errorCode);
+    }
+}
+
+uint32_t
+CollationBuilder::addIfDifferent(const UnicodeString &prefix, const UnicodeString &str,
+                                 const int64_t newCEs[], int32_t newCEsLength, uint32_t ce32,
+                                 UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return ce32; }
+    int64_t oldCEs[Collation::MAX_EXPANSION_LENGTH];
+    int32_t oldCEsLength = dataBuilder->getCEs(prefix, str, oldCEs, 0);
+    if(!sameCEs(newCEs, newCEsLength, oldCEs, oldCEsLength)) {
+        if(ce32 == Collation::UNASSIGNED_CE32) {
+            ce32 = dataBuilder->encodeCEs(newCEs, newCEsLength, errorCode);
+        }
+        dataBuilder->addCE32(prefix, str, ce32, errorCode);
+    }
+    return ce32;
+}
+
+UBool
+CollationBuilder::sameCEs(const int64_t ces1[], int32_t ces1Length,
+                          const int64_t ces2[], int32_t ces2Length) {
+    if(ces1Length != ces2Length) {
+        return FALSE;
+    }
+    U_ASSERT(ces1Length <= Collation::MAX_EXPANSION_LENGTH);
+    for(int32_t i = 0; i < ces1Length; ++i) {
+        if(ces1[i] != ces2[i]) { return FALSE; }
+    }
+    return TRUE;
+}
+
+#ifdef DEBUG_COLLATION_BUILDER
+
+uint32_t
+alignWeightRight(uint32_t w) {
+    if(w != 0) {
+        while((w & 0xff) == 0) { w >>= 8; }
+    }
+    return w;
+}
+
+#endif
+
+void
+CollationBuilder::makeTailoredCEs(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+
+    CollationWeights primaries, secondaries, tertiaries;
+    int64_t *nodesArray = nodes.getBuffer();
+
+    for(int32_t rpi = 0; rpi < rootPrimaryIndexes.size(); ++rpi) {
+        int32_t i = rootPrimaryIndexes.elementAti(rpi);
+        int64_t node = nodesArray[i];
+        uint32_t p = weight32FromNode(node);
+        uint32_t s = p == 0 ? 0 : Collation::COMMON_WEIGHT16;
+        uint32_t t = s;
+        uint32_t q = 0;
+        UBool pIsTailored = FALSE;
+        UBool sIsTailored = FALSE;
+        UBool tIsTailored = FALSE;
+#ifdef DEBUG_COLLATION_BUILDER
+        printf("\nprimary     %lx\n", (long)alignWeightRight(p));
+#endif
+        int32_t pIndex = p == 0 ? 0 : rootElements.findPrimary(p);
+        int32_t nextIndex = nextIndexFromNode(node);
+        while(nextIndex != 0) {
+            i = nextIndex;
+            node = nodesArray[i];
+            nextIndex = nextIndexFromNode(node);
+            int32_t strength = strengthFromNode(node);
+            if(strength == UCOL_QUATERNARY) {
+                U_ASSERT(isTailoredNode(node));
+#ifdef DEBUG_COLLATION_BUILDER
+                printf("      quat+     ");
+#endif
+                if(q == 3) {
+                    errorCode = U_BUFFER_OVERFLOW_ERROR;
+                    errorReason = "quaternary tailoring gap too small";
+                    return;
+                }
+                ++q;
+            } else {
+                if(strength == UCOL_TERTIARY) {
+                    if(isTailoredNode(node)) {
+#ifdef DEBUG_COLLATION_BUILDER
+                        printf("    ter+        ");
+#endif
+                        if(!tIsTailored) {
+                            // First tailored tertiary node for [p, s].
+                            int32_t tCount = countTailoredNodes(nodesArray, nextIndex,
+                                                                UCOL_TERTIARY) + 1;
+                            uint32_t tLimit;
+                            if(t == 0) {
+                                // Gap at the beginning of the tertiary CE range.
+                                t = rootElements.getTertiaryBoundary() - 0x100;
+                                tLimit = rootElements.getFirstTertiaryCE() & Collation::ONLY_TERTIARY_MASK;
+                            } else if(t == BEFORE_WEIGHT16) {
+                                tLimit = Collation::COMMON_WEIGHT16;
+                            } else if(!pIsTailored && !sIsTailored) {
+                                // p and s are root weights.
+                                tLimit = rootElements.getTertiaryAfter(pIndex, s, t);
+                            } else {
+                                // [p, s] is tailored.
+                                U_ASSERT(t == Collation::COMMON_WEIGHT16);
+                                tLimit = rootElements.getTertiaryBoundary();
+                            }
+                            U_ASSERT(tLimit == 0x4000 || (tLimit & ~Collation::ONLY_TERTIARY_MASK) == 0);
+                            tertiaries.initForTertiary();
+                            if(!tertiaries.allocWeights(t, tLimit, tCount)) {
+                                errorCode = U_BUFFER_OVERFLOW_ERROR;
+                                errorReason = "tertiary tailoring gap too small";
+                                return;
+                            }
+                            tIsTailored = TRUE;
+                        }
+                        t = tertiaries.nextWeight();
+                        U_ASSERT(t != 0xffffffff);
+                    } else {
+                        t = weight16FromNode(node);
+                        tIsTailored = FALSE;
+#ifdef DEBUG_COLLATION_BUILDER
+                        printf("    ter     %lx\n", (long)alignWeightRight(t));
+#endif
+                    }
+                } else {
+                    if(strength == UCOL_SECONDARY) {
+                        if(isTailoredNode(node)) {
+#ifdef DEBUG_COLLATION_BUILDER
+                            printf("  sec+          ");
+#endif
+                            if(!sIsTailored) {
+                                // First tailored secondary node for p.
+                                int32_t sCount = countTailoredNodes(nodesArray, nextIndex,
+                                                                    UCOL_SECONDARY) + 1;
+                                uint32_t sLimit;
+                                if(s == 0) {
+                                    // Gap at the beginning of the secondary CE range.
+                                    s = rootElements.getSecondaryBoundary() - 0x100;
+                                    sLimit = rootElements.getFirstSecondaryCE() >> 16;
+                                } else if(s == BEFORE_WEIGHT16) {
+                                    sLimit = Collation::COMMON_WEIGHT16;
+                                } else if(!pIsTailored) {
+                                    // p is a root primary.
+                                    sLimit = rootElements.getSecondaryAfter(pIndex, s);
+                                } else {
+                                    // p is a tailored primary.
+                                    U_ASSERT(s == Collation::COMMON_WEIGHT16);
+                                    sLimit = rootElements.getSecondaryBoundary();
+                                }
+                                if(s == Collation::COMMON_WEIGHT16) {
+                                    // Do not tailor into the getSortKey() range of
+                                    // compressed common secondaries.
+                                    s = rootElements.getLastCommonSecondary();
+                                }
+                                secondaries.initForSecondary();
+                                if(!secondaries.allocWeights(s, sLimit, sCount)) {
+                                    errorCode = U_BUFFER_OVERFLOW_ERROR;
+                                    errorReason = "secondary tailoring gap too small";
+                                    return;
+                                }
+                                sIsTailored = TRUE;
+                            }
+                            s = secondaries.nextWeight();
+                            U_ASSERT(s != 0xffffffff);
+                        } else {
+                            s = weight16FromNode(node);
+                            sIsTailored = FALSE;
+#ifdef DEBUG_COLLATION_BUILDER
+                            printf("  sec       %lx\n", (long)alignWeightRight(s));
+#endif
+                        }
+                    } else /* UCOL_PRIMARY */ {
+                        U_ASSERT(isTailoredNode(node));
+#ifdef DEBUG_COLLATION_BUILDER
+                        printf("pri+            ");
+#endif
+                        if(!pIsTailored) {
+                            // First tailored primary node in this list.
+                            int32_t pCount = countTailoredNodes(nodesArray, nextIndex,
+                                                                UCOL_PRIMARY) + 1;
+                            UBool isCompressible = baseData->isCompressiblePrimary(p);
+                            uint32_t pLimit =
+                                rootElements.getPrimaryAfter(p, pIndex, isCompressible);
+                            primaries.initForPrimary(isCompressible);
+                            if(!primaries.allocWeights(p, pLimit, pCount)) {
+                                errorCode = U_BUFFER_OVERFLOW_ERROR;  // TODO: introduce a more specific UErrorCode?
+                                errorReason = "primary tailoring gap too small";
+                                return;
+                            }
+                            pIsTailored = TRUE;
+                        }
+                        p = primaries.nextWeight();
+                        U_ASSERT(p != 0xffffffff);
+                        s = Collation::COMMON_WEIGHT16;
+                        sIsTailored = FALSE;
+                    }
+                    t = s == 0 ? 0 : Collation::COMMON_WEIGHT16;
+                    tIsTailored = FALSE;
+                }
+                q = 0;
+            }
+            if(isTailoredNode(node)) {
+                nodesArray[i] = Collation::makeCE(p, s, t, q);
+#ifdef DEBUG_COLLATION_BUILDER
+                printf("%016llx\n", (long long)nodesArray[i]);
+#endif
+            }
+        }
+    }
+}
+
+int32_t
+CollationBuilder::countTailoredNodes(const int64_t *nodesArray, int32_t i, int32_t strength) {
+    int32_t count = 0;
+    for(;;) {
+        if(i == 0) { break; }
+        int64_t node = nodesArray[i];
+        if(strengthFromNode(node) < strength) { break; }
+        if(strengthFromNode(node) == strength) {
+            if(isTailoredNode(node)) {
+                ++count;
+            } else {
+                break;
+            }
+        }
+        i = nextIndexFromNode(node);
+    }
+    return count;
+}
+
+class CEFinalizer : public CollationDataBuilder::CEModifier {
+public:
+    CEFinalizer(const int64_t *ces) : finalCEs(ces) {}
+    virtual ~CEFinalizer();
+    virtual int64_t modifyCE32(uint32_t ce32) const {
+        U_ASSERT(!Collation::isSpecialCE32(ce32));
+        if(CollationBuilder::isTempCE32(ce32)) {
+            // retain case bits
+            return finalCEs[CollationBuilder::indexFromTempCE32(ce32)] | ((ce32 & 0xc0) << 8);
+        } else {
+            return Collation::NO_CE;
+        }
+    }
+    virtual int64_t modifyCE(int64_t ce) const {
+        if(CollationBuilder::isTempCE(ce)) {
+            // retain case bits
+            return finalCEs[CollationBuilder::indexFromTempCE(ce)] | (ce & 0xc000);
+        } else {
+            return Collation::NO_CE;
+        }
+    }
+
+private:
+    const int64_t *finalCEs;
+};
+
+CEFinalizer::~CEFinalizer() {}
+
+void
+CollationBuilder::finalizeCEs(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    LocalPointer<CollationDataBuilder> newBuilder(new CollationDataBuilder(errorCode));
+    if(newBuilder.isNull()) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return;
+    }
+    newBuilder->initForTailoring(baseData, errorCode);
+    CEFinalizer finalizer(nodes.getBuffer());
+    newBuilder->copyFrom(*dataBuilder, finalizer, errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    delete dataBuilder;
+    dataBuilder = newBuilder.orphan();
+}
+
+int32_t
+CollationBuilder::ceStrength(int64_t ce) {
+    return
+        isTempCE(ce) ? strengthFromTempCE(ce) :
+        (ce & INT64_C(0xff00000000000000)) != 0 ? UCOL_PRIMARY :
+        ((uint32_t)ce & 0xff000000) != 0 ? UCOL_SECONDARY :
+        ce != 0 ? UCOL_TERTIARY :
+        UCOL_IDENTICAL;
+}
+
+U_NAMESPACE_END
+
+U_NAMESPACE_USE
+
+U_CAPI UCollator * U_EXPORT2
+ucol_openRules(const UChar *rules, int32_t rulesLength,
+               UColAttributeValue normalizationMode, UCollationStrength strength,
+               UParseError *parseError, UErrorCode *pErrorCode) {
+    if(U_FAILURE(*pErrorCode)) { return NULL; }
+    if(rules == NULL && rulesLength != 0) {
+        *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return NULL;
+    }
+    RuleBasedCollator *coll = new RuleBasedCollator();
+    if(coll == NULL) {
+        *pErrorCode = U_MEMORY_ALLOCATION_ERROR;
+        return NULL;
+    }
+    UnicodeString r((UBool)(rulesLength < 0), rules, rulesLength);
+    coll->internalBuildTailoring(r, strength, normalizationMode, parseError, NULL, *pErrorCode);
+    if(U_FAILURE(*pErrorCode)) {
+        delete coll;
+        return NULL;
+    }
+    return coll->toUCollator();
+}
+
+static const int32_t internalBufferSize = 512;
+
+// The @internal ucol_getUnsafeSet() was moved here from ucol_sit.cpp
+// because it calls UnicodeSet "builder" code that depends on all Unicode properties,
+// and the rest of the collation "runtime" code only depends on normalization.
+// This function is not related to the collation builder,
+// but it did not seem worth moving it into its own .cpp file,
+// nor rewriting it to use lower-level UnicodeSet and Normalizer2Impl methods.
+U_CAPI int32_t U_EXPORT2
+ucol_getUnsafeSet( const UCollator *coll,
+                  USet *unsafe,
+                  UErrorCode *status)
+{
+    UChar buffer[internalBufferSize];
+    int32_t len = 0;
+
+    uset_clear(unsafe);
+
+    // cccpattern = "[[:^tccc=0:][:^lccc=0:]]", unfortunately variant
+    static const UChar cccpattern[25] = { 0x5b, 0x5b, 0x3a, 0x5e, 0x74, 0x63, 0x63, 0x63, 0x3d, 0x30, 0x3a, 0x5d,
+                                    0x5b, 0x3a, 0x5e, 0x6c, 0x63, 0x63, 0x63, 0x3d, 0x30, 0x3a, 0x5d, 0x5d, 0x00 };
+
+    // add chars that fail the fcd check
+    uset_applyPattern(unsafe, cccpattern, 24, USET_IGNORE_SPACE, status);
+
+    // add lead/trail surrogates
+    // (trail surrogates should need to be unsafe only if the caller tests for UTF-16 code *units*,
+    // not when testing code *points*)
+    uset_addRange(unsafe, 0xd800, 0xdfff);
+
+    USet *contractions = uset_open(0,0);
+
+    int32_t i = 0, j = 0;
+    int32_t contsSize = ucol_getContractions(coll, contractions, status);
+    UChar32 c = 0;
+    // Contraction set consists only of strings
+    // to get unsafe code points, we need to
+    // break the strings apart and add them to the unsafe set
+    for(i = 0; i < contsSize; i++) {
+        len = uset_getItem(contractions, i, NULL, NULL, buffer, internalBufferSize, status);
+        if(len > 0) {
+            j = 0;
+            while(j < len) {
+                U16_NEXT(buffer, j, len, c);
+                if(j < len) {
+                    uset_add(unsafe, c);
+                }
+            }
+        }
+    }
+
+    uset_close(contractions);
+
+    return uset_size(unsafe);
+}
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationbuilder.h b/icu4c/source/i18n/collationbuilder.h
new file mode 100644 (file)
index 0000000..df8be2a
--- /dev/null
@@ -0,0 +1,406 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationbuilder.h
+*
+* created on: 2013may06
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONBUILDER_H__
+#define __COLLATIONBUILDER_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/uniset.h"
+#include "unicode/unistr.h"
+#include "collationrootelements.h"
+#include "collationruleparser.h"
+#include "uvectr32.h"
+#include "uvectr64.h"
+
+struct UParseError;
+
+U_NAMESPACE_BEGIN
+
+struct CollationData;
+struct CollationTailoring;
+
+class CEFinalizer;
+class CollationDataBuilder;
+class Normalizer2;
+class Normalizer2Impl;
+
+class U_I18N_API CollationBuilder : public CollationRuleParser::Sink {
+public:
+    CollationBuilder(const CollationTailoring *base, UErrorCode &errorCode);
+    virtual ~CollationBuilder();
+
+    void disableFastLatin() { fastLatinEnabled = FALSE; }
+
+    CollationTailoring *parseAndBuild(const UnicodeString &ruleString,
+                                      const UVersionInfo rulesVersion,
+                                      CollationRuleParser::Importer *importer,
+                                      UParseError *outParseError,
+                                      UErrorCode &errorCode);
+
+    const char *getErrorReason() const { return errorReason; }
+
+private:
+    friend class CEFinalizer;
+
+    /** Implements CollationRuleParser::Sink. */
+    virtual void addReset(int32_t strength, const UnicodeString &str,
+                          const char *&errorReason, UErrorCode &errorCode);
+
+    int64_t getSpecialResetPosition(const UnicodeString &str,
+                                    const char *&parserErrorReason, UErrorCode &errorCode);
+
+    /** Implements CollationRuleParser::Sink. */
+    virtual void addRelation(int32_t strength, const UnicodeString &prefix,
+                             const UnicodeString &str, const UnicodeString &extension,
+                             const char *&errorReason, UErrorCode &errorCode);
+
+    /**
+     * Picks one of the current CEs and finds or inserts a node in the graph
+     * for the CE + strength.
+     */
+    int32_t findOrInsertNodeForCEs(int32_t strength, const char *&parserErrorReason,
+                                   UErrorCode &errorCode);
+    int32_t findOrInsertNodeForRootCE(int64_t ce, int32_t strength, UErrorCode &errorCode);
+    /** Finds or inserts the node for a root CE's primary weight. */
+    int32_t findOrInsertNodeForPrimary(uint32_t p, UErrorCode &errorCode);
+    /** Finds or inserts the node for a secondary or tertiary weight. */
+    int32_t findOrInsertWeakNode(int32_t index, uint32_t weight16, int32_t level,
+                                 UErrorCode &errorCode);
+
+    /**
+     * Makes and inserts a new tailored node into the list, after the one at index.
+     * Skips over nodes of weaker strength to maintain collation order
+     * ("postpone insertion").
+     * @return the new node's index
+     */
+    int32_t insertTailoredNodeAfter(int32_t index, int32_t strength, UErrorCode &errorCode);
+
+    /**
+     * Inserts a new node into the list, between list-adjacent items.
+     * The node's previous and next indexes must not be set yet.
+     * @return the new node's index
+     */
+    int32_t insertNodeBetween(int32_t index, int32_t nextIndex, int64_t node,
+                              UErrorCode &errorCode);
+
+    /**
+     * Finds the node which implies or contains a common=05 weight of the given strength
+     * (secondary or tertiary).
+     * Skips weaker nodes and tailored nodes if the current node is stronger
+     * and is followed by an explicit-common-weight node.
+     * Always returns the input index if that node is no stronger than the given strength.
+     */
+    int32_t findCommonNode(int32_t index, int32_t strength) const;
+
+    void setCaseBits(const UnicodeString &nfdString,
+                     const char *&parserErrorReason, UErrorCode &errorCode);
+
+    /** Implements CollationRuleParser::Sink. */
+    virtual void suppressContractions(const UnicodeSet &set, const char *&parserErrorReason,
+                                      UErrorCode &errorCode);
+
+    /** Implements CollationRuleParser::Sink. */
+    virtual void optimize(const UnicodeSet &set, const char *&parserErrorReason,
+                          UErrorCode &errorCode);
+
+    /**
+     * Adds the mapping and its canonical closure.
+     * Takes ce32=dataBuilder->encodeCEs(...) so that the data builder
+     * need not re-encode the CEs multiple times.
+     */
+    uint32_t addWithClosure(const UnicodeString &nfdPrefix, const UnicodeString &nfdString,
+                            const int64_t newCEs[], int32_t newCEsLength, uint32_t ce32,
+                            UErrorCode &errorCode);
+    uint32_t addOnlyClosure(const UnicodeString &nfdPrefix, const UnicodeString &nfdString,
+                            const int64_t newCEs[], int32_t newCEsLength, uint32_t ce32,
+                            UErrorCode &errorCode);
+    void addTailComposites(const UnicodeString &nfdPrefix, const UnicodeString &nfdString,
+                           UErrorCode &errorCode);
+    UBool mergeCompositeIntoString(const UnicodeString &nfdString, int32_t indexAfterLastStarter,
+                                   UChar32 composite, const UnicodeString &decomp,
+                                   UnicodeString &newNFDString, UnicodeString &newString,
+                                   UErrorCode &errorCode) const;
+
+    UBool ignorePrefix(const UnicodeString &s, UErrorCode &errorCode) const;
+    UBool ignoreString(const UnicodeString &s, UErrorCode &errorCode) const;
+    UBool isFCD(const UnicodeString &s, UErrorCode &errorCode) const;
+
+    void closeOverComposites(UErrorCode &errorCode);
+
+    uint32_t addIfDifferent(const UnicodeString &prefix, const UnicodeString &str,
+                            const int64_t newCEs[], int32_t newCEsLength, uint32_t ce32,
+                            UErrorCode &errorCode);
+    static UBool sameCEs(const int64_t ces1[], int32_t ces1Length,
+                         const int64_t ces2[], int32_t ces2Length);
+
+    /**
+     * Walks the tailoring graph and overwrites tailored nodes with new CEs.
+     * After this, the graph is destroyed.
+     * The nodes array can then be used only as a source of tailored CEs.
+     */
+    void makeTailoredCEs(UErrorCode &errorCode);
+    /**
+     * Counts the tailored nodes of the given strength up to the next node
+     * which is either stronger or has an explicit weight of this strength.
+     */
+    static int32_t countTailoredNodes(const int64_t *nodesArray, int32_t i, int32_t strength);
+
+    /** Replaces temporary CEs with the final CEs they point to. */
+    void finalizeCEs(UErrorCode &errorCode);
+
+    /**
+     * Encodes "temporary CE" data into a CE that fits into the CE32 data structure,
+     * with 2-byte primary, 1-byte secondary and 6-bit tertiary,
+     * with valid CE byte values.
+     *
+     * The index must not exceed 20 bits (0xfffff).
+     * The strength must fit into 2 bits (UCOL_PRIMARY..UCOL_QUATERNARY).
+     *
+     * Temporary CEs are distinguished from real CEs by their use of
+     * secondary weights 06..45 which are otherwise reserved for compressed sort keys.
+     *
+     * The case bits are unused and available.
+     */
+    static inline int64_t tempCEFromIndexAndStrength(int32_t index, int32_t strength) {
+        return
+            // CE byte offsets, to ensure valid CE bytes, and case bits 11
+            INT64_C(0x4040000006002000) +
+            // index bits 19..13 -> primary byte 1 = CE bits 63..56 (byte values 40..BF)
+            ((int64_t)(index & 0xfe000) << 43) +
+            // index bits 12..6 -> primary byte 2 = CE bits 55..48 (byte values 40..BF)
+            ((int64_t)(index & 0x1fc0) << 42) +
+            // index bits 5..0 -> secondary byte 1 = CE bits 31..24 (byte values 06..45)
+            ((index & 0x3f) << 24) +
+            // strength bits 1..0 -> tertiary byte 1 = CE bits 13..8 (byte values 20..23)
+            (strength << 8);
+    }
+    static inline int32_t indexFromTempCE(int64_t tempCE) {
+        tempCE -= INT64_C(0x4040000006002000);
+        return
+            ((int32_t)(tempCE >> 43) & 0xfe000) |
+            ((int32_t)(tempCE >> 42) & 0x1fc0) |
+            ((int32_t)(tempCE >> 24) & 0x3f);
+    }
+    static inline int32_t strengthFromTempCE(int64_t tempCE) {
+        return ((int32_t)tempCE >> 8) & 3;
+    }
+    static inline UBool isTempCE(int64_t ce) {
+        uint32_t sec = (uint32_t)ce >> 24;
+        return 6 <= sec && sec <= 0x45;
+    }
+
+    static inline int32_t indexFromTempCE32(uint32_t tempCE32) {
+        tempCE32 -= 0x40400620;
+        return
+            ((int32_t)(tempCE32 >> 11) & 0xfe000) |
+            ((int32_t)(tempCE32 >> 10) & 0x1fc0) |
+            ((int32_t)(tempCE32 >> 8) & 0x3f);
+    }
+    static inline UBool isTempCE32(uint32_t ce32) {
+        return
+            (ce32 & 0xff) >= 2 &&  // not a long-primary/long-secondary CE32
+            6 <= ((ce32 >> 8) & 0xff) && ((ce32 >> 8) & 0xff) <= 0x45;
+    }
+
+    static int32_t ceStrength(int64_t ce);
+
+    /** The secondary/tertiary lower limit for tailoring before the common weight. */
+    static const uint32_t BEFORE_WEIGHT16 = Collation::MERGE_SEPARATOR_WEIGHT16;
+
+    /** At most 1M nodes, limited by the 20 bits in node bit fields. */
+    static const int32_t MAX_INDEX = 0xfffff;
+    /**
+     * Node bit 6 is set on a primary node if there are tailored nodes
+     * with secondary values below the common secondary weight (05),
+     * from a reset-secondary-before (&[before 2]).
+     */
+    static const int32_t HAS_BEFORE2 = 0x40;
+    /**
+     * Node bit 5 is set on a primary or secondary node if there are tailored nodes
+     * with tertiary values below the common tertiary weight (05),
+     * from a reset-tertiary-before (&[before 3]).
+     */
+    static const int32_t HAS_BEFORE3 = 0x20;
+    /**
+     * Node bit 3 distinguishes a tailored node, which has no weight value,
+     * from a node with an explicit (root or default) weight.
+     */
+    static const int32_t IS_TAILORED = 8;
+
+    static inline int64_t nodeFromWeight32(uint32_t weight32) {
+        return (int64_t)weight32 << 32;
+    }
+    static inline int64_t nodeFromWeight16(uint32_t weight16) {
+        return (int64_t)weight16 << 48;
+    }
+    static inline int64_t nodeFromPreviousIndex(int32_t previous) {
+        return (int64_t)previous << 28;
+    }
+    static inline int64_t nodeFromNextIndex(int32_t next) {
+        return next << 8;
+    }
+    static inline int64_t nodeFromStrength(int32_t strength) {
+        return strength;
+    }
+
+    static inline uint32_t weight32FromNode(int64_t node) {
+        return (uint32_t)(node >> 32);
+    }
+    static inline uint32_t weight16FromNode(int64_t node) {
+        return (uint32_t)(node >> 48) & 0xffff;
+    }
+    static inline int32_t previousIndexFromNode(int64_t node) {
+        return (int32_t)(node >> 28) & MAX_INDEX;
+    }
+    static inline int32_t nextIndexFromNode(int64_t node) {
+        return ((int32_t)node >> 8) & MAX_INDEX;
+    }
+    static inline int32_t strengthFromNode(int64_t node) {
+        return (int32_t)node & 3;
+    }
+
+    static inline UBool nodeHasBefore2(int64_t node) {
+        return (node & HAS_BEFORE2) != 0;
+    }
+    static inline UBool nodeHasBefore3(int64_t node) {
+        return (node & HAS_BEFORE3) != 0;
+    }
+    static inline UBool nodeHasAnyBefore(int64_t node) {
+        return (node & (HAS_BEFORE2 | HAS_BEFORE3)) != 0;
+    }
+    static inline UBool isTailoredNode(int64_t node) {
+        return (node & IS_TAILORED) != 0;
+    }
+
+    static inline int64_t changeNodePreviousIndex(int64_t node, int32_t previous) {
+        return (node & INT64_C(0xffff00000fffffff)) | nodeFromPreviousIndex(previous);
+    }
+    static inline int64_t changeNodeNextIndex(int64_t node, int32_t next) {
+        return (node & INT64_C(0xfffffffff00000ff)) | nodeFromNextIndex(next);
+    }
+
+    const Normalizer2 &nfd, &fcd;
+    const Normalizer2Impl &nfcImpl;
+
+    const CollationTailoring *base;
+    const CollationData *baseData;
+    const CollationRootElements rootElements;
+    uint32_t variableTop;
+
+    CollationDataBuilder *dataBuilder;
+    UBool fastLatinEnabled;
+    UnicodeSet optimizeSet;
+    const char *errorReason;
+
+    int64_t ces[Collation::MAX_EXPANSION_LENGTH];
+    int32_t cesLength;
+
+    /**
+     * Indexes of nodes with root primary weights, sorted by primary.
+     * Compact form of a TreeMap from root primary to node index.
+     *
+     * This is a performance optimization for finding reset positions.
+     * Without this, we would have to search through the entire nodes list.
+     * It also allows storing root primary weights in list head nodes,
+     * without previous index, leaving room in root primary nodes for 32-bit primary weights.
+     */
+    UVector32 rootPrimaryIndexes;
+    /**
+     * Data structure for assigning tailored weights and CEs.
+     * Doubly-linked lists of nodes in mostly collation order.
+     * Each list starts with a root primary node and ends with a nextIndex of 0.
+     *
+     * When there are any nodes in the list, then there is always a root primary node at index 0.
+     * This allows some code not to have to check explicitly for nextIndex==0.
+     *
+     * Root primary nodes have 32-bit weights but do not have previous indexes.
+     * All other nodes have at most 16-bit weights and do have previous indexes.
+     *
+     * Nodes with explicit weights store root collator weights,
+     * or default weak weights (e.g., secondary 05) for stronger nodes.
+     * "Tailored" nodes, with the IS_TAILORED bit set,
+     * do not store explicit weights but rather
+     * create a difference of a certain strength from the preceding node.
+     *
+     * A root node is followed by either
+     * - a root/default node of the same strength, or
+     * - a root/default node of the next-weaker strength, or
+     * - a tailored node of the same strength.
+     *
+     * A node of a given strength normally implies "common" weights on weaker levels.
+     *
+     * A node with HAS_BEFORE2 must be immediately followed by
+     * a secondary node with BEFORE_WEIGHT16, then a secondary tailored node,
+     * and later an explicit common-secondary node.
+     * (&[before 2] resets to the BEFORE_WEIGHT16 node so that
+     * the following addRelation(secondary) tailors right after that.
+     * If we did not have this node and instead were to reset on the primary node,
+     * then addRelation(secondary) would skip forward to the the COMMON_WEIGHT16 node.)
+     *
+     * All secondary tailored nodes between these two explicit ones
+     * will be assigned lower-than-common secondary weights.
+     * If the flag is not set, then there are no explicit secondary nodes
+     * with the common or lower weights.
+     *
+     * Same for HAS_BEFORE3 for tertiary nodes and weights.
+     * A node must not have both flags set.
+     *
+     * Tailored CEs are initially represented in a CollationDataBuilder as temporary CEs
+     * which point to stable indexes in this list,
+     * and temporary CEs stored in a CollationDataBuilder only point to tailored nodes.
+     *
+     * A temporary CE in the ces[] array may point to a non-tailored reset-before-position node,
+     * until the next relation is added.
+     *
+     * At the end, the tailored weights are allocated as necessary,
+     * then the tailored nodes are replaced with final CEs,
+     * and the CollationData is rewritten by replacing temporary CEs with final ones.
+     *
+     * We cannot simply insert new nodes in the middle of the array
+     * because that would invalidate the indexes stored in existing temporary CEs.
+     * We need to use a linked graph with stable indexes to existing nodes.
+     * A doubly-linked list seems easiest to maintain.
+     *
+     * Each node is stored as an int64_t, with its fields stored as bit fields.
+     *
+     * Root primary node:
+     * - primary weight: 32 bits 63..32
+     * - reserved/unused/zero: 4 bits 31..28
+     *
+     * Weaker root nodes & tailored nodes:
+     * - a weight: 16 bits 63..48
+     *   + a root or default weight for a non-tailored node
+     *   + unused/zero for a tailored node
+     * - index to the previous node: 20 bits 47..28
+     *
+     * All types of nodes:
+     * - index to the next node: 20 bits 27..8
+     *   + nextIndex=0 in last node per root-primary list
+     * - reserved/unused/zero bits: bits 7, 4, 2
+     * - HAS_BEFORE2: bit 6
+     * - HAS_BEFORE3: bit 5
+     * - IS_TAILORED: bit 3
+     * - the difference strength (primary/secondary/tertiary/quaternary): 2 bits 1..0
+     *
+     * We could allocate structs with pointers, but we would have to store them
+     * in a pointer list so that they can be indexed from temporary CEs,
+     * and they would require more memory allocations.
+     */
+    UVector64 nodes;
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONBUILDER_H__
diff --git a/icu4c/source/i18n/collationcompare.cpp b/icu4c/source/i18n/collationcompare.cpp
new file mode 100644 (file)
index 0000000..6f9107e
--- /dev/null
@@ -0,0 +1,363 @@
+/*
+*******************************************************************************
+* Copyright (C) 1996-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationcompare.cpp
+*
+* created on: 2012feb14 with new and old collation code
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/ucol.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationcompare.h"
+#include "collationiterator.h"
+#include "collationsettings.h"
+#include "uassert.h"
+
+U_NAMESPACE_BEGIN
+
+UCollationResult
+CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterator &right,
+                                        const CollationSettings &settings,
+                                        UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return UCOL_EQUAL; }
+
+    int32_t options = settings.options;
+    uint32_t variableTop;
+    if((options & CollationSettings::ALTERNATE_MASK) == 0) {
+        variableTop = 0;
+    } else {
+        // +1 so that we can use "<" and primary ignorables test out early.
+        variableTop = settings.variableTop + 1;
+    }
+    UBool anyVariable = FALSE;
+
+    // Fetch CEs, compare primaries, store secondary & tertiary weights.
+    U_ALIGN_CODE(16);
+    for(;;) {
+        // We fetch CEs until we get a non-ignorable primary or reach the end.
+        uint32_t leftPrimary;
+        do {
+            int64_t ce = left.nextCE(errorCode);
+            leftPrimary = (uint32_t)(ce >> 32);
+            if(leftPrimary < variableTop && leftPrimary > Collation::MERGE_SEPARATOR_PRIMARY) {
+                // Variable CE, shift it to quaternary level.
+                // Ignore all following primary ignorables, and shift further variable CEs.
+                anyVariable = TRUE;
+                do {
+                    // Store only the primary of the variable CE.
+                    left.setCurrentCE(ce & INT64_C(0xffffffff00000000));
+                    for(;;) {
+                        ce = left.nextCE(errorCode);
+                        leftPrimary = (uint32_t)(ce >> 32);
+                        if(leftPrimary == 0) {
+                            left.setCurrentCE(0);
+                        } else {
+                            break;
+                        }
+                    }
+                } while(leftPrimary < variableTop &&
+                        leftPrimary > Collation::MERGE_SEPARATOR_PRIMARY);
+            }
+        } while(leftPrimary == 0);
+
+        uint32_t rightPrimary;
+        do {
+            int64_t ce = right.nextCE(errorCode);
+            rightPrimary = (uint32_t)(ce >> 32);
+            if(rightPrimary < variableTop && rightPrimary > Collation::MERGE_SEPARATOR_PRIMARY) {
+                // Variable CE, shift it to quaternary level.
+                // Ignore all following primary ignorables, and shift further variable CEs.
+                anyVariable = TRUE;
+                do {
+                    // Store only the primary of the variable CE.
+                    right.setCurrentCE(ce & INT64_C(0xffffffff00000000));
+                    for(;;) {
+                        ce = right.nextCE(errorCode);
+                        rightPrimary = (uint32_t)(ce >> 32);
+                        if(rightPrimary == 0) {
+                            right.setCurrentCE(0);
+                        } else {
+                            break;
+                        }
+                    }
+                } while(rightPrimary < variableTop &&
+                        rightPrimary > Collation::MERGE_SEPARATOR_PRIMARY);
+            }
+        } while(rightPrimary == 0);
+
+        if(leftPrimary != rightPrimary) {
+            // Return the primary difference, with script reordering.
+            const uint8_t *reorderTable = settings.reorderTable;
+            if (reorderTable != NULL) {
+                leftPrimary = Collation::reorder(reorderTable, leftPrimary);
+                rightPrimary = Collation::reorder(reorderTable, rightPrimary);
+            }
+            return (leftPrimary < rightPrimary) ? UCOL_LESS : UCOL_GREATER;
+        }
+        if(leftPrimary == Collation::NO_CE_PRIMARY) { break; }
+    }
+    if(U_FAILURE(errorCode)) { return UCOL_EQUAL; }
+
+    // Compare the buffered secondary & tertiary weights.
+    // We might skip the secondary level but continue with the case level
+    // which is turned on separately.
+    if(CollationSettings::getStrength(options) >= UCOL_SECONDARY) {
+        if((options & CollationSettings::BACKWARD_SECONDARY) == 0) {
+            int32_t leftIndex = 0;
+            int32_t rightIndex = 0;
+            for(;;) {
+                uint32_t leftSecondary;
+                do {
+                    leftSecondary = ((uint32_t)left.getCE(leftIndex++)) >> 16;
+                } while(leftSecondary == 0);
+
+                uint32_t rightSecondary;
+                do {
+                    rightSecondary = ((uint32_t)right.getCE(rightIndex++)) >> 16;
+                } while(rightSecondary == 0);
+
+                if(leftSecondary != rightSecondary) {
+                    return (leftSecondary < rightSecondary) ? UCOL_LESS : UCOL_GREATER;
+                }
+                if(leftSecondary == Collation::NO_CE_WEIGHT16) { break; }
+            }
+        } else {
+            // The backwards secondary level compares secondary weights backwards
+            // within segments separated by the merge separator (U+FFFE, weight 02).
+            int32_t leftStart = 0;
+            int32_t rightStart = 0;
+            for(;;) {
+                // Find the merge separator or the NO_CE terminator.
+                int32_t leftLimit = leftStart;
+                uint32_t leftLower32;
+                while((leftLower32 = (uint32_t)left.getCE(leftLimit)) >
+                            Collation::MERGE_SEPARATOR_LOWER32 ||
+                        leftLower32 == 0) {
+                    ++leftLimit;
+                }
+                int32_t rightLimit = rightStart;
+                uint32_t rightLower32;
+                while((rightLower32 = (uint32_t)right.getCE(rightLimit)) >
+                            Collation::MERGE_SEPARATOR_LOWER32 ||
+                        rightLower32 == 0) {
+                    ++rightLimit;
+                }
+
+                // Compare the segments.
+                int32_t leftIndex = leftLimit;
+                int32_t rightIndex = rightLimit;
+                for(;;) {
+                    int32_t leftSecondary = 0;
+                    while(leftSecondary == 0 && leftIndex > leftStart) {
+                        leftSecondary = ((uint32_t)left.getCE(--leftIndex)) >> 16;
+                    }
+
+                    int32_t rightSecondary = 0;
+                    while(rightSecondary == 0 && rightIndex > rightStart) {
+                        rightSecondary = ((uint32_t)right.getCE(--rightIndex)) >> 16;
+                    }
+
+                    if(leftSecondary != rightSecondary) {
+                        return (leftSecondary < rightSecondary) ? UCOL_LESS : UCOL_GREATER;
+                    }
+                    if(leftSecondary == 0) { break; }
+                }
+
+                // Did we reach the end of either string?
+                // Both strings have the same number of merge separators,
+                // or else there would have been a primary-level difference.
+                U_ASSERT(left.getCE(leftLimit) == right.getCE(rightLimit));
+                if(left.getCE(leftLimit) == Collation::NO_CE) { break; }
+                // Skip both merge separators and continue.
+                leftStart = leftLimit + 1;
+                rightStart = rightLimit + 1;
+            }
+        }
+    }
+
+    if((options & CollationSettings::CASE_LEVEL) != 0) {
+        int32_t strength = CollationSettings::getStrength(options);
+        int32_t leftIndex = 0;
+        int32_t rightIndex = 0;
+        for(;;) {
+            uint32_t leftCase, leftLower32, rightCase;
+            if(strength == UCOL_PRIMARY) {
+                // Primary+caseLevel: Ignore case level weights of primary ignorables.
+                // Otherwise we would get a-umlaut > a
+                // which is not desirable for accent-insensitive sorting.
+                // Check for (lower 32 bits) == 0 as well because variable CEs are stored
+                // with only primary weights.
+                int64_t ce;
+                do {
+                    ce = left.getCE(leftIndex++);
+                    leftCase = (uint32_t)ce;
+                } while((uint32_t)(ce >> 32) == 0 || leftCase == 0);
+                leftLower32 = leftCase;
+                leftCase &= 0xc000;
+
+                do {
+                    ce = right.getCE(rightIndex++);
+                    rightCase = (uint32_t)ce;
+                } while((uint32_t)(ce >> 32) == 0 || rightCase == 0);
+                rightCase &= 0xc000;
+            } else {
+                // Secondary+caseLevel: By analogy with the above,
+                // ignore case level weights of secondary ignorables.
+                //
+                // Note: A tertiary CE has uppercase case bits (0.0.ut)
+                // to keep tertiary+caseFirst well-formed.
+                //
+                // Tertiary+caseLevel: Also ignore case level weights of secondary ignorables.
+                // Otherwise a tertiary CE's uppercase would be no greater than
+                // a primary/secondary CE's uppercase.
+                // (See UCA well-formedness condition 2.)
+                // We could construct a special case weight higher than uppercase,
+                // but it's simpler to always ignore case weights of secondary ignorables,
+                // turning 0.0.ut into 0.0.0.t.
+                // (See LDML Collation, Case Parameters.)
+                do {
+                    leftCase = (uint32_t)left.getCE(leftIndex++);
+                } while(leftCase <= 0xffff);
+                leftLower32 = leftCase;
+                leftCase &= 0xc000;
+
+                do {
+                    rightCase = (uint32_t)right.getCE(rightIndex++);
+                } while(rightCase <= 0xffff);
+                rightCase &= 0xc000;
+            }
+
+            // No need to handle NO_CE and MERGE_SEPARATOR specially:
+            // There is one case weight for each previous-level weight,
+            // so level length differences were handled there.
+            if(leftCase != rightCase) {
+                if((options & CollationSettings::UPPER_FIRST) == 0) {
+                    return (leftCase < rightCase) ? UCOL_LESS : UCOL_GREATER;
+                } else {
+                    return (leftCase < rightCase) ? UCOL_GREATER : UCOL_LESS;
+                }
+            }
+            if((leftLower32 >> 16) == Collation::NO_CE_WEIGHT16) { break; }
+        }
+    }
+    if(CollationSettings::getStrength(options) <= UCOL_SECONDARY) { return UCOL_EQUAL; }
+
+    uint32_t tertiaryMask = CollationSettings::getTertiaryMask(options);
+
+    int32_t leftIndex = 0;
+    int32_t rightIndex = 0;
+    uint32_t anyQuaternaries = 0;
+    for(;;) {
+        uint32_t leftLower32, leftTertiary;
+        do {
+            leftLower32 = (uint32_t)left.getCE(leftIndex++);
+            anyQuaternaries |= leftLower32;
+            U_ASSERT((leftLower32 & Collation::ONLY_TERTIARY_MASK) != 0 ||
+                     (leftLower32 & 0xc0c0) == 0);
+            leftTertiary = leftLower32 & tertiaryMask;
+        } while(leftTertiary == 0);
+
+        uint32_t rightLower32, rightTertiary;
+        do {
+            rightLower32 = (uint32_t)right.getCE(rightIndex++);
+            anyQuaternaries |= rightLower32;
+            U_ASSERT((rightLower32 & Collation::ONLY_TERTIARY_MASK) != 0 ||
+                     (rightLower32 & 0xc0c0) == 0);
+            rightTertiary = rightLower32 & tertiaryMask;
+        } while(rightTertiary == 0);
+
+        if(leftTertiary != rightTertiary) {
+            if(CollationSettings::sortsTertiaryUpperCaseFirst(options)) {
+                // Pass through NO_CE and MERGE_SEPARATOR
+                // and keep real tertiary weights larger than the MERGE_SEPARATOR.
+                // Do not change the artificial uppercase weight of a tertiary CE (0.0.ut),
+                // to keep tertiary CEs well-formed.
+                // Their case+tertiary weights must be greater than those of
+                // primary and secondary CEs.
+                if(leftTertiary > Collation::MERGE_SEPARATOR_WEIGHT16) {
+                    if(leftLower32 > 0xffff) {
+                        leftTertiary ^= 0xc000;
+                    } else {
+                        leftTertiary += 0x4000;
+                    }
+                }
+                if(rightTertiary > Collation::MERGE_SEPARATOR_WEIGHT16) {
+                    if(rightLower32 > 0xffff) {
+                        rightTertiary ^= 0xc000;
+                    } else {
+                        rightTertiary += 0x4000;
+                    }
+                }
+            }
+            return (leftTertiary < rightTertiary) ? UCOL_LESS : UCOL_GREATER;
+        }
+        if(leftTertiary == Collation::NO_CE_WEIGHT16) { break; }
+    }
+    if(CollationSettings::getStrength(options) <= UCOL_TERTIARY) { return UCOL_EQUAL; }
+
+    if(!anyVariable && (anyQuaternaries & 0xc0) == 0) {
+        // If there are no "variable" CEs and no non-zero quaternary weights,
+        // then there are no quaternary differences.
+        return UCOL_EQUAL;
+    }
+
+    leftIndex = 0;
+    rightIndex = 0;
+    for(;;) {
+        uint32_t leftQuaternary;
+        do {
+            int64_t ce = left.getCE(leftIndex++);
+            leftQuaternary = (uint32_t)ce & 0xffff;
+            if(leftQuaternary == 0) {
+                // Variable primary or completely ignorable.
+                leftQuaternary = (uint32_t)(ce >> 32);
+            } else if(leftQuaternary <= Collation::MERGE_SEPARATOR_WEIGHT16) {
+                // Leave NO_CE or MERGE_SEPARATOR as is.
+            } else {
+                // Regular CE, not tertiary ignorable.
+                // Preserve the quaternary weight in bits 7..6.
+                leftQuaternary |= 0xffffff3f;
+            }
+        } while(leftQuaternary == 0);
+
+        uint32_t rightQuaternary;
+        do {
+            int64_t ce = right.getCE(rightIndex++);
+            rightQuaternary = (uint32_t)ce & 0xffff;
+            if(rightQuaternary == 0) {
+                // Variable primary or completely ignorable.
+                rightQuaternary = (uint32_t)(ce >> 32);
+            } else if(rightQuaternary <= Collation::MERGE_SEPARATOR_WEIGHT16) {
+                // Leave NO_CE or MERGE_SEPARATOR as is.
+            } else {
+                // Regular CE, not tertiary ignorable.
+                // Preserve the quaternary weight in bits 7..6.
+                rightQuaternary |= 0xffffff3f;
+            }
+        } while(rightQuaternary == 0);
+
+        if(leftQuaternary != rightQuaternary) {
+            // Return the difference, with script reordering.
+            const uint8_t *reorderTable = settings.reorderTable;
+            if (reorderTable != NULL) {
+                leftQuaternary = Collation::reorder(reorderTable, leftQuaternary);
+                rightQuaternary = Collation::reorder(reorderTable, rightQuaternary);
+            }
+            return (leftQuaternary < rightQuaternary) ? UCOL_LESS : UCOL_GREATER;
+        }
+        if(leftQuaternary == Collation::NO_CE_WEIGHT16) { break; }
+    }
+    return UCOL_EQUAL;
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationcompare.h b/icu4c/source/i18n/collationcompare.h
new file mode 100644 (file)
index 0000000..0185226
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+*******************************************************************************
+* Copyright (C) 1996-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationcompare.h
+*
+* created on: 2012feb14 with new and old collation code
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONCOMPARE_H__
+#define __COLLATIONCOMPARE_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/ucol.h"
+
+U_NAMESPACE_BEGIN
+
+class CollationIterator;
+struct CollationSettings;
+
+class U_I18N_API CollationCompare /* not : public UObject because all methods are static */ {
+public:
+    static UCollationResult compareUpToQuaternary(CollationIterator &left, CollationIterator &right,
+                                                  const CollationSettings &settings,
+                                                  UErrorCode &errorCode);
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONCOMPARE_H__
diff --git a/icu4c/source/i18n/collationdata.cpp b/icu4c/source/i18n/collationdata.cpp
new file mode 100644 (file)
index 0000000..ad4ef6b
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationdata.cpp
+*
+* created on: 2012jul28
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/ucol.h"
+#include "unicode/udata.h"
+#include "unicode/uscript.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "uassert.h"
+#include "utrie2.h"
+
+U_NAMESPACE_BEGIN
+
+uint32_t
+CollationData::getIndirectCE32(uint32_t ce32) const {
+    U_ASSERT(Collation::isSpecialCE32(ce32));
+    int32_t tag = Collation::tagFromCE32(ce32);
+    if(tag == Collation::DIGIT_TAG) {
+        // Fetch the non-numeric-collation CE32.
+        ce32 = ce32s[Collation::indexFromCE32(ce32)];
+    } else if(tag == Collation::LEAD_SURROGATE_TAG) {
+        ce32 = Collation::UNASSIGNED_CE32;
+    } else if(tag == Collation::U0000_TAG) {
+        // Fetch the normal ce32 for U+0000.
+        ce32 = ce32s[0];
+    }
+    return ce32;
+}
+
+uint32_t
+CollationData::getFinalCE32(uint32_t ce32) const {
+    if(Collation::isSpecialCE32(ce32)) {
+        ce32 = getIndirectCE32(ce32);
+    }
+    return ce32;
+}
+
+uint32_t
+CollationData::getFirstPrimaryForGroup(int32_t script) const {
+    int32_t index = findScript(script);
+    if(index < 0) {
+        return 0;
+    }
+    uint32_t head = scripts[index];
+    return (head & 0xff00) << 16;
+}
+
+uint32_t
+CollationData::getLastPrimaryForGroup(int32_t script) const {
+    int32_t index = findScript(script);
+    if(index < 0) {
+        return 0;
+    }
+    uint32_t head = scripts[index];
+    uint32_t lastByte = head & 0xff;
+    return ((lastByte + 1) << 24) - 1;
+}
+
+int32_t
+CollationData::getGroupForPrimary(uint32_t p) const {
+    p >>= 24;  // Reordering groups are distinguished by primary lead bytes.
+    for(int32_t i = 0; i < scriptsLength; i = i + 2 + scripts[i + 1]) {
+        uint32_t lastByte = scripts[i] & 0xff;
+        if(p <= lastByte) {
+            return scripts[i + 2];
+        }
+    }
+    return -1;
+}
+
+int32_t
+CollationData::findScript(int32_t script) const {
+    if(script < 0 || 0xffff < script) { return -1; }
+    for(int32_t i = 0; i < scriptsLength;) {
+        int32_t limit = i + 2 + scripts[i + 1];
+        for(int32_t j = i + 2; j < limit; ++j) {
+            if(script == scripts[j]) { return i; }
+        }
+        i = limit;
+    }
+    return -1;
+}
+
+int32_t
+CollationData::getEquivalentScripts(int32_t script,
+                                    int32_t dest[], int32_t capacity,
+                                    UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return 0; }
+    int32_t i = findScript(script);
+    if(i < 0) { return 0; }
+    int32_t length = scripts[i + 1];
+    U_ASSERT(length != 0);
+    if(length > capacity) {
+        errorCode = U_BUFFER_OVERFLOW_ERROR;
+        return length;
+    }
+    i += 2;
+    dest[0] = scripts[i++];
+    for(int32_t j = 1; j < length; ++j) {
+        script = scripts[i++];
+        // Sorted insertion.
+        for(int32_t k = j;; --k) {
+            // Invariant: dest[k] is free to receive either script or dest[k - 1].
+            if(k > 0 && script < dest[k - 1]) {
+                dest[k] = dest[k - 1];
+            } else {
+                dest[k] = script;
+                break;
+            }
+        }
+    }
+    return length;
+}
+
+void
+CollationData::makeReorderTable(const int32_t *reorder, int32_t length,
+                                uint8_t table[256], UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return; }
+
+    // Initialize the table.
+    // Never reorder special low and high primary lead bytes.
+    int32_t lowByte;
+    for(lowByte = 0; lowByte <= Collation::MERGE_SEPARATOR_BYTE; ++lowByte) {
+        table[lowByte] = lowByte;
+    }
+    // lowByte == 03
+
+    int32_t highByte;
+    for(highByte = 0xff; highByte >= Collation::TRAIL_WEIGHT_BYTE; --highByte) {
+        table[highByte] = highByte;
+    }
+    // highByte == FE
+
+    // Set intermediate bytes to 0 to indicate that they have not been set yet.
+    for(int32_t i = lowByte; i <= highByte; ++i) {
+        table[i] = 0;
+    }
+
+    // Get the set of special reorder codes in the input list.
+    // This supports up to 32 special reorder codes;
+    // it works for data with codes beyond UCOL_REORDER_CODE_LIMIT.
+    uint32_t specials = 0;
+    for(int32_t i = 0; i < length; ++i) {
+        int32_t reorderCode = reorder[i] - UCOL_REORDER_CODE_FIRST;
+        if(0 <= reorderCode && reorderCode <= 31) {
+            specials |= (uint32_t)1 << reorderCode;
+        }
+    }
+
+    // Start the reordering with the special low reorder codes that do not occur in the input.
+    for(int32_t i = 0;; i += 3) {
+        if(scripts[i + 1] != 1) { break; }  // Went beyond special single-code reorder codes.
+        int32_t reorderCode = (int32_t)scripts[i + 2] - UCOL_REORDER_CODE_FIRST;
+        if(reorderCode < 0) { break; }  // Went beyond special reorder codes.
+        if((specials & ((uint32_t)1 << reorderCode)) == 0) {
+            int32_t head = scripts[i];
+            int32_t firstByte = head >> 8;
+            int32_t lastByte = head & 0xff;
+            do { table[firstByte++] = lowByte++; } while(firstByte <= lastByte);
+        }
+    }
+
+    // Reorder according to the input scripts, continuing from the bottom of the bytes range.
+    for(int32_t i = 0; i < length;) {
+        int32_t script = reorder[i++];
+        if(script == USCRIPT_UNKNOWN) {
+            // Put the remaining scripts at the top.
+            while(i < length) {
+                script = reorder[--length];
+                if(script == USCRIPT_UNKNOWN ||  // Must occur at most once.
+                        script == UCOL_REORDER_CODE_DEFAULT) {
+                    errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+                    return;
+                }
+                int32_t index = findScript(script);
+                if(index < 0) { continue; }
+                int32_t head = scripts[index];
+                int32_t firstByte = head >> 8;
+                int32_t lastByte = head & 0xff;
+                if(table[firstByte] != 0) {  // Duplicate or equivalent script.
+                    errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+                    return;
+                }
+                do { table[lastByte--] = highByte--; } while(firstByte <= lastByte);
+            }
+            break;
+        }
+        if(script == UCOL_REORDER_CODE_DEFAULT) {
+            // The default code must be the only one in the list, and that is handled by the caller.
+            // Otherwise it must not be used.
+            errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+            return;
+        }
+        int32_t index = findScript(script);
+        if(index < 0) { continue; }
+        int32_t head = scripts[index];
+        int32_t firstByte = head >> 8;
+        int32_t lastByte = head & 0xff;
+        if(table[firstByte] != 0) {  // Duplicate or equivalent script.
+            errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+            return;
+        }
+        do { table[firstByte++] = lowByte++; } while(firstByte <= lastByte);
+    }
+
+    // Put all remaining scripts into the middle.
+    // Avoid table[0] which must remain 0.
+    for(int32_t i = 1; i <= 0xff; ++i) {
+        if(table[i] == 0) { table[i] = lowByte++; }
+    }
+    U_ASSERT(lowByte == highByte + 1);
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationdata.h b/icu4c/source/i18n/collationdata.h
new file mode 100644 (file)
index 0000000..7ff5d77
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+*******************************************************************************
+* Copyright (C) 2010-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationdata.h
+*
+* created on: 2010oct27
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONDATA_H__
+#define __COLLATIONDATA_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/uniset.h"
+#include "collation.h"
+#include "normalizer2impl.h"
+#include "utrie2.h"
+
+struct UDataMemory;
+
+U_NAMESPACE_BEGIN
+
+/**
+ * Collation data container.
+ * Immutable data created by a CollationDataBuilder, or loaded from a file,
+ * or deserialized from API-provided binary data.
+ *
+ * Includes data for the collation base (root/default), aliased if this is not the base.
+ */
+struct U_I18N_API CollationData : public UMemory {
+    CollationData(const Normalizer2Impl &nfc)
+            : trie(NULL),
+              ce32s(NULL), ces(NULL), contexts(NULL), base(NULL),
+              jamoCE32s(NULL),
+              nfcImpl(nfc),
+              numericPrimary(0x12000000),
+              ce32sLength(0), cesLength(0), contextsLength(0),
+              compressibleBytes(NULL),
+              unsafeBackwardSet(NULL),
+              fastLatinTable(NULL), fastLatinTableLength(0),
+              scripts(NULL), scriptsLength(0),
+              rootElements(NULL), rootElementsLength(0) {}
+
+    uint32_t getCE32(UChar32 c) const {
+        return UTRIE2_GET32(trie, c);
+    }
+
+    uint32_t getCE32FromSupplementary(UChar32 c) const {
+        return UTRIE2_GET32_FROM_SUPP(trie, c);
+    }
+
+    UBool isDigit(UChar32 c) const {
+        return c < 0x660 ? c <= 0x39 && 0x30 <= c :
+                Collation::hasCE32Tag(getCE32(c), Collation::DIGIT_TAG);
+    }
+
+    UBool isUnsafeBackward(UChar32 c, UBool numeric) const {
+        return unsafeBackwardSet->contains(c) || (numeric && isDigit(c));
+    }
+
+    UBool isCompressibleLeadByte(uint32_t b) const {
+        return compressibleBytes[b];
+    }
+
+    inline UBool isCompressiblePrimary(uint32_t p) const {
+        return isCompressibleLeadByte(p >> 24);
+    }
+
+    /**
+     * Returns the CE32 from two contexts words.
+     * Access to the defaultCE32 for contraction and prefix matching.
+     */
+    static uint32_t readCE32(const UChar *p) {
+        return ((uint32_t)p[0] << 16) | p[1];
+    }
+
+    /**
+     * Returns the CE32 for an indirect special CE32 (e.g., with DIGIT_TAG).
+     * Requires that ce32 is special.
+     */
+    uint32_t getIndirectCE32(uint32_t ce32) const;
+    /**
+     * Returns the CE32 for an indirect special CE32 (e.g., with DIGIT_TAG),
+     * if ce32 is special.
+     */
+    uint32_t getFinalCE32(uint32_t ce32) const;
+
+    /**
+     * Computes a CE from c's ce32 which has the OFFSET_TAG.
+     */
+    int64_t getCEFromOffsetCE32(UChar32 c, uint32_t ce32) const {
+        int64_t dataCE = ces[Collation::indexFromCE32(ce32)];
+        return Collation::makeCE(Collation::getThreeBytePrimaryForOffsetData(c, dataCE));
+    }
+
+    /**
+     * Returns the FCD16 value for code point c. c must be >= 0.
+     */
+    uint16_t getFCD16(UChar32 c) const {
+        return nfcImpl.getFCD16(c);
+    }
+
+    /**
+     * Returns the first primary for the script's reordering group.
+     * @return the primary with only the first primary lead byte of the group
+     *         (not necessarily an actual root collator primary weight),
+     *         or 0 if the script is unknown
+     */
+    uint32_t getFirstPrimaryForGroup(int32_t script) const;
+
+    /**
+     * Returns the last primary for the script's reordering group.
+     * @return the last primary of the group
+     *         (not an actual root collator primary weight),
+     *         or 0 if the script is unknown
+     */
+    uint32_t getLastPrimaryForGroup(int32_t script) const;
+
+    /**
+     * Finds the reordering group which contains the primary weight.
+     * @return the first script of the group, or -1 if the weight is beyond the last group
+     */
+    int32_t getGroupForPrimary(uint32_t p) const;
+
+    int32_t getEquivalentScripts(int32_t script,
+                                 int32_t dest[], int32_t capacity, UErrorCode &errorCode) const;
+
+    /**
+     * Writes the permutation table for the given reordering of scripts and groups,
+     * mapping from default-order primary-weight lead bytes to reordered lead bytes.
+     * The caller checks for illegal arguments and
+     * takes care of [DEFAULT] and memory allocation.
+     */
+    void makeReorderTable(const int32_t *reorder, int32_t length,
+                          uint8_t table[256], UErrorCode &errorCode) const;
+
+    /** @see jamoCE32s */
+    static const int32_t JAMO_CE32S_LENGTH = 19 + 21 + 27;
+
+    /** Main lookup trie. */
+    const UTrie2 *trie;
+    /**
+     * Array of CE32 values.
+     * At index 0 there must be CE32(U+0000)
+     * to support U+0000's special-tag for NUL-termination handling.
+     */
+    const uint32_t *ce32s;
+    /** Array of CE values for expansions and OFFSET_TAG. */
+    const int64_t *ces;
+    /** Array of prefix and contraction-suffix matching data. */
+    const UChar *contexts;
+    /** Base collation data, or NULL if this data itself is a base. */
+    const CollationData *base;
+    /**
+     * Simple array of JAMO_CE32S_LENGTH=19+21+27 CE32s, one per canonical Jamo L/V/T.
+     * They are normally simple CE32s, rarely expansions.
+     * For fast handling of HANGUL_TAG.
+     */
+    const uint32_t *jamoCE32s;
+    const Normalizer2Impl &nfcImpl;
+    /** The single-byte primary weight (xx000000) for numeric collation. */
+    uint32_t numericPrimary;
+
+    int32_t ce32sLength;
+    int32_t cesLength;
+    int32_t contextsLength;
+
+    /** 256 flags for which primary-weight lead bytes are compressible. */
+    const UBool *compressibleBytes;
+    /**
+     * Set of code points that are unsafe for starting string comparison after an identical prefix,
+     * or in backwards CE iteration.
+     */
+    const UnicodeSet *unsafeBackwardSet;
+
+    /**
+     * Fast Latin table for common-Latin-text string comparisons.
+     * Data structure see class CollationFastLatin.
+     */
+    const uint16_t *fastLatinTable;
+    int32_t fastLatinTableLength;
+
+    /**
+     * Data for scripts and reordering groups.
+     * Uses include building a reordering permutation table and
+     * providing script boundaries to AlphabeticIndex.
+     *
+     * This data is a sorted list of primary-weight lead byte ranges (reordering groups),
+     * each with a list of pairs sorted in base collation order;
+     * each pair contains a script/reorder code and the lowest primary weight for that script.
+     *
+     * Data structure:
+     * - Each reordering group is encoded in n+2 16-bit integers.
+     *   - First integer:
+     *     Bits 15..8: First byte of the reordering group's range.
+     *     Bits  7..0: Last byte of the reordering group's range.
+     *   - Second integer:
+     *     Length n of the list of script/reordering codes.
+     *   - Each further integer is a script or reordering code.
+     */
+    const uint16_t *scripts;
+    int32_t scriptsLength;
+
+    /**
+     * Collation elements in the root collator.
+     * Used by the CollationRootElements class. The data structure is described there.
+     * NULL in a tailoring.
+     */
+    const uint32_t *rootElements;
+    int32_t rootElementsLength;
+
+private:
+    int32_t findScript(int32_t script) const;
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONDATA_H__
diff --git a/icu4c/source/i18n/collationdatabuilder.cpp b/icu4c/source/i18n/collationdatabuilder.cpp
new file mode 100644 (file)
index 0000000..8d275b7
--- /dev/null
@@ -0,0 +1,1528 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationdatabuilder.cpp
+*
+* (replaced the former ucol_elm.cpp)
+*
+* created on: 2012apr01
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/localpointer.h"
+#include "unicode/uchar.h"
+#include "unicode/ucharstrie.h"
+#include "unicode/ucharstriebuilder.h"
+#include "unicode/uniset.h"
+#include "unicode/unistr.h"
+#include "unicode/usetiter.h"
+#include "unicode/utf16.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationdatabuilder.h"
+#include "collationfastlatinbuilder.h"
+#include "collationiterator.h"
+#include "normalizer2impl.h"
+#include "utrie2.h"
+#include "uvectr32.h"
+#include "uvectr64.h"
+#include "uvector.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
+
+U_NAMESPACE_BEGIN
+
+CollationDataBuilder::CEModifier::~CEModifier() {}
+
+/**
+ * Build-time context and CE32 for a code point.
+ * If a code point has contextual mappings, then the default (no-context) mapping
+ * and all conditional mappings are stored in a singly-linked list
+ * of ConditionalCE32, sorted by context strings.
+ *
+ * Context strings sort by prefix length, then by prefix, then by contraction suffix.
+ * Context strings must be unique and in ascending order.
+ */
+struct ConditionalCE32 : public UMemory {
+    ConditionalCE32(const UnicodeString &ct, uint32_t ce)
+            : context(ct),
+              ce32(ce), defaultCE32(Collation::NO_CE32), builtCE32(Collation::NO_CE32),
+              next(-1) {}
+
+    inline UBool hasContext() const { return context.length() > 1; }
+    inline int32_t prefixLength() const { return context.charAt(0); }
+
+    /**
+     * "\0" for the first entry for any code point, with its default CE32.
+     *
+     * Otherwise one unit with the length of the prefix string,
+     * then the prefix string, then the contraction suffix.
+     */
+    UnicodeString context;
+    /**
+     * CE32 for the code point and its context.
+     * Can be special (e.g., for an expansion) but not contextual (prefix or contraction tag).
+     */
+    uint32_t ce32;
+    /**
+     * Default CE32 for all contexts with this same prefix.
+     * Initially NO_CE32. Set only while building runtime data structures,
+     * and only on one of the nodes of a sub-list with the same prefix.
+     */
+    uint32_t defaultCE32;
+    /**
+     * CE32 for the built contexts.
+     * When fetching CEs from the builder, the contexts are built into their runtime form
+     * so that the normal collation implementation can process them.
+     * The result is cached in the list head. It is reset when the contexts are modified.
+     */
+    uint32_t builtCE32;
+    /**
+     * Index of the next ConditionalCE32.
+     * Negative for the end of the list.
+     */
+    int32_t next;
+};
+
+U_CDECL_BEGIN
+
+U_CAPI void U_CALLCONV
+uprv_deleteConditionalCE32(void *obj) {
+    delete static_cast<ConditionalCE32 *>(obj);
+}
+
+U_CDECL_END
+
+/**
+ * Build-time collation element and character iterator.
+ * Uses the runtime CollationIterator for fetching CEs for a string
+ * but reads from the builder's unfinished data structures.
+ * In particular, this class reads from the unfinished trie
+ * and has to avoid CollationIterator::nextCE() and redirect other
+ * calls to data->getCE32() and data->getCE32FromSupplementary().
+ *
+ * We do this so that we need not implement the collation algorithm
+ * again for the builder and make it behave exactly like the runtime code.
+ * That would be more difficult to test and maintain than this indirection.
+ *
+ * Some CE32 tags (for example, the DIGIT_TAG) do not occur in the builder data,
+ * so the data accesses from those code paths need not be modified.
+ *
+ * This class iterates directly over whole code points
+ * so that the CollationIterator does not need the finished trie
+ * for handling the LEAD_SURROGATE_TAG.
+ */
+class DataBuilderCollationIterator : public CollationIterator {
+public:
+    DataBuilderCollationIterator(CollationDataBuilder &b);
+
+    virtual ~DataBuilderCollationIterator();
+
+    int32_t fetchCEs(const UnicodeString &str, int32_t start, int64_t ces[], int32_t cesLength);
+
+    virtual void resetToOffset(int32_t newOffset);
+    virtual int32_t getOffset() const;
+
+    virtual UChar32 nextCodePoint(UErrorCode &errorCode);
+    virtual UChar32 previousCodePoint(UErrorCode &errorCode);
+
+protected:
+    virtual void forwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+    virtual void backwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+
+    virtual uint32_t getDataCE32(UChar32 c) const;
+    virtual uint32_t getCE32FromBuilderData(uint32_t ce32, UErrorCode &errorCode);
+
+    CollationDataBuilder &builder;
+    CollationData builderData;
+    uint32_t jamoCE32s[CollationData::JAMO_CE32S_LENGTH];
+    const UnicodeString *s;
+    int32_t pos;
+};
+
+DataBuilderCollationIterator::DataBuilderCollationIterator(CollationDataBuilder &b)
+        : CollationIterator(&builderData, /*numeric=*/ FALSE),
+          builder(b), builderData(b.nfcImpl),
+          s(NULL), pos(0) {
+    builderData.base = builder.base;
+    // Set all of the jamoCE32s[] to indirection CE32s.
+    for(int32_t j = 0; j < CollationData::JAMO_CE32S_LENGTH; ++j) {  // Count across Jamo types.
+        UChar32 jamo = CollationDataBuilder::jamoCpFromIndex(j);
+        jamoCE32s[j] = Collation::makeCE32FromTagAndIndex(Collation::BUILDER_DATA_TAG, jamo) |
+                CollationDataBuilder::IS_BUILDER_JAMO_CE32;
+    }
+    builderData.jamoCE32s = jamoCE32s;
+}
+
+DataBuilderCollationIterator::~DataBuilderCollationIterator() {}
+
+int32_t
+DataBuilderCollationIterator::fetchCEs(const UnicodeString &str, int32_t start,
+                                       int64_t ces[], int32_t cesLength) {
+    // Set the pointers each time, in case they changed due to reallocation.
+    builderData.ce32s = reinterpret_cast<const uint32_t *>(builder.ce32s.getBuffer());
+    builderData.ces = builder.ce64s.getBuffer();
+    builderData.contexts = builder.contexts.getBuffer();
+    // Modified copy of CollationIterator::nextCE() and CollationIterator::nextCEFromCE32().
+    reset();
+    s = &str;
+    pos = start;
+    UErrorCode errorCode = U_ZERO_ERROR;
+    while(U_SUCCESS(errorCode) && pos < s->length()) {
+        // No need to keep all CEs in the iterator buffer.
+        clearCEs();
+        UChar32 c = s->char32At(pos);
+        pos += U16_LENGTH(c);
+        uint32_t ce32 = utrie2_get32(builder.trie, c);
+        const CollationData *d;
+        if(ce32 == Collation::FALLBACK_CE32) {
+            d = builder.base;
+            ce32 = builder.base->getCE32(c);
+        } else {
+            d = &builderData;
+        }
+        appendCEsFromCE32(d, c, ce32, /*forward=*/ TRUE, errorCode);
+        U_ASSERT(U_SUCCESS(errorCode));
+        for(int32_t i = 0; i < getCEsLength(); ++i) {
+            int64_t ce = getCE(i);
+            if(ce != 0) {
+                if(cesLength < Collation::MAX_EXPANSION_LENGTH) {
+                    ces[cesLength] = ce;
+                }
+                ++cesLength;
+            }
+        }
+    }
+    return cesLength;
+}
+
+void
+DataBuilderCollationIterator::resetToOffset(int32_t newOffset) {
+    reset();
+    pos = newOffset;
+}
+
+int32_t
+DataBuilderCollationIterator::getOffset() const {
+    return pos;
+}
+
+UChar32
+DataBuilderCollationIterator::nextCodePoint(UErrorCode & /*errorCode*/) {
+    if(pos == s->length()) {
+        return U_SENTINEL;
+    }
+    UChar32 c = s->char32At(pos);
+    pos += U16_LENGTH(c);
+    return c;
+}
+
+UChar32
+DataBuilderCollationIterator::previousCodePoint(UErrorCode & /*errorCode*/) {
+    if(pos == 0) {
+        return U_SENTINEL;
+    }
+    UChar32 c = s->char32At(pos - 1);
+    pos -= U16_LENGTH(c);
+    return c;
+}
+
+void
+DataBuilderCollationIterator::forwardNumCodePoints(int32_t num, UErrorCode & /*errorCode*/) {
+    pos = s->moveIndex32(pos, num);
+}
+
+void
+DataBuilderCollationIterator::backwardNumCodePoints(int32_t num, UErrorCode & /*errorCode*/) {
+    pos = s->moveIndex32(pos, -num);
+}
+
+uint32_t
+DataBuilderCollationIterator::getDataCE32(UChar32 c) const {
+    return utrie2_get32(builder.trie, c);
+}
+
+uint32_t
+DataBuilderCollationIterator::getCE32FromBuilderData(uint32_t ce32, UErrorCode &errorCode) {
+    U_ASSERT(Collation::hasCE32Tag(ce32, Collation::BUILDER_DATA_TAG));
+    if((ce32 & CollationDataBuilder::IS_BUILDER_JAMO_CE32) != 0) {
+        UChar32 jamo = Collation::indexFromCE32(ce32);
+        return utrie2_get32(builder.trie, jamo);
+    } else {
+        ConditionalCE32 *cond = builder.getConditionalCE32ForCE32(ce32);
+        if(cond->builtCE32 == Collation::NO_CE32) {
+            // Build the context-sensitive mappings into their runtime form and cache the result.
+            cond->builtCE32 = builder.buildContext(cond, errorCode);
+            if(errorCode == U_BUFFER_OVERFLOW_ERROR) {
+                errorCode = U_ZERO_ERROR;
+                builder.clearContexts();
+                cond->builtCE32 = builder.buildContext(cond, errorCode);
+            }
+            builderData.contexts = builder.contexts.getBuffer();
+        }
+        return cond->builtCE32;
+    }
+}
+
+// ------------------------------------------------------------------------- ***
+
+CollationDataBuilder::CollationDataBuilder(UErrorCode &errorCode)
+        : nfcImpl(*Normalizer2Factory::getNFCImpl(errorCode)),
+          base(NULL), baseSettings(NULL),
+          trie(NULL),
+          ce32s(errorCode), ce64s(errorCode), conditionalCE32s(errorCode),
+          modified(FALSE),
+          fastLatinEnabled(FALSE), fastLatinBuilder(NULL),
+          collIter(NULL) {
+    // Reserve the first CE32 for U+0000.
+    ce32s.addElement(0, errorCode);
+    conditionalCE32s.setDeleter(uprv_deleteConditionalCE32);
+}
+
+CollationDataBuilder::~CollationDataBuilder() {
+    utrie2_close(trie);
+    delete fastLatinBuilder;
+    delete collIter;
+}
+
+void
+CollationDataBuilder::initForTailoring(const CollationData *b, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    if(trie != NULL) {
+        errorCode = U_INVALID_STATE_ERROR;
+        return;
+    }
+    if(b == NULL) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
+    base = b;
+
+    // For a tailoring, the default is to fall back to the base.
+    trie = utrie2_open(Collation::FALLBACK_CE32, Collation::FFFD_CE32, &errorCode);
+
+    // Set the Latin-1 letters block so that it is allocated first in the data array,
+    // to try to improve locality of reference when sorting Latin-1 text.
+    // Do not use utrie2_setRange32() since that will not actually allocate blocks
+    // that are filled with the default value.
+    // ASCII (0..7F) is already preallocated anyway.
+    for(UChar32 c = 0xc0; c <= 0xff; ++c) {
+        utrie2_set32(trie, c, Collation::FALLBACK_CE32, &errorCode);
+    }
+
+    // Hangul syllables are not tailorable (except via tailoring Jamos).
+    // Always set the Hangul tag to help performance.
+    // Do this here, rather than in buildMappings(),
+    // so that we see the HANGUL_TAG in various assertions.
+    uint32_t hangulCE32 = Collation::makeCE32FromTagAndIndex(Collation::HANGUL_TAG, 0);
+    utrie2_setRange32(trie, Hangul::HANGUL_BASE, Hangul::HANGUL_END, hangulCE32, TRUE, &errorCode);
+
+    // Copy the set contents but don't copy/clone the set as a whole because
+    // that would copy the isFrozen state too.
+    unsafeBackwardSet.addAll(*b->unsafeBackwardSet);
+
+    if(U_FAILURE(errorCode)) { return; }
+}
+
+UBool
+CollationDataBuilder::maybeSetPrimaryRange(UChar32 start, UChar32 end,
+                                           uint32_t primary, int32_t step,
+                                           UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    U_ASSERT(start <= end);
+    // TODO: Do we need to check what values are currently set for start..end?
+    // An offset range is worth it only if we can achieve an overlap between
+    // adjacent UTrie2 blocks of 32 code points each.
+    // An offset CE is also a little more expensive to look up and compute
+    // than a simple CE.
+    // If the range spans at least three UTrie2 block boundaries (> 64 code points),
+    // then we take it.
+    // If the range spans one or two block boundaries and there are
+    // at least 4 code points on either side, then we take it.
+    // (We could additionally require a minimum range length of, say, 16.)
+    int32_t blockDelta = (end >> 5) - (start >> 5);
+    if(2 <= step && step <= 0x7f &&
+            (blockDelta >= 3 ||
+            (blockDelta > 0 && (start & 0x1f) <= 0x1c && (end & 0x1f) >= 3))) {
+        int64_t dataCE = ((int64_t)primary << 32) | (start << 8) | step;
+        if(isCompressiblePrimary(primary)) { dataCE |= 0x80; }
+        int32_t index = addCE(dataCE, errorCode);
+        if(U_FAILURE(errorCode)) { return 0; }
+        if(index > Collation::MAX_INDEX) {
+            errorCode = U_BUFFER_OVERFLOW_ERROR;
+            return 0;
+        }
+        uint32_t offsetCE32 = Collation::makeCE32FromTagAndIndex(Collation::OFFSET_TAG, index);
+        utrie2_setRange32(trie, start, end, offsetCE32, TRUE, &errorCode);
+        modified = TRUE;
+        return TRUE;
+    } else {
+        return FALSE;
+    }
+}
+
+uint32_t
+CollationDataBuilder::setPrimaryRangeAndReturnNext(UChar32 start, UChar32 end,
+                                                   uint32_t primary, int32_t step,
+                                                   UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    UBool isCompressible = isCompressiblePrimary(primary);
+    if(maybeSetPrimaryRange(start, end, primary, step, errorCode)) {
+        return Collation::incThreeBytePrimaryByOffset(primary, isCompressible,
+                                                      (end - start + 1) * step);
+    } else {
+        // Short range: Set individual CE32s.
+        for(;;) {
+            utrie2_set32(trie, start, Collation::makeLongPrimaryCE32(primary), &errorCode);
+            ++start;
+            primary = Collation::incThreeBytePrimaryByOffset(primary, isCompressible, step);
+            if(start > end) { return primary; }
+        }
+        modified = TRUE;
+    }
+}
+
+uint32_t
+CollationDataBuilder::getCE32FromOffsetCE32(UBool fromBase, UChar32 c, uint32_t ce32) const {
+    int32_t i = Collation::indexFromCE32(ce32);
+    int64_t dataCE = fromBase ? base->ces[i] : ce64s.elementAti(i);
+    uint32_t p = Collation::getThreeBytePrimaryForOffsetData(c, dataCE);
+    return Collation::makeLongPrimaryCE32(p);
+}
+
+UBool
+CollationDataBuilder::isCompressibleLeadByte(uint32_t b) const {
+    return base->isCompressibleLeadByte(b);
+}
+
+UBool
+CollationDataBuilder::isAssigned(UChar32 c) const {
+    return Collation::isAssignedCE32(utrie2_get32(trie, c));
+}
+
+uint32_t
+CollationDataBuilder::getLongPrimaryIfSingleCE(UChar32 c) const {
+    uint32_t ce32 = utrie2_get32(trie, c);
+    if(Collation::isLongPrimaryCE32(ce32)) {
+        return Collation::primaryFromLongPrimaryCE32(ce32);
+    } else {
+        return 0;
+    }
+}
+
+int64_t
+CollationDataBuilder::getSingleCE(UChar32 c, UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return 0; }
+    UBool fromBase = FALSE;
+    uint32_t ce32 = utrie2_get32(trie, c);
+    if(ce32 == Collation::FALLBACK_CE32) {
+        fromBase = TRUE;
+        ce32 = base->getCE32(c);
+    }
+    while(Collation::isSpecialCE32(ce32)) {
+        switch(Collation::tagFromCE32(ce32)) {
+        case Collation::LATIN_EXPANSION_TAG:
+        case Collation::BUILDER_DATA_TAG:
+        case Collation::PREFIX_TAG:
+        case Collation::CONTRACTION_TAG:
+        case Collation::HANGUL_TAG:
+        case Collation::LEAD_SURROGATE_TAG:
+            errorCode = U_UNSUPPORTED_ERROR;
+            return 0;
+        case Collation::FALLBACK_TAG:
+        case Collation::RESERVED_TAG_3:
+            errorCode = U_INTERNAL_PROGRAM_ERROR;
+            return 0;
+        case Collation::LONG_PRIMARY_TAG:
+            return Collation::ceFromLongPrimaryCE32(ce32);
+        case Collation::LONG_SECONDARY_TAG:
+            return Collation::ceFromLongSecondaryCE32(ce32);
+        case Collation::EXPANSION32_TAG:
+            if(Collation::lengthFromCE32(ce32) == 1) {
+                int32_t i = Collation::indexFromCE32(ce32);
+                ce32 = fromBase ? base->ce32s[i] : ce32s.elementAti(i);
+                break;
+            } else {
+                errorCode = U_UNSUPPORTED_ERROR;
+                return 0;
+            }
+        case Collation::EXPANSION_TAG: {
+            if(Collation::lengthFromCE32(ce32) == 1) {
+                int32_t i = Collation::indexFromCE32(ce32);
+                return fromBase ? base->ces[i] : ce64s.elementAti(i);
+            } else {
+                errorCode = U_UNSUPPORTED_ERROR;
+                return 0;
+            }
+        }
+        case Collation::DIGIT_TAG:
+            // Fetch the non-numeric-collation CE32 and continue.
+            ce32 = ce32s.elementAti(Collation::indexFromCE32(ce32));
+            break;
+        case Collation::U0000_TAG:
+            U_ASSERT(c == 0);
+            // Fetch the normal ce32 for U+0000 and continue.
+            ce32 = fromBase ? base->ce32s[0] : ce32s.elementAti(0);
+            break;
+        case Collation::OFFSET_TAG:
+            ce32 = getCE32FromOffsetCE32(fromBase, c, ce32);
+            break;
+        case Collation::IMPLICIT_TAG:
+            return Collation::unassignedCEFromCodePoint(c);
+        }
+    }
+    return Collation::ceFromSimpleCE32(ce32);
+}
+
+int32_t
+CollationDataBuilder::addCE(int64_t ce, UErrorCode &errorCode) {
+    int32_t length = ce64s.size();
+    for(int32_t i = 0; i < length; ++i) {
+        if(ce == ce64s.elementAti(i)) { return i; }
+    }
+    ce64s.addElement(ce, errorCode);
+    return length;
+}
+
+int32_t
+CollationDataBuilder::addCE32(uint32_t ce32, UErrorCode &errorCode) {
+    int32_t length = ce32s.size();
+    for(int32_t i = 0; i < length; ++i) {
+        if(ce32 == (uint32_t)ce32s.elementAti(i)) { return i; }
+    }
+    ce32s.addElement((int32_t)ce32, errorCode);  
+    return length;
+}
+
+int32_t
+CollationDataBuilder::addConditionalCE32(const UnicodeString &context, uint32_t ce32,
+                                         UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return -1; }
+    U_ASSERT(!context.isEmpty());
+    int32_t index = conditionalCE32s.size();
+    if(index > Collation::MAX_INDEX) {
+        errorCode = U_BUFFER_OVERFLOW_ERROR;
+        return -1;
+    }
+    ConditionalCE32 *cond = new ConditionalCE32(context, ce32);
+    if(cond == NULL) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return -1;
+    }
+    conditionalCE32s.addElement(cond, errorCode);
+    return index;
+}
+
+void
+CollationDataBuilder::add(const UnicodeString &prefix, const UnicodeString &s,
+                          const int64_t ces[], int32_t cesLength,
+                          UErrorCode &errorCode) {
+    uint32_t ce32 = encodeCEs(ces, cesLength, errorCode);
+    addCE32(prefix, s, ce32, errorCode);
+}
+
+void
+CollationDataBuilder::addCE32(const UnicodeString &prefix, const UnicodeString &s,
+                              uint32_t ce32, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    if(s.isEmpty()) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
+    if(trie == NULL || utrie2_isFrozen(trie)) {
+        errorCode = U_INVALID_STATE_ERROR;
+        return;
+    }
+    UChar32 c = s.char32At(0);
+    int32_t cLength = U16_LENGTH(c);
+    uint32_t oldCE32 = utrie2_get32(trie, c);
+    UBool hasContext = !prefix.isEmpty() || s.length() > cLength;
+    if(oldCE32 == Collation::FALLBACK_CE32) {
+        // First tailoring for c.
+        // If c has contextual base mappings or if we add a contextual mapping,
+        // then copy the base mappings.
+        // Otherwise we just override the base mapping.
+        uint32_t baseCE32 = base->getFinalCE32(base->getCE32(c));
+        if(hasContext || Collation::ce32HasContext(baseCE32)) {
+            oldCE32 = copyFromBaseCE32(c, baseCE32, TRUE, errorCode);
+            utrie2_set32(trie, c, oldCE32, &errorCode);
+            if(U_FAILURE(errorCode)) { return; }
+        }
+    }
+    if(!hasContext) {
+        // No prefix, no contraction.
+        if(!isBuilderContextCE32(oldCE32)) {
+            utrie2_set32(trie, c, ce32, &errorCode);
+        } else {
+            ConditionalCE32 *cond = getConditionalCE32ForCE32(oldCE32);
+            cond->builtCE32 = Collation::NO_CE32;
+            cond->ce32 = ce32;
+        }
+    } else {
+        ConditionalCE32 *cond;
+        if(!isBuilderContextCE32(oldCE32)) {
+            // Replace the simple oldCE32 with a builder context CE32
+            // pointing to a new ConditionalCE32 list head.
+            int32_t index = addConditionalCE32(UnicodeString((UChar)0), oldCE32, errorCode);
+            if(U_FAILURE(errorCode)) { return; }
+            uint32_t contextCE32 = makeBuilderContextCE32(index);
+            utrie2_set32(trie, c, contextCE32, &errorCode);
+            contextChars.add(c);
+            cond = getConditionalCE32(index);
+        } else {
+            cond = getConditionalCE32ForCE32(oldCE32);
+            cond->builtCE32 = Collation::NO_CE32;
+        }
+        UnicodeString suffix(s, cLength);
+        UnicodeString context((UChar)prefix.length());
+        context.append(prefix).append(suffix);
+        unsafeBackwardSet.addAll(suffix);
+        for(;;) {
+            // invariant: context > cond->context
+            int32_t next = cond->next;
+            if(next < 0) {
+                // Append a new ConditionalCE32 after cond.
+                int32_t index = addConditionalCE32(context, ce32, errorCode);
+                if(U_FAILURE(errorCode)) { return; }
+                cond->next = index;
+                break;
+            }
+            ConditionalCE32 *nextCond = getConditionalCE32(next);
+            int8_t cmp = context.compare(nextCond->context);
+            if(cmp < 0) {
+                // Insert a new ConditionalCE32 between cond and nextCond.
+                int32_t index = addConditionalCE32(context, ce32, errorCode);
+                if(U_FAILURE(errorCode)) { return; }
+                cond->next = index;
+                getConditionalCE32(index)->next = next;
+                break;
+            } else if(cmp == 0) {
+                // Same context as before, overwrite its ce32.
+                nextCond->ce32 = ce32;
+                break;
+            }
+            cond = nextCond;
+        }
+    }
+    modified = TRUE;
+}
+
+uint32_t
+CollationDataBuilder::encodeOneCEAsCE32(int64_t ce) {
+    uint32_t p = (uint32_t)(ce >> 32);
+    uint32_t lower32 = (uint32_t)ce;
+    uint32_t t = (uint32_t)(ce & 0xffff);
+    U_ASSERT((t & 0xc000) != 0xc000);  // Impossible case bits 11 mark special CE32s.
+    if((ce & INT64_C(0xffff00ff00ff)) == 0) {
+        // normal form ppppsstt
+        return p | (lower32 >> 16) | (t >> 8);
+    } else if((ce & INT64_C(0xffffffffff)) == Collation::COMMON_SEC_AND_TER_CE) {
+        // long-primary form ppppppC1
+        return Collation::makeLongPrimaryCE32(p);
+    } else if(p == 0 && (t & 0xff) == 0) {
+        // long-secondary form ssssttC2
+        return Collation::makeLongSecondaryCE32(lower32);
+    }
+    return Collation::NO_CE32;
+}
+
+uint32_t
+CollationDataBuilder::encodeOneCE(int64_t ce, UErrorCode &errorCode) {
+    // Try to encode one CE as one CE32.
+    uint32_t ce32 = encodeOneCEAsCE32(ce);
+    if(ce32 != Collation::NO_CE32) { return ce32; }
+    int32_t index = addCE(ce, errorCode);
+    if(U_FAILURE(errorCode)) { return 0; }
+    if(index > Collation::MAX_INDEX) {
+        errorCode = U_BUFFER_OVERFLOW_ERROR;
+        return 0;
+    }
+    return Collation::makeCE32FromTagIndexAndLength(Collation::EXPANSION_TAG, index, 1);
+}
+
+uint32_t
+CollationDataBuilder::encodeCEs(const int64_t ces[], int32_t cesLength,
+                                UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    if(cesLength < 0 || cesLength > Collation::MAX_EXPANSION_LENGTH) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return 0;
+    }
+    if(trie == NULL || utrie2_isFrozen(trie)) {
+        errorCode = U_INVALID_STATE_ERROR;
+        return 0;
+    }
+    if(cesLength == 0) {
+        // Convenience: We cannot map to nothing, but we can map to a completely ignorable CE.
+        // Do this here so that callers need not do it.
+        return encodeOneCEAsCE32(0);
+    } else if(cesLength == 1) {
+        return encodeOneCE(ces[0], errorCode);
+    } else if(cesLength == 2) {
+        // Try to encode two CEs as one CE32.
+        int64_t ce0 = ces[0];
+        int64_t ce1 = ces[1];
+        uint32_t p0 = (uint32_t)(ce0 >> 32);
+        if((ce0 & INT64_C(0xffffffffff00ff)) == Collation::COMMON_SECONDARY_CE &&
+                (ce1 & INT64_C(0xffffffff00ffffff)) == Collation::COMMON_TERTIARY_CE &&
+                p0 != 0) {
+            // Latin mini expansion
+            return
+                p0 |
+                (((uint32_t)ce0 & 0xff00u) << 8) |
+                (uint32_t)(ce1 >> 16) |
+                Collation::SPECIAL_CE32_LOW_BYTE |
+                Collation::LATIN_EXPANSION_TAG;
+        }
+    }
+    // Try to encode two or more CEs as CE32s.
+    int32_t newCE32s[Collation::MAX_EXPANSION_LENGTH];
+    for(int32_t i = 0;; ++i) {
+        if(i == cesLength) {
+            return encodeExpansion32(newCE32s, cesLength, errorCode);
+        }
+        uint32_t ce32 = encodeOneCEAsCE32(ces[i]);
+        if(ce32 == Collation::NO_CE32) { break; }
+        newCE32s[i] = (int32_t)ce32;
+    }
+    return encodeExpansion(ces, cesLength, errorCode);
+}
+
+uint32_t
+CollationDataBuilder::encodeExpansion(const int64_t ces[], int32_t length, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    // See if this sequence of CEs has already been stored.
+    int64_t first = ces[0];
+    int32_t ce64sMax = ce64s.size() - length;
+    for(int32_t i = 0; i <= ce64sMax; ++i) {
+        if(first == ce64s.elementAti(i)) {
+            if(i > Collation::MAX_INDEX) {
+                errorCode = U_BUFFER_OVERFLOW_ERROR;
+                return 0;
+            }
+            for(int32_t j = 1;; ++j) {
+                if(j == length) {
+                    return Collation::makeCE32FromTagIndexAndLength(
+                            Collation::EXPANSION_TAG, i, length);
+                }
+                if(ce64s.elementAti(i + j) != ces[j]) { break; }
+            }
+        }
+    }
+    // Store the new sequence.
+    int32_t i = ce64s.size();
+    if(i > Collation::MAX_INDEX) {
+        errorCode = U_BUFFER_OVERFLOW_ERROR;
+        return 0;
+    }
+    for(int32_t j = 0; j < length; ++j) {
+        ce64s.addElement(ces[j], errorCode);
+    }
+    return Collation::makeCE32FromTagIndexAndLength(Collation::EXPANSION_TAG, i, length);
+}
+
+uint32_t
+CollationDataBuilder::encodeExpansion32(const int32_t newCE32s[], int32_t length,
+                                        UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    // See if this sequence of CE32s has already been stored.
+    int32_t first = newCE32s[0];
+    int32_t ce32sMax = ce32s.size() - length;
+    for(int32_t i = 0; i <= ce32sMax; ++i) {
+        if(first == ce32s.elementAti(i)) {
+            if(i > Collation::MAX_INDEX) {
+                errorCode = U_BUFFER_OVERFLOW_ERROR;
+                return 0;
+            }
+            for(int32_t j = 1;; ++j) {
+                if(j == length) {
+                    return Collation::makeCE32FromTagIndexAndLength(
+                            Collation::EXPANSION32_TAG, i, length);
+                }
+                if(ce32s.elementAti(i + j) != newCE32s[j]) { break; }
+            }
+        }
+    }
+    // Store the new sequence.
+    int32_t i = ce32s.size();
+    if(i > Collation::MAX_INDEX) {
+        errorCode = U_BUFFER_OVERFLOW_ERROR;
+        return 0;
+    }
+    for(int32_t j = 0; j < length; ++j) {
+        ce32s.addElement(newCE32s[j], errorCode);
+    }
+    return Collation::makeCE32FromTagIndexAndLength(Collation::EXPANSION32_TAG, i, length);
+}
+
+uint32_t
+CollationDataBuilder::copyFromBaseCE32(UChar32 c, uint32_t ce32, UBool withContext,
+                                       UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    if(!Collation::isSpecialCE32(ce32)) { return ce32; }
+    switch(Collation::tagFromCE32(ce32)) {
+    case Collation::LONG_PRIMARY_TAG:
+    case Collation::LONG_SECONDARY_TAG:
+    case Collation::LATIN_EXPANSION_TAG:
+        // copy as is
+        break;
+    case Collation::EXPANSION32_TAG: {
+        const uint32_t *baseCE32s = base->ce32s + Collation::indexFromCE32(ce32);
+        int32_t length = Collation::lengthFromCE32(ce32);
+        ce32 = encodeExpansion32(
+            reinterpret_cast<const int32_t *>(baseCE32s), length, errorCode);
+        break;
+    }
+    case Collation::EXPANSION_TAG: {
+        const int64_t *baseCEs = base->ces + Collation::indexFromCE32(ce32);
+        int32_t length = Collation::lengthFromCE32(ce32);
+        ce32 = encodeExpansion(baseCEs, length, errorCode);
+        break;
+    }
+    case Collation::PREFIX_TAG: {
+        // Flatten prefixes and nested suffixes (contractions)
+        // into a linear list of ConditionalCE32.
+        const UChar *p = base->contexts + Collation::indexFromCE32(ce32);
+        ce32 = CollationData::readCE32(p);  // Default if no prefix match.
+        if(!withContext) {
+            return copyFromBaseCE32(c, ce32, FALSE, errorCode);
+        }
+        ConditionalCE32 head(UnicodeString(), 0);
+        UnicodeString context((UChar)0);
+        int32_t index;
+        if(Collation::isContractionCE32(ce32)) {
+            index = copyContractionsFromBaseCE32(context, c, ce32, &head, errorCode);
+        } else {
+            ce32 = copyFromBaseCE32(c, ce32, TRUE, errorCode);
+            head.next = index = addConditionalCE32(context, ce32, errorCode);
+        }
+        if(U_FAILURE(errorCode)) { return 0; }
+        ConditionalCE32 *cond = getConditionalCE32(index);  // the last ConditionalCE32 so far
+        UCharsTrie::Iterator prefixes(p + 2, 0, errorCode);
+        while(prefixes.next(errorCode)) {
+            context = prefixes.getString();
+            context.reverse();
+            context.insert(0, (UChar)context.length());
+            ce32 = (uint32_t)prefixes.getValue();
+            if(Collation::isContractionCE32(ce32)) {
+                index = copyContractionsFromBaseCE32(context, c, ce32, cond, errorCode);
+            } else {
+                ce32 = copyFromBaseCE32(c, ce32, TRUE, errorCode);
+                cond->next = index = addConditionalCE32(context, ce32, errorCode);
+            }
+            if(U_FAILURE(errorCode)) { return 0; }
+            cond = getConditionalCE32(index);
+        }
+        ce32 = makeBuilderContextCE32(head.next);
+        contextChars.add(c);
+        break;
+    }
+    case Collation::CONTRACTION_TAG: {
+        if(!withContext) {
+            const UChar *p = base->contexts + Collation::indexFromCE32(ce32);
+            ce32 = CollationData::readCE32(p);  // Default if no suffix match.
+            return copyFromBaseCE32(c, ce32, FALSE, errorCode);
+        }
+        ConditionalCE32 head(UnicodeString(), 0);
+        UnicodeString context((UChar)0);
+        copyContractionsFromBaseCE32(context, c, ce32, &head, errorCode);
+        ce32 = makeBuilderContextCE32(head.next);
+        contextChars.add(c);
+        break;
+    }
+    case Collation::HANGUL_TAG:
+        errorCode = U_UNSUPPORTED_ERROR;  // We forbid tailoring of Hangul syllables.
+        break;
+    case Collation::OFFSET_TAG:
+        ce32 = getCE32FromOffsetCE32(TRUE, c, ce32);
+        break;
+    case Collation::IMPLICIT_TAG:
+        ce32 = encodeOneCE(Collation::unassignedCEFromCodePoint(c), errorCode);
+        break;
+    default:
+        U_ASSERT(FALSE);  // require ce32 == base->getFinalCE32(ce32)
+        break;
+    }
+    return ce32;
+}
+
+int32_t
+CollationDataBuilder::copyContractionsFromBaseCE32(UnicodeString &context, UChar32 c, uint32_t ce32,
+                                                   ConditionalCE32 *cond, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    const UChar *p = base->contexts + Collation::indexFromCE32(ce32);
+    int32_t index;
+    if((ce32 & Collation::CONTRACT_SINGLE_CP_NO_MATCH) != 0) {
+        // No match on the single code point.
+        // We are underneath a prefix, and the default mapping is just
+        // a fallback to the mappings for a shorter prefix.
+        U_ASSERT(context.length() > 1);
+        index = -1;
+    } else {
+        ce32 = CollationData::readCE32(p);  // Default if no suffix match.
+        U_ASSERT(!Collation::isContractionCE32(ce32));
+        ce32 = copyFromBaseCE32(c, ce32, TRUE, errorCode);
+        cond->next = index = addConditionalCE32(context, ce32, errorCode);
+        if(U_FAILURE(errorCode)) { return 0; }
+        cond = getConditionalCE32(index);
+    }
+
+    int32_t suffixStart = context.length();
+    UCharsTrie::Iterator suffixes(p + 2, 0, errorCode);
+    while(suffixes.next(errorCode)) {
+        context.append(suffixes.getString());
+        ce32 = copyFromBaseCE32(c, (uint32_t)suffixes.getValue(), TRUE, errorCode);
+        cond->next = index = addConditionalCE32(context, ce32, errorCode);
+        if(U_FAILURE(errorCode)) { return 0; }
+        // No need to update the unsafeBackwardSet because the tailoring set
+        // is already a copy of the base set.
+        cond = getConditionalCE32(index);
+        context.truncate(suffixStart);
+    }
+    U_ASSERT(index >= 0);
+    return index;
+}
+
+class CopyHelper {
+public:
+    CopyHelper(const CollationDataBuilder &s, CollationDataBuilder &d,
+               const CollationDataBuilder::CEModifier &m, UErrorCode &initialErrorCode)
+            : src(s), dest(d), modifier(m),
+              errorCode(initialErrorCode) {}
+
+    UBool copyRangeCE32(UChar32 start, UChar32 end, uint32_t ce32) {
+        ce32 = copyCE32(ce32);
+        utrie2_setRange32(dest.trie, start, end, ce32, TRUE, &errorCode);
+        if(CollationDataBuilder::isBuilderContextCE32(ce32)) {
+            dest.contextChars.add(start, end);
+        }
+        return U_SUCCESS(errorCode);
+    }
+
+    uint32_t copyCE32(uint32_t ce32) {
+        if(!Collation::isSpecialCE32(ce32)) {
+            int64_t ce = modifier.modifyCE32(ce32);
+            if(ce != Collation::NO_CE) {
+                ce32 = dest.encodeOneCE(ce, errorCode);
+            }
+        } else {
+            int32_t tag = Collation::tagFromCE32(ce32);
+            if(tag == Collation::EXPANSION32_TAG) {
+                const uint32_t *srcCE32s = reinterpret_cast<uint32_t *>(src.ce32s.getBuffer());
+                srcCE32s += Collation::indexFromCE32(ce32);
+                int32_t length = Collation::lengthFromCE32(ce32);
+                // Inspect the source CE32s. Just copy them if none are modified.
+                // Otherwise copy to modifiedCEs, with modifications.
+                UBool isModified = FALSE;
+                for(int32_t i = 0; i < length; ++i) {
+                    ce32 = srcCE32s[i];
+                    int64_t ce;
+                    if(Collation::isSpecialCE32(ce32) ||
+                            (ce = modifier.modifyCE32(ce32)) == Collation::NO_CE) {
+                        if(isModified) {
+                            modifiedCEs[i] = Collation::ceFromCE32(ce32);
+                        }
+                    } else {
+                        if(!isModified) {
+                            for(int32_t j = 0; j < i; ++j) {
+                                modifiedCEs[j] = Collation::ceFromCE32(srcCE32s[j]);
+                            }
+                            isModified = TRUE;
+                        }
+                        modifiedCEs[i] = ce;
+                    }
+                }
+                if(isModified) {
+                    ce32 = dest.encodeCEs(modifiedCEs, length, errorCode);
+                } else {
+                    ce32 = dest.encodeExpansion32(
+                        reinterpret_cast<const int32_t *>(srcCE32s), length, errorCode);
+                }
+            } else if(tag == Collation::EXPANSION_TAG) {
+                const int64_t *srcCEs = src.ce64s.getBuffer();
+                srcCEs += Collation::indexFromCE32(ce32);
+                int32_t length = Collation::lengthFromCE32(ce32);
+                // Inspect the source CEs. Just copy them if none are modified.
+                // Otherwise copy to modifiedCEs, with modifications.
+                UBool isModified = FALSE;
+                for(int32_t i = 0; i < length; ++i) {
+                    int64_t srcCE = srcCEs[i];
+                    int64_t ce = modifier.modifyCE(srcCE);
+                    if(ce == Collation::NO_CE) {
+                        if(isModified) {
+                            modifiedCEs[i] = srcCE;
+                        }
+                    } else {
+                        if(!isModified) {
+                            for(int32_t j = 0; j < i; ++j) {
+                                modifiedCEs[j] = srcCEs[j];
+                            }
+                            isModified = TRUE;
+                        }
+                        modifiedCEs[i] = ce;
+                    }
+                }
+                if(isModified) {
+                    ce32 = dest.encodeCEs(modifiedCEs, length, errorCode);
+                } else {
+                    ce32 = dest.encodeExpansion(srcCEs, length, errorCode);
+                }
+            } else if(tag == Collation::BUILDER_DATA_TAG) {
+                // Copy the list of ConditionalCE32.
+                ConditionalCE32 *cond = src.getConditionalCE32ForCE32(ce32);
+                U_ASSERT(!cond->hasContext());
+                int32_t destIndex = dest.addConditionalCE32(
+                        cond->context, copyCE32(cond->ce32), errorCode);
+                ce32 = CollationDataBuilder::makeBuilderContextCE32(destIndex);
+                while(cond->next >= 0) {
+                    cond = src.getConditionalCE32(cond->next);
+                    ConditionalCE32 *prevDestCond = dest.getConditionalCE32(destIndex);
+                    destIndex = dest.addConditionalCE32(
+                            cond->context, copyCE32(cond->ce32), errorCode);
+                    int32_t suffixStart = cond->prefixLength() + 1;
+                    dest.unsafeBackwardSet.addAll(cond->context.tempSubString(suffixStart));
+                    prevDestCond->next = destIndex;
+                }
+            } else {
+                // Just copy long CEs and Latin mini expansions (and other expected values) as is,
+                // assuming that the modifier would not modify them.
+                U_ASSERT(tag == Collation::LONG_PRIMARY_TAG ||
+                        tag == Collation::LONG_SECONDARY_TAG ||
+                        tag == Collation::LATIN_EXPANSION_TAG ||
+                        tag == Collation::HANGUL_TAG);
+            }
+        }
+        return ce32;
+    }
+
+    const CollationDataBuilder &src;
+    CollationDataBuilder &dest;
+    const CollationDataBuilder::CEModifier &modifier;
+    int64_t modifiedCEs[Collation::MAX_EXPANSION_LENGTH];
+    UErrorCode errorCode;
+};
+
+U_CDECL_BEGIN
+
+static UBool U_CALLCONV
+enumRangeForCopy(const void *context, UChar32 start, UChar32 end, uint32_t value) {
+    return
+        value == Collation::UNASSIGNED_CE32 || value == Collation::FALLBACK_CE32 ||
+        ((CopyHelper *)context)->copyRangeCE32(start, end, value);
+}
+
+U_CDECL_END
+
+void
+CollationDataBuilder::copyFrom(const CollationDataBuilder &src, const CEModifier &modifier,
+                               UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    if(trie == NULL || utrie2_isFrozen(trie)) {
+        errorCode = U_INVALID_STATE_ERROR;
+        return;
+    }
+    CopyHelper helper(src, *this, modifier, errorCode);
+    utrie2_enum(src.trie, NULL, enumRangeForCopy, &helper);
+    errorCode = helper.errorCode;
+    // Update the contextChars and the unsafeBackwardSet while copying,
+    // in case a character had conditional mappings in the source builder
+    // and they were removed later.
+    modified |= src.modified;
+}
+
+void
+CollationDataBuilder::optimize(const UnicodeSet &set, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode) || set.isEmpty()) { return; }
+    UnicodeSetIterator iter(set);
+    while(iter.next() && !iter.isString()) {
+        UChar32 c = iter.getCodepoint();
+        uint32_t ce32 = utrie2_get32(trie, c);
+        if(ce32 == Collation::FALLBACK_CE32) {
+            ce32 = base->getFinalCE32(base->getCE32(c));
+            ce32 = copyFromBaseCE32(c, ce32, TRUE, errorCode);
+            utrie2_set32(trie, c, ce32, &errorCode);
+        }
+    }
+    modified = TRUE;
+}
+
+void
+CollationDataBuilder::suppressContractions(const UnicodeSet &set, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode) || set.isEmpty()) { return; }
+    UnicodeSetIterator iter(set);
+    while(iter.next() && !iter.isString()) {
+        UChar32 c = iter.getCodepoint();
+        uint32_t ce32 = utrie2_get32(trie, c);
+        if(ce32 == Collation::FALLBACK_CE32) {
+            ce32 = base->getFinalCE32(base->getCE32(c));
+            if(Collation::ce32HasContext(ce32)) {
+                ce32 = copyFromBaseCE32(c, ce32, FALSE /* without context */, errorCode);
+                utrie2_set32(trie, c, ce32, &errorCode);
+            }
+        } else if(isBuilderContextCE32(ce32)) {
+            ce32 = getConditionalCE32ForCE32(ce32)->ce32;
+            // Simply abandon the list of ConditionalCE32.
+            // The caller will copy this builder in the end,
+            // eliminating unreachable data.
+            utrie2_set32(trie, c, ce32, &errorCode);
+            contextChars.remove(c);
+        }
+    }
+    modified = TRUE;
+}
+
+UBool
+CollationDataBuilder::getJamoCE32s(uint32_t jamoCE32s[], UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    UBool anyJamoAssigned = base == NULL;  // always set jamoCE32s in the base data
+    UBool needToCopyFromBase = FALSE;
+    for(int32_t j = 0; j < CollationData::JAMO_CE32S_LENGTH; ++j) {  // Count across Jamo types.
+        UChar32 jamo = jamoCpFromIndex(j);
+        UBool fromBase = FALSE;
+        uint32_t ce32 = utrie2_get32(trie, jamo);
+        anyJamoAssigned |= Collation::isAssignedCE32(ce32);
+        // TODO: Try to prevent [optimize [Jamo]] from counting as anyJamoAssigned.
+        // (As of CLDR 24 [2013] the Korean tailoring does not optimize conjoining Jamo.)
+        if(ce32 == Collation::FALLBACK_CE32) {
+            fromBase = TRUE;
+            ce32 = base->getCE32(jamo);
+        }
+        if(Collation::isSpecialCE32(ce32)) {
+            switch(Collation::tagFromCE32(ce32)) {
+            case Collation::LONG_PRIMARY_TAG:
+            case Collation::LONG_SECONDARY_TAG:
+            case Collation::LATIN_EXPANSION_TAG:
+                // Copy the ce32 as-is.
+                break;
+            case Collation::EXPANSION32_TAG:
+            case Collation::EXPANSION_TAG:
+            case Collation::PREFIX_TAG:
+            case Collation::CONTRACTION_TAG:
+                if(fromBase) {
+                    // Defer copying until we know if anyJamoAssigned.
+                    ce32 = Collation::FALLBACK_CE32;
+                    needToCopyFromBase = TRUE;
+                }
+                break;
+            case Collation::IMPLICIT_TAG:
+                // An unassigned Jamo should only occur in tests with incomplete bases.
+                U_ASSERT(fromBase);
+                ce32 = Collation::FALLBACK_CE32;
+                needToCopyFromBase = TRUE;
+                break;
+            case Collation::OFFSET_TAG:
+                ce32 = getCE32FromOffsetCE32(fromBase, jamo, ce32);
+                break;
+            case Collation::FALLBACK_TAG:
+            case Collation::RESERVED_TAG_3:
+            case Collation::BUILDER_DATA_TAG:
+            case Collation::DIGIT_TAG:
+            case Collation::U0000_TAG:
+            case Collation::HANGUL_TAG:
+            case Collation::LEAD_SURROGATE_TAG:
+                errorCode = U_INTERNAL_PROGRAM_ERROR;
+                return FALSE;
+            }
+        }
+        jamoCE32s[j] = ce32;
+    }
+    if(anyJamoAssigned && needToCopyFromBase) {
+        for(int32_t j = 0; j < CollationData::JAMO_CE32S_LENGTH; ++j) {
+            if(jamoCE32s[j] == Collation::FALLBACK_CE32) {
+                UChar32 jamo = jamoCpFromIndex(j);
+                jamoCE32s[j] = copyFromBaseCE32(jamo, base->getCE32(jamo),
+                                                /*withContext=*/ TRUE, errorCode);
+            }
+        }
+    }
+    return anyJamoAssigned && U_SUCCESS(errorCode);
+}
+
+void
+CollationDataBuilder::setDigitTags(UErrorCode &errorCode) {
+    UnicodeSet digits(UNICODE_STRING_SIMPLE("[:Nd:]"), errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    UnicodeSetIterator iter(digits);
+    while(iter.next()) {
+        U_ASSERT(!iter.isString());
+        UChar32 c = iter.getCodepoint();
+        uint32_t ce32 = utrie2_get32(trie, c);
+        if(ce32 != Collation::FALLBACK_CE32 && ce32 != Collation::UNASSIGNED_CE32) {
+            int32_t index = addCE32(ce32, errorCode);
+            if(U_FAILURE(errorCode)) { return; }
+            if(index > Collation::MAX_INDEX) {
+                errorCode = U_BUFFER_OVERFLOW_ERROR;
+                return;
+            }
+            ce32 = Collation::makeCE32FromTagIndexAndLength(
+                    Collation::DIGIT_TAG, index, u_charDigitValue(c));
+            utrie2_set32(trie, c, ce32, &errorCode);
+        }
+    }
+}
+
+U_CDECL_BEGIN
+
+static UBool U_CALLCONV
+enumRangeLeadValue(const void *context, UChar32 /*start*/, UChar32 /*end*/, uint32_t value) {
+    int32_t *pValue = (int32_t *)context;
+    if(value == Collation::UNASSIGNED_CE32) {
+        value = Collation::LEAD_ALL_UNASSIGNED;
+    } else if(value == Collation::FALLBACK_CE32) {
+        value = Collation::LEAD_ALL_FALLBACK;
+    } else {
+        *pValue = Collation::LEAD_MIXED;
+        return FALSE;
+    }
+    if(*pValue < 0) {
+        *pValue = (int32_t)value;
+    } else if(*pValue != (int32_t)value) {
+        *pValue = Collation::LEAD_MIXED;
+        return FALSE;
+    }
+    return TRUE;
+}
+
+U_CDECL_END
+
+void
+CollationDataBuilder::setLeadSurrogates(UErrorCode &errorCode) {
+    for(UChar lead = 0xd800; lead < 0xdc00; ++lead) {
+        int32_t value = -1;
+        utrie2_enumForLeadSurrogate(trie, lead, NULL, enumRangeLeadValue, &value);
+        utrie2_set32ForLeadSurrogateCodeUnit(
+            trie, lead,
+            Collation::makeCE32FromTagAndIndex(Collation::LEAD_SURROGATE_TAG, 0) | (uint32_t)value,
+            &errorCode);
+    }
+}
+
+void
+CollationDataBuilder::build(CollationData &data, UErrorCode &errorCode) {
+    buildMappings(data, errorCode);
+    if(base != NULL) {
+        data.numericPrimary = base->numericPrimary;
+        data.compressibleBytes = base->compressibleBytes;
+        data.scripts = base->scripts;
+        data.scriptsLength = base->scriptsLength;
+    }
+    buildFastLatinTable(data, errorCode);
+}
+
+void
+CollationDataBuilder::buildMappings(CollationData &data, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    if(trie == NULL || utrie2_isFrozen(trie)) {
+        errorCode = U_INVALID_STATE_ERROR;
+        return;
+    }
+
+    buildContexts(errorCode);
+
+    uint32_t jamoCE32s[CollationData::JAMO_CE32S_LENGTH];
+    int32_t jamoIndex = -1;
+    if(getJamoCE32s(jamoCE32s, errorCode)) {
+        jamoIndex = ce32s.size();
+        for(int32_t i = 0; i < CollationData::JAMO_CE32S_LENGTH; ++i) {
+            ce32s.addElement((int32_t)jamoCE32s[i], errorCode);
+        }
+        // Small optimization: Use a bit in the Hangul ce32
+        // to indicate that none of the Jamo CE32s are isSpecialCE32()
+        // (as it should be in the root collator).
+        // It allows CollationIterator to avoid recursive function calls and per-Jamo tests.
+        // In order to still have good trie compression and keep this code simple,
+        // we only set this flag if a whole block of 588 Hangul syllables starting with
+        // a common leading consonant (Jamo L) has this property.
+        UBool isAnyJamoVTSpecial = FALSE;
+        for(int32_t i = Hangul::JAMO_L_COUNT; i < CollationData::JAMO_CE32S_LENGTH; ++i) {
+            if(Collation::isSpecialCE32(jamoCE32s[i])) {
+                isAnyJamoVTSpecial = TRUE;
+                break;
+            }
+        }
+        uint32_t hangulCE32 = Collation::makeCE32FromTagAndIndex(Collation::HANGUL_TAG, 0);
+        UChar32 c = Hangul::HANGUL_BASE;
+        for(int32_t i = 0; i < Hangul::JAMO_L_COUNT; ++i) {  // iterate over the Jamo L
+            uint32_t ce32 = hangulCE32;
+            if(!isAnyJamoVTSpecial && !Collation::isSpecialCE32(jamoCE32s[i])) {
+                ce32 |= Collation::HANGUL_NO_SPECIAL_JAMO;
+            }
+            UChar32 limit = c + Hangul::JAMO_VT_COUNT;
+            utrie2_setRange32(trie, c, limit - 1, ce32, TRUE, &errorCode);
+            c = limit;
+        }
+    } else {
+        // Copy the Hangul CE32s from the base in blocks per Jamo L,
+        // assuming that HANGUL_NO_SPECIAL_JAMO is set or not set for whole blocks.
+        for(UChar32 c = Hangul::HANGUL_BASE; c < Hangul::HANGUL_LIMIT;) {
+            uint32_t ce32 = base->getCE32(c);
+            U_ASSERT(Collation::hasCE32Tag(ce32, Collation::HANGUL_TAG));
+            UChar32 limit = c + Hangul::JAMO_VT_COUNT;
+            utrie2_setRange32(trie, c, limit - 1, ce32, TRUE, &errorCode);
+            c = limit;
+        }
+    }
+
+    setDigitTags(errorCode);
+    setLeadSurrogates(errorCode);
+
+    // For U+0000, move its normal ce32 into CE32s[0] and set U0000_TAG.
+    ce32s.setElementAt((int32_t)utrie2_get32(trie, 0), 0);
+    utrie2_set32(trie, 0, Collation::makeCE32FromTagAndIndex(Collation::U0000_TAG, 0), &errorCode);
+
+    utrie2_freeze(trie, UTRIE2_32_VALUE_BITS, &errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+
+    // Mark each lead surrogate as "unsafe"
+    // if any of its 1024 associated supplementary code points is "unsafe".
+    UChar32 c = 0x10000;
+    for(UChar lead = 0xd800; lead < 0xdc00; ++lead, c += 0x400) {
+        if(unsafeBackwardSet.containsSome(c, c + 0x3ff)) {
+            unsafeBackwardSet.add(lead);
+        }
+    }
+    unsafeBackwardSet.freeze();
+
+    data.trie = trie;
+    data.ce32s = reinterpret_cast<const uint32_t *>(ce32s.getBuffer());
+    data.ces = ce64s.getBuffer();
+    data.contexts = contexts.getBuffer();
+
+    data.ce32sLength = ce32s.size();
+    data.cesLength = ce64s.size();
+    data.contextsLength = contexts.length();
+
+    data.base = base;
+    if(jamoIndex >= 0) {
+        data.jamoCE32s = data.ce32s + jamoIndex;
+    } else {
+        data.jamoCE32s = base->jamoCE32s;
+    }
+    data.unsafeBackwardSet = &unsafeBackwardSet;
+}
+
+void
+CollationDataBuilder::clearContexts() {
+    contexts.remove();
+    UnicodeSetIterator iter(contextChars);
+    while(iter.next()) {
+        U_ASSERT(!iter.isString());
+        uint32_t ce32 = utrie2_get32(trie, iter.getCodepoint());
+        U_ASSERT(isBuilderContextCE32(ce32));
+        getConditionalCE32ForCE32(ce32)->builtCE32 = Collation::NO_CE32;
+    }
+}
+
+void
+CollationDataBuilder::buildContexts(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    // Ignore abandoned lists and the cached builtCE32,
+    // and build all contexts from scratch.
+    contexts.remove();
+    UnicodeSetIterator iter(contextChars);
+    while(U_SUCCESS(errorCode) && iter.next()) {
+        U_ASSERT(!iter.isString());
+        UChar32 c = iter.getCodepoint();
+        uint32_t ce32 = utrie2_get32(trie, c);
+        if(!isBuilderContextCE32(ce32)) {
+            // Impossible: No context data for c in contextChars.
+            errorCode = U_INTERNAL_PROGRAM_ERROR;
+            return;
+        }
+        ConditionalCE32 *cond = getConditionalCE32ForCE32(ce32);
+        ce32 = buildContext(cond, errorCode);
+        utrie2_set32(trie, c, ce32, &errorCode);
+    }
+}
+
+uint32_t
+CollationDataBuilder::buildContext(ConditionalCE32 *head, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    // The list head must have no context.
+    U_ASSERT(!head->hasContext());
+    // The list head must be followed by one or more nodes that all do have context.
+    U_ASSERT(head->next >= 0);
+    UCharsTrieBuilder prefixBuilder(errorCode);
+    UCharsTrieBuilder contractionBuilder(errorCode);
+    for(ConditionalCE32 *cond = head;; cond = getConditionalCE32(cond->next)) {
+        // After the list head, the prefix or suffix can be empty, but not both.
+        U_ASSERT(cond == head || cond->hasContext());
+        int32_t prefixLength = cond->prefixLength();
+        UnicodeString prefix(cond->context, 0, prefixLength + 1);
+        // Collect all contraction suffixes for one prefix.
+        ConditionalCE32 *firstCond = cond;
+        ConditionalCE32 *lastCond = cond;
+        while(cond->next >= 0 &&
+                (cond = getConditionalCE32(cond->next))->context.startsWith(prefix)) {
+            lastCond = cond;
+        }
+        uint32_t ce32;
+        int32_t suffixStart = prefixLength + 1;  // == prefix.length()
+        if(lastCond->context.length() == suffixStart) {
+            // One prefix without contraction suffix.
+            U_ASSERT(firstCond == lastCond);
+            ce32 = lastCond->ce32;
+            cond = lastCond;
+        } else {
+            // Build the contractions trie.
+            contractionBuilder.clear();
+            // Entry for an empty suffix, to be stored before the trie.
+            uint32_t emptySuffixCE32;
+            uint32_t flags = 0;
+            if(firstCond->context.length() == suffixStart) {
+                // There is a mapping for the prefix and the single character c. (p|c)
+                // If no other suffix matches, then we return this value.
+                emptySuffixCE32 = firstCond->ce32;
+                cond = getConditionalCE32(firstCond->next);
+            } else {
+                // There is no mapping for the prefix and just the single character.
+                // (There is no p|c, only p|cd, p|ce etc.)
+                flags |= Collation::CONTRACT_SINGLE_CP_NO_MATCH;
+                // When the prefix matches but none of the prefix-specific suffixes,
+                // then we fall back to the mappings with the next-longest prefix,
+                // and ultimately to mappings with no prefix.
+                // Each fallback might be another set of contractions.
+                // For example, if there are mappings for ch, p|cd, p|ce, but not for p|c,
+                // then in text "pch" we find the ch contraction.
+                for(cond = head;; cond = getConditionalCE32(cond->next)) {
+                    int32_t length = cond->prefixLength();
+                    if(length == prefixLength) { break; }
+                    if(cond->defaultCE32 != Collation::NO_CE32 &&
+                            (length==0 || prefix.endsWith(cond->context, 1, length))) {
+                        emptySuffixCE32 = cond->defaultCE32;
+                    }
+                }
+                cond = firstCond;
+            }
+            // Optimization: Set a flag when
+            // the first character of every contraction suffix has lccc!=0.
+            // Short-circuits contraction matching when a normal letter follows.
+            flags |= Collation::CONTRACT_NEXT_CCC;
+            // Add all of the non-empty suffixes into the contraction trie.
+            for(;;) {
+                UnicodeString suffix(cond->context, suffixStart);
+                uint16_t fcd16 = nfcImpl.getFCD16(suffix.char32At(0));
+                if(fcd16 <= 0xff) {
+                    flags &= ~Collation::CONTRACT_NEXT_CCC;
+                }
+                fcd16 = nfcImpl.getFCD16(suffix.char32At(suffix.length() - 1));
+                if(fcd16 > 0xff) {
+                    // The last suffix character has lccc!=0, allowing for discontiguous contractions.
+                    flags |= Collation::CONTRACT_TRAILING_CCC;
+                }
+                contractionBuilder.add(suffix, (int32_t)cond->ce32, errorCode);
+                if(cond == lastCond) { break; }
+                cond = getConditionalCE32(cond->next);
+            }
+            int32_t index = addContextTrie(emptySuffixCE32, contractionBuilder, errorCode);
+            if(U_FAILURE(errorCode)) { return 0; }
+            if(index > Collation::MAX_INDEX) {
+                errorCode = U_BUFFER_OVERFLOW_ERROR;
+                return 0;
+            }
+            ce32 = Collation::makeCE32FromTagAndIndex(Collation::CONTRACTION_TAG, index) | flags;
+        }
+        U_ASSERT(cond == lastCond);
+        firstCond->defaultCE32 = ce32;
+        if(prefixLength == 0) {
+            if(cond->next < 0) {
+                // No non-empty prefixes, only contractions.
+                return ce32;
+            }
+        } else {
+            prefix.remove(0, 1);  // Remove the length unit.
+            prefix.reverse();
+            prefixBuilder.add(prefix, (int32_t)ce32, errorCode);
+            if(cond->next < 0) { break; }
+        }
+    }
+    U_ASSERT(head->defaultCE32 != Collation::NO_CE32);
+    int32_t index = addContextTrie(head->defaultCE32, prefixBuilder, errorCode);
+    if(U_FAILURE(errorCode)) { return 0; }
+    if(index > Collation::MAX_INDEX) {
+        errorCode = U_BUFFER_OVERFLOW_ERROR;
+        return 0;
+    }
+    return Collation::makeCE32FromTagAndIndex(Collation::PREFIX_TAG, index);
+}
+
+int32_t
+CollationDataBuilder::addContextTrie(uint32_t defaultCE32, UCharsTrieBuilder &trieBuilder,
+                                     UErrorCode &errorCode) {
+    UnicodeString context;
+    context.append((UChar)(defaultCE32 >> 16)).append((UChar)defaultCE32);
+    UnicodeString trieString;
+    context.append(trieBuilder.buildUnicodeString(USTRINGTRIE_BUILD_SMALL, trieString, errorCode));
+    if(U_FAILURE(errorCode)) { return -1; }
+    int32_t index = contexts.indexOf(context);
+    if(index < 0) {
+        index = contexts.length();
+        contexts.append(context);
+    }
+    return index;
+}
+
+void
+CollationDataBuilder::buildFastLatinTable(CollationData &data, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode) || !fastLatinEnabled) { return; }
+
+    delete fastLatinBuilder;
+    fastLatinBuilder = new CollationFastLatinBuilder(errorCode);
+    if(fastLatinBuilder == NULL) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return;
+    }
+    if(fastLatinBuilder->forData(data, errorCode)) {
+        const uint16_t *table = fastLatinBuilder->getTable();
+        int32_t length = fastLatinBuilder->lengthOfTable();
+        if(base != NULL && length == base->fastLatinTableLength &&
+                uprv_memcmp(table, base->fastLatinTable, length * 2) == 0) {
+            // Same fast Latin table as in the base, use that one instead.
+            delete fastLatinBuilder;
+            fastLatinBuilder = NULL;
+            table = base->fastLatinTable;
+        }
+        data.fastLatinTable = table;
+        data.fastLatinTableLength = length;
+    } else {
+        delete fastLatinBuilder;
+        fastLatinBuilder = NULL;
+    }
+}
+
+int32_t
+CollationDataBuilder::getCEs(const UnicodeString &s, int64_t ces[], int32_t cesLength) {
+    return getCEs(s, 0, ces, cesLength);
+}
+
+int32_t
+CollationDataBuilder::getCEs(const UnicodeString &prefix, const UnicodeString &s,
+                             int64_t ces[], int32_t cesLength) {
+    int32_t prefixLength = prefix.length();
+    if(prefixLength == 0) {
+        return getCEs(s, 0, ces, cesLength);
+    } else {
+        return getCEs(prefix + s, prefixLength, ces, cesLength);
+    }
+}
+
+int32_t
+CollationDataBuilder::getCEs(const UnicodeString &s, int32_t start,
+                             int64_t ces[], int32_t cesLength) {
+    if(collIter == NULL) {
+        collIter = new DataBuilderCollationIterator(*this);
+        if(collIter == NULL) { return 0; }
+    }
+    return collIter->fetchCEs(s, start, ces, cesLength);
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationdatabuilder.h b/icu4c/source/i18n/collationdatabuilder.h
new file mode 100644 (file)
index 0000000..cfa46fd
--- /dev/null
@@ -0,0 +1,257 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationdatabuilder.h
+*
+* created on: 2012apr01
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONDATABUILDER_H__
+#define __COLLATIONDATABUILDER_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/uniset.h"
+#include "unicode/unistr.h"
+#include "unicode/uversion.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationsettings.h"
+#include "normalizer2impl.h"
+#include "utrie2.h"
+#include "uvectr32.h"
+#include "uvectr64.h"
+#include "uvector.h"
+
+U_NAMESPACE_BEGIN
+
+struct ConditionalCE32;
+
+class CollationFastLatinBuilder;
+class CopyHelper;
+class DataBuilderCollationIterator;
+class UCharsTrieBuilder;
+
+/**
+ * Low-level CollationData builder.
+ * Takes (character, CE) pairs and builds them into runtime data structures.
+ * Supports characters with context prefixes and contraction suffixes.
+ */
+class U_I18N_API CollationDataBuilder : public UObject {
+public:
+    /**
+     * Collation element modifier. Interface class for a modifier
+     * that changes a tailoring builder's temporary CEs to final CEs.
+     * Called for every non-special CE32 and every expansion CE.
+     */
+    class CEModifier : public UObject {
+    public:
+        virtual ~CEModifier();
+        /** Returns a new CE to replace the non-special input CE32, or else Collation::NO_CE. */
+        virtual int64_t modifyCE32(uint32_t ce32) const = 0;
+        /** Returns a new CE to replace the input CE, or else Collation::NO_CE. */
+        virtual int64_t modifyCE(int64_t ce) const = 0;
+    };
+
+    CollationDataBuilder(UErrorCode &errorCode);
+
+    virtual ~CollationDataBuilder();
+
+    void initForTailoring(const CollationData *b, UErrorCode &errorCode);
+
+    virtual UBool isCompressibleLeadByte(uint32_t b) const;
+
+    inline UBool isCompressiblePrimary(uint32_t p) const {
+        return isCompressibleLeadByte(p >> 24);
+    }
+
+    /**
+     * @return TRUE if this builder has mappings (e.g., add() has been called)
+     */
+    UBool hasMappings() const { return modified; }
+
+    /**
+     * @return TRUE if c has CEs in this builder
+     */
+    UBool isAssigned(UChar32 c) const;
+
+    /**
+     * @return the three-byte primary if c maps to a single such CE and has no context data,
+     * otherwise returns 0.
+     */
+    uint32_t getLongPrimaryIfSingleCE(UChar32 c) const;
+
+    /**
+     * @return the single CE for c.
+     * Sets an error code if c does not have a single CE.
+     */
+    int64_t getSingleCE(UChar32 c, UErrorCode &errorCode) const;
+
+    void add(const UnicodeString &prefix, const UnicodeString &s,
+             const int64_t ces[], int32_t cesLength,
+             UErrorCode &errorCode);
+
+    /**
+     * Encodes the ces as either the returned ce32 by itself,
+     * or by storing an expansion, with the returned ce32 referring to that.
+     *
+     * add(p, s, ces, cesLength) = addCE32(p, s, encodeCEs(ces, cesLength))
+     */
+    virtual uint32_t encodeCEs(const int64_t ces[], int32_t cesLength, UErrorCode &errorCode);
+    void addCE32(const UnicodeString &prefix, const UnicodeString &s,
+                 uint32_t ce32, UErrorCode &errorCode);
+
+    /**
+     * Sets three-byte-primary CEs for a range of code points in code point order,
+     * if it is worth doing; otherwise no change is made.
+     * None of the code points in the range should have complex mappings so far
+     * (expansions/contractions/prefixes).
+     * @param start first code point
+     * @param end last code point (inclusive)
+     * @param primary primary weight for 'start'
+     * @param step per-code point primary-weight increment
+     * @param errorCode ICU in/out error code
+     * @return TRUE if an OFFSET_TAG range was used for start..end
+     */
+    UBool maybeSetPrimaryRange(UChar32 start, UChar32 end,
+                               uint32_t primary, int32_t step,
+                               UErrorCode &errorCode);
+
+    /**
+     * Sets three-byte-primary CEs for a range of code points in code point order.
+     * Sets range values if that is worth doing, or else individual values.
+     * None of the code points in the range should have complex mappings so far
+     * (expansions/contractions/prefixes).
+     * @param start first code point
+     * @param end last code point (inclusive)
+     * @param primary primary weight for 'start'
+     * @param step per-code point primary-weight increment
+     * @param errorCode ICU in/out error code
+     * @return the next primary after 'end': start primary incremented by ((end-start)+1)*step
+     */
+    uint32_t setPrimaryRangeAndReturnNext(UChar32 start, UChar32 end,
+                                          uint32_t primary, int32_t step,
+                                          UErrorCode &errorCode);
+
+    /**
+     * Copies all mappings from the src builder, with modifications.
+     * This builder here must not be built yet, and should be empty.
+     */
+    void copyFrom(const CollationDataBuilder &src, const CEModifier &modifier,
+                  UErrorCode &errorCode);
+
+    void optimize(const UnicodeSet &set, UErrorCode &errorCode);
+    void suppressContractions(const UnicodeSet &set, UErrorCode &errorCode);
+
+    void enableFastLatin() { fastLatinEnabled = TRUE; }
+    virtual void build(CollationData &data, UErrorCode &errorCode);
+
+    /**
+     * Looks up CEs for s and appends them to the ces array.
+     * Does not handle normalization: s should be in FCD form.
+     *
+     * Does not write completely ignorable CEs.
+     * Does not write beyond Collation::MAX_EXPANSION_LENGTH.
+     *
+     * @return incremented cesLength
+     */
+    int32_t getCEs(const UnicodeString &s, int64_t ces[], int32_t cesLength);
+    int32_t getCEs(const UnicodeString &prefix, const UnicodeString &s,
+                   int64_t ces[], int32_t cesLength);
+
+protected:
+    friend class CopyHelper;
+    friend class DataBuilderCollationIterator;
+
+    uint32_t getCE32FromOffsetCE32(UBool fromBase, UChar32 c, uint32_t ce32) const;
+
+    int32_t addCE(int64_t ce, UErrorCode &errorCode);
+    int32_t addCE32(uint32_t ce32, UErrorCode &errorCode);
+    int32_t addConditionalCE32(const UnicodeString &context, uint32_t ce32, UErrorCode &errorCode);
+
+    inline ConditionalCE32 *getConditionalCE32(int32_t index) const {
+        return static_cast<ConditionalCE32 *>(conditionalCE32s[index]);
+    }
+    inline ConditionalCE32 *getConditionalCE32ForCE32(uint32_t ce32) const {
+        return getConditionalCE32(Collation::indexFromCE32(ce32));
+    }
+
+    static uint32_t makeBuilderContextCE32(int32_t index) {
+        return Collation::makeCE32FromTagAndIndex(Collation::BUILDER_DATA_TAG, index);
+    }
+    static inline UBool isBuilderContextCE32(uint32_t ce32) {
+        return Collation::hasCE32Tag(ce32, Collation::BUILDER_DATA_TAG);
+    }
+
+    static uint32_t encodeOneCEAsCE32(int64_t ce);
+    uint32_t encodeOneCE(int64_t ce, UErrorCode &errorCode);
+    uint32_t encodeExpansion(const int64_t ces[], int32_t length, UErrorCode &errorCode);
+    uint32_t encodeExpansion32(const int32_t newCE32s[], int32_t length, UErrorCode &errorCode);
+
+    uint32_t copyFromBaseCE32(UChar32 c, uint32_t ce32, UBool withContext, UErrorCode &errorCode);
+    /**
+     * Copies base contractions to a list of ConditionalCE32.
+     * Sets cond->next to the index of the first new item
+     * and returns the index of the last new item.
+     */
+    int32_t copyContractionsFromBaseCE32(UnicodeString &context, UChar32 c, uint32_t ce32,
+                                         ConditionalCE32 *cond, UErrorCode &errorCode);
+
+    UBool getJamoCE32s(uint32_t jamoCE32s[], UErrorCode &errorCode);
+    void setDigitTags(UErrorCode &errorCode);
+    void setLeadSurrogates(UErrorCode &errorCode);
+
+    void buildMappings(CollationData &data, UErrorCode &errorCode);
+
+    void clearContexts();
+    void buildContexts(UErrorCode &errorCode);
+    uint32_t buildContext(ConditionalCE32 *head, UErrorCode &errorCode);
+    int32_t addContextTrie(uint32_t defaultCE32, UCharsTrieBuilder &trieBuilder,
+                           UErrorCode &errorCode);
+
+    void buildFastLatinTable(CollationData &data, UErrorCode &errorCode);
+
+    int32_t getCEs(const UnicodeString &s, int32_t start, int64_t ces[], int32_t cesLength);
+
+    static UChar32 jamoCpFromIndex(int32_t i) {
+        // 0 <= i < CollationData::JAMO_CE32S_LENGTH = 19 + 21 + 27
+        if(i < Hangul::JAMO_L_COUNT) { return Hangul::JAMO_L_BASE + i; }
+        i -= Hangul::JAMO_L_COUNT;
+        if(i < Hangul::JAMO_V_COUNT) { return Hangul::JAMO_V_BASE + i; }
+        i -= Hangul::JAMO_V_COUNT;
+        // i < 27
+        return Hangul::JAMO_T_BASE + 1 + i;
+    }
+
+    /** @see Collation::BUILDER_DATA_TAG */
+    static const uint32_t IS_BUILDER_JAMO_CE32 = 0x100;
+
+    const Normalizer2Impl &nfcImpl;
+    const CollationData *base;
+    const CollationSettings *baseSettings;
+    UTrie2 *trie;
+    UVector32 ce32s;
+    UVector64 ce64s;
+    UVector conditionalCE32s;  // vector of ConditionalCE32
+    // Characters that have context (prefixes or contraction suffixes).
+    UnicodeSet contextChars;
+    // Serialized UCharsTrie structures for finalized contexts.
+    UnicodeString contexts;
+    UnicodeSet unsafeBackwardSet;
+    UBool modified;
+
+    UBool fastLatinEnabled;
+    CollationFastLatinBuilder *fastLatinBuilder;
+
+    DataBuilderCollationIterator *collIter;
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONDATABUILDER_H__
diff --git a/icu4c/source/i18n/collationdatareader.cpp b/icu4c/source/i18n/collationdatareader.cpp
new file mode 100644 (file)
index 0000000..e0d8cb9
--- /dev/null
@@ -0,0 +1,441 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationdatareader.cpp
+*
+* created on: 2013feb07
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/ucol.h"
+#include "unicode/udata.h"
+#include "unicode/uscript.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationdatareader.h"
+#include "collationfastlatin.h"
+#include "collationkeys.h"
+#include "collationrootelements.h"
+#include "collationsettings.h"
+#include "collationtailoring.h"
+#include "normalizer2impl.h"
+#include "uassert.h"
+#include "ucmndata.h"
+#include "utrie2.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
+
+U_NAMESPACE_BEGIN
+
+namespace {
+
+int32_t getIndex(const int32_t *indexes, int32_t length, int32_t i) {
+    return (i < length) ? indexes[i] : -1;
+}
+
+}  // namespace
+
+void
+CollationDataReader::read(const CollationTailoring *base, const uint8_t *inBytes, int32_t inLength,
+                          CollationTailoring &tailoring, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    if(base != NULL) {
+        if(inBytes == NULL || (0 <= inLength && inLength < 24)) {
+            errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+            return;
+        }
+        const DataHeader *header = reinterpret_cast<const DataHeader *>(inBytes);
+        if(!(header->dataHeader.magic1 == 0xda && header->dataHeader.magic2 == 0x27 &&
+                isAcceptable(tailoring.version, NULL, NULL, &header->info))) {
+            errorCode = U_INVALID_FORMAT_ERROR;
+            return;
+        }
+        if(base->getUCAVersion() != tailoring.getUCAVersion()) {
+            errorCode = U_COLLATOR_VERSION_MISMATCH;
+            return;
+        }
+        int32_t headerLength = header->dataHeader.headerSize;
+        inBytes += headerLength;
+        if(inLength >= 0) {
+            inLength -= headerLength;
+        }
+    }
+
+    if(inBytes == NULL || (0 <= inLength && inLength < 8)) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
+    const int32_t *inIndexes = reinterpret_cast<const int32_t *>(inBytes);
+    int32_t indexesLength = inIndexes[IX_INDEXES_LENGTH];
+    if(indexesLength < 2 || (0 <= inLength && inLength < indexesLength * 4)) {
+        errorCode = U_INVALID_FORMAT_ERROR;  // Not enough indexes.
+        return;
+    }
+
+    // Assume that the tailoring data is in initial state,
+    // with NULL pointers and 0 lengths.
+
+    // Set pointers to non-empty data parts.
+    // Do this in order of their byte offsets. (Should help porting to Java.)
+
+    int32_t index;  // one of the indexes[] slots
+    int32_t offset;  // byte offset for the index part
+    int32_t length;  // number of bytes in the index part
+
+    if(indexesLength > IX_TOTAL_SIZE) {
+        length = inIndexes[IX_TOTAL_SIZE];
+    } else if(indexesLength > IX_REORDER_CODES_OFFSET) {
+        length = inIndexes[indexesLength - 1];
+    } else {
+        length = 0;  // only indexes, and inLength was already checked for them
+    }
+    if(0 <= inLength && inLength < length) {
+        errorCode = U_INVALID_FORMAT_ERROR;
+        return;
+    }
+
+    const CollationData *baseData = base == NULL ? NULL : base->data;
+    const int32_t *reorderCodes = NULL;
+    int32_t reorderCodesLength = 0;
+    index = IX_REORDER_CODES_OFFSET;
+    offset = getIndex(inIndexes, indexesLength, index);
+    length = getIndex(inIndexes, indexesLength, index + 1) - offset;
+    if(length >= 4) {
+        if(baseData == NULL) {
+            // We assume for collation settings that
+            // the base data does not have a reordering.
+            errorCode = U_INVALID_FORMAT_ERROR;
+            return;
+        }
+        reorderCodes = reinterpret_cast<const int32_t *>(inBytes + offset);
+        reorderCodesLength = length / 4;
+    }
+
+    // There should be a reorder table only if there are reorder codes.
+    // However, when there are reorder codes the reorder table may be omitted to reduce
+    // the data size.
+    const uint8_t *reorderTable = NULL;
+    index = IX_REORDER_TABLE_OFFSET;
+    offset = getIndex(inIndexes, indexesLength, index);
+    length = getIndex(inIndexes, indexesLength, index + 1) - offset;
+    if(length >= 256) {
+        if(reorderCodesLength == 0) {
+            errorCode = U_INVALID_FORMAT_ERROR;  // Reordering table without reordering codes.
+            return;
+        }
+        reorderTable = inBytes + offset;
+    } else {
+        // If we have reorder codes, then build the reorderTable at the end,
+        // when the CollationData is otherwise complete.
+    }
+
+    if(baseData != NULL && baseData->numericPrimary != (inIndexes[IX_OPTIONS] & 0xff000000)) {
+        errorCode = U_INVALID_FORMAT_ERROR;
+        return;
+    }
+    CollationData *data = NULL;  // Remains NULL if there are no mappings.
+
+    index = IX_TRIE_OFFSET;
+    offset = getIndex(inIndexes, indexesLength, index);
+    length = getIndex(inIndexes, indexesLength, index + 1) - offset;
+    if(length >= 8) {
+        if(!tailoring.ensureOwnedData(errorCode)) { return; }
+        data = tailoring.ownedData;
+        data->base = baseData;
+        data->numericPrimary = inIndexes[IX_OPTIONS] & 0xff000000;
+        data->trie = tailoring.trie = utrie2_openFromSerialized(
+            UTRIE2_32_VALUE_BITS, inBytes + offset, length, NULL,
+            &errorCode);
+        if(U_FAILURE(errorCode)) { return; }
+    } else if(baseData != NULL) {
+        // Use the base data. Only the settings are tailored.
+        tailoring.data = baseData;
+    } else {
+        errorCode = U_INVALID_FORMAT_ERROR;  // No mappings.
+        return;
+    }
+
+    index = IX_CES_OFFSET;
+    offset = getIndex(inIndexes, indexesLength, index);
+    length = getIndex(inIndexes, indexesLength, index + 1) - offset;
+    if(length >= 8) {
+        if(data == NULL) {
+            errorCode = U_INVALID_FORMAT_ERROR;  // Tailored ces without tailored trie.
+            return;
+        }
+        data->ces = reinterpret_cast<const int64_t *>(inBytes + offset);
+        data->cesLength = length / 8;
+    }
+
+    index = IX_CE32S_OFFSET;
+    offset = getIndex(inIndexes, indexesLength, index);
+    length = getIndex(inIndexes, indexesLength, index + 1) - offset;
+    if(length >= 4) {
+        if(data == NULL) {
+            errorCode = U_INVALID_FORMAT_ERROR;  // Tailored ce32s without tailored trie.
+            return;
+        }
+        data->ce32s = reinterpret_cast<const uint32_t *>(inBytes + offset);
+        data->ce32sLength = length / 4;
+    }
+
+    int32_t jamoCE32sStart = getIndex(inIndexes, indexesLength, IX_JAMO_CE32S_START);
+    if(jamoCE32sStart >= 0) {
+        if(data == NULL || data->ce32s == NULL) {
+            errorCode = U_INVALID_FORMAT_ERROR;  // Index into non-existent ce32s[].
+            return;
+        }
+        data->jamoCE32s = data->ce32s + jamoCE32sStart;
+    } else if(data == NULL) {
+        // Nothing to do.
+    } else if(baseData != NULL) {
+        data->jamoCE32s = baseData->jamoCE32s;
+    } else {
+        errorCode = U_INVALID_FORMAT_ERROR;  // No Jamo CE32s for Hangul processing.
+        return;
+    }
+
+    index = IX_ROOT_ELEMENTS_OFFSET;
+    offset = getIndex(inIndexes, indexesLength, index);
+    length = getIndex(inIndexes, indexesLength, index + 1) - offset;
+    if(length >= 4) {
+        length /= 4;
+        if(data == NULL || length <= CollationRootElements::IX_SEC_TER_BOUNDARIES) {
+            errorCode = U_INVALID_FORMAT_ERROR;
+            return;
+        }
+        data->rootElements = reinterpret_cast<const uint32_t *>(inBytes + offset);
+        data->rootElementsLength = length;
+        uint32_t commonSecTer = data->rootElements[CollationRootElements::IX_COMMON_SEC_AND_TER_CE];
+        if(commonSecTer != Collation::COMMON_SEC_AND_TER_CE) {
+            errorCode = U_INVALID_FORMAT_ERROR;
+            return;
+        }
+        uint32_t secTerBoundaries = data->rootElements[CollationRootElements::IX_SEC_TER_BOUNDARIES];
+        if((secTerBoundaries >> 24) < CollationKeys::SEC_COMMON_HIGH) {
+            // [fixed last secondary common byte] is too low,
+            // and secondary weights would collide with compressed common secondaries.
+            errorCode = U_INVALID_FORMAT_ERROR;
+            return;
+        }
+    }
+
+    index = IX_CONTEXTS_OFFSET;
+    offset = getIndex(inIndexes, indexesLength, index);
+    length = getIndex(inIndexes, indexesLength, index + 1) - offset;
+    if(length >= 2) {
+        if(data == NULL) {
+            errorCode = U_INVALID_FORMAT_ERROR;  // Tailored contexts without tailored trie.
+            return;
+        }
+        data->contexts = reinterpret_cast<const UChar *>(inBytes + offset);
+        data->contextsLength = length / 2;
+    }
+
+    index = IX_UNSAFE_BWD_OFFSET;
+    offset = getIndex(inIndexes, indexesLength, index);
+    length = getIndex(inIndexes, indexesLength, index + 1) - offset;
+    if(length >= 2) {
+        if(data == NULL) {
+            errorCode = U_INVALID_FORMAT_ERROR;
+            return;
+        }
+        if(baseData == NULL) {
+            // Create the unsafe-backward set for the root collator.
+            // Include all non-zero combining marks and trail surrogates.
+            // We do this at load time, rather than at build time,
+            // to simplify Unicode version bootstrapping:
+            // The root data builder only needs the new FractionalUCA.txt data,
+            // but it need not be built with a version of ICU already updated to
+            // the corresponding new Unicode Character Database.
+            //
+            // The following is an optimized version of
+            // new UnicodeSet("[[:^lccc=0:][\\udc00-\\udfff]]").
+            // It is faster and requires fewer code dependencies.
+            tailoring.unsafeBackwardSet = new UnicodeSet(0xdc00, 0xdfff);  // trail surrogates
+            if(tailoring.unsafeBackwardSet == NULL) {
+                errorCode = U_MEMORY_ALLOCATION_ERROR;
+                return;
+            }
+            data->nfcImpl.addLcccChars(*tailoring.unsafeBackwardSet);
+        } else {
+            // Clone the root collator's set contents.
+            tailoring.unsafeBackwardSet = static_cast<UnicodeSet *>(
+                baseData->unsafeBackwardSet->cloneAsThawed());
+            if(tailoring.unsafeBackwardSet == NULL) {
+                errorCode = U_MEMORY_ALLOCATION_ERROR;
+                return;
+            }
+        }
+        // Add the ranges from the data file to the unsafe-backward set.
+        USerializedSet sset;
+        const uint16_t *unsafeData = reinterpret_cast<const uint16_t *>(inBytes + offset);
+        if(!uset_getSerializedSet(&sset, unsafeData, length / 2)) {
+            errorCode = U_INVALID_FORMAT_ERROR;
+            return;
+        }
+        int32_t count = uset_getSerializedRangeCount(&sset);
+        for(int32_t i = 0; i < count; ++i) {
+            UChar32 start, end;
+            uset_getSerializedRange(&sset, i, &start, &end);
+            tailoring.unsafeBackwardSet->add(start, end);
+        }
+        // Mark each lead surrogate as "unsafe"
+        // if any of its 1024 associated supplementary code points is "unsafe".
+        UChar32 c = 0x10000;
+        for(UChar lead = 0xd800; lead < 0xdc00; ++lead, c += 0x400) {
+            if(!tailoring.unsafeBackwardSet->containsNone(c, c + 0x3ff)) {
+                tailoring.unsafeBackwardSet->add(lead);
+            }
+        }
+        tailoring.unsafeBackwardSet->freeze();
+        data->unsafeBackwardSet = tailoring.unsafeBackwardSet;
+    } else if(data == NULL) {
+        // Nothing to do.
+    } else if(baseData != NULL) {
+        // No tailoring-specific data: Alias the root collator's set.
+        data->unsafeBackwardSet = baseData->unsafeBackwardSet;
+    } else {
+        errorCode = U_INVALID_FORMAT_ERROR;  // No unsafeBackwardSet.
+        return;
+    }
+
+    // If the fast Latin format version is different,
+    // or the version is set to 0 for "no fast Latin table",
+    // then just always use the normal string comparison path.
+    if(data != NULL) {
+        data->fastLatinTable = NULL;
+        data->fastLatinTableLength = 0;
+        if(((inIndexes[IX_OPTIONS] >> 16) & 0xff) == CollationFastLatin::VERSION) {
+            index = IX_FAST_LATIN_TABLE_OFFSET;
+            offset = getIndex(inIndexes, indexesLength, index);
+            length = getIndex(inIndexes, indexesLength, index + 1) - offset;
+            if(length >= 2) {
+                data->fastLatinTable = reinterpret_cast<const uint16_t *>(inBytes + offset);
+                data->fastLatinTableLength = length / 2;
+                if((*data->fastLatinTable >> 8) != CollationFastLatin::VERSION) {
+                    errorCode = U_INVALID_FORMAT_ERROR;  // header vs. table version mismatch
+                    return;
+                }
+            } else if(baseData != NULL) {
+                data->fastLatinTable = baseData->fastLatinTable;
+                data->fastLatinTableLength = baseData->fastLatinTableLength;
+            }
+        }
+    }
+
+    index = IX_SCRIPTS_OFFSET;
+    offset = getIndex(inIndexes, indexesLength, index);
+    length = getIndex(inIndexes, indexesLength, index + 1) - offset;
+    if(length >= 2) {
+        if(data == NULL) {
+            errorCode = U_INVALID_FORMAT_ERROR;
+            return;
+        }
+        data->scripts = reinterpret_cast<const uint16_t *>(inBytes + offset);
+        data->scriptsLength = length / 2;
+    } else if(data == NULL) {
+        // Nothing to do.
+    } else if(baseData != NULL) {
+        data->scripts = baseData->scripts;
+        data->scriptsLength = baseData->scriptsLength;
+    }
+
+    index = IX_COMPRESSIBLE_BYTES_OFFSET;
+    offset = getIndex(inIndexes, indexesLength, index);
+    length = getIndex(inIndexes, indexesLength, index + 1) - offset;
+    if(length >= 256) {
+        if(data == NULL) {
+            errorCode = U_INVALID_FORMAT_ERROR;
+            return;
+        }
+        data->compressibleBytes = reinterpret_cast<const UBool *>(inBytes + offset);
+    } else if(data == NULL) {
+        // Nothing to do.
+    } else if(baseData != NULL) {
+        data->compressibleBytes = baseData->compressibleBytes;
+    } else {
+        errorCode = U_INVALID_FORMAT_ERROR;  // No compressibleBytes[].
+        return;
+    }
+
+    const CollationSettings &ts = *tailoring.settings;
+    int32_t options = inIndexes[IX_OPTIONS] & 0xffff;
+    uint16_t fastLatinPrimaries[CollationFastLatin::LATIN_LIMIT];
+    int32_t fastLatinOptions = CollationFastLatin::getOptions(
+            tailoring.data, ts, fastLatinPrimaries, LENGTHOF(fastLatinPrimaries));
+    if(options == ts.options && ts.variableTop != 0 &&
+            reorderCodesLength == ts.reorderCodesLength &&
+            uprv_memcmp(reorderCodes, ts.reorderCodes, reorderCodesLength * 4) == 0 &&
+            fastLatinOptions == ts.fastLatinOptions &&
+            (fastLatinOptions < 0 ||
+                uprv_memcmp(fastLatinPrimaries, ts.fastLatinPrimaries,
+                            sizeof(fastLatinPrimaries)) == 0)) {
+        return;
+    }
+
+    CollationSettings *settings = SharedObject::copyOnWrite(tailoring.settings);
+    if(settings == NULL) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return;
+    }
+    settings->options = options;
+    // Set variableTop from options and scripts data.
+    settings->variableTop = tailoring.data->getLastPrimaryForGroup(
+            UCOL_REORDER_CODE_FIRST + settings->getMaxVariable());
+    if(settings->variableTop == 0) {
+        errorCode = U_INVALID_FORMAT_ERROR;
+        return;
+    }
+
+    if(reorderCodesLength == 0 || reorderTable != NULL) {
+        settings->aliasReordering(reorderCodes, reorderCodesLength, reorderTable);
+    } else {
+        uint8_t table[256];
+        baseData->makeReorderTable(reorderCodes, reorderCodesLength, table, errorCode);
+        if(U_FAILURE(errorCode)) { return; }
+        if(!settings->setReordering(reorderCodes, reorderCodesLength,table)) {
+            errorCode = U_MEMORY_ALLOCATION_ERROR;
+            return;
+        }
+    }
+
+    settings->fastLatinOptions = CollationFastLatin::getOptions(
+        tailoring.data, *settings,
+        settings->fastLatinPrimaries, LENGTHOF(settings->fastLatinPrimaries));
+}
+
+UBool U_CALLCONV
+CollationDataReader::isAcceptable(void *context,
+                                  const char * /* type */, const char * /*name*/,
+                                  const UDataInfo *pInfo) {
+    if(
+        pInfo->size >= 20 &&
+        pInfo->isBigEndian == U_IS_BIG_ENDIAN &&
+        pInfo->charsetFamily == U_CHARSET_FAMILY &&
+        pInfo->dataFormat[0] == 0x55 &&  // dataFormat="UCol"
+        pInfo->dataFormat[1] == 0x43 &&
+        pInfo->dataFormat[2] == 0x6f &&
+        pInfo->dataFormat[3] == 0x6c &&
+        pInfo->formatVersion[0] == 4
+    ) {
+        UVersionInfo *version = static_cast<UVersionInfo *>(context);
+        if(version != NULL) {
+            uprv_memcpy(version, pInfo->dataVersion, 4);
+        }
+        return TRUE;
+    } else {
+        return FALSE;
+    }
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationdatareader.h b/icu4c/source/i18n/collationdatareader.h
new file mode 100644 (file)
index 0000000..df65b86
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationdatareader.h
+*
+* created on: 2013feb07
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONDATAREADER_H__
+#define __COLLATIONDATAREADER_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/udata.h"
+
+struct UDataMemory;
+
+U_NAMESPACE_BEGIN
+
+struct CollationTailoring;
+
+/**
+ * Collation binary data reader.
+ */
+struct U_I18N_API CollationDataReader /* all static */ {
+    // The following constants are also copied into source/common/ucol_swp.cpp.
+    // Keep them in sync!
+    enum {
+        /**
+         * Number of int32_t indexes.
+         *
+         * Can be 2 if there are only options.
+         * Can be 7 or 8 if there are only options and a script reordering.
+         * The loader treats any index>=indexes[IX_INDEXES_LENGTH] as 0.
+         */
+        IX_INDEXES_LENGTH,  // 0
+        /**
+         * Bits 31..24: numericPrimary, for numeric collation
+         *      23..16: fast Latin format version (0 = no fast Latin table)
+         *      15.. 0: options bit set
+         */
+        IX_OPTIONS,
+        IX_RESERVED2,
+        IX_RESERVED3,
+
+        /** Array offset to Jamo CE32s in ce32s[], or <0 if none. */
+        IX_JAMO_CE32S_START,  // 4
+
+        // Byte offsets from the start of the data, after the generic header.
+        // The indexes[] are at byte offset 0, other data follows.
+        // Each data item is aligned properly.
+        // The data items should be in descending order of unit size,
+        // to minimize the need for padding.
+        // Each item's byte length is given by the difference between its offset and
+        // the next index/offset value.
+        /** Byte offset to int32_t reorderCodes[]. */
+        IX_REORDER_CODES_OFFSET,
+        /**
+         * Byte offset to uint8_t reorderTable[].
+         * Empty table if <256 bytes (padding only).
+         * Otherwise 256 bytes or more (with padding).
+         */
+        IX_REORDER_TABLE_OFFSET,
+        /** Byte offset to the collation trie. Its length is a multiple of 8 bytes. */
+        IX_TRIE_OFFSET,
+
+        IX_RESERVED8_OFFSET,  // 8
+        /** Byte offset to int64_t ces[]. */
+        IX_CES_OFFSET,
+        IX_RESERVED10_OFFSET,
+        /** Byte offset to uint32_t ce32s[]. */
+        IX_CE32S_OFFSET,
+
+        /** Byte offset to uint32_t rootElements[]. */
+        IX_ROOT_ELEMENTS_OFFSET,  // 12
+        /** Byte offset to UChar *contexts[]. */
+        IX_CONTEXTS_OFFSET,
+        /** Byte offset to uint16_t [] with serialized unsafeBackwardSet. */
+        IX_UNSAFE_BWD_OFFSET,
+        /** Byte offset to uint16_t fastLatinTable[]. */
+        IX_FAST_LATIN_TABLE_OFFSET,
+
+        /** Byte offset to uint16_t scripts[]. */
+        IX_SCRIPTS_OFFSET,  // 16
+        /**
+         * Byte offset to UBool compressibleBytes[].
+         * Empty table if <256 bytes (padding only).
+         * Otherwise 256 bytes or more (with padding).
+         */
+        IX_COMPRESSIBLE_BYTES_OFFSET,
+        IX_RESERVED18_OFFSET,
+        IX_TOTAL_SIZE
+    };
+
+    static void read(const CollationTailoring *base, const uint8_t *inBytes, int32_t inLength,
+                     CollationTailoring &tailoring, UErrorCode &errorCode);
+
+    static UBool U_CALLCONV
+    isAcceptable(void *context, const char *type, const char *name, const UDataInfo *pInfo);
+
+private:
+    CollationDataReader();  // no constructor
+};
+
+/*
+ * Format of collation data (ucadata.icu, binary data in coll/ *.res files).
+ * Format version 4.0.
+ *
+ * The root collation data is stored in the ucadata.icu file.
+ * Tailorings are stored inside .res resource bundle files, with a complete file header.
+ *
+ * Collation data begins with a standard ICU data file header
+ * (DataHeader, see ucmndata.h and unicode/udata.h).
+ * The UDataInfo.dataVersion field contains the UCA and other version numbers,
+ * see the comments for CollationTailoring.version.
+ *
+ * After the header, the file contains the following parts.
+ * Constants are defined as enum values of the CollationDataReader class.
+ * See also the Collation class.
+ *
+ * int32_t indexes[indexesLength];
+ *      The indexes array has variable length.
+ *      Some tailorings only need the length and the options,
+ *      others only add reorderCodes and the reorderTable,
+ *      some need to store mappings.
+ *      Only as many indexes are stored as needed to read all of the data.
+ *
+ *      Index 0: indexesLength
+ *      Index 1: numericPrimary, CollationFastLatin::VERSION, and options: see IX_OPTIONS
+ *      Index 2..3: Unused/reserved/0.
+ *      Index 4: Index into the ce32s array where the CE32s of the conjoining Jamo
+ *               are stored in a short, contiguous part of the ce32s array.
+ *
+ *      Indexes 5..19 are byte offsets in ascending order.
+ *      Each byte offset marks the start of the next part in the data file,
+ *      and the end of the previous one.
+ *      When two consecutive byte offsets are the same (or too short),
+ *      then the corresponding part is empty.
+ *      Byte offsets are offsets from after the header,
+ *      that is, from the beginning of the indexes[].
+ *      Each part starts at an offset with proper alignment for its data.
+ *      If necessary, the previous part may include padding bytes to achieve this alignment.
+ *      The last byte offset that is stored in the indexes indicates the total size of the data
+ *      (starting with the indexes).
+ *
+ * int32_t reorderCodes[]; -- empty in root
+ *      The list of script and reordering codes.
+ *
+ * uint8_t reorderTable[256]; -- empty in root; can be longer to include padding bytes
+ *      Primary-weight lead byte permutation table.
+ *      Normally present when the reorderCodes are, but can be built at load time.
+ *
+ * UTrie2 trie; -- see utrie2_impl.h and utrie2.h
+ *      The trie holds the main collation data. Each code point is mapped to a 32-bit value.
+ *      It encodes a simple collation element (CE) in compact form, unless bits 7..6 are both set,
+ *      in which case it is a special CE32 and contains a 4-bit tag and further data.
+ *      See the Collation class for details.
+ *
+ *      The trie has a value for each lead surrogate code unit with some bits encoding
+ *      collective properties of the 1024 supplementary characters whose UTF-16 form starts with
+ *      the lead surrogate. See Collation::LEAD_SURROGATE_TAG..
+ *
+ * int64_t ces[];
+ *      64-bit CEs and expansions that cannot be stored in a more compact form.
+ *
+ * uint32_t ce32s[];
+ *      CE32s for expansions in compact form, and for characters whose trie values
+ *      contain special data.
+ *
+ * uint32_t rootElements[]; -- empty in all tailorings
+ *      Compact storage for all of the CEs that occur in the root collation.
+ *      See the CollationRootElements class.
+ *
+ * UChar *contexts[];
+ *      Serialized UCharsTrie structures with prefix (pre-context) and contraction mappings.
+ *
+ * uint16_t unsafeBackwardSet[]; -- see UnicodeSet::serialize()
+ *      Serialized form of characters that are unsafe when iterating backwards,
+ *      and at the end of an identical string prefix.
+ *      Back up to a safe character.
+ *      Lead surrogates are "unsafe" when any of their corresponding supplementary
+ *      code points are unsafe.
+ *      Does not include [:^lccc=0:][:^tccc=0:].
+ *      For each tailoring, the root unsafeBackwardSet is subtracted.
+ *      (As a result, in many tailorings no set needs to be stored.)
+ *
+ * uint16_t fastLatinTable[];
+ *      Optional optimization for Latin text.
+ *      See the CollationFastLatin class.
+ *
+ * uint16_t scripts[]; -- empty in all tailorings
+ *      Table of the reordering groups with their first and last lead bytes,
+ *      and their script and reordering codes.
+ *      See CollationData::scripts.
+ *
+ * UBool compressibleBytes[]; -- empty in all tailorings
+ *      Flag for getSortKey(), indicating primary weight lead bytes that are compressible.
+ */
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONDATAREADER_H__
diff --git a/icu4c/source/i18n/collationdatawriter.cpp b/icu4c/source/i18n/collationdatawriter.cpp
new file mode 100644 (file)
index 0000000..dc600af
--- /dev/null
@@ -0,0 +1,329 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationdatawriter.cpp
+*
+* created on: 2013aug06
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/tblcoll.h"
+#include "unicode/udata.h"
+#include "unicode/uniset.h"
+#include "cmemory.h"
+#include "collationdata.h"
+#include "collationdatabuilder.h"
+#include "collationdatareader.h"
+#include "collationdatawriter.h"
+#include "collationfastlatin.h"
+#include "collationsettings.h"
+#include "collationtailoring.h"
+#include "uassert.h"
+#include "ucmndata.h"
+
+U_NAMESPACE_BEGIN
+
+uint8_t *
+RuleBasedCollator::cloneRuleData(int32_t &length, UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return NULL; }
+    LocalMemory<uint8_t> buffer((uint8_t *)uprv_malloc(20000));
+    if(buffer.isNull()) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return NULL;
+    }
+    length = cloneBinary(buffer.getAlias(), 20000, errorCode);
+    if(errorCode == U_BUFFER_OVERFLOW_ERROR) {
+        if(buffer.allocateInsteadAndCopy(length, 0) == NULL) {
+            errorCode = U_MEMORY_ALLOCATION_ERROR;
+            return NULL;
+        }
+        errorCode = U_ZERO_ERROR;
+        length = cloneBinary(buffer.getAlias(), length, errorCode);
+    }
+    if(U_FAILURE(errorCode)) { return NULL; }
+    return buffer.orphan();
+}
+
+int32_t
+RuleBasedCollator::cloneBinary(uint8_t *dest, int32_t capacity, UErrorCode &errorCode) const {
+    int32_t indexes[CollationDataReader::IX_TOTAL_SIZE + 1];
+    return CollationDataWriter::writeTailoring(
+            *tailoring, *settings, indexes, dest, capacity,
+            errorCode);
+}
+
+static const UDataInfo dataInfo = {
+    sizeof(UDataInfo),
+    0,
+
+    U_IS_BIG_ENDIAN,
+    U_CHARSET_FAMILY,
+    U_SIZEOF_UCHAR,
+    0,
+
+    { 0x55, 0x43, 0x6f, 0x6c },         // dataFormat="UCol"
+    { 4, 0, 0, 0 },                     // formatVersion
+    { 6, 3, 0, 0 }                      // dataVersion
+};
+
+int32_t
+CollationDataWriter::writeBase(const CollationData &data, const CollationSettings &settings,
+                               const void *rootElements, int32_t rootElementsLength,
+                               int32_t indexes[], uint8_t *dest, int32_t capacity,
+                               UErrorCode &errorCode) {
+    return write(TRUE, NULL,
+                 data, settings,
+                 rootElements, rootElementsLength,
+                 indexes, dest, capacity, errorCode);
+}
+
+int32_t
+CollationDataWriter::writeTailoring(const CollationTailoring &t, const CollationSettings &settings,
+                                    int32_t indexes[], uint8_t *dest, int32_t capacity,
+                                    UErrorCode &errorCode) {
+    return write(FALSE, t.version,
+                 *t.data, settings,
+                 NULL, 0,
+                 indexes, dest, capacity, errorCode);
+}
+
+int32_t
+CollationDataWriter::write(UBool isBase, const UVersionInfo dataVersion,
+                           const CollationData &data, const CollationSettings &settings,
+                           const void *rootElements, int32_t rootElementsLength,
+                           int32_t indexes[], uint8_t *dest, int32_t capacity,
+                           UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    if(capacity < 0 || (capacity > 0 && dest == NULL)) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return 0;
+    }
+
+    // Figure out which data items to write before settling on
+    // the indexes length and writing offsets.
+    // For any data item, we need to write the start and limit offsets,
+    // so the indexes length must be at least index-of-start-offset + 2.
+    int32_t indexesLength;
+    UBool hasMappings;
+    UnicodeSet unsafeBackwardSet;
+    const CollationData *baseData = data.base;
+
+    int32_t fastLatinVersion;
+    if(data.fastLatinTable != NULL) {
+        fastLatinVersion = (int32_t)CollationFastLatin::VERSION << 16;
+    } else {
+        fastLatinVersion = 0;
+    }
+    int32_t fastLatinTableLength = 0;
+
+    if(isBase) {
+        // For the root collator, we write an even number of indexes
+        // so that we start with an 8-aligned offset.
+        indexesLength = CollationDataReader::IX_TOTAL_SIZE + 1;
+        U_ASSERT(settings.reorderCodesLength == 0);
+        hasMappings = TRUE;
+        unsafeBackwardSet = *data.unsafeBackwardSet;
+        fastLatinTableLength = data.fastLatinTableLength;
+    } else if(baseData == NULL) {
+        hasMappings = FALSE;
+        if(settings.reorderCodesLength == 0) {
+            // only options
+            indexesLength = CollationDataReader::IX_OPTIONS + 1;  // no limit offset here
+        } else {
+            // only options, reorder codes, and the reorder table
+            indexesLength = CollationDataReader::IX_REORDER_TABLE_OFFSET + 2;
+        }
+    } else {
+        hasMappings = TRUE;
+        // Tailored mappings, and what else?
+        // Check in ascending order of optional tailoring data items.
+        indexesLength = CollationDataReader::IX_CE32S_OFFSET + 2;
+        if(data.contextsLength != 0) {
+            indexesLength = CollationDataReader::IX_CONTEXTS_OFFSET + 2;
+        }
+        unsafeBackwardSet.addAll(*data.unsafeBackwardSet).removeAll(*baseData->unsafeBackwardSet);
+        if(!unsafeBackwardSet.isEmpty()) {
+            indexesLength = CollationDataReader::IX_UNSAFE_BWD_OFFSET + 2;
+        }
+        if(data.fastLatinTable != baseData->fastLatinTable) {
+            fastLatinTableLength = data.fastLatinTableLength;
+            indexesLength = CollationDataReader::IX_FAST_LATIN_TABLE_OFFSET + 2;
+        }
+    }
+
+    int32_t headerSize;
+    if(isBase) {
+        headerSize = 0;  // udata_create() writes the header
+    } else {
+        DataHeader header;
+        header.dataHeader.magic1 = 0xda;
+        header.dataHeader.magic2 = 0x27;
+        uprv_memcpy(&header.info, &dataInfo, sizeof(UDataInfo));
+        uprv_memcpy(header.info.dataVersion, dataVersion, sizeof(UVersionInfo));
+        headerSize = (int32_t)sizeof(header);
+        U_ASSERT((headerSize & 3) == 0);  // multiple of 4 bytes
+        if(hasMappings && data.cesLength != 0) {
+            // Sum of the sizes of the data items which are
+            // not automatically multiples of 8 bytes and which are placed before the CEs.
+            int32_t sum = headerSize + (indexesLength + settings.reorderCodesLength) * 4;
+            if((sum & 7) != 0) {
+                // We need to add padding somewhere so that the 64-bit CEs are 8-aligned.
+                // We add to the header size here.
+                // Alternatively, we could increment the indexesLength
+                // or add a few bytes to the reorderTable.
+                headerSize += 4;
+            }
+        }
+        header.dataHeader.headerSize = (uint16_t)headerSize;
+        if(headerSize <= capacity) {
+            uprv_memcpy(dest, &header, sizeof(header));
+            // Write 00 bytes so that the padding is not mistaken for a copyright string.
+            uprv_memset(dest + sizeof(header), 0, headerSize - (int32_t)sizeof(header));
+            dest += headerSize;
+            capacity -= headerSize;
+        } else {
+            dest = NULL;
+            capacity = 0;
+        }
+    }
+
+    indexes[CollationDataReader::IX_INDEXES_LENGTH] = indexesLength;
+    U_ASSERT((settings.options & ~0xffff) == 0);
+    indexes[CollationDataReader::IX_OPTIONS] =
+            data.numericPrimary | fastLatinVersion | settings.options;
+    indexes[CollationDataReader::IX_RESERVED2] = 0;
+    indexes[CollationDataReader::IX_RESERVED3] = 0;
+
+    // Byte offsets of data items all start from the start of the indexes.
+    // We add the headerSize at the very end.
+    int32_t totalSize = indexesLength * 4;
+
+    if(hasMappings && (isBase || data.jamoCE32s != baseData->jamoCE32s)) {
+        indexes[CollationDataReader::IX_JAMO_CE32S_START] = data.jamoCE32s - data.ce32s;
+    } else {
+        indexes[CollationDataReader::IX_JAMO_CE32S_START] = -1;
+    }
+
+    indexes[CollationDataReader::IX_REORDER_CODES_OFFSET] = totalSize;
+    totalSize += settings.reorderCodesLength * 4;
+
+    indexes[CollationDataReader::IX_REORDER_TABLE_OFFSET] = totalSize;
+    if(settings.reorderTable != NULL) {
+        totalSize += 256;
+    }
+
+    indexes[CollationDataReader::IX_TRIE_OFFSET] = totalSize;
+    if(hasMappings) {
+        UErrorCode errorCode2 = U_ZERO_ERROR;
+        int32_t length;
+        if(totalSize < capacity) {
+            length = utrie2_serialize(data.trie, dest + totalSize,
+                                      capacity - totalSize, &errorCode2);
+        } else {
+            length = utrie2_serialize(data.trie, NULL, 0, &errorCode2);
+        }
+        if(U_FAILURE(errorCode2) && errorCode2 != U_BUFFER_OVERFLOW_ERROR) {
+            errorCode = errorCode2;
+            return 0;
+        }
+        // The trie size should be a multiple of 8 bytes due to the way
+        // compactIndex2(UNewTrie2 *trie) currently works.
+        U_ASSERT((length & 7) == 0);
+        totalSize += length;
+    }
+
+    indexes[CollationDataReader::IX_RESERVED8_OFFSET] = totalSize;
+    indexes[CollationDataReader::IX_CES_OFFSET] = totalSize;
+    if(hasMappings && data.cesLength != 0) {
+        U_ASSERT(((headerSize + totalSize) & 7) == 0);
+        totalSize += data.cesLength * 8;
+    }
+
+    indexes[CollationDataReader::IX_RESERVED10_OFFSET] = totalSize;
+    indexes[CollationDataReader::IX_CE32S_OFFSET] = totalSize;
+    if(hasMappings) {
+        totalSize += data.ce32sLength * 4;
+    }
+
+    indexes[CollationDataReader::IX_ROOT_ELEMENTS_OFFSET] = totalSize;
+    totalSize += rootElementsLength * 4;
+
+    indexes[CollationDataReader::IX_CONTEXTS_OFFSET] = totalSize;
+    if(hasMappings) {
+        totalSize += data.contextsLength * 2;
+    }
+
+    indexes[CollationDataReader::IX_UNSAFE_BWD_OFFSET] = totalSize;
+    if(hasMappings && !unsafeBackwardSet.isEmpty()) {
+        UErrorCode errorCode2 = U_ZERO_ERROR;
+        int32_t length;
+        if(totalSize < capacity) {
+            uint16_t *p = reinterpret_cast<uint16_t *>(dest + totalSize);
+            length = unsafeBackwardSet.serialize(
+                    p, (capacity - totalSize) / 2, errorCode2);
+        } else {
+            length = unsafeBackwardSet.serialize(NULL, 0, errorCode2);
+        }
+        if(U_FAILURE(errorCode2) && errorCode2 != U_BUFFER_OVERFLOW_ERROR) {
+            errorCode = errorCode2;
+            return 0;
+        }
+        totalSize += length * 2;
+    }
+
+    indexes[CollationDataReader::IX_FAST_LATIN_TABLE_OFFSET] = totalSize;
+    totalSize += fastLatinTableLength * 2;
+
+    indexes[CollationDataReader::IX_SCRIPTS_OFFSET] = totalSize;
+    if(isBase) {
+        totalSize += data.scriptsLength * 2;
+    }
+
+    indexes[CollationDataReader::IX_COMPRESSIBLE_BYTES_OFFSET] = totalSize;
+    if(isBase) {
+        totalSize += 256;
+    }
+
+    indexes[CollationDataReader::IX_RESERVED18_OFFSET] = totalSize;
+    indexes[CollationDataReader::IX_TOTAL_SIZE] = totalSize;
+
+    if(totalSize > capacity) {
+        errorCode = U_BUFFER_OVERFLOW_ERROR;
+        return headerSize + totalSize;
+    }
+
+    uprv_memcpy(dest, indexes, indexesLength * 4);
+    copyData(indexes, CollationDataReader::IX_REORDER_CODES_OFFSET, settings.reorderCodes, dest);
+    copyData(indexes, CollationDataReader::IX_REORDER_TABLE_OFFSET, settings.reorderTable, dest);
+    // The trie has already been serialized into the dest buffer.
+    copyData(indexes, CollationDataReader::IX_CES_OFFSET, data.ces, dest);
+    copyData(indexes, CollationDataReader::IX_CE32S_OFFSET, data.ce32s, dest);
+    copyData(indexes, CollationDataReader::IX_ROOT_ELEMENTS_OFFSET, rootElements, dest);
+    copyData(indexes, CollationDataReader::IX_CONTEXTS_OFFSET, data.contexts, dest);
+    // The unsafeBackwardSet has already been serialized into the dest buffer.
+    copyData(indexes, CollationDataReader::IX_FAST_LATIN_TABLE_OFFSET, data.fastLatinTable, dest);
+    copyData(indexes, CollationDataReader::IX_SCRIPTS_OFFSET, data.scripts, dest);
+    copyData(indexes, CollationDataReader::IX_COMPRESSIBLE_BYTES_OFFSET, data.compressibleBytes, dest);
+
+    return headerSize + totalSize;
+}
+
+void
+CollationDataWriter::copyData(const int32_t indexes[], int32_t startIndex,
+                              const void *src, uint8_t *dest) {
+    int32_t start = indexes[startIndex];
+    int32_t limit = indexes[startIndex + 1];
+    if(start < limit) {
+        uprv_memcpy(dest + start, src, limit - start);
+    }
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationdatawriter.h b/icu4c/source/i18n/collationdatawriter.h
new file mode 100644 (file)
index 0000000..50e2652
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationdatawriter.h
+*
+* created on: 2013aug06
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONDATAWRITER_H__
+#define __COLLATIONDATAWRITER_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+U_NAMESPACE_BEGIN
+
+struct CollationData;
+struct CollationSettings;
+struct CollationTailoring;
+
+/**
+ * Collation-related code for tools & demos.
+ */
+class U_I18N_API CollationDataWriter /* all static */ {
+public:
+    static int32_t writeBase(const CollationData &data, const CollationSettings &settings,
+                             const void *rootElements, int32_t rootElementsLength,
+                             int32_t indexes[], uint8_t *dest, int32_t capacity,
+                             UErrorCode &errorCode);
+
+    static int32_t writeTailoring(const CollationTailoring &t, const CollationSettings &settings,
+                                  int32_t indexes[], uint8_t *dest, int32_t capacity,
+                                  UErrorCode &errorCode);
+
+private:
+    CollationDataWriter();  // no constructor
+
+    static int32_t write(UBool isBase, const UVersionInfo dataVersion,
+                         const CollationData &data, const CollationSettings &settings,
+                         const void *rootElements, int32_t rootElementsLength,
+                         int32_t indexes[], uint8_t *dest, int32_t capacity,
+                         UErrorCode &errorCode);
+
+    static void copyData(const int32_t indexes[], int32_t startIndex,
+                         const void *src, uint8_t *dest);
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONDATAWRITER_H__
diff --git a/icu4c/source/i18n/collationfastlatin.cpp b/icu4c/source/i18n/collationfastlatin.cpp
new file mode 100644 (file)
index 0000000..0b26d1d
--- /dev/null
@@ -0,0 +1,1083 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationfastlatin.cpp
+*
+* created on: 2013aug18
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/ucol.h"
+#include "collationdata.h"
+#include "collationfastlatin.h"
+#include "collationsettings.h"
+#include "putilimp.h"  // U_ALIGN_CODE
+#include "uassert.h"
+
+U_NAMESPACE_BEGIN
+
+int32_t
+CollationFastLatin::getOptions(const CollationData *data, const CollationSettings &settings,
+                               uint16_t *primaries, int32_t capacity) {
+    const uint16_t *table = data->fastLatinTable;
+    if(table == NULL) { return -1; }
+    U_ASSERT(capacity == LATIN_LIMIT);
+    if(capacity != LATIN_LIMIT) { return -1; }
+
+    uint32_t miniVarTop;
+    if((settings.options & CollationSettings::ALTERNATE_MASK) == 0) {
+        // No mini primaries are variable, set a variableTop just below the
+        // lowest long mini primary.
+        miniVarTop = MIN_LONG - 1;
+    } else {
+        uint32_t v1 = settings.variableTop >> 24;
+        int32_t headerLength = *table & 0xff;
+        int32_t i = headerLength - 1;
+        if(i <= 0 || v1 > (table[i] & 0x7f)) {
+            return -1;  // variableTop >= digits, should not occur
+        }
+        while(i > 1 && v1 <= (table[i - 1] & 0x7f)) { --i; }
+        // In the table header, the miniVarTop is in bits 15..7, with 4 zero bits 19..16 implied.
+        // Shift right to make it comparable with long mini primaries in bits 15..3.
+        miniVarTop = (table[i] & 0xff80) >> 4;
+    }
+
+    const uint8_t *reorderTable = settings.reorderTable;
+    if(reorderTable != NULL) {
+        const uint16_t *scripts = data->scripts;
+        int32_t length = data->scriptsLength;
+        uint32_t prevLastByte = 0;
+        for(int32_t i = 0; i < length;) {
+            // reordered last byte of the group
+            uint32_t lastByte = reorderTable[scripts[i] & 0xff];
+            if(lastByte < prevLastByte) {
+                // The permutation affects the groups up to Latin.
+                return -1;
+            }
+            if(scripts[i + 2] == USCRIPT_LATIN) { break; }
+            i = i + 2 + scripts[i + 1];
+            prevLastByte = lastByte;
+        }
+    }
+
+    table += (table[0] & 0xff);  // skip the header
+    for(UChar32 c = 0; c < LATIN_LIMIT; ++c) {
+        uint32_t p = table[c];
+        if(p >= MIN_SHORT) {
+            p &= SHORT_PRIMARY_MASK;
+        } else if(p > miniVarTop) {
+            p &= LONG_PRIMARY_MASK;
+        } else {
+            p = 0;
+        }
+        primaries[c] = (uint16_t)p;
+    }
+    if((settings.options & CollationSettings::NUMERIC) != 0) {
+        // Bail out for digits.
+        for(UChar32 c = 0x30; c <= 0x39; ++c) { primaries[c] = 0; }
+    }
+
+    // Shift the miniVarTop above other options.
+    return ((int32_t)miniVarTop << 16) | settings.options;
+}
+
+int32_t
+CollationFastLatin::compareUTF16(const uint16_t *table, const uint16_t *primaries, int32_t options,
+                                 const UChar *left, int32_t leftLength,
+                                 const UChar *right, int32_t rightLength) {
+    // This is a modified copy of CollationCompare::compareUpToQuaternary(),
+    // optimized for common Latin text.
+    // Keep them in sync!
+    // Keep compareUTF16() and compareUTF8() in sync very closely!
+
+    U_ASSERT((table[0] >> 8) == VERSION);
+    table += (table[0] & 0xff);  // skip the header
+    uint32_t variableTop = (uint32_t)options >> 16;  // see getOptions()
+    options &= 0xffff;  // needed for CollationSettings::getStrength() to work
+
+    // Check for supported characters, fetch mini CEs, and compare primaries.
+    U_ALIGN_CODE(16);
+    int32_t leftIndex = 0, rightIndex = 0;
+    /**
+     * Single mini CE or a pair.
+     * The current mini CE is in the lower 16 bits, the next one is in the upper 16 bits.
+     * If there is only one, then it is in the lower bits, and the upper bits are 0.
+     */
+    uint32_t leftPair = 0, rightPair = 0;
+    for(;;) {
+        // We fetch CEs until we get a non-ignorable primary or reach the end.
+        while(leftPair == 0) {
+            if(leftIndex == leftLength) {
+                leftPair = EOS;
+                break;
+            }
+            UChar32 c = left[leftIndex++];
+            if(c <= LATIN_MAX) {
+                leftPair = primaries[c];
+                if(leftPair != 0) { break; }
+                if(c <= 0x39 && c >= 0x30 && (options & CollationSettings::NUMERIC) != 0) {
+                    return BAIL_OUT_RESULT;
+                }
+                leftPair = table[c];
+            } else if(PUNCT_START <= c && c < PUNCT_LIMIT) {
+                leftPair = table[c - PUNCT_START + LATIN_LIMIT];
+            } else {
+                leftPair = lookup(table, c);
+            }
+            if(leftPair >= MIN_SHORT) {
+                leftPair &= SHORT_PRIMARY_MASK;
+                break;
+            } else if(leftPair > variableTop) {
+                leftPair &= LONG_PRIMARY_MASK;
+                break;
+            } else {
+                leftPair = nextPair(table, c, leftPair, left, NULL, leftIndex, leftLength);
+                if(leftPair == BAIL_OUT) { return BAIL_OUT_RESULT; }
+                leftPair = getPrimaries(variableTop, leftPair);
+            }
+        }
+
+        while(rightPair == 0) {
+            if(rightIndex == rightLength) {
+                rightPair = EOS;
+                break;
+            }
+            UChar32 c = right[rightIndex++];
+            if(c <= LATIN_MAX) {
+                rightPair = primaries[c];
+                if(rightPair != 0) { break; }
+                if(c <= 0x39 && c >= 0x30 && (options & CollationSettings::NUMERIC) != 0) {
+                    return BAIL_OUT_RESULT;
+                }
+                rightPair = table[c];
+            } else if(PUNCT_START <= c && c < PUNCT_LIMIT) {
+                rightPair = table[c - PUNCT_START + LATIN_LIMIT];
+            } else {
+                rightPair = lookup(table, c);
+            }
+            if(rightPair >= MIN_SHORT) {
+                rightPair &= SHORT_PRIMARY_MASK;
+                break;
+            } else if(rightPair > variableTop) {
+                rightPair &= LONG_PRIMARY_MASK;
+                break;
+            } else {
+                rightPair = nextPair(table, c, rightPair, right, NULL, rightIndex, rightLength);
+                if(rightPair == BAIL_OUT) { return BAIL_OUT_RESULT; }
+                rightPair = getPrimaries(variableTop, rightPair);
+            }
+        }
+
+        if(leftPair == rightPair) {
+            if(leftPair == EOS) { break; }
+            leftPair = rightPair = 0;
+            continue;
+        }
+        uint32_t leftPrimary = leftPair & 0xffff;
+        uint32_t rightPrimary = rightPair & 0xffff;
+        if(leftPrimary != rightPrimary) {
+            // Return the primary difference.
+            return (leftPrimary < rightPrimary) ? UCOL_LESS : UCOL_GREATER;
+        }
+        if(leftPair == EOS) { break; }
+        leftPair >>= 16;
+        rightPair >>= 16;
+    }
+    // In the following, we need to re-fetch each character because we did not buffer the CEs,
+    // but we know that the string is well-formed and
+    // only contains supported characters and mappings.
+
+    // We might skip the secondary level but continue with the case level
+    // which is turned on separately.
+    if(CollationSettings::getStrength(options) >= UCOL_SECONDARY) {
+        leftIndex = rightIndex = 0;
+        leftPair = rightPair = 0;
+        for(;;) {
+            while(leftPair == 0) {
+                if(leftIndex == leftLength) {
+                    leftPair = EOS;
+                    break;
+                }
+                UChar32 c = left[leftIndex++];
+                if(c <= LATIN_MAX) {
+                    leftPair = table[c];
+                } else if(PUNCT_START <= c && c < PUNCT_LIMIT) {
+                    leftPair = table[c - PUNCT_START + LATIN_LIMIT];
+                } else {
+                    leftPair = lookup(table, c);
+                }
+                if(leftPair >= MIN_SHORT) {
+                    leftPair = getSecondariesFromOneShortCE(leftPair);
+                    break;
+                } else if(leftPair > variableTop) {
+                    leftPair = COMMON_SEC_PLUS_OFFSET;
+                    break;
+                } else {
+                    leftPair = nextPair(table, c, leftPair, left, NULL, leftIndex, leftLength);
+                    leftPair = getSecondaries(variableTop, leftPair);
+                }
+            }
+
+            while(rightPair == 0) {
+                if(rightIndex == rightLength) {
+                    rightPair = EOS;
+                    break;
+                }
+                UChar32 c = right[rightIndex++];
+                if(c <= LATIN_MAX) {
+                    rightPair = table[c];
+                } else if(PUNCT_START <= c && c < PUNCT_LIMIT) {
+                    rightPair = table[c - PUNCT_START + LATIN_LIMIT];
+                } else {
+                    rightPair = lookup(table, c);
+                }
+                if(rightPair >= MIN_SHORT) {
+                    rightPair = getSecondariesFromOneShortCE(rightPair);
+                    break;
+                } else if(rightPair > variableTop) {
+                    rightPair = COMMON_SEC_PLUS_OFFSET;
+                    break;
+                } else {
+                    rightPair = nextPair(table, c, rightPair, right, NULL, rightIndex, rightLength);
+                    rightPair = getSecondaries(variableTop, rightPair);
+                }
+            }
+
+            if(leftPair == rightPair) {
+                if(leftPair == EOS) { break; }
+                leftPair = rightPair = 0;
+                continue;
+            }
+            uint32_t leftSecondary = leftPair & 0xffff;
+            uint32_t rightSecondary = rightPair & 0xffff;
+            if(leftSecondary != rightSecondary) {
+                if((options & CollationSettings::BACKWARD_SECONDARY) != 0) {
+                    // Full support for backwards secondary requires backwards contraction matching
+                    // and moving backwards between merge separators.
+                    return BAIL_OUT_RESULT;
+                }
+                return (leftSecondary < rightSecondary) ? UCOL_LESS : UCOL_GREATER;
+            }
+            if(leftPair == EOS) { break; }
+            leftPair >>= 16;
+            rightPair >>= 16;
+        }
+    }
+
+    if((options & CollationSettings::CASE_LEVEL) != 0) {
+        UBool strengthIsPrimary = CollationSettings::getStrength(options) == UCOL_PRIMARY;
+        leftIndex = rightIndex = 0;
+        leftPair = rightPair = 0;
+        for(;;) {
+            while(leftPair == 0) {
+                if(leftIndex == leftLength) {
+                    leftPair = EOS;
+                    break;
+                }
+                UChar32 c = left[leftIndex++];
+                leftPair = (c <= LATIN_MAX) ? table[c] : lookup(table, c);
+                if(leftPair < MIN_LONG) {
+                    leftPair = nextPair(table, c, leftPair, left, NULL, leftIndex, leftLength);
+                }
+                leftPair = getCases(variableTop, strengthIsPrimary, leftPair);
+            }
+
+            while(rightPair == 0) {
+                if(rightIndex == rightLength) {
+                    rightPair = EOS;
+                    break;
+                }
+                UChar32 c = right[rightIndex++];
+                rightPair = (c <= LATIN_MAX) ? table[c] : lookup(table, c);
+                if(rightPair < MIN_LONG) {
+                    rightPair = nextPair(table, c, rightPair, right, NULL, rightIndex, rightLength);
+                }
+                rightPair = getCases(variableTop, strengthIsPrimary, rightPair);
+            }
+
+            if(leftPair == rightPair) {
+                if(leftPair == EOS) { break; }
+                leftPair = rightPair = 0;
+                continue;
+            }
+            uint32_t leftCase = leftPair & 0xffff;
+            uint32_t rightCase = rightPair & 0xffff;
+            if(leftCase != rightCase) {
+                if((options & CollationSettings::UPPER_FIRST) == 0) {
+                    return (leftCase < rightCase) ? UCOL_LESS : UCOL_GREATER;
+                } else {
+                    return (leftCase < rightCase) ? UCOL_GREATER : UCOL_LESS;
+                }
+            }
+            if(leftPair == EOS) { break; }
+            leftPair >>= 16;
+            rightPair >>= 16;
+        }
+    }
+    if(CollationSettings::getStrength(options) <= UCOL_SECONDARY) { return UCOL_EQUAL; }
+
+    // Remove the case bits from the tertiary weight when caseLevel is on or caseFirst is off.
+    UBool withCaseBits = CollationSettings::isTertiaryWithCaseBits(options);
+
+    leftIndex = rightIndex = 0;
+    leftPair = rightPair = 0;
+    for(;;) {
+        while(leftPair == 0) {
+            if(leftIndex == leftLength) {
+                leftPair = EOS;
+                break;
+            }
+            UChar32 c = left[leftIndex++];
+            leftPair = (c <= LATIN_MAX) ? table[c] : lookup(table, c);
+            if(leftPair < MIN_LONG) {
+                leftPair = nextPair(table, c, leftPair, left, NULL, leftIndex, leftLength);
+            }
+            leftPair = getTertiaries(variableTop, withCaseBits, leftPair);
+        }
+
+        while(rightPair == 0) {
+            if(rightIndex == rightLength) {
+                rightPair = EOS;
+                break;
+            }
+            UChar32 c = right[rightIndex++];
+            rightPair = (c <= LATIN_MAX) ? table[c] : lookup(table, c);
+            if(rightPair < MIN_LONG) {
+                rightPair = nextPair(table, c, rightPair, right, NULL, rightIndex, rightLength);
+            }
+            rightPair = getTertiaries(variableTop, withCaseBits, rightPair);
+        }
+
+        if(leftPair == rightPair) {
+            if(leftPair == EOS) { break; }
+            leftPair = rightPair = 0;
+            continue;
+        }
+        uint32_t leftTertiary = leftPair & 0xffff;
+        uint32_t rightTertiary = rightPair & 0xffff;
+        if(leftTertiary != rightTertiary) {
+            if(CollationSettings::sortsTertiaryUpperCaseFirst(options)) {
+                // Pass through EOS and MERGE_WEIGHT
+                // and keep real tertiary weights larger than the MERGE_WEIGHT.
+                // Tertiary CEs (secondary ignorables) are not supported in fast Latin.
+                if(leftTertiary > MERGE_WEIGHT) {
+                    leftTertiary ^= CASE_MASK;
+                }
+                if(rightTertiary > MERGE_WEIGHT) {
+                    rightTertiary ^= CASE_MASK;
+                }
+            }
+            return (leftTertiary < rightTertiary) ? UCOL_LESS : UCOL_GREATER;
+        }
+        if(leftPair == EOS) { break; }
+        leftPair >>= 16;
+        rightPair >>= 16;
+    }
+    if(CollationSettings::getStrength(options) <= UCOL_TERTIARY) { return UCOL_EQUAL; }
+
+    leftIndex = rightIndex = 0;
+    leftPair = rightPair = 0;
+    for(;;) {
+        while(leftPair == 0) {
+            if(leftIndex == leftLength) {
+                leftPair = EOS;
+                break;
+            }
+            UChar32 c = left[leftIndex++];
+            leftPair = (c <= LATIN_MAX) ? table[c] : lookup(table, c);
+            if(leftPair < MIN_LONG) {
+                leftPair = nextPair(table, c, leftPair, left, NULL, leftIndex, leftLength);
+            }
+            leftPair = getQuaternaries(variableTop, leftPair);
+        }
+
+        while(rightPair == 0) {
+            if(rightIndex == rightLength) {
+                rightPair = EOS;
+                break;
+            }
+            UChar32 c = right[rightIndex++];
+            rightPair = (c <= LATIN_MAX) ? table[c] : lookup(table, c);
+            if(rightPair < MIN_LONG) {
+                rightPair = nextPair(table, c, rightPair, right, NULL, rightIndex, rightLength);
+            }
+            rightPair = getQuaternaries(variableTop, rightPair);
+        }
+
+        if(leftPair == rightPair) {
+            if(leftPair == EOS) { break; }
+            leftPair = rightPair = 0;
+            continue;
+        }
+        uint32_t leftQuaternary = leftPair & 0xffff;
+        uint32_t rightQuaternary = rightPair & 0xffff;
+        if(leftQuaternary != rightQuaternary) {
+            return (leftQuaternary < rightQuaternary) ? UCOL_LESS : UCOL_GREATER;
+        }
+        if(leftPair == EOS) { break; }
+        leftPair >>= 16;
+        rightPair >>= 16;
+    }
+    return UCOL_EQUAL;
+}
+
+int32_t
+CollationFastLatin::compareUTF8(const uint16_t *table, const uint16_t *primaries, int32_t options,
+                                 const uint8_t *left, int32_t leftLength,
+                                 const uint8_t *right, int32_t rightLength) {
+    // Keep compareUTF16() and compareUTF8() in sync very closely!
+
+    U_ASSERT((table[0] >> 8) == VERSION);
+    table += (table[0] & 0xff);  // skip the header
+    uint32_t variableTop = (uint32_t)options >> 16;  // see RuleBasedCollator::getFastLatinOptions()
+    options &= 0xffff;  // needed for CollationSettings::getStrength() to work
+
+    // Check for supported characters, fetch mini CEs, and compare primaries.
+    U_ALIGN_CODE(16);
+    int32_t leftIndex = 0, rightIndex = 0;
+    /**
+     * Single mini CE or a pair.
+     * The current mini CE is in the lower 16 bits, the next one is in the upper 16 bits.
+     * If there is only one, then it is in the lower bits, and the upper bits are 0.
+     */
+    uint32_t leftPair = 0, rightPair = 0;
+    // Note: There is no need to assemble the code point.
+    // We only need to look up the table entry for the character,
+    // and nextPair() looks for whether c==0.
+    for(;;) {
+        // We fetch CEs until we get a non-ignorable primary or reach the end.
+        while(leftPair == 0) {
+            if(leftIndex == leftLength) {
+                leftPair = EOS;
+                break;
+            }
+            UChar32 c = left[leftIndex++];
+            uint8_t t;
+            if(c <= 0x7f) {
+                leftPair = primaries[c];
+                if(leftPair != 0) { break; }
+                if(c <= 0x39 && c >= 0x30 && (options & CollationSettings::NUMERIC) != 0) {
+                    return BAIL_OUT_RESULT;
+                }
+                leftPair = table[c];
+            } else if(c <= LATIN_MAX_UTF8_LEAD && 0xc2 <= c && leftIndex != leftLength &&
+                    0x80 <= (t = left[leftIndex]) && t <= 0xbf) {
+                ++leftIndex;
+                c = ((c - 0xc2) << 6) + t;
+                leftPair = primaries[c];
+                if(leftPair != 0) { break; }
+                leftPair = table[c];
+            } else {
+                leftPair = lookupUTF8(table, c, left, leftIndex, leftLength);
+            }
+            if(leftPair >= MIN_SHORT) {
+                leftPair &= SHORT_PRIMARY_MASK;
+                break;
+            } else if(leftPair > variableTop) {
+                leftPair &= LONG_PRIMARY_MASK;
+                break;
+            } else {
+                leftPair = nextPair(table, c, leftPair, NULL, left, leftIndex, leftLength);
+                if(leftPair == BAIL_OUT) { return BAIL_OUT_RESULT; }
+                leftPair = getPrimaries(variableTop, leftPair);
+            }
+        }
+
+        while(rightPair == 0) {
+            if(rightIndex == rightLength) {
+                rightPair = EOS;
+                break;
+            }
+            UChar32 c = right[rightIndex++];
+            uint8_t t;
+            if(c <= 0x7f) {
+                rightPair = primaries[c];
+                if(rightPair != 0) { break; }
+                if(c <= 0x39 && c >= 0x30 && (options & CollationSettings::NUMERIC) != 0) {
+                    return BAIL_OUT_RESULT;
+                }
+                rightPair = table[c];
+            } else if(c <= LATIN_MAX_UTF8_LEAD && 0xc2 <= c && rightIndex != rightLength &&
+                    0x80 <= (t = right[rightIndex]) && t <= 0xbf) {
+                ++rightIndex;
+                c = ((c - 0xc2) << 6) + t;
+                rightPair = primaries[c];
+                if(rightPair != 0) { break; }
+                rightPair = table[c];
+            } else {
+                rightPair = lookupUTF8(table, c, right, rightIndex, rightLength);
+            }
+            if(rightPair >= MIN_SHORT) {
+                rightPair &= SHORT_PRIMARY_MASK;
+                break;
+            } else if(rightPair > variableTop) {
+                rightPair &= LONG_PRIMARY_MASK;
+                break;
+            } else {
+                rightPair = nextPair(table, c, rightPair, NULL, right, rightIndex, rightLength);
+                if(rightPair == BAIL_OUT) { return BAIL_OUT_RESULT; }
+                rightPair = getPrimaries(variableTop, rightPair);
+            }
+        }
+
+        if(leftPair == rightPair) {
+            if(leftPair == EOS) { break; }
+            leftPair = rightPair = 0;
+            continue;
+        }
+        uint32_t leftPrimary = leftPair & 0xffff;
+        uint32_t rightPrimary = rightPair & 0xffff;
+        if(leftPrimary != rightPrimary) {
+            // Return the primary difference.
+            return (leftPrimary < rightPrimary) ? UCOL_LESS : UCOL_GREATER;
+        }
+        if(leftPair == EOS) { break; }
+        leftPair >>= 16;
+        rightPair >>= 16;
+    }
+    // In the following, we need to re-fetch each character because we did not buffer the CEs,
+    // but we know that the string is well-formed and
+    // only contains supported characters and mappings.
+
+    // We might skip the secondary level but continue with the case level
+    // which is turned on separately.
+    if(CollationSettings::getStrength(options) >= UCOL_SECONDARY) {
+        leftIndex = rightIndex = 0;
+        leftPair = rightPair = 0;
+        for(;;) {
+            while(leftPair == 0) {
+                if(leftIndex == leftLength) {
+                    leftPair = EOS;
+                    break;
+                }
+                UChar32 c = left[leftIndex++];
+                if(c <= 0x7f) {
+                    leftPair = table[c];
+                } else if(c <= LATIN_MAX_UTF8_LEAD) {
+                    leftPair = table[((c - 0xc2) << 6) + left[leftIndex++]];
+                } else {
+                    leftPair = lookupUTF8Unsafe(table, c, left, leftIndex);
+                }
+                if(leftPair >= MIN_SHORT) {
+                    leftPair = getSecondariesFromOneShortCE(leftPair);
+                    break;
+                } else if(leftPair > variableTop) {
+                    leftPair = COMMON_SEC_PLUS_OFFSET;
+                    break;
+                } else {
+                    leftPair = nextPair(table, c, leftPair, NULL, left, leftIndex, leftLength);
+                    leftPair = getSecondaries(variableTop, leftPair);
+                }
+            }
+
+            while(rightPair == 0) {
+                if(rightIndex == rightLength) {
+                    rightPair = EOS;
+                    break;
+                }
+                UChar32 c = right[rightIndex++];
+                if(c <= 0x7f) {
+                    rightPair = table[c];
+                } else if(c <= LATIN_MAX_UTF8_LEAD) {
+                    rightPair = table[((c - 0xc2) << 6) + right[rightIndex++]];
+                } else {
+                    rightPair = lookupUTF8Unsafe(table, c, right, rightIndex);
+                }
+                if(rightPair >= MIN_SHORT) {
+                    rightPair = getSecondariesFromOneShortCE(rightPair);
+                    break;
+                } else if(rightPair > variableTop) {
+                    rightPair = COMMON_SEC_PLUS_OFFSET;
+                    break;
+                } else {
+                    rightPair = nextPair(table, c, rightPair, NULL, right, rightIndex, rightLength);
+                    rightPair = getSecondaries(variableTop, rightPair);
+                }
+            }
+
+            if(leftPair == rightPair) {
+                if(leftPair == EOS) { break; }
+                leftPair = rightPair = 0;
+                continue;
+            }
+            uint32_t leftSecondary = leftPair & 0xffff;
+            uint32_t rightSecondary = rightPair & 0xffff;
+            if(leftSecondary != rightSecondary) {
+                if((options & CollationSettings::BACKWARD_SECONDARY) != 0) {
+                    // Full support for backwards secondary requires backwards contraction matching
+                    // and moving backwards between merge separators.
+                    return BAIL_OUT_RESULT;
+                }
+                return (leftSecondary < rightSecondary) ? UCOL_LESS : UCOL_GREATER;
+            }
+            if(leftPair == EOS) { break; }
+            leftPair >>= 16;
+            rightPair >>= 16;
+        }
+    }
+
+    if((options & CollationSettings::CASE_LEVEL) != 0) {
+        UBool strengthIsPrimary = CollationSettings::getStrength(options) == UCOL_PRIMARY;
+        leftIndex = rightIndex = 0;
+        leftPair = rightPair = 0;
+        for(;;) {
+            while(leftPair == 0) {
+                if(leftIndex == leftLength) {
+                    leftPair = EOS;
+                    break;
+                }
+                UChar32 c = left[leftIndex++];
+                leftPair = (c <= 0x7f) ? table[c] : lookupUTF8Unsafe(table, c, left, leftIndex);
+                if(leftPair < MIN_LONG) {
+                    leftPair = nextPair(table, c, leftPair, NULL, left, leftIndex, leftLength);
+                }
+                leftPair = getCases(variableTop, strengthIsPrimary, leftPair);
+            }
+
+            while(rightPair == 0) {
+                if(rightIndex == rightLength) {
+                    rightPair = EOS;
+                    break;
+                }
+                UChar32 c = right[rightIndex++];
+                rightPair = (c <= 0x7f) ? table[c] : lookupUTF8Unsafe(table, c, right, rightIndex);
+                if(rightPair < MIN_LONG) {
+                    rightPair = nextPair(table, c, rightPair, NULL, right, rightIndex, rightLength);
+                }
+                rightPair = getCases(variableTop, strengthIsPrimary, rightPair);
+            }
+
+            if(leftPair == rightPair) {
+                if(leftPair == EOS) { break; }
+                leftPair = rightPair = 0;
+                continue;
+            }
+            uint32_t leftCase = leftPair & 0xffff;
+            uint32_t rightCase = rightPair & 0xffff;
+            if(leftCase != rightCase) {
+                if((options & CollationSettings::UPPER_FIRST) == 0) {
+                    return (leftCase < rightCase) ? UCOL_LESS : UCOL_GREATER;
+                } else {
+                    return (leftCase < rightCase) ? UCOL_GREATER : UCOL_LESS;
+                }
+            }
+            if(leftPair == EOS) { break; }
+            leftPair >>= 16;
+            rightPair >>= 16;
+        }
+    }
+    if(CollationSettings::getStrength(options) <= UCOL_SECONDARY) { return UCOL_EQUAL; }
+
+    // Remove the case bits from the tertiary weight when caseLevel is on or caseFirst is off.
+    UBool withCaseBits = CollationSettings::isTertiaryWithCaseBits(options);
+
+    leftIndex = rightIndex = 0;
+    leftPair = rightPair = 0;
+    for(;;) {
+        while(leftPair == 0) {
+            if(leftIndex == leftLength) {
+                leftPair = EOS;
+                break;
+            }
+            UChar32 c = left[leftIndex++];
+            leftPair = (c <= 0x7f) ? table[c] : lookupUTF8Unsafe(table, c, left, leftIndex);
+            if(leftPair < MIN_LONG) {
+                leftPair = nextPair(table, c, leftPair, NULL, left, leftIndex, leftLength);
+            }
+            leftPair = getTertiaries(variableTop, withCaseBits, leftPair);
+        }
+
+        while(rightPair == 0) {
+            if(rightIndex == rightLength) {
+                rightPair = EOS;
+                break;
+            }
+            UChar32 c = right[rightIndex++];
+            rightPair = (c <= 0x7f) ? table[c] : lookupUTF8Unsafe(table, c, right, rightIndex);
+            if(rightPair < MIN_LONG) {
+                rightPair = nextPair(table, c, rightPair, NULL, right, rightIndex, rightLength);
+            }
+            rightPair = getTertiaries(variableTop, withCaseBits, rightPair);
+        }
+
+        if(leftPair == rightPair) {
+            if(leftPair == EOS) { break; }
+            leftPair = rightPair = 0;
+            continue;
+        }
+        uint32_t leftTertiary = leftPair & 0xffff;
+        uint32_t rightTertiary = rightPair & 0xffff;
+        if(leftTertiary != rightTertiary) {
+            if(CollationSettings::sortsTertiaryUpperCaseFirst(options)) {
+                // Pass through EOS and MERGE_WEIGHT
+                // and keep real tertiary weights larger than the MERGE_WEIGHT.
+                // Tertiary CEs (secondary ignorables) are not supported in fast Latin.
+                if(leftTertiary > MERGE_WEIGHT) {
+                    leftTertiary ^= CASE_MASK;
+                }
+                if(rightTertiary > MERGE_WEIGHT) {
+                    rightTertiary ^= CASE_MASK;
+                }
+            }
+            return (leftTertiary < rightTertiary) ? UCOL_LESS : UCOL_GREATER;
+        }
+        if(leftPair == EOS) { break; }
+        leftPair >>= 16;
+        rightPair >>= 16;
+    }
+    if(CollationSettings::getStrength(options) <= UCOL_TERTIARY) { return UCOL_EQUAL; }
+
+    leftIndex = rightIndex = 0;
+    leftPair = rightPair = 0;
+    for(;;) {
+        while(leftPair == 0) {
+            if(leftIndex == leftLength) {
+                leftPair = EOS;
+                break;
+            }
+            UChar32 c = left[leftIndex++];
+            leftPair = (c <= 0x7f) ? table[c] : lookupUTF8Unsafe(table, c, left, leftIndex);
+            if(leftPair < MIN_LONG) {
+                leftPair = nextPair(table, c, leftPair, NULL, left, leftIndex, leftLength);
+            }
+            leftPair = getQuaternaries(variableTop, leftPair);
+        }
+
+        while(rightPair == 0) {
+            if(rightIndex == rightLength) {
+                rightPair = EOS;
+                break;
+            }
+            UChar32 c = right[rightIndex++];
+            rightPair = (c <= 0x7f) ? table[c] : lookupUTF8Unsafe(table, c, right, rightIndex);
+            if(rightPair < MIN_LONG) {
+                rightPair = nextPair(table, c, rightPair, NULL, right, rightIndex, rightLength);
+            }
+            rightPair = getQuaternaries(variableTop, rightPair);
+        }
+
+        if(leftPair == rightPair) {
+            if(leftPair == EOS) { break; }
+            leftPair = rightPair = 0;
+            continue;
+        }
+        uint32_t leftQuaternary = leftPair & 0xffff;
+        uint32_t rightQuaternary = rightPair & 0xffff;
+        if(leftQuaternary != rightQuaternary) {
+            return (leftQuaternary < rightQuaternary) ? UCOL_LESS : UCOL_GREATER;
+        }
+        if(leftPair == EOS) { break; }
+        leftPair >>= 16;
+        rightPair >>= 16;
+    }
+    return UCOL_EQUAL;
+}
+
+uint32_t
+CollationFastLatin::lookup(const uint16_t *table, UChar32 c) {
+    U_ASSERT(c > LATIN_MAX);
+    if(PUNCT_START <= c && c < PUNCT_LIMIT) {
+        return table[c - PUNCT_START + LATIN_LIMIT];
+    } else if(c == 0xfffe) {
+        return MERGE_WEIGHT;
+    } else if(c == 0xffff) {
+        return MAX_SHORT | COMMON_SEC | LOWER_CASE | COMMON_TER;
+    } else {
+        return BAIL_OUT;
+    }
+}
+
+uint32_t
+CollationFastLatin::lookupUTF8(const uint16_t *table, UChar32 c,
+                               const uint8_t *s8, int32_t &sIndex, int32_t sLength) {
+    // The caller handled ASCII and valid/supported Latin.
+    U_ASSERT(c > 0x7f);
+    int32_t i2 = sIndex + 1;
+    if(i2 < sLength || sLength < 0) {
+        uint8_t t1 = s8[sIndex];
+        uint8_t t2 = s8[i2];
+        sIndex += 2;
+        if(c == 0xe2 && t1 == 0x80 && 0x80 <= t2 && t2 <= 0xbf) {
+            return table[(LATIN_LIMIT - 0x80) + t2];  // 2000..203F -> 0180..01BF
+        } else if(c == 0xef && t1 == 0xbf) {
+            if(t2 == 0xbe) {
+                return MERGE_WEIGHT;  // U+FFFE
+            } else if(t2 == 0xbf) {
+                return MAX_SHORT | COMMON_SEC | LOWER_CASE | COMMON_TER;  // U+FFFF
+            }
+        }
+    }
+    return BAIL_OUT;
+}
+
+uint32_t
+CollationFastLatin::lookupUTF8Unsafe(const uint16_t *table, UChar32 c,
+                                     const uint8_t *s8, int32_t &sIndex) {
+    // The caller handled ASCII.
+    // The string is well-formed and contains only supported characters.
+    U_ASSERT(c > 0x7f);
+    if(c <= LATIN_MAX_UTF8_LEAD) {
+        return table[((c - 0xc2) << 6) + s8[sIndex++]];  // 0080..017F
+    }
+    uint8_t t2 = s8[sIndex + 1];
+    sIndex += 2;
+    if(c == 0xe2) {
+        return table[(LATIN_LIMIT - 0x80) + t2];  // 2000..203F -> 0180..01BF
+    } else if(t2 == 0xbe) {
+        return MERGE_WEIGHT;  // U+FFFE
+    } else {
+        return MAX_SHORT | COMMON_SEC | LOWER_CASE | COMMON_TER;  // U+FFFF
+    }
+}
+
+uint32_t
+CollationFastLatin::nextPair(const uint16_t *table, UChar32 c, uint32_t ce,
+                             const UChar *s16, const uint8_t *s8, int32_t &sIndex, int32_t &sLength) {
+    if(ce >= MIN_LONG || ce < CONTRACTION) {
+        return ce;  // simple or special mini CE
+    } else if(ce >= EXPANSION) {
+        int32_t index = NUM_FAST_CHARS + (ce & INDEX_MASK);
+        return ((uint32_t)table[index + 1] << 16) | table[index];
+    } else /* ce >= CONTRACTION */ {
+        if(c == 0 && sLength < 0) {
+            sLength = sIndex - 1;
+            return EOS;
+        }
+        // Contraction list: Default mapping followed by
+        // 0 or more single-character contraction suffix mappings.
+        int32_t index = NUM_FAST_CHARS + (ce & INDEX_MASK);
+        if(sIndex != sLength) {
+            // Read the next character.
+            int32_t c2;
+            int32_t nextIndex = sIndex;
+            if(s16 != NULL) {
+                c2 = s16[nextIndex++];
+                if(c2 > LATIN_MAX) {
+                    if(PUNCT_START <= c2 && c2 < PUNCT_LIMIT) {
+                        c2 = c2 - PUNCT_START + LATIN_LIMIT;  // 2000..203F -> 0180..01BF
+                    } else if(c2 == 0xfffe || c2 == 0xffff) {
+                        c2 = -1;  // U+FFFE & U+FFFF cannot occur in contractions.
+                    } else {
+                        return BAIL_OUT;
+                    }
+                }
+            } else {
+                c2 = s8[nextIndex++];
+                if(c2 > 0x7f) {
+                    uint8_t t;
+                    if(c2 <= 0xc5 && 0xc2 <= c2 && nextIndex != sLength &&
+                            0x80 <= (t = s8[nextIndex]) && t <= 0xbf) {
+                        c2 = ((c2 - 0xc2) << 6) + t;  // 0080..017F
+                        ++nextIndex;
+                    } else {
+                        int32_t i2 = nextIndex + 1;
+                        if(i2 < sLength || sLength < 0) {
+                            if(c2 == 0xe2 && s8[nextIndex] == 0x80 &&
+                                    0x80 <= (t = s8[i2]) && t <= 0xbf) {
+                                c2 = (LATIN_LIMIT - 0x80) + t;  // 2000..203F -> 0180..01BF
+                            } else if(c2 == 0xef && s8[nextIndex] == 0xbf &&
+                                    ((t = s8[i2]) == 0xbe || t == 0xbf)) {
+                                c2 = -1;  // U+FFFE & U+FFFF cannot occur in contractions.
+                            } else {
+                                return BAIL_OUT;
+                            }
+                        } else {
+                            return BAIL_OUT;
+                        }
+                        nextIndex += 2;
+                    }
+                }
+            }
+            if(c2 == 0 && sLength < 0) {
+                sLength = sIndex;
+                c2 = -1;
+            }
+            // Look for the next character in the contraction suffix list,
+            // which is in ascending order of single suffix characters.
+            int32_t i = index;
+            int32_t head = table[i];  // first skip the default mapping
+            int32_t x;
+            do {
+                i += head >> CONTR_LENGTH_SHIFT;
+                head = table[i];
+                x = head & CONTR_CHAR_MASK;
+            } while(x < c2);
+            if(x == c2) {
+                index = i;
+                sIndex = nextIndex;
+            }
+        }
+        // Return the CE or CEs for the default or contraction mapping.
+        int32_t length = table[index] >> CONTR_LENGTH_SHIFT;
+        if(length == 1) {
+            return BAIL_OUT;
+        }
+        ce = table[index + 1];
+        if(length == 2) {
+            return ce;
+        } else {
+            return ((uint32_t)table[index + 2] << 16) | ce;
+        }
+    }
+}
+
+uint32_t
+CollationFastLatin::getSecondaries(uint32_t variableTop, uint32_t pair) {
+    if(pair <= 0xffff) {
+        // one mini CE
+        if(pair >= MIN_SHORT) {
+            pair = getSecondariesFromOneShortCE(pair);
+        } else if(pair > variableTop) {
+            pair = COMMON_SEC_PLUS_OFFSET;
+        } else if(pair >= MIN_LONG) {
+            pair = 0;  // variable
+        }
+        // else special mini CE
+    } else {
+        uint32_t ce = pair & 0xffff;
+        if(ce >= MIN_SHORT) {
+            pair = (pair & TWO_SECONDARIES_MASK) + TWO_SEC_OFFSETS;
+        } else if(ce > variableTop) {
+            pair = TWO_COMMON_SEC_PLUS_OFFSET;
+        } else {
+            U_ASSERT(ce >= MIN_LONG);
+            pair = 0;  // variable
+        }
+    }
+    return pair;
+}
+
+uint32_t
+CollationFastLatin::getCases(uint32_t variableTop, UBool strengthIsPrimary, uint32_t pair) {
+    // Primary+caseLevel: Ignore case level weights of primary ignorables.
+    // Otherwise: Ignore case level weights of secondary ignorables.
+    // For details see the comments in the CollationCompare class.
+    // Tertiary CEs (secondary ignorables) are not supported in fast Latin.
+    if(pair <= 0xffff) {
+        // one mini CE
+        if(pair >= MIN_SHORT) {
+            // A high secondary weight means we really have two CEs,
+            // a primary CE and a secondary CE.
+            uint32_t ce = pair;
+            pair &= CASE_MASK;  // explicit weight of primary CE
+            if(!strengthIsPrimary && (ce & SECONDARY_MASK) >= MIN_SEC_HIGH) {
+                pair |= LOWER_CASE << 16;  // implied weight of secondary CE
+            }
+        } else if(pair > variableTop) {
+            pair = LOWER_CASE;
+        } else if(pair >= MIN_LONG) {
+            pair = 0;  // variable
+        }
+        // else special mini CE
+    } else {
+        // two mini CEs, same primary groups, neither expands like above
+        uint32_t ce = pair & 0xffff;
+        if(ce >= MIN_SHORT) {
+            if(strengthIsPrimary && (pair & (SHORT_PRIMARY_MASK << 16)) == 0) {
+                pair &= CASE_MASK;
+            } else {
+                pair &= TWO_CASES_MASK;
+            }
+        } else if(ce > variableTop) {
+            pair = TWO_LOWER_CASES;
+        } else {
+            U_ASSERT(ce >= MIN_LONG);
+            pair = 0;  // variable
+        }
+    }
+    return pair;
+}
+
+uint32_t
+CollationFastLatin::getTertiaries(uint32_t variableTop, UBool withCaseBits, uint32_t pair) {
+    if(pair <= 0xffff) {
+        // one mini CE
+        if(pair >= MIN_SHORT) {
+            // A high secondary weight means we really have two CEs,
+            // a primary CE and a secondary CE.
+            uint32_t ce = pair;
+            if(withCaseBits) {
+                pair = (pair & CASE_AND_TERTIARY_MASK) + TER_OFFSET;
+                if((ce & SECONDARY_MASK) >= MIN_SEC_HIGH) {
+                    pair |= (LOWER_CASE | COMMON_TER_PLUS_OFFSET) << 16;
+                }
+            } else {
+                pair = (pair & TERTIARY_MASK) + TER_OFFSET;
+                if((ce & SECONDARY_MASK) >= MIN_SEC_HIGH) {
+                    pair |= COMMON_TER_PLUS_OFFSET << 16;
+                }
+            }
+        } else if(pair > variableTop) {
+            pair = (pair & TERTIARY_MASK) + TER_OFFSET;
+            if(withCaseBits) {
+                pair |= LOWER_CASE;
+            }
+        } else if(pair >= MIN_LONG) {
+            pair = 0;  // variable
+        }
+        // else special mini CE
+    } else {
+        // two mini CEs, same primary groups, neither expands like above
+        uint32_t ce = pair & 0xffff;
+        if(ce >= MIN_SHORT) {
+            if(withCaseBits) {
+                pair &= TWO_CASES_MASK | TWO_TERTIARIES_MASK;
+            } else {
+                pair &= TWO_TERTIARIES_MASK;
+            }
+            pair += TWO_TER_OFFSETS;
+        } else if(ce > variableTop) {
+            pair = (pair & TWO_TERTIARIES_MASK) + TWO_TER_OFFSETS;
+            if(withCaseBits) {
+                pair |= TWO_LOWER_CASES;
+            }
+        } else {
+            U_ASSERT(ce >= MIN_LONG);
+            pair = 0;  // variable
+        }
+    }
+    return pair;
+}
+
+uint32_t
+CollationFastLatin::getQuaternaries(uint32_t variableTop, uint32_t pair) {
+    // Return the primary weight of a variable CE,
+    // or the maximum primary weight for a non-variable, not-completely-ignorable CE.
+    if(pair <= 0xffff) {
+        // one mini CE
+        if(pair >= MIN_SHORT) {
+            // A high secondary weight means we really have two CEs,
+            // a primary CE and a secondary CE.
+            if((pair & SECONDARY_MASK) >= MIN_SEC_HIGH) {
+                pair = TWO_SHORT_PRIMARIES_MASK;
+            } else {
+                pair = SHORT_PRIMARY_MASK;
+            }
+        } else if(pair > variableTop) {
+            pair = SHORT_PRIMARY_MASK;
+        } else if(pair >= MIN_LONG) {
+            pair &= LONG_PRIMARY_MASK;  // variable
+        }
+        // else special mini CE
+    } else {
+        // two mini CEs, same primary groups, neither expands like above
+        uint32_t ce = pair & 0xffff;
+        if(ce > variableTop) {
+            pair = TWO_SHORT_PRIMARIES_MASK;
+        } else {
+            U_ASSERT(ce >= MIN_LONG);
+            pair &= TWO_LONG_PRIMARIES_MASK;  // variable
+        }
+    }
+    return pair;
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationfastlatin.h b/icu4c/source/i18n/collationfastlatin.h
new file mode 100644 (file)
index 0000000..4582eb1
--- /dev/null
@@ -0,0 +1,301 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationfastlatin.h
+*
+* created on: 2013aug09
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONFASTLATIN_H__
+#define __COLLATIONFASTLATIN_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+U_NAMESPACE_BEGIN
+
+struct CollationData;
+struct CollationSettings;
+
+class U_I18N_API CollationFastLatin /* all static */ {
+public:
+    /**
+     * Fast Latin format version (one byte 1..FF).
+     * Must be incremented for any runtime-incompatible changes,
+     * in particular, for changes to any of the following constants.
+     *
+     * When the major version number of the main data format changes,
+     * we can reset this fast Latin version to 1.
+     */
+    static const uint16_t VERSION = 1;
+
+    static const int32_t LATIN_MAX = 0x17f;
+    static const int32_t LATIN_LIMIT = LATIN_MAX + 1;
+
+    static const int32_t LATIN_MAX_UTF8_LEAD = 0xc5;  // UTF-8 lead byte of LATIN_MAX
+
+    static const int32_t PUNCT_START = 0x2000;
+    static const int32_t PUNCT_LIMIT = 0x2040;
+
+    // excludes U+FFFE & U+FFFF
+    static const int32_t NUM_FAST_CHARS = LATIN_LIMIT + (PUNCT_LIMIT - PUNCT_START);
+
+    // Note on the supported weight ranges:
+    // Analysis of UCA 6.3 and CLDR 23 non-search tailorings shows that
+    // the CEs for characters in the above ranges, excluding expansions with length >2,
+    // excluding contractions of >2 characters, and other restrictions
+    // (see the builder's getCEsFromCE32()),
+    // use at most about 150 primary weights,
+    // where about 94 primary weights are possibly-variable (space/punct/symbol/currency),
+    // at most 4 secondary before-common weights,
+    // at most 4 secondary after-common weights,
+    // at most 16 secondary high weights (in secondary CEs), and
+    // at most 4 tertiary after-common weights.
+    // The following ranges are designed to support slightly more weights than that.
+    // (en_US_POSIX is unusual: It creates about 64 variable + 116 Latin primaries.)
+
+    // Digits may use long primaries (preserving more short ones)
+    // or short primaries (faster) without changing this data structure.
+    // (If we supported numeric collation, then digits would have to have long primaries
+    // so that special handling does not affect the fast path.)
+
+    static const uint32_t SHORT_PRIMARY_MASK = 0xfc00;  // bits 15..10
+    static const uint32_t INDEX_MASK = 0x3ff;  // bits 9..0 for expansions & contractions
+    static const uint32_t SECONDARY_MASK = 0x3e0;  // bits 9..5
+    static const uint32_t CASE_MASK = 0x18;  // bits 4..3
+    static const uint32_t LONG_PRIMARY_MASK = 0xfff8;  // bits 15..3
+    static const uint32_t TERTIARY_MASK = 7;  // bits 2..0
+    static const uint32_t CASE_AND_TERTIARY_MASK = CASE_MASK | TERTIARY_MASK;
+
+    static const uint32_t TWO_SHORT_PRIMARIES_MASK =
+            (SHORT_PRIMARY_MASK << 16) | SHORT_PRIMARY_MASK;  // 0xfc00fc00
+    static const uint32_t TWO_LONG_PRIMARIES_MASK =
+            (LONG_PRIMARY_MASK << 16) | LONG_PRIMARY_MASK;  // 0xfff8fff8
+    static const uint32_t TWO_SECONDARIES_MASK =
+            (SECONDARY_MASK << 16) | SECONDARY_MASK;  // 0x3e003e0
+    static const uint32_t TWO_CASES_MASK =
+            (CASE_MASK << 16) | CASE_MASK;  // 0x180018
+    static const uint32_t TWO_TERTIARIES_MASK =
+            (TERTIARY_MASK << 16) | TERTIARY_MASK;  // 0x70007
+
+    /**
+     * Contraction with one fast Latin character.
+     * Use INDEX_MASK to find the start of the contraction list after the fixed table.
+     * The first entry contains the default mapping.
+     * Otherwise use CONTR_CHAR_MASK for the contraction character index
+     * (in ascending order).
+     * Use CONTR_LENGTH_SHIFT for the length of the entry
+     * (1=BAIL_OUT, 2=one CE, 3=two CEs).
+     *
+     * Also, U+0000 maps to a contraction entry, so that the fast path need not
+     * check for NUL termination.
+     * It usually maps to a contraction list with only the completely ignorable default value.
+     */
+    static const uint32_t CONTRACTION = 0x400;
+    /**
+     * An expansion encodes two CEs.
+     * Use INDEX_MASK to find the pair of CEs after the fixed table.
+     *
+     * The higher a mini CE value, the easier it is to process.
+     * For expansions and higher, no context needs to be considered.
+     */
+    static const uint32_t EXPANSION = 0x800;
+    /**
+     * Encodes one CE with a long/low mini primary (there are 128).
+     * All potentially-variable primaries must be in this range,
+     * to make the short-primary path as fast as possible.
+     */
+    static const uint32_t MIN_LONG = 0xc00;
+    static const uint32_t LONG_INC = 8;
+    static const uint32_t MAX_LONG = 0xff8;
+    /**
+     * Encodes one CE with a short/high primary (there are 60),
+     * plus a secondary CE if the secondary weight is high.
+     * Fast handling: At least all letter primaries should be in this range.
+     */
+    static const uint32_t MIN_SHORT = 0x1000;
+    static const uint32_t SHORT_INC = 0x400;
+    /** The highest primary weight is reserved for U+FFFF. */
+    static const uint32_t MAX_SHORT = SHORT_PRIMARY_MASK;
+
+    static const uint32_t MIN_SEC_BEFORE = 0;  // must add SEC_OFFSET
+    static const uint32_t SEC_INC = 0x20;
+    static const uint32_t MAX_SEC_BEFORE = MIN_SEC_BEFORE + 4 * SEC_INC;  // 5 before common
+    static const uint32_t COMMON_SEC = MAX_SEC_BEFORE + SEC_INC;
+    static const uint32_t MIN_SEC_AFTER = COMMON_SEC + SEC_INC;
+    static const uint32_t MAX_SEC_AFTER = MIN_SEC_AFTER + 5 * SEC_INC;  // 6 after common
+    static const uint32_t MIN_SEC_HIGH = MAX_SEC_AFTER + SEC_INC;  // 20 high secondaries
+    static const uint32_t MAX_SEC_HIGH = SECONDARY_MASK;
+
+    /**
+     * Lookup: Add this offset to secondary weights, except for completely ignorable CEs.
+     * Must be greater than any special value, e.g., MERGE_WEIGHT.
+     * The exact value is not relevant for the format version.
+     */
+    static const uint32_t SEC_OFFSET = SEC_INC;
+    static const uint32_t COMMON_SEC_PLUS_OFFSET = COMMON_SEC + SEC_OFFSET;
+
+    static const uint32_t TWO_SEC_OFFSETS =
+            (SEC_OFFSET << 16) | SEC_OFFSET;  // 0x200020
+    static const uint32_t TWO_COMMON_SEC_PLUS_OFFSET =
+            (COMMON_SEC_PLUS_OFFSET << 16) | COMMON_SEC_PLUS_OFFSET;
+
+    static const uint32_t LOWER_CASE = 8;  // case bits include this offset
+    static const uint32_t TWO_LOWER_CASES = (LOWER_CASE << 16) | LOWER_CASE;  // 0x80008
+
+    static const uint32_t COMMON_TER = 0;  // must add TER_OFFSET
+    static const uint32_t MAX_TER_AFTER = 7;  // 7 after common
+
+    /**
+     * Lookup: Add this offset to tertiary weights, except for completely ignorable CEs.
+     * Must be greater than any special value, e.g., MERGE_WEIGHT.
+     * Must be greater than case bits as well, so that with combined case+tertiary weights
+     * plus the offset the tertiary bits does not spill over into the case bits.
+     * The exact value is not relevant for the format version.
+     */
+    static const uint32_t TER_OFFSET = SEC_OFFSET;
+    static const uint32_t COMMON_TER_PLUS_OFFSET = COMMON_TER + TER_OFFSET;
+
+    static const uint32_t TWO_TER_OFFSETS = (TER_OFFSET << 16) | TER_OFFSET;
+    static const uint32_t TWO_COMMON_TER_PLUS_OFFSET =
+            (COMMON_TER_PLUS_OFFSET << 16) | COMMON_TER_PLUS_OFFSET;
+
+    static const uint32_t MERGE_WEIGHT = 3;
+    static const uint32_t EOS = 2;  // end of string
+    static const uint32_t BAIL_OUT = 1;
+
+    /**
+     * Contraction result first word bits 8..0 contain the
+     * second contraction character, as a char index 0..NUM_FAST_CHARS-1.
+     * Each contraction list is terminated with a word containing CONTR_CHAR_MASK.
+     */
+    static const uint32_t CONTR_CHAR_MASK = 0x1ff;
+    /**
+     * Contraction result first word bits 10..9 contain the result length:
+     * 1=bail out, 2=one mini CE, 3=two mini CEs
+     */
+    static const uint32_t CONTR_LENGTH_SHIFT = 9;
+
+    /**
+     * Comparison return value when the regular comparison must be used.
+     * The exact value is not relevant for the format version.
+     */
+    static const int32_t BAIL_OUT_RESULT = -2;
+
+    static inline int32_t getCharIndex(UChar c) {
+        if(c <= LATIN_MAX) {
+            return c;
+        } else if(PUNCT_START <= c && c < PUNCT_LIMIT) {
+            return c - (PUNCT_START - LATIN_LIMIT);
+        } else {
+            // Not a fast Latin character.
+            // Note: U+FFFE & U+FFFF are forbidden in tailorings
+            // and thus do not occur in any contractions.
+            return -1;
+        }
+    }
+
+    /**
+     * Computes the options value for the compare functions
+     * and writes the precomputed primary weights.
+     * Returns -1 if the Latin fastpath is not supported for the data and settings.
+     * The capacity must be LATIN_LIMIT.
+     */
+    static int32_t getOptions(const CollationData *data, const CollationSettings &settings,
+                              uint16_t *primaries, int32_t capacity);
+
+    static int32_t compareUTF16(const uint16_t *table, const uint16_t *primaries, int32_t options,
+                                const UChar *left, int32_t leftLength,
+                                const UChar *right, int32_t rightLength);
+
+    static int32_t compareUTF8(const uint16_t *table, const uint16_t *primaries, int32_t options,
+                               const uint8_t *left, int32_t leftLength,
+                               const uint8_t *right, int32_t rightLength);
+
+private:
+    static uint32_t lookup(const uint16_t *table, UChar32 c);
+    static uint32_t lookupUTF8(const uint16_t *table, UChar32 c,
+                               const uint8_t *s8, int32_t &sIndex, int32_t sLength);
+    static uint32_t lookupUTF8Unsafe(const uint16_t *table, UChar32 c,
+                                     const uint8_t *s8, int32_t &sIndex);
+
+    static uint32_t nextPair(const uint16_t *table, UChar32 c, uint32_t ce,
+                             const UChar *s16, const uint8_t *s8, int32_t &sIndex, int32_t &sLength);
+
+    static inline uint32_t getPrimaries(uint32_t variableTop, uint32_t pair) {
+        uint32_t ce = pair & 0xffff;
+        if(ce >= MIN_SHORT) { return pair & TWO_SHORT_PRIMARIES_MASK; }
+        if(ce > variableTop) { return pair & TWO_LONG_PRIMARIES_MASK; }
+        if(ce >= MIN_LONG) { return 0; }  // variable
+        return pair;  // special mini CE
+    }
+    static inline uint32_t getSecondariesFromOneShortCE(uint32_t ce) {
+        ce &= SECONDARY_MASK;
+        if(ce < MIN_SEC_HIGH) {
+            return ce + SEC_OFFSET;
+        } else {
+            return ((ce + SEC_OFFSET) << 16) | COMMON_SEC_PLUS_OFFSET;
+        }
+    }
+    static uint32_t getSecondaries(uint32_t variableTop, uint32_t pair);
+    static uint32_t getCases(uint32_t variableTop, UBool strengthIsPrimary, uint32_t pair);
+    static uint32_t getTertiaries(uint32_t variableTop, UBool withCaseBits, uint32_t pair);
+    static uint32_t getQuaternaries(uint32_t variableTop, uint32_t pair);
+
+private:
+    CollationFastLatin();  // no constructor
+};
+
+/*
+ * Format of the CollationFastLatin data table.
+ * CollationFastLatin::VERSION = 1.
+ *
+ * This table contains data for a Latin-text collation fastpath.
+ * The data is stored as an array of uint16_t which contains the following parts.
+ *
+ * uint16_t  -- version & header length
+ *   Bits 15..8: version, must match the VERSION
+ *         7..0: length of the header
+ *
+ * uint16_t varTops[header length - 1]
+ *   Each of these values maps the variable top lead byte of a supported maxVariable group
+ *   to the highest CollationFastLatin long-primary weight.
+ *   The values are stored in ascending order.
+ *   Bits 15..7: max fast-Latin long-primary weight (bits 11..3 shifted left by 4 bits)
+ *         6..0: regular primary lead byte
+ *
+ * uint16_t miniCEs[0x1c0]
+ *   A mini collation element for each character U+0000..U+017F and U+2000..U+203F.
+ *   Each value encodes one or two mini CEs (two are possible if the first one
+ *   has a short mini primary and the second one is a secondary CE, i.e., primary == 0),
+ *   or points to an expansion or to a contraction table.
+ *   U+0000 always has a contraction entry,
+ *   so that NUL-termination need not be tested in the fastpath.
+ *   If the collation elements for a character or contraction cannot be encoded in this format,
+ *   then the BAIL_OUT value is stored.
+ *   For details see the comments for the class constants.
+ *
+ * uint16_t expansions[variable length];
+ *   Expansion mini CEs contain an offset relative to just after the miniCEs table.
+ *   An expansions contains exactly 2 mini CEs.
+ *
+ * uint16_t contractions[variable length];
+ *   Contraction mini CEs contain an offset relative to just after the miniCEs table.
+ *   It points to a list of tuples which map from a contraction suffix character to a result.
+ *   First uint16_t of each tuple:
+ *     Bits 10..9: Length of the result (1..3), see comments on CONTR_LENGTH_SHIFT.
+ *     Bits  8..0: Contraction character, see comments on CONTR_CHAR_MASK.
+ *   This is followed by 0, 1, or 2 uint16_t according to the length.
+ *   Each list is terminated by an entry with CONTR_CHAR_MASK.
+ *   Each list starts with such an entry which also contains the default result
+ *   for when there is no contraction match.
+ */
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONFASTLATIN_H__
diff --git a/icu4c/source/i18n/collationfastlatinbuilder.cpp b/icu4c/source/i18n/collationfastlatinbuilder.cpp
new file mode 100644 (file)
index 0000000..fefed86
--- /dev/null
@@ -0,0 +1,734 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationfastlatinbuilder.cpp
+*
+* created on: 2013aug09
+* created by: Markus W. Scherer
+*/
+
+#define DEBUG_COLLATION_FAST_LATIN_BUILDER 0  // 0 or 1 or 2
+#if DEBUG_COLLATION_FAST_LATIN_BUILDER
+#include <stdio.h>
+#include <string>
+#endif
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/ucol.h"
+#include "unicode/ucharstrie.h"
+#include "unicode/unistr.h"
+#include "unicode/uobject.h"
+#include "unicode/uscript.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationfastlatin.h"
+#include "collationfastlatinbuilder.h"
+#include "uassert.h"
+#include "uvectr64.h"
+
+U_NAMESPACE_BEGIN
+
+struct CollationData;
+
+namespace {
+
+/**
+ * Compare two signed int64_t values as if they were unsigned.
+ */
+int32_t
+compareInt64AsUnsigned(int64_t a, int64_t b) {
+    if((uint64_t)a < (uint64_t)b) {
+        return -1;
+    } else if((uint64_t)a > (uint64_t)b) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+// TODO: Merge this with the near-identical version in collationbasedatabuilder.cpp
+/**
+ * Like Java Collections.binarySearch(List, String, Comparator).
+ *
+ * @return the index>=0 where the item was found,
+ *         or the index<0 for inserting the string at ~index in sorted order
+ */
+int32_t
+binarySearch(const int64_t list[], int32_t limit, int64_t ce) {
+    if (limit == 0) { return ~0; }
+    int32_t start = 0;
+    for (;;) {
+        int32_t i = (start + limit) / 2;
+        int32_t cmp = compareInt64AsUnsigned(ce, list[i]);
+        if (cmp == 0) {
+            return i;
+        } else if (cmp < 0) {
+            if (i == start) {
+                return ~start;  // insert ce before i
+            }
+            limit = i;
+        } else {
+            if (i == start) {
+                return ~(start + 1);  // insert ce after i
+            }
+            start = i;
+        }
+    }
+}
+
+}  // namespace
+
+CollationFastLatinBuilder::CollationFastLatinBuilder(UErrorCode &errorCode)
+        : ce0(0), ce1(0),
+          contractionCEs(errorCode), uniqueCEs(errorCode),
+          miniCEs(NULL),
+          firstDigitPrimary(0), firstLatinPrimary(0), lastLatinPrimary(0),
+          firstShortPrimary(0), shortPrimaryOverflow(FALSE),
+          headerLength(0) {
+}
+
+CollationFastLatinBuilder::~CollationFastLatinBuilder() {
+    uprv_free(miniCEs);
+}
+
+UBool
+CollationFastLatinBuilder::forData(const CollationData &data, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    if(!result.isEmpty()) {  // This builder is not reusable.
+        errorCode = U_INVALID_STATE_ERROR;
+        return FALSE;
+    }
+    if(!loadGroups(data, errorCode)) { return FALSE; }
+
+    // Fast handling of digits.
+    firstShortPrimary = firstDigitPrimary;
+    getCEs(data, errorCode);
+    if(!encodeUniqueCEs(errorCode)) { return FALSE; }
+    if(shortPrimaryOverflow) {
+        // Give digits long mini primaries,
+        // so that there are more short primaries for letters.
+        firstShortPrimary = firstLatinPrimary;
+        resetCEs();
+        getCEs(data, errorCode);
+        if(!encodeUniqueCEs(errorCode)) { return FALSE; }
+    }
+    // Note: If we still have a short-primary overflow but not a long-primary overflow,
+    // then we could calculate how many more long primaries would fit,
+    // and set the firstShortPrimary to that many after the current firstShortPrimary,
+    // and try again.
+    // However, this might only benefit the en_US_POSIX tailoring,
+    // and it is simpler to suppress building fast Latin data for it in genrb,
+    // or by returning FALSE here if shortPrimaryOverflow.
+
+    UBool ok = !shortPrimaryOverflow &&
+            encodeCharCEs(errorCode) && encodeContractions(errorCode);
+    contractionCEs.removeAllElements();  // might reduce heap memory usage
+    uniqueCEs.removeAllElements();
+    return ok;
+}
+
+UBool
+CollationFastLatinBuilder::loadGroups(const CollationData &data, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    result.append(0);  // reserved for version & headerLength
+    // The first few reordering groups should be special groups
+    // (space, punct, ..., digit) followed by Latn, then Grek and other scripts.
+    for(int32_t i = 0;;) {
+        if(i >= data.scriptsLength) {
+            // no Latn script
+            errorCode = U_INTERNAL_PROGRAM_ERROR;
+            return FALSE;
+        }
+        uint32_t head = data.scripts[i];
+        uint32_t lastByte = head & 0xff;  // last primary byte in the group
+        int32_t group = data.scripts[i + 2];
+        if(group == UCOL_REORDER_CODE_DIGIT) {
+            firstDigitPrimary = (head & 0xff00) << 16;
+            headerLength = result.length();
+            uint32_t r0 = (CollationFastLatin::VERSION << 8) | headerLength;
+            result.setCharAt(0, (UChar)r0);
+        } else if(group == USCRIPT_LATIN) {
+            if(firstDigitPrimary == 0) {
+                // no digit group
+                errorCode = U_INTERNAL_PROGRAM_ERROR;
+                return FALSE;
+            }
+            firstLatinPrimary = (head & 0xff00) << 16;
+            lastLatinPrimary = (lastByte << 24) | 0xffffff;
+            break;
+        } else if(firstDigitPrimary == 0) {
+            // a group below digits
+            if(lastByte > 0x7f) {
+                // We only use 7 bits for the last byte of a below-digits group.
+                // This does not warrant an errorCode, but we do not build a fast Latin table.
+                return FALSE;
+            }
+            result.append((UChar)lastByte);
+        }
+        i = i + 2 + data.scripts[i + 1];
+    }
+    return TRUE;
+}
+
+UBool
+CollationFastLatinBuilder::inSameGroup(uint32_t p, uint32_t q) const {
+    // Both or neither need to be encoded as short primaries,
+    // so that we can test only one and use the same bit mask.
+    if(p >= firstShortPrimary) {
+        return q >= firstShortPrimary;
+    } else if(q >= firstShortPrimary) {
+        return FALSE;
+    }
+    // Both or neither must be potentially-variable,
+    // so that we can test only one and determine if both are variable.
+    if(p >= firstDigitPrimary) {
+        return q >= firstDigitPrimary;
+    } else if(q >= firstDigitPrimary) {
+        return FALSE;
+    }
+    // Both will be encoded with long mini primaries.
+    // They must be in the same special reordering group,
+    // so that we can test only one and determine if both are variable.
+    p >>= 24;  // first primary byte
+    q >>= 24;
+    U_ASSERT(p != 0 && q != 0);
+    U_ASSERT(p <= result[headerLength - 1]);  // the loop will terminate
+    for(int32_t i = 1;; ++i) {
+        uint32_t lastByte = result[i];
+        if(p <= lastByte) {
+            return q <= lastByte;
+        } else if(q <= lastByte) {
+            return FALSE;
+        }
+    }
+}
+
+void
+CollationFastLatinBuilder::resetCEs() {
+    contractionCEs.removeAllElements();
+    uniqueCEs.removeAllElements();
+    shortPrimaryOverflow = FALSE;
+    result.truncate(headerLength);
+}
+
+void
+CollationFastLatinBuilder::getCEs(const CollationData &data, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    int32_t i = 0;
+    for(UChar c = 0;; ++i, ++c) {
+        if(c == CollationFastLatin::LATIN_LIMIT) {
+            c = CollationFastLatin::PUNCT_START;
+        } else if(c == CollationFastLatin::PUNCT_LIMIT) {
+            break;
+        }
+        const CollationData *d;
+        uint32_t ce32 = data.getCE32(c);
+        if(ce32 == Collation::FALLBACK_CE32) {
+            d = data.base;
+            ce32 = d->getCE32(c);
+        } else {
+            d = &data;
+        }
+        if(getCEsFromCE32(*d, c, ce32, errorCode)) {
+            charCEs[i][0] = ce0;
+            charCEs[i][1] = ce1;
+            addUniqueCE(ce0, errorCode);
+            addUniqueCE(ce1, errorCode);
+        } else {
+            // bail out for c
+            charCEs[i][0] = ce0 = Collation::NO_CE;
+            charCEs[i][1] = ce1 = 0;
+        }
+        if(c == 0 && !isContractionCharCE(ce0)) {
+            // Always map U+0000 to a contraction.
+            // Write a contraction list with only a default value if there is no real contraction.
+            U_ASSERT(contractionCEs.isEmpty());
+            addContractionEntry(CollationFastLatin::CONTR_CHAR_MASK, ce0, ce1, errorCode);
+            charCEs[0][0] = ((int64_t)Collation::NO_CE_PRIMARY << 32) | CONTRACTION_FLAG;
+            charCEs[0][1] = 0;
+        }
+    }
+    // Terminate the last contraction list.
+    contractionCEs.addElement(CollationFastLatin::CONTR_CHAR_MASK, errorCode);
+}
+
+UBool
+CollationFastLatinBuilder::getCEsFromCE32(const CollationData &data, UChar32 c, uint32_t ce32,
+                                          UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    ce32 = data.getFinalCE32(ce32);
+    ce1 = 0;
+    if(Collation::isSimpleOrLongCE32(ce32)) {
+        ce0 = Collation::ceFromCE32(ce32);
+    } else {
+        switch(Collation::tagFromCE32(ce32)) {
+        case Collation::LATIN_EXPANSION_TAG:
+            ce0 = Collation::latinCE0FromCE32(ce32);
+            ce1 = Collation::latinCE1FromCE32(ce32);
+            break;
+        case Collation::EXPANSION32_TAG: {
+            const uint32_t *ce32s = data.ce32s + Collation::indexFromCE32(ce32);
+            int32_t length = Collation::lengthFromCE32(ce32);
+            if(length <= 2) {
+                ce0 = Collation::ceFromCE32(ce32s[0]);
+                if(length == 2) {
+                    ce1 = Collation::ceFromCE32(ce32s[1]);
+                }
+                break;
+            } else {
+                return FALSE;
+            }
+        }
+        case Collation::EXPANSION_TAG: {
+            const int64_t *ces = data.ces + Collation::indexFromCE32(ce32);
+            int32_t length = Collation::lengthFromCE32(ce32);
+            if(length <= 2) {
+                ce0 = ces[0];
+                if(length == 2) {
+                    ce1 = ces[1];
+                }
+                break;
+            } else {
+                return FALSE;
+            }
+        }
+        // Note: We could support PREFIX_TAG (assert c>=0)
+        // by recursing on its default CE32 and checking that none of the prefixes starts
+        // with a fast Latin character.
+        // However, currently (2013) there are only the L-before-middle-dot
+        // prefix mappings in the Latin range, and those would be rejected anyway.
+        case Collation::CONTRACTION_TAG:
+            U_ASSERT(c >= 0);
+            return getCEsFromContractionCE32(data, ce32, errorCode);
+        case Collation::OFFSET_TAG:
+            U_ASSERT(c >= 0);
+            ce0 = data.getCEFromOffsetCE32(c, ce32);
+            break;
+        default:
+            return FALSE;
+        }
+    }
+    // A mapping can be completely ignorable.
+    if(ce0 == 0) { return ce1 == 0; }
+    // We do not support an ignorable ce0 unless it is completely ignorable.
+    uint32_t p0 = (uint32_t)(ce0 >> 32);
+    if(p0 == 0) { return FALSE; }
+    // We only support primaries up to the Latin script.
+    if(p0 > lastLatinPrimary) { return FALSE; }
+    // We support non-common secondary and case weights only together with short primaries.
+    uint32_t lower32_0 = (uint32_t)ce0;
+    if(p0 < firstShortPrimary) {
+        uint32_t sc0 = lower32_0 & Collation::SECONDARY_AND_CASE_MASK;
+        if(sc0 != Collation::COMMON_SECONDARY_CE) { return FALSE; }
+    }
+    // No below-common tertiary weights.
+    if((lower32_0 & Collation::ONLY_TERTIARY_MASK) < Collation::COMMON_WEIGHT16) { return FALSE; }
+    if(ce1 != 0) {
+        // Both primaries must be in the same group,
+        // or both must get short mini primaries,
+        // or a short-primary CE is followed by a secondary CE.
+        // This is so that we can test the first primary and use the same mask for both,
+        // and determine for both whether they are variable.
+        uint32_t p1 = (uint32_t)(ce1 >> 32);
+        if(p1 == 0 ? p0 < firstShortPrimary : !inSameGroup(p0, p1)) { return FALSE; }
+        uint32_t lower32_1 = (uint32_t)ce1;
+        // No tertiary CEs.
+        if((lower32_1 >> 16) == 0) { return FALSE; }
+        // We support non-common secondary and case weights
+        // only for secondary CEs or together with short primaries.
+        if(p1 != 0 && p1 < firstShortPrimary) {
+            uint32_t sc1 = lower32_1 & Collation::SECONDARY_AND_CASE_MASK;
+            if(sc1 != Collation::COMMON_SECONDARY_CE) { return FALSE; }
+        }
+        // No below-common tertiary weights.
+        if((lower32_1 & Collation::ONLY_TERTIARY_MASK) < Collation::COMMON_WEIGHT16) { return FALSE; }
+    }
+    // No quaternary weights.
+    if(((ce0 | ce1) & Collation::QUATERNARY_MASK) != 0) { return FALSE; }
+    return TRUE;
+}
+
+UBool
+CollationFastLatinBuilder::getCEsFromContractionCE32(const CollationData &data, uint32_t ce32,
+                                                     UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    const UChar *p = data.contexts + Collation::indexFromCE32(ce32);
+    ce32 = CollationData::readCE32(p);  // Default if no suffix match.
+    // Since the original ce32 is not a prefix mapping,
+    // the default ce32 must not be another contraction.
+    U_ASSERT(!Collation::isContractionCE32(ce32));
+    int32_t contractionIndex = contractionCEs.size();
+    if(getCEsFromCE32(data, U_SENTINEL, ce32, errorCode)) {
+        addContractionEntry(CollationFastLatin::CONTR_CHAR_MASK, ce0, ce1, errorCode);
+    } else {
+        // Bail out for c-without-contraction.
+        addContractionEntry(CollationFastLatin::CONTR_CHAR_MASK, Collation::NO_CE, 0, errorCode);
+    }
+    // Handle an encodable contraction unless the next contraction is too long
+    // and starts with the same character.
+    int32_t prevX = -1;
+    UBool addContraction = FALSE;
+    UCharsTrie::Iterator suffixes(p + 2, 0, errorCode);
+    while(suffixes.next(errorCode)) {
+        const UnicodeString &suffix = suffixes.getString();
+        int32_t x = CollationFastLatin::getCharIndex(suffix.charAt(0));
+        if(x < 0) { continue; }  // ignore anything but fast Latin text
+        if(x == prevX) {
+            if(addContraction) {
+                // Bail out for all contractions starting with this character.
+                addContractionEntry(x, Collation::NO_CE, 0, errorCode);
+                addContraction = FALSE;
+            }
+            continue;
+        }
+        if(addContraction) {
+            addContractionEntry(prevX, ce0, ce1, errorCode);
+        }
+        ce32 = (uint32_t)suffixes.getValue();
+        if(suffix.length() == 1 && getCEsFromCE32(data, U_SENTINEL, ce32, errorCode)) {
+            addContraction = TRUE;
+        } else {
+            addContractionEntry(x, Collation::NO_CE, 0, errorCode);
+            addContraction = FALSE;
+        }
+        prevX = x;
+    }
+    if(addContraction) {
+        addContractionEntry(prevX, ce0, ce1, errorCode);
+    }
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    // Note: There might not be any fast Latin contractions, but
+    // we need to enter contraction handling anyway so that we can bail out
+    // when there is a non-fast-Latin character following.
+    // For example: Danish &Y<<u+umlaut, when we compare Y vs. u\u0308 we need to see the
+    // following umlaut and bail out, rather than return the difference of Y vs. u.
+    ce0 = ((int64_t)Collation::NO_CE_PRIMARY << 32) | CONTRACTION_FLAG | contractionIndex;
+    ce1 = 0;
+    return TRUE;
+}
+
+void
+CollationFastLatinBuilder::addContractionEntry(int32_t x, int64_t cce0, int64_t cce1,
+                                               UErrorCode &errorCode) {
+    contractionCEs.addElement(x, errorCode);
+    contractionCEs.addElement(cce0, errorCode);
+    contractionCEs.addElement(cce1, errorCode);
+    addUniqueCE(cce0, errorCode);
+    addUniqueCE(cce1, errorCode);
+}
+
+void
+CollationFastLatinBuilder::addUniqueCE(int64_t ce, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    if(ce == 0 || (uint32_t)(ce >> 32) == Collation::NO_CE_PRIMARY) { return; }
+    ce &= ~(int64_t)Collation::CASE_MASK;  // blank out case bits
+    int32_t i = binarySearch(uniqueCEs.getBuffer(), uniqueCEs.size(), ce);
+    if(i < 0) {
+        uniqueCEs.insertElementAt(ce, ~i, errorCode);
+    }
+}
+
+uint32_t
+CollationFastLatinBuilder::getMiniCE(int64_t ce) const {
+    ce &= ~(int64_t)Collation::CASE_MASK;  // blank out case bits
+    int32_t index = binarySearch(uniqueCEs.getBuffer(), uniqueCEs.size(), ce);
+    U_ASSERT(index >= 0);
+    return miniCEs[index];
+}
+
+UBool
+CollationFastLatinBuilder::encodeUniqueCEs(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    uprv_free(miniCEs);
+    miniCEs = (uint16_t *)uprv_malloc(uniqueCEs.size() * 2);
+    if(miniCEs == NULL) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return FALSE;
+    }
+    int32_t group = 1;
+    uint32_t lastGroupByte = result[group];
+    // The lowest unique CE must be at least a secondary CE.
+    U_ASSERT(((uint32_t)uniqueCEs.elementAti(0) >> 16) != 0);
+    uint32_t prevPrimary = 0;
+    uint32_t prevSecondary = 0;
+    uint32_t pri = 0;
+    uint32_t sec = 0;
+    uint32_t ter = CollationFastLatin::COMMON_TER;
+    for(int32_t i = 0; i < uniqueCEs.size(); ++i) {
+        int64_t ce = uniqueCEs.elementAti(i);
+        // Note: At least one of the p/s/t weights changes from one unique CE to the next.
+        // (uniqueCEs does not store case bits.)
+        uint32_t p = (uint32_t)(ce >> 32);
+        if(p != prevPrimary) {
+            uint32_t p1 = p >> 24;
+            while(p1 > lastGroupByte) {
+                U_ASSERT(pri <= CollationFastLatin::MAX_LONG);
+                // Add the last "long primary" in or before the group
+                // into the upper 9 bits of the group entry.
+                result.setCharAt(group, (UChar)((pri << 4) | lastGroupByte));
+                if(++group < headerLength) {  // group is 1-based
+                    lastGroupByte = result[group];
+                } else {
+                    lastGroupByte = 0xff;
+                    break;
+                }
+            }
+            if(p < firstShortPrimary) {
+                if(pri == 0) {
+                    pri = CollationFastLatin::MIN_LONG;
+                } else if(pri < CollationFastLatin::MAX_LONG) {
+                    pri += CollationFastLatin::LONG_INC;
+                } else {
+#if DEBUG_COLLATION_FAST_LATIN_BUILDER
+                    printf("long-primary overflow for %08x\n", p);
+#endif
+                    miniCEs[i] = CollationFastLatin::BAIL_OUT;
+                    continue;
+                }
+            } else {
+                if(pri < CollationFastLatin::MIN_SHORT) {
+                    pri = CollationFastLatin::MIN_SHORT;
+                } else if(pri < (CollationFastLatin::MAX_SHORT - CollationFastLatin::SHORT_INC)) {
+                    // Reserve the highest primary weight for U+FFFF.
+                    pri += CollationFastLatin::SHORT_INC;
+                } else {
+#if DEBUG_COLLATION_FAST_LATIN_BUILDER
+                    printf("short-primary overflow for %08x\n", p);
+#endif
+                    shortPrimaryOverflow = TRUE;
+                    miniCEs[i] = CollationFastLatin::BAIL_OUT;
+                    continue;
+                }
+            }
+            prevPrimary = p;
+            prevSecondary = Collation::COMMON_WEIGHT16;
+            sec = CollationFastLatin::COMMON_SEC;
+            ter = CollationFastLatin::COMMON_TER;
+        }
+        uint32_t lower32 = (uint32_t)ce;
+        uint32_t s = lower32 >> 16;
+        if(s != prevSecondary) {
+            if(pri == 0) {
+                if(sec == 0) {
+                    sec = CollationFastLatin::MIN_SEC_HIGH;
+                } else if(sec < CollationFastLatin::MAX_SEC_HIGH) {
+                    sec += CollationFastLatin::SEC_INC;
+                } else {
+                    miniCEs[i] = CollationFastLatin::BAIL_OUT;
+                    continue;
+                }
+                prevSecondary = s;
+                ter = CollationFastLatin::COMMON_TER;
+            } else if(s < Collation::COMMON_WEIGHT16) {
+                if(sec == CollationFastLatin::COMMON_SEC) {
+                    sec = CollationFastLatin::MIN_SEC_BEFORE;
+                } else if(sec < CollationFastLatin::MAX_SEC_BEFORE) {
+                    sec += CollationFastLatin::SEC_INC;
+                } else {
+                    miniCEs[i] = CollationFastLatin::BAIL_OUT;
+                    continue;
+                }
+            } else if(s == Collation::COMMON_WEIGHT16) {
+                sec = CollationFastLatin::COMMON_SEC;
+            } else {
+                if(sec < CollationFastLatin::MIN_SEC_AFTER) {
+                    sec = CollationFastLatin::MIN_SEC_AFTER;
+                } else if(sec < CollationFastLatin::MAX_SEC_AFTER) {
+                    sec += CollationFastLatin::SEC_INC;
+                } else {
+                    miniCEs[i] = CollationFastLatin::BAIL_OUT;
+                    continue;
+                }
+            }
+            prevSecondary = s;
+            ter = CollationFastLatin::COMMON_TER;
+        }
+        U_ASSERT((lower32 & Collation::CASE_MASK) == 0);  // blanked out in uniqueCEs
+        uint32_t t = lower32 & Collation::ONLY_TERTIARY_MASK;
+        if(t > Collation::COMMON_WEIGHT16) {
+            if(ter < CollationFastLatin::MAX_TER_AFTER) {
+                ++ter;
+            } else {
+                miniCEs[i] = CollationFastLatin::BAIL_OUT;
+                continue;
+            }
+        }
+        if(CollationFastLatin::MIN_LONG <= pri && pri <= CollationFastLatin::MAX_LONG) {
+            U_ASSERT(sec == CollationFastLatin::COMMON_SEC);
+            miniCEs[i] = (uint16_t)(pri | ter);
+        } else {
+            miniCEs[i] = (uint16_t)(pri | sec | ter);
+        }
+    }
+#if DEBUG_COLLATION_FAST_LATIN_BUILDER
+    printf("last mini primary: %04x\n", pri);
+#endif
+#if DEBUG_COLLATION_FAST_LATIN_BUILDER >= 2
+    for(int32_t i = 0; i < uniqueCEs.size(); ++i) {
+        int64_t ce = uniqueCEs.elementAti(i);
+        printf("unique CE 0x%016lx -> 0x%04x\n", ce, miniCEs[i]);
+    }
+#endif
+    return U_SUCCESS(errorCode);
+}
+
+UBool
+CollationFastLatinBuilder::encodeCharCEs(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    int32_t miniCEsStart = result.length();
+    for(int32_t i = 0; i < CollationFastLatin::NUM_FAST_CHARS; ++i) {
+        result.append(0);  // initialize to completely ignorable
+    }
+    int32_t indexBase = result.length();
+    for(int32_t i = 0; i < CollationFastLatin::NUM_FAST_CHARS; ++i) {
+        int64_t ce = charCEs[i][0];
+        if(isContractionCharCE(ce)) { continue; }  // defer contraction
+        uint32_t miniCE = encodeTwoCEs(ce, charCEs[i][1]);
+        if(miniCE > 0xffff) {
+            // Note: There is a chance that this new expansion is the same as a previous one,
+            // and if so, then we could reuse the other expansion.
+            // However, that seems unlikely.
+            int32_t expansionIndex = result.length() - indexBase;
+            if(expansionIndex > (int32_t)CollationFastLatin::INDEX_MASK) {
+                miniCE = CollationFastLatin::BAIL_OUT;
+            } else {
+                result.append((UChar)(miniCE >> 16)).append((UChar)miniCE);
+                miniCE = CollationFastLatin::EXPANSION | expansionIndex;
+            }
+        }
+        result.setCharAt(miniCEsStart + i, (UChar)miniCE);
+    }
+    return U_SUCCESS(errorCode);
+}
+
+UBool
+CollationFastLatinBuilder::encodeContractions(UErrorCode &errorCode) {
+    // We encode all contraction lists so that the first word of a list
+    // terminates the previous list, and we only need one additional terminator at the end.
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    int32_t indexBase = headerLength + CollationFastLatin::NUM_FAST_CHARS;
+    int32_t firstContractionIndex = result.length();
+    for(int32_t i = 0; i < CollationFastLatin::NUM_FAST_CHARS; ++i) {
+        int64_t ce = charCEs[i][0];
+        if(!isContractionCharCE(ce)) { continue; }
+        int32_t contractionIndex = result.length() - indexBase;
+        if(contractionIndex > (int32_t)CollationFastLatin::INDEX_MASK) {
+            result.setCharAt(headerLength + i, CollationFastLatin::BAIL_OUT);
+            continue;
+        }
+        UBool firstTriple = TRUE;
+        for(int32_t index = (int32_t)ce & 0x7fffffff;; index += 3) {
+            int32_t x = contractionCEs.elementAti(index);
+            if((uint32_t)x == CollationFastLatin::CONTR_CHAR_MASK && !firstTriple) { break; }
+            int64_t cce0 = contractionCEs.elementAti(index + 1);
+            int64_t cce1 = contractionCEs.elementAti(index + 2);
+            uint32_t miniCE = encodeTwoCEs(cce0, cce1);
+            if(miniCE == CollationFastLatin::BAIL_OUT) {
+                result.append((UChar)(x | (1 << CollationFastLatin::CONTR_LENGTH_SHIFT)));
+            } else if(miniCE <= 0xffff) {
+                result.append((UChar)(x | (2 << CollationFastLatin::CONTR_LENGTH_SHIFT)));
+                result.append((UChar)miniCE);
+            } else {
+                result.append((UChar)(x | (3 << CollationFastLatin::CONTR_LENGTH_SHIFT)));
+                result.append((UChar)(miniCE >> 16)).append((UChar)miniCE);
+            }
+            firstTriple = FALSE;
+        }
+        // Note: There is a chance that this new contraction list is the same as a previous one,
+        // and if so, then we could truncate the result and reuse the other list.
+        // However, that seems unlikely.
+        result.setCharAt(headerLength + i,
+                         (UChar)(CollationFastLatin::CONTRACTION | contractionIndex));
+    }
+    if(result.length() > firstContractionIndex) {
+        // Terminate the last contraction list.
+        result.append((UChar)CollationFastLatin::CONTR_CHAR_MASK);
+    }
+    if(result.isBogus()) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return FALSE;
+    }
+#if DEBUG_COLLATION_FAST_LATIN_BUILDER
+    printf("** fast Latin %d * 2 = %d bytes\n", result.length(), result.length() * 2);
+    puts("   header & below-digit groups map");
+    int32_t i = 0;
+    for(; i < headerLength; ++i) {
+        printf(" %04x", result[i]);
+    }
+    printf("\n   char mini CEs");
+    U_ASSERT(CollationFastLatin::NUM_FAST_CHARS % 16 == 0);
+    for(; i < indexBase; i += 16) {
+        UChar32 c = i - headerLength;
+        if(c >= CollationFastLatin::LATIN_LIMIT) {
+            c = CollationFastLatin::PUNCT_START + c - CollationFastLatin::LATIN_LIMIT;
+        }
+        printf("\n %04x:", c);
+        for(int32_t j = 0; j < 16; ++j) {
+            printf(" %04x", result[i + j]);
+        }
+    }
+    printf("\n   expansions & contractions");
+    for(; i < result.length(); ++i) {
+        if((i - indexBase) % 16 == 0) { puts(""); }
+        printf(" %04x", result[i]);
+    }
+    puts("");
+#endif
+    return TRUE;
+}
+
+uint32_t
+CollationFastLatinBuilder::encodeTwoCEs(int64_t first, int64_t second) const {
+    if(first == 0) {
+        return 0;  // completely ignorable
+    }
+    if(first == Collation::NO_CE) {
+        return CollationFastLatin::BAIL_OUT;
+    }
+    U_ASSERT((uint32_t)(first >> 32) != Collation::NO_CE_PRIMARY);
+
+    uint32_t miniCE = getMiniCE(first);
+    if(miniCE == CollationFastLatin::BAIL_OUT) { return miniCE; }
+    if(miniCE >= CollationFastLatin::MIN_SHORT) {
+        // Extract & copy the case bits.
+        // Shift them from normal CE bits 15..14 to mini CE bits 4..3.
+        uint32_t c = (((uint32_t)first & Collation::CASE_MASK) >> (14 - 3));
+        // Only in mini CEs: Ignorable case bits = 0, lowercase = 1.
+        c += CollationFastLatin::LOWER_CASE;
+        miniCE |= c;
+    }
+    if(second == 0) { return miniCE; }
+
+    uint32_t miniCE1 = getMiniCE(second);
+    if(miniCE1 == CollationFastLatin::BAIL_OUT) { return miniCE1; }
+
+    uint32_t case1 = (uint32_t)second & Collation::CASE_MASK;
+    if(miniCE >= CollationFastLatin::MIN_SHORT &&
+            (miniCE & CollationFastLatin::SECONDARY_MASK) == CollationFastLatin::COMMON_SEC) {
+        // Try to combine the two mini CEs into one.
+        uint32_t sec1 = miniCE1 & CollationFastLatin::SECONDARY_MASK;
+        uint32_t ter1 = miniCE1 & CollationFastLatin::TERTIARY_MASK;
+        if(sec1 >= CollationFastLatin::MIN_SEC_HIGH && case1 == 0 &&
+                ter1 == CollationFastLatin::COMMON_TER) {
+            // sec1>=sec_high implies pri1==0.
+            return (miniCE & ~CollationFastLatin::SECONDARY_MASK) | sec1;
+        }
+    }
+
+    if(miniCE1 <= CollationFastLatin::SECONDARY_MASK || CollationFastLatin::MIN_SHORT <= miniCE1) {
+        // Secondary CE, or a CE with a short primary, copy the case bits.
+        case1 = (case1 >> (14 - 3)) + CollationFastLatin::LOWER_CASE;
+        miniCE1 |= case1;
+    }
+    return (miniCE << 16) | miniCE1;
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationfastlatinbuilder.h b/icu4c/source/i18n/collationfastlatinbuilder.h
new file mode 100644 (file)
index 0000000..b0ac5fa
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationfastlatinbuilder.h
+*
+* created on: 2013aug09
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONFASTLATINBUILDER_H__
+#define __COLLATIONFASTLATINBUILDER_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/unistr.h"
+#include "unicode/uobject.h"
+#include "collation.h"
+#include "collationfastlatin.h"
+#include "uvectr64.h"
+
+U_NAMESPACE_BEGIN
+
+struct CollationData;
+
+class U_I18N_API CollationFastLatinBuilder : public UObject {
+public:
+    CollationFastLatinBuilder(UErrorCode &errorCode);
+    ~CollationFastLatinBuilder();
+
+    UBool forData(const CollationData &data, UErrorCode &errorCode);
+
+    const uint16_t *getTable() const {
+        return reinterpret_cast<const uint16_t *>(result.getBuffer());
+    }
+    int32_t lengthOfTable() const { return result.length(); }
+
+private:
+    UBool loadGroups(const CollationData &data, UErrorCode &errorCode);
+    UBool inSameGroup(uint32_t p, uint32_t q) const;
+
+    void resetCEs();
+    void getCEs(const CollationData &data, UErrorCode &errorCode);
+    UBool getCEsFromCE32(const CollationData &data, UChar32 c, uint32_t ce32,
+                         UErrorCode &errorCode);
+    UBool getCEsFromContractionCE32(const CollationData &data, uint32_t ce32,
+                                    UErrorCode &errorCode);
+    void addContractionEntry(int32_t x, int64_t cce0, int64_t cce1, UErrorCode &errorCode);
+    void addUniqueCE(int64_t ce, UErrorCode &errorCode);
+    uint32_t getMiniCE(int64_t ce) const;
+    UBool encodeUniqueCEs(UErrorCode &errorCode);
+    UBool encodeCharCEs(UErrorCode &errorCode);
+    UBool encodeContractions(UErrorCode &errorCode);
+    uint32_t encodeTwoCEs(int64_t first, int64_t second) const;
+
+    static UBool isContractionCharCE(int64_t ce) {
+        return (uint32_t)(ce >> 32) == Collation::NO_CE_PRIMARY && ce != Collation::NO_CE;
+    }
+
+    static const uint32_t CONTRACTION_FLAG = 0x80000000;
+
+    // temporary "buffer"
+    int64_t ce0, ce1;
+
+    int64_t charCEs[CollationFastLatin::NUM_FAST_CHARS][2];
+
+    UVector64 contractionCEs;
+    UVector64 uniqueCEs;
+
+    /** One 16-bit mini CE per unique CE. */
+    uint16_t *miniCEs;
+
+    // These are constant for a given list of CollationData.scripts.
+    uint32_t firstDigitPrimary;
+    uint32_t firstLatinPrimary;
+    uint32_t lastLatinPrimary;
+    // This determines the first normal primary weight which is mapped to
+    // a short mini primary. It must be >=firstDigitPrimary.
+    uint32_t firstShortPrimary;
+
+    UBool shortPrimaryOverflow;
+
+    UnicodeString result;
+    int32_t headerLength;
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONFASTLATINBUILDER_H__
diff --git a/icu4c/source/i18n/collationfcd.cpp b/icu4c/source/i18n/collationfcd.cpp
new file mode 100644 (file)
index 0000000..7a6f8de
--- /dev/null
@@ -0,0 +1,301 @@
+/*
+ * Copyright (C) 1999-2014, International Business Machines
+ * Corporation and others.  All Rights Reserved.
+ *
+ * file name: collationfcd.cpp
+ *
+ * machine-generated by: icu/tools/unicode/c/genuca/genuca.cpp
+ */
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "collationfcd.h"
+
+U_NAMESPACE_BEGIN
+
+const uint8_t CollationFCD::lcccIndex[2048]={
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,1,2,3,0,0,0,0,
+0,0,0,0,4,0,0,0,0,0,0,0,5,6,7,0,
+8,0,9,0xa,0,0,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0x10,
+0x11,0x12,0x13,0,0,0,0,0x14,0,0x15,0x16,0,0,0x15,0x17,0,
+0,0x15,0x17,0,0,0x15,0x17,0,0,0x15,0x17,0,0,0,0x17,0,
+0,0,0x18,0,0,0x15,0x17,0,0,0,0x17,0,0,0,0x19,0,
+0,0x1a,0x1b,0,0,0x1c,0x1b,0,0x1c,0x1d,0,0x1e,0x1f,0,0x20,0,
+0,0x21,0,0,0x17,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x22,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x23,0x23,0,0,0,0,0x24,0,
+0,0,0,0,0,0x25,0,0,0,0x13,0,0,0,0,0,0,
+0x26,0,0,0x27,0,0,0,0,0,0x23,0x28,0x10,0,0x29,0,0x2a,
+0,0x2b,0,0,0,0,0x2c,0x2d,0,0,0,0,0,0,1,0x2e,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x2f,0x30,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0x31,0,0,0,0x32,0,0,0,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x33,0,0,0x34,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x35,0x32,0,0,0x36,0,0,0,0,0,0,0,0,
+0x20,0,0,0,0,0,0x28,0x37,0,0x38,0x39,0,0,0x39,0x3a,0,
+0,0,0,0,0,0x3b,0x3c,0x3d,0,0,0,0,0,0,0,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,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x3e,0x23,0,0,0,0,0,0,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,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x3f,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
+const uint32_t CollationFCD::lcccBits[65]={
+0,0xffffffff,0xffff7fff,0xffff,0xf8,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0xfffff800,0x10000,0x9fc00000,0x3d9f,0x20000,0xffff0000,0x7ff,
+0xff800,0xfbc00000,0x3eef,0xe000000,0x7ffffff0,0x10000000,0x1e2000,0x2000,0x602000,0x400,0x7000000,0xf00,0x3000000,0x2a00000,0x3c3e0000,0xdf,
+0x40,0x6800000,0xe0000000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x1021fd,0xf000007f,0x1fff0000,
+0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0x35,0x40000000,
+0x7f
+};
+
+const uint8_t CollationFCD::tcccIndex[2048]={
+0,0,0,0,0,0,2,3,4,5,6,7,0,8,9,0xa,
+0xb,0xc,0,0,0,0,0,0,1,1,0xd,0xe,0xf,0x10,0x11,0,
+0x12,0x13,0x14,0x15,0x16,0,0x17,0x18,0,0,0,0,0x19,0x1a,0x1b,0,
+0x1c,0x1d,0x1e,0x1f,0,0,0x20,0x21,0x22,0x23,0x24,0,0,0,0,0x25,
+0x26,0x27,0x28,0,0,0,0,0x29,0,0x2a,0x2b,0,0,0x2c,0x2d,0,
+0,0x2e,0x2f,0,0,0x2c,0x30,0,0,0x2c,0x31,0,0,0,0x30,0,
+0,0,0x32,0,0,0x2c,0x30,0,0,0,0x30,0,0,0,0x33,0,
+0,0x34,0x35,0,0,0x36,0x35,0,0x36,0x37,0,0x38,0x39,0,0x3a,0,
+0,0x3b,0,0,0x30,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0x3c,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x3d,0x3d,0,0,0,0,0x3e,0,
+0,0,0,0,0,0x3f,0,0,0,0x28,0,0,0,0,0,0,
+0x40,0,0,0x41,0,0,0,0,0,0x3d,0x42,0x25,0,0x43,0,0x44,
+0,0x45,0,0,0,0,0x46,0x47,0,0,0,0,0,0,1,0x48,
+1,1,1,1,0x49,1,1,0x4a,0x4b,1,0x4c,0x4d,1,0x4e,0x4f,0x50,
+0,0,0,0,0,0,0x51,0x52,0,0x53,0,0,0x54,0x55,0x56,0,
+0x57,0x58,0x59,0x5a,0x5b,0x5c,0,0x5d,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0x2c,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0x5e,0,0,0,0x5f,0,0,0,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x60,0x61,0x62,0x63,0x61,0x62,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,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0x65,0x5f,0,0,0x66,0,0,0,0,0,0,0,0,
+0x3a,0,0,0,0,0,0x42,0x67,0,0x68,0x69,0,0,0x69,0x6a,0,
+0,0,0,0,0,0x6b,0x6c,0x6d,0,0,0,0,0,0,0,0x30,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0x6e,0x3d,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0x3c,0x6f,0x70,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0x71,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
+const uint32_t CollationFCD::tcccBits[114]={
+0,0xffffffff,0x3e7effbf,0xbe7effbf,0xfffcffff,0x7ef1ff3f,0xfff3f1f8,0x7fffff3f,0x18003,0xdfffe000,0xff31ffcf,0xcfffffff,0xfffc0,0xffff7fff,0xffff,0x1d760,
+0x1fc00,0x187c00,0x200708b,0x2000000,0x708b0000,0xc00000,0xf8,0xfccf0006,0x33ffcfc,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0x7c,0xfffff800,0x10000,
+0x9fc80005,0x3d9f,0x20000,0xffff0000,0x7ff,0xff800,0xfbc00000,0x3eef,0xe000000,0x7ffffff0,0x10120200,0xff1e2000,0x10000000,0xb0002000,0x10480000,0x4e002000,
+0x2000,0x30002000,0x602100,0x24000400,0x7000000,0xf00,0x3000000,0x2a00000,0x3d7e0000,0xdf,0x40,0x6800000,0xe0000000,0x100000,0x20040000,0x200,
+0x1800000,0x9fe00001,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x1021fd,0xf000007f,0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f,0x3fffffff,0x1fdfffff,0xefcfffde,
+0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50,0x292,0x333e005,0x333,0xf000,0x3c0f,0x38000,0x80000000,
+0xfc00,0x55555000,0x36db02a5,0x46100000,0x47900000,0x3ff08000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0x35,0x5f7ffc00,
+0x7fdb,0x7f
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationfcd.h b/icu4c/source/i18n/collationfcd.h
new file mode 100644 (file)
index 0000000..2943373
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationfcd.h
+*
+* created on: 2012aug18
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONFCD_H__
+#define __COLLATIONFCD_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/utf16.h"
+
+U_NAMESPACE_BEGIN
+
+/**
+ * Data and functions for the FCD check fast path.
+ *
+ * The fast path looks at a pair of 16-bit code units and checks
+ * whether there is an FCD boundary between them;
+ * there is if the first unit has a trailing ccc=0 (!hasTccc(first))
+ * or the second unit has a leading ccc=0 (!hasLccc(second)),
+ * or both.
+ * When the fast path finds a possible non-boundary,
+ * then the FCD check slow path looks at the actual sequence of FCD values.
+ *
+ * This is a pure optimization.
+ * The fast path must at least find all possible non-boundaries.
+ * If the fast path is too pessimistic, it costs performance.
+ *
+ * For a pair of BMP characters, the fast path tests are precise (1 bit per character).
+ *
+ * For a supplementary code point, the two units are its lead and trail surrogates.
+ * We set hasTccc(lead)=true if any of its 1024 associated supplementary code points
+ * has lccc!=0 or tccc!=0.
+ * We set hasLccc(trail)=true for all trail surrogates.
+ * As a result, we leave the fast path if the lead surrogate might start a
+ * supplementary code point that is not FCD-inert.
+ * (So the fast path need not detect that there is a surrogate pair,
+ * nor look ahead to the next full code point.)
+ *
+ * hasLccc(lead)=true if any of its 1024 associated supplementary code points
+ * has lccc!=0, for fast boundary checking between BMP & supplementary.
+ *
+ * hasTccc(trail)=false:
+ * It should only be tested for unpaired trail surrogates which are FCD-inert.
+ */
+class U_I18N_API CollationFCD {
+public:
+    static inline UBool hasLccc(UChar32 c) {
+        // assert c <= 0xffff
+        // c can be negative, e.g., U_SENTINEL from UCharIterator;
+        // that is handled in the first test.
+        int32_t i;
+        return
+            // U+0300 is the first character with lccc!=0.
+            c >= 0x300 &&
+            (i = lcccIndex[c >> 5]) != 0 &&
+            (lcccBits[i] & ((uint32_t)1 << (c & 0x1f))) != 0;
+    }
+
+    static inline UBool hasTccc(UChar32 c) {
+        // assert c <= 0xffff
+        // c can be negative, e.g., U_SENTINEL from UCharIterator;
+        // that is handled in the first test.
+        int32_t i;
+        return
+            // U+00C0 is the first character with tccc!=0.
+            c >= 0xc0 &&
+            (i = tcccIndex[c >> 5]) != 0 &&
+            (tcccBits[i] & ((uint32_t)1 << (c & 0x1f))) != 0;
+    }
+
+    static inline UBool mayHaveLccc(UChar32 c) {
+        // Handles all of Unicode 0..10FFFF.
+        // c can be negative, e.g., U_SENTINEL.
+        // U+0300 is the first character with lccc!=0.
+        if(c < 0x300) { return FALSE; }
+        if(c > 0xffff) { c = U16_LEAD(c); }
+        int32_t i;
+        return
+            (i = lcccIndex[c >> 5]) != 0 &&
+            (lcccBits[i] & ((uint32_t)1 << (c & 0x1f))) != 0;
+    }
+
+    /**
+     * Tibetan composite vowel signs (U+0F73, U+0F75, U+0F81)
+     * must be decomposed before reaching the core collation code,
+     * or else some sequences including them, even ones passing the FCD check,
+     * do not yield canonically equivalent results.
+     *
+     * This is a fast and imprecise test.
+     *
+     * @param c a code point
+     * @return TRUE if c is U+0F73, U+0F75 or U+0F81 or one of several other Tibetan characters
+     */
+    static inline UBool maybeTibetanCompositeVowel(UChar32 c) {
+        return (c & 0x1fff01) == 0xf01;
+    }
+
+    /**
+     * Tibetan composite vowel signs (U+0F73, U+0F75, U+0F81)
+     * must be decomposed before reaching the core collation code,
+     * or else some sequences including them, even ones passing the FCD check,
+     * do not yield canonically equivalent results.
+     *
+     * They have distinct lccc/tccc combinations: 129/130 or 129/132.
+     *
+     * @param fcd16 the FCD value (lccc/tccc combination) of a code point
+     * @return TRUE if fcd16 is from U+0F73, U+0F75 or U+0F81
+     */
+    static inline UBool isFCD16OfTibetanCompositeVowel(uint16_t fcd16) {
+        return fcd16 == 0x8182 || fcd16 == 0x8184;
+    }
+
+private:
+    CollationFCD();  // No instantiation.
+
+    static const uint8_t lcccIndex[2048];
+    static const uint8_t tcccIndex[2048];
+    static const uint32_t lcccBits[65];
+    static const uint32_t tcccBits[114];
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONFCD_H__
diff --git a/icu4c/source/i18n/collationiterator.cpp b/icu4c/source/i18n/collationiterator.cpp
new file mode 100644 (file)
index 0000000..86199bc
--- /dev/null
@@ -0,0 +1,953 @@
+/*
+*******************************************************************************
+* Copyright (C) 2010-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationiterator.cpp
+*
+* created on: 2010oct27
+* created by: Markus W. Scherer
+*/
+
+#include "utypeinfo.h"  // for 'typeid' to work
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/ucharstrie.h"
+#include "unicode/ustringtrie.h"
+#include "charstr.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationfcd.h"
+#include "collationiterator.h"
+#include "normalizer2impl.h"
+#include "uassert.h"
+#include "uvectr32.h"
+
+U_NAMESPACE_BEGIN
+
+CollationIterator::CEBuffer::~CEBuffer() {}
+
+UBool
+CollationIterator::CEBuffer::ensureAppendCapacity(int32_t appCap, UErrorCode &errorCode) {
+    int32_t capacity = buffer.getCapacity();
+    if((length + appCap) <= capacity) { return TRUE; }
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    do {
+        if(capacity < 1000) {
+            capacity *= 4;
+        } else {
+            capacity *= 2;
+        }
+    } while(capacity < (length + appCap));
+    int64_t *p = buffer.resize(capacity, length);
+    if(p == NULL) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return FALSE;
+    }
+    return TRUE;
+}
+
+// State of combining marks skipped in discontiguous contraction.
+// We create a state object on first use and keep it around deactivated between uses.
+class SkippedState : public UMemory {
+public:
+    // Born active but empty.
+    SkippedState() : pos(0), skipLengthAtMatch(0) {}
+    void clear() {
+        oldBuffer.remove();
+        pos = 0;
+        // The newBuffer is reset by setFirstSkipped().
+    }
+
+    UBool isEmpty() const { return oldBuffer.isEmpty(); }
+
+    UBool hasNext() const { return pos < oldBuffer.length(); }
+
+    // Requires hasNext().
+    UChar32 next() {
+        UChar32 c = oldBuffer.char32At(pos);
+        pos += U16_LENGTH(c);
+        return c;
+    }
+
+    // Accounts for one more input code point read beyond the end of the marks buffer.
+    void incBeyond() {
+        U_ASSERT(!hasNext());
+        ++pos;
+    }
+
+    // Goes backward through the skipped-marks buffer.
+    // Returns the number of code points read beyond the skipped marks
+    // that need to be backtracked through normal input.
+    int32_t backwardNumCodePoints(int32_t n) {
+        int32_t length = oldBuffer.length();
+        int32_t beyond = pos - length;
+        if(beyond > 0) {
+            if(beyond >= n) {
+                // Not back far enough to re-enter the oldBuffer.
+                pos -= n;
+                return n;
+            } else {
+                // Back out all beyond-oldBuffer code points and re-enter the buffer.
+                pos = oldBuffer.moveIndex32(length, beyond - n);
+                return beyond;
+            }
+        } else {
+            // Go backwards from inside the oldBuffer.
+            pos = oldBuffer.moveIndex32(pos, -n);
+            return 0;
+        }
+    }
+
+    void setFirstSkipped(UChar32 c) {
+        skipLengthAtMatch = 0;
+        newBuffer.setTo(c);
+    }
+
+    void skip(UChar32 c) {
+        newBuffer.append(c);
+    }
+
+    void recordMatch() { skipLengthAtMatch = newBuffer.length(); }
+
+    // Replaces the characters we consumed with the newly skipped ones.
+    void replaceMatch() {
+        // Note: UnicodeString.replace() pins pos to at most length().
+        oldBuffer.replace(0, pos, newBuffer, 0, skipLengthAtMatch);
+        pos = 0;
+    }
+
+    void saveTrieState(const UCharsTrie &trie) { trie.saveState(state); }
+    void resetToTrieState(UCharsTrie &trie) const { trie.resetToState(state); }
+
+private:
+    // Combining marks skipped in previous discontiguous-contraction matching.
+    // After that discontiguous contraction was completed, we start reading them from here.
+    UnicodeString oldBuffer;
+    // Combining marks newly skipped in current discontiguous-contraction matching.
+    // These might have been read from the normal text or from the oldBuffer.
+    UnicodeString newBuffer;
+    // Reading index in oldBuffer,
+    // or counter for how many code points have been read beyond oldBuffer (pos-oldBuffer.length()).
+    int32_t pos;
+    // newBuffer.length() at the time of the last matching character.
+    // When a partial match fails, we back out skipped and partial-matching input characters.
+    int32_t skipLengthAtMatch;
+    // We save the trie state before we attempt to match a character,
+    // so that we can skip it and try the next one.
+    UCharsTrie::State state;
+};
+
+CollationIterator::CollationIterator(const CollationIterator &other)
+        : UObject(other),
+          trie(other.trie),
+          data(other.data),
+          cesIndex(other.cesIndex),
+          skipped(NULL),
+          numCpFwd(other.numCpFwd),
+          isNumeric(other.isNumeric) {
+    UErrorCode errorCode = U_ZERO_ERROR;
+    int32_t length = other.ceBuffer.length;
+    if(length > 0 && ceBuffer.ensureAppendCapacity(length, errorCode)) {
+        for(int32_t i = 0; i < length; ++i) {
+            ceBuffer.set(i, other.ceBuffer.get(i));
+        }
+        ceBuffer.length = length;
+    } else {
+        cesIndex = 0;
+    }
+}
+
+CollationIterator::~CollationIterator() {
+    delete skipped;
+}
+
+UBool
+CollationIterator::operator==(const CollationIterator &other) const {
+    // Subclasses: Call this method and then add more specific checks.
+    // Compare the iterator state but not the collation data (trie & data fields):
+    // Assume that the caller compares the data.
+    // Ignore skipped since that should be unused between calls to nextCE().
+    // (It only stays around to avoid another memory allocation.)
+    if(!(typeid(*this) == typeid(other) &&
+            ceBuffer.length == other.ceBuffer.length &&
+            cesIndex == other.cesIndex &&
+            numCpFwd == other.numCpFwd &&
+            isNumeric == other.isNumeric)) {
+        return FALSE;
+    }
+    for(int32_t i = 0; i < ceBuffer.length; ++i) {
+        if(ceBuffer.get(i) != other.ceBuffer.get(i)) { return FALSE; }
+    }
+    return TRUE;
+}
+
+void
+CollationIterator::reset() {
+    cesIndex = ceBuffer.length = 0;
+    if(skipped != NULL) { skipped->clear(); }
+}
+
+int32_t
+CollationIterator::fetchCEs(UErrorCode &errorCode) {
+    while(U_SUCCESS(errorCode) && nextCE(errorCode) != Collation::NO_CE) {
+        // No need to loop for each expansion CE.
+        cesIndex = ceBuffer.length;
+    }
+    return ceBuffer.length;
+}
+
+uint32_t
+CollationIterator::handleNextCE32(UChar32 &c, UErrorCode &errorCode) {
+    c = nextCodePoint(errorCode);
+    return (c < 0) ? Collation::FALLBACK_CE32 : data->getCE32(c);
+}
+
+UChar
+CollationIterator::handleGetTrailSurrogate() {
+    return 0;
+}
+
+UBool
+CollationIterator::foundNULTerminator() {
+    return FALSE;
+}
+
+UBool
+CollationIterator::forbidSurrogateCodePoints() const {
+    return FALSE;
+}
+
+uint32_t
+CollationIterator::getDataCE32(UChar32 c) const {
+    return data->getCE32(c);
+}
+
+uint32_t
+CollationIterator::getCE32FromBuilderData(uint32_t /*ce32*/, UErrorCode &errorCode) {
+    if(U_SUCCESS(errorCode)) { errorCode = U_INTERNAL_PROGRAM_ERROR; }
+    return 0;
+}
+
+int64_t
+CollationIterator::nextCEFromCE32(const CollationData *d, UChar32 c, uint32_t ce32,
+                                  UErrorCode &errorCode) {
+    --ceBuffer.length;  // Undo ceBuffer.incLength().
+    appendCEsFromCE32(d, c, ce32, TRUE, errorCode);
+    if(U_SUCCESS(errorCode)) {
+        return ceBuffer.get(cesIndex++);
+    } else {
+        return Collation::NO_CE_PRIMARY;
+    }
+}
+
+void
+CollationIterator::appendCEsFromCE32(const CollationData *d, UChar32 c, uint32_t ce32,
+                                     UBool forward, UErrorCode &errorCode) {
+    while(Collation::isSpecialCE32(ce32)) {
+        switch(Collation::tagFromCE32(ce32)) {
+        case Collation::FALLBACK_TAG:
+        case Collation::RESERVED_TAG_3:
+            if(U_SUCCESS(errorCode)) { errorCode = U_INTERNAL_PROGRAM_ERROR; }
+            return;
+        case Collation::LONG_PRIMARY_TAG:
+            ceBuffer.append(Collation::ceFromLongPrimaryCE32(ce32), errorCode);
+            return;
+        case Collation::LONG_SECONDARY_TAG:
+            ceBuffer.append(Collation::ceFromLongSecondaryCE32(ce32), errorCode);
+            return;
+        case Collation::LATIN_EXPANSION_TAG:
+            if(ceBuffer.ensureAppendCapacity(2, errorCode)) {
+                ceBuffer.set(ceBuffer.length, Collation::latinCE0FromCE32(ce32));
+                ceBuffer.set(ceBuffer.length + 1, Collation::latinCE1FromCE32(ce32));
+                ceBuffer.length += 2;
+            }
+            return;
+        case Collation::EXPANSION32_TAG: {
+            const uint32_t *ce32s = d->ce32s + Collation::indexFromCE32(ce32);
+            int32_t length = Collation::lengthFromCE32(ce32);
+            if(ceBuffer.ensureAppendCapacity(length, errorCode)) {
+                do {
+                    ceBuffer.appendUnsafe(Collation::ceFromCE32(*ce32s++));
+                } while(--length > 0);
+            }
+            return;
+        }
+        case Collation::EXPANSION_TAG: {
+            const int64_t *ces = d->ces + Collation::indexFromCE32(ce32);
+            int32_t length = Collation::lengthFromCE32(ce32);
+            if(ceBuffer.ensureAppendCapacity(length, errorCode)) {
+                do {
+                    ceBuffer.appendUnsafe(*ces++);
+                } while(--length > 0);
+            }
+            return;
+        }
+        case Collation::BUILDER_DATA_TAG:
+            ce32 = getCE32FromBuilderData(ce32, errorCode);
+            if(U_FAILURE(errorCode)) { return; }
+            if(ce32 == Collation::FALLBACK_CE32) {
+                d = data->base;
+                ce32 = d->getCE32(c);
+            }
+            break;
+        case Collation::PREFIX_TAG:
+            if(forward) { backwardNumCodePoints(1, errorCode); }
+            ce32 = getCE32FromPrefix(d, ce32, errorCode);
+            if(forward) { forwardNumCodePoints(1, errorCode); }
+            break;
+        case Collation::CONTRACTION_TAG: {
+            const UChar *p = d->contexts + Collation::indexFromCE32(ce32);
+            uint32_t defaultCE32 = CollationData::readCE32(p);  // Default if no suffix match.
+            if(!forward) {
+                // Backward contractions are handled by previousCEUnsafe().
+                // c has contractions but they were not found.
+                ce32 = defaultCE32;
+                break;
+            }
+            UChar32 nextCp;
+            if(skipped == NULL && numCpFwd < 0) {
+                // Some portion of nextCE32FromContraction() pulled out here as an ASCII fast path,
+                // avoiding the function call and the nextSkippedCodePoint() overhead.
+                nextCp = nextCodePoint(errorCode);
+                if(nextCp < 0) {
+                    // No more text.
+                    ce32 = defaultCE32;
+                    break;
+                } else if((ce32 & Collation::CONTRACT_NEXT_CCC) != 0 &&
+                        !CollationFCD::mayHaveLccc(nextCp)) {
+                    // All contraction suffixes start with characters with lccc!=0
+                    // but the next code point has lccc==0.
+                    backwardNumCodePoints(1, errorCode);
+                    ce32 = defaultCE32;
+                    break;
+                }
+            } else {
+                nextCp = nextSkippedCodePoint(errorCode);
+                if(nextCp < 0) {
+                    // No more text.
+                    ce32 = defaultCE32;
+                    break;
+                } else if((ce32 & Collation::CONTRACT_NEXT_CCC) != 0 &&
+                        !CollationFCD::mayHaveLccc(nextCp)) {
+                    // All contraction suffixes start with characters with lccc!=0
+                    // but the next code point has lccc==0.
+                    backwardNumSkipped(1, errorCode);
+                    ce32 = defaultCE32;
+                    break;
+                }
+            }
+            ce32 = nextCE32FromContraction(d, ce32, p + 2, defaultCE32, nextCp, errorCode);
+            if(ce32 == Collation::NO_CE32) {
+                // CEs from a discontiguous contraction plus the skipped combining marks
+                // have been appended already.
+                return;
+            }
+            break;
+        }
+        case Collation::DIGIT_TAG:
+            if(isNumeric) {
+                appendNumericCEs(ce32, forward, errorCode);
+                return;
+            } else {
+                // Fetch the non-numeric-collation CE32 and continue.
+                ce32 = d->ce32s[Collation::indexFromCE32(ce32)];
+                break;
+            }
+        case Collation::U0000_TAG:
+            U_ASSERT(c == 0);
+            if(forward && foundNULTerminator()) {
+                // Handle NUL-termination. (Not needed in Java.)
+                ceBuffer.append(Collation::NO_CE, errorCode);
+                return;
+            } else {
+                // Fetch the normal ce32 for U+0000 and continue.
+                ce32 = d->ce32s[0];
+                break;
+            }
+        case Collation::HANGUL_TAG: {
+            const uint32_t *jamoCE32s = d->jamoCE32s;
+            c -= Hangul::HANGUL_BASE;
+            UChar32 t = c % Hangul::JAMO_T_COUNT;
+            c /= Hangul::JAMO_T_COUNT;
+            UChar32 v = c % Hangul::JAMO_V_COUNT;
+            c /= Hangul::JAMO_V_COUNT;
+            if((ce32 & Collation::HANGUL_NO_SPECIAL_JAMO) != 0) {
+                // None of the Jamo CE32s are isSpecialCE32().
+                // Avoid recursive function calls and per-Jamo tests.
+                if(ceBuffer.ensureAppendCapacity(t == 0 ? 2 : 3, errorCode)) {
+                    ceBuffer.set(ceBuffer.length, Collation::ceFromCE32(jamoCE32s[c]));
+                    ceBuffer.set(ceBuffer.length + 1, Collation::ceFromCE32(jamoCE32s[19 + v]));
+                    ceBuffer.length += 2;
+                    if(t != 0) {
+                        ceBuffer.appendUnsafe(Collation::ceFromCE32(jamoCE32s[39 + t]));
+                    }
+                }
+                return;
+            } else {
+                // We should not need to compute each Jamo code point.
+                // In particular, there should be no offset or implicit ce32.
+                appendCEsFromCE32(d, U_SENTINEL, jamoCE32s[c], forward, errorCode);
+                appendCEsFromCE32(d, U_SENTINEL, jamoCE32s[19 + v], forward, errorCode);
+                if(t == 0) { return; }
+                // offset 39 = 19 + 21 - 1:
+                // 19 = JAMO_L_COUNT
+                // 21 = JAMO_T_COUNT
+                // -1 = omit t==0
+                ce32 = jamoCE32s[39 + t];
+                c = U_SENTINEL;
+                break;
+            }
+        }
+        case Collation::LEAD_SURROGATE_TAG: {
+            U_ASSERT(forward);  // Backward iteration should never see lead surrogate code _unit_ data.
+            U_ASSERT(U16_IS_LEAD(c));
+            UChar trail;
+            if(U16_IS_TRAIL(trail = handleGetTrailSurrogate())) {
+                c = U16_GET_SUPPLEMENTARY(c, trail);
+                ce32 &= Collation::LEAD_TYPE_MASK;
+                if(ce32 == Collation::LEAD_ALL_UNASSIGNED) {
+                    ce32 = Collation::UNASSIGNED_CE32;  // unassigned-implicit
+                } else if(ce32 == Collation::LEAD_ALL_FALLBACK ||
+                        (ce32 = d->getCE32FromSupplementary(c)) == Collation::FALLBACK_CE32) {
+                    // fall back to the base data
+                    d = d->base;
+                    ce32 = d->getCE32FromSupplementary(c);
+                }
+            } else {
+                // c is an unpaired surrogate.
+                ce32 = Collation::UNASSIGNED_CE32;
+            }
+            break;
+        }
+        case Collation::OFFSET_TAG:
+            U_ASSERT(c >= 0);
+            ceBuffer.append(d->getCEFromOffsetCE32(c, ce32), errorCode);
+            return;
+        case Collation::IMPLICIT_TAG:
+            U_ASSERT(c >= 0);
+            if(U_IS_SURROGATE(c) && forbidSurrogateCodePoints()) {
+                ce32 = Collation::FFFD_CE32;
+                break;
+            } else {
+                ceBuffer.append(Collation::unassignedCEFromCodePoint(c), errorCode);
+                return;
+            }
+        }
+    }
+    ceBuffer.append(Collation::ceFromSimpleCE32(ce32), errorCode);
+}
+
+uint32_t
+CollationIterator::getCE32FromPrefix(const CollationData *d, uint32_t ce32,
+                                     UErrorCode &errorCode) {
+    const UChar *p = d->contexts + Collation::indexFromCE32(ce32);
+    ce32 = CollationData::readCE32(p);  // Default if no prefix match.
+    p += 2;
+    // Number of code points read before the original code point.
+    int32_t lookBehind = 0;
+    UCharsTrie prefixes(p);
+    for(;;) {
+        UChar32 c = previousCodePoint(errorCode);
+        if(c < 0) { break; }
+        ++lookBehind;
+        UStringTrieResult match = prefixes.nextForCodePoint(c);
+        if(USTRINGTRIE_HAS_VALUE(match)) {
+            ce32 = (uint32_t)prefixes.getValue();
+        }
+        if(!USTRINGTRIE_HAS_NEXT(match)) { break; }
+    }
+    forwardNumCodePoints(lookBehind, errorCode);
+    return ce32;
+}
+
+UChar32
+CollationIterator::nextSkippedCodePoint(UErrorCode &errorCode) {
+    if(skipped != NULL && skipped->hasNext()) { return skipped->next(); }
+    if(numCpFwd == 0) { return U_SENTINEL; }
+    UChar32 c = nextCodePoint(errorCode);
+    if(skipped != NULL && !skipped->isEmpty() && c >= 0) { skipped->incBeyond(); }
+    if(numCpFwd > 0 && c >= 0) { --numCpFwd; }
+    return c;
+}
+
+void
+CollationIterator::backwardNumSkipped(int32_t n, UErrorCode &errorCode) {
+    if(skipped != NULL && !skipped->isEmpty()) {
+        n = skipped->backwardNumCodePoints(n);
+    }
+    backwardNumCodePoints(n, errorCode);
+    if(numCpFwd >= 0) { numCpFwd += n; }
+}
+
+uint32_t
+CollationIterator::nextCE32FromContraction(const CollationData *d, uint32_t contractionCE32,
+                                           const UChar *p, uint32_t ce32, UChar32 c,
+                                           UErrorCode &errorCode) {
+    // c: next code point after the original one
+
+    // Number of code points read beyond the original code point.
+    // Needed for discontiguous contraction matching.
+    int32_t lookAhead = 1;
+    // Number of code points read since the last match (initially only c).
+    int32_t sinceMatch = 1;
+    // Normally we only need a contiguous match,
+    // and therefore need not remember the suffixes state from before a mismatch for retrying.
+    // If we are already processing skipped combining marks, then we do track the state.
+    UCharsTrie suffixes(p);
+    if(skipped != NULL && !skipped->isEmpty()) { skipped->saveTrieState(suffixes); }
+    UStringTrieResult match = suffixes.firstForCodePoint(c);
+    for(;;) {
+        UChar32 nextCp;
+        if(USTRINGTRIE_HAS_VALUE(match)) {
+            ce32 = (uint32_t)suffixes.getValue();
+            if(!USTRINGTRIE_HAS_NEXT(match) || (c = nextSkippedCodePoint(errorCode)) < 0) {
+                return ce32;
+            }
+            if(skipped != NULL && !skipped->isEmpty()) { skipped->saveTrieState(suffixes); }
+            sinceMatch = 1;
+        } else if(match == USTRINGTRIE_NO_MATCH || (nextCp = nextSkippedCodePoint(errorCode)) < 0) {
+            // No match for c, or partial match (USTRINGTRIE_NO_VALUE) and no further text.
+            // Back up if necessary, and try a discontiguous contraction.
+            if((contractionCE32 & Collation::CONTRACT_TRAILING_CCC) != 0 &&
+                    // Discontiguous contraction matching extends an existing match.
+                    // If there is no match yet, then there is nothing to do.
+                    ((contractionCE32 & Collation::CONTRACT_SINGLE_CP_NO_MATCH) == 0 ||
+                        sinceMatch < lookAhead)) {
+                // The last character of at least one suffix has lccc!=0,
+                // allowing for discontiguous contractions.
+                // UCA S2.1.1 only processes non-starters immediately following
+                // "a match in the table" (sinceMatch=1).
+                if(sinceMatch > 1) {
+                    // Return to the state after the last match.
+                    // (Return to sinceMatch=0 and re-fetch the first partially-matched character.)
+                    backwardNumSkipped(sinceMatch, errorCode);
+                    c = nextSkippedCodePoint(errorCode);
+                    lookAhead -= sinceMatch - 1;
+                    sinceMatch = 1;
+                }
+                if(d->getFCD16(c) > 0xff) {
+                    return nextCE32FromDiscontiguousContraction(
+                        d, suffixes, ce32, lookAhead, c, errorCode);
+                }
+            }
+            break;
+        } else {
+            // Continue after partial match (USTRINGTRIE_NO_VALUE) for c.
+            // It does not have a result value, therefore it is not itself "a match in the table".
+            // If a partially-matched c has ccc!=0 then
+            // it might be skipped in discontiguous contraction.
+            c = nextCp;
+            ++sinceMatch;
+        }
+        ++lookAhead;
+        match = suffixes.nextForCodePoint(c);
+    }
+    backwardNumSkipped(sinceMatch, errorCode);
+    return ce32;
+}
+
+uint32_t
+CollationIterator::nextCE32FromDiscontiguousContraction(
+        const CollationData *d, UCharsTrie &suffixes, uint32_t ce32,
+        int32_t lookAhead, UChar32 c,
+        UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+
+    // UCA section 3.3.2 Contractions:
+    // Contractions that end with non-starter characters
+    // are known as discontiguous contractions.
+    // ... discontiguous contractions must be detected in input text
+    // whenever the final sequence of non-starter characters could be rearranged
+    // so as to make a contiguous matching sequence that is canonically equivalent.
+
+    // UCA: http://www.unicode.org/reports/tr10/#S2.1
+    // S2.1 Find the longest initial substring S at each point that has a match in the table.
+    // S2.1.1 If there are any non-starters following S, process each non-starter C.
+    // S2.1.2 If C is not blocked from S, find if S + C has a match in the table.
+    //     Note: A non-starter in a string is called blocked
+    //     if there is another non-starter of the same canonical combining class or zero
+    //     between it and the last character of canonical combining class 0.
+    // S2.1.3 If there is a match, replace S by S + C, and remove C.
+
+    // First: Is a discontiguous contraction even possible?
+    uint16_t fcd16 = d->getFCD16(c);
+    U_ASSERT(fcd16 > 0xff);  // The caller checked this already, as a shortcut.
+    UChar32 nextCp = nextSkippedCodePoint(errorCode);
+    if(nextCp < 0) {
+        // No further text.
+        backwardNumSkipped(1, errorCode);
+        return ce32;
+    }
+    ++lookAhead;
+    uint8_t prevCC = (uint8_t)fcd16;
+    fcd16 = d->getFCD16(nextCp);
+    if(fcd16 <= 0xff) {
+        // The next code point after c is a starter (S2.1.1 "process each non-starter").
+        backwardNumSkipped(2, errorCode);
+        return ce32;
+    }
+
+    // We have read and matched (lookAhead-2) code points,
+    // read non-matching c and peeked ahead at nextCp.
+    // Return to the state before the mismatch and continue matching with nextCp.
+    if(skipped == NULL || skipped->isEmpty()) {
+        if(skipped == NULL) {
+            skipped = new SkippedState();
+            if(skipped == NULL) {
+                errorCode = U_MEMORY_ALLOCATION_ERROR;
+                return 0;
+            }
+        }
+        suffixes.reset();
+        if(lookAhead > 2) {
+            // Replay the partial match so far.
+            backwardNumCodePoints(lookAhead, errorCode);
+            suffixes.firstForCodePoint(nextCodePoint(errorCode));
+            for(int32_t i = 3; i < lookAhead; ++i) {
+                suffixes.nextForCodePoint(nextCodePoint(errorCode));
+            }
+            // Skip c (which did not match) and nextCp (which we will try now).
+            forwardNumCodePoints(2, errorCode);
+        }
+        skipped->saveTrieState(suffixes);
+    } else {
+        // Reset to the trie state before the failed match of c.
+        skipped->resetToTrieState(suffixes);
+    }
+
+    skipped->setFirstSkipped(c);
+    // Number of code points read since the last match (at this point: c and nextCp).
+    int32_t sinceMatch = 2;
+    c = nextCp;
+    for(;;) {
+        UStringTrieResult match;
+        // "If C is not blocked from S, find if S + C has a match in the table." (S2.1.2)
+        if(prevCC < (fcd16 >> 8) && USTRINGTRIE_HAS_VALUE(match = suffixes.nextForCodePoint(c))) {
+            // "If there is a match, replace S by S + C, and remove C." (S2.1.3)
+            // Keep prevCC unchanged.
+            ce32 = (uint32_t)suffixes.getValue();
+            sinceMatch = 0;
+            skipped->recordMatch();
+            if(!USTRINGTRIE_HAS_NEXT(match)) { break; }
+            skipped->saveTrieState(suffixes);
+        } else {
+            // No match for "S + C", skip C.
+            skipped->skip(c);
+            skipped->resetToTrieState(suffixes);
+            prevCC = (uint8_t)fcd16;
+        }
+        if((c = nextSkippedCodePoint(errorCode)) < 0) { break; }
+        ++sinceMatch;
+        fcd16 = d->getFCD16(c);
+        if(fcd16 <= 0xff) {
+            // The next code point after c is a starter (S2.1.1 "process each non-starter").
+            break;
+        }
+    }
+    backwardNumSkipped(sinceMatch, errorCode);
+    UBool isTopDiscontiguous = skipped->isEmpty();
+    skipped->replaceMatch();
+    if(isTopDiscontiguous && !skipped->isEmpty()) {
+        // We did get a match after skipping one or more combining marks,
+        // and we are not in a recursive discontiguous contraction.
+        // Append CEs from the contraction ce32
+        // and then from the combining marks that we skipped before the match.
+        c = U_SENTINEL;
+        for(;;) {
+            appendCEsFromCE32(d, c, ce32, TRUE, errorCode);
+            // Fetch CE32s for skipped combining marks from the normal data, with fallback,
+            // rather than from the CollationData where we found the contraction.
+            if(!skipped->hasNext()) { break; }
+            c = skipped->next();
+            ce32 = getDataCE32(c);
+            if(ce32 == Collation::FALLBACK_CE32) {
+                d = data->base;
+                ce32 = d->getCE32(c);
+            } else {
+                d = data;
+            }
+            // Note: A nested discontiguous-contraction match
+            // replaces consumed combining marks with newly skipped ones
+            // and resets the reading position to the beginning.
+        }
+        skipped->clear();
+        ce32 = Collation::NO_CE32;  // Signal to the caller that the result is in the ceBuffer.
+    }
+    return ce32;
+}
+
+void
+CollationIterator::appendNumericCEs(uint32_t ce32, UBool forward, UErrorCode &errorCode) {
+    // Collect digits.
+    CharString digits;
+    if(forward) {
+        for(;;) {
+            char digit = Collation::digitFromCE32(ce32);
+            digits.append(digit, errorCode);
+            if(numCpFwd == 0) { break; }
+            UChar32 c = nextCodePoint(errorCode);
+            if(c < 0) { break; }
+            ce32 = data->getCE32(c);
+            if(ce32 == Collation::FALLBACK_CE32) {
+                ce32 = data->base->getCE32(c);
+            }
+            if(!Collation::hasCE32Tag(ce32, Collation::DIGIT_TAG)) {
+                backwardNumCodePoints(1, errorCode);
+                break;
+            }
+            if(numCpFwd > 0) { --numCpFwd; }
+        }
+    } else {
+        for(;;) {
+            char digit = Collation::digitFromCE32(ce32);
+            digits.append(digit, errorCode);
+            UChar32 c = previousCodePoint(errorCode);
+            if(c < 0) { break; }
+            ce32 = data->getCE32(c);
+            if(ce32 == Collation::FALLBACK_CE32) {
+                ce32 = data->base->getCE32(c);
+            }
+            if(!Collation::hasCE32Tag(ce32, Collation::DIGIT_TAG)) {
+                forwardNumCodePoints(1, errorCode);
+                break;
+            }
+        }
+        // Reverse the digit string.
+        char *p = digits.data();
+        char *q = p + digits.length() - 1;
+        while(p < q) {
+            char digit = *p;
+            *p++ = *q;
+            *q-- = digit;
+        }
+    }
+    if(U_FAILURE(errorCode)) { return; }
+    int32_t pos = 0;
+    do {
+        // Skip leading zeros.
+        while(pos < (digits.length() - 1) && digits[pos] == 0) { ++pos; }
+        // Write a sequence of CEs for at most 254 digits at a time.
+        int32_t segmentLength = digits.length() - pos;
+        if(segmentLength > 254) { segmentLength = 254; }
+        appendNumericSegmentCEs(digits.data() + pos, segmentLength, errorCode);
+        pos += segmentLength;
+    } while(U_SUCCESS(errorCode) && pos < digits.length());
+}
+
+void
+CollationIterator::appendNumericSegmentCEs(const char *digits, int32_t length, UErrorCode &errorCode) {
+    U_ASSERT(1 <= length && length <= 254);
+    U_ASSERT(length == 1 || digits[0] != 0);
+    uint32_t numericPrimary = data->numericPrimary;
+    // Note: We use primary byte values 2..255: digits are not compressible.
+    if(length <= 7) {
+        // Very dense encoding for small numbers.
+        int32_t value = digits[0];
+        for(int32_t i = 1; i < length; ++i) {
+            value = value * 10 + digits[i];
+        }
+        // Primary weight second byte values:
+        //     74 byte values   2.. 75 for small numbers in two-byte primary weights.
+        //     40 byte values  76..115 for medium numbers in three-byte primary weights.
+        //     16 byte values 116..131 for large numbers in four-byte primary weights.
+        //    124 byte values 132..255 for very large numbers with 4..127 digit pairs.
+        int32_t firstByte = 2;
+        int32_t numBytes = 74;
+        if(value < numBytes) {
+            // Two-byte primary for 0..73, good for day & month numbers etc.
+            uint32_t primary = numericPrimary | ((firstByte + value) << 16);
+            ceBuffer.append(Collation::makeCE(primary), errorCode);
+            return;
+        }
+        value -= numBytes;
+        firstByte += numBytes;
+        numBytes = 40;
+        if(value < numBytes * 254) {
+            // Three-byte primary for 74..10233=74+40*254-1, good for year numbers and more.
+            uint32_t primary = numericPrimary |
+                ((firstByte + value / 254) << 16) | ((2 + value % 254) << 8);
+            ceBuffer.append(Collation::makeCE(primary), errorCode);
+            return;
+        }
+        value -= numBytes * 254;
+        firstByte += numBytes;
+        numBytes = 16;
+        if(value < numBytes * 254 * 254) {
+            // Four-byte primary for 10234..1042489=10234+16*254*254-1.
+            uint32_t primary = numericPrimary | (2 + value % 254);
+            value /= 254;
+            primary |= (2 + value % 254) << 8;
+            value /= 254;
+            primary |= (firstByte + value % 254) << 16;
+            ceBuffer.append(Collation::makeCE(primary), errorCode);
+            return;
+        }
+        // original value > 1042489
+    }
+    U_ASSERT(length >= 7);
+
+    // The second primary byte value 132..255 indicates the number of digit pairs (4..127),
+    // then we generate primary bytes with those pairs.
+    // Omit trailing 00 pairs.
+    // Decrement the value for the last pair.
+
+    // Set the exponent. 4 pairs->132, 5 pairs->133, ..., 127 pairs->255.
+    int32_t numPairs = (length + 1) / 2;
+    uint32_t primary = numericPrimary | ((132 - 4 + numPairs) << 16);
+    // Find the length without trailing 00 pairs.
+    while(digits[length - 1] == 0 && digits[length - 2] == 0) {
+        length -= 2;
+    }
+    // Read the first pair.
+    uint32_t pair;
+    int32_t pos;
+    if(length & 1) {
+        // Only "half a pair" if we have an odd number of digits.
+        pair = digits[0];
+        pos = 1;
+    } else {
+        pair = digits[0] * 10 + digits[1];
+        pos = 2;
+    }
+    pair = 11 + 2 * pair;
+    // Add the pairs of digits between pos and length.
+    int32_t shift = 8;
+    while(pos < length) {
+        if(shift == 0) {
+            // Every three pairs/bytes we need to store a 4-byte-primary CE
+            // and start with a new CE with the '0' primary lead byte.
+            primary |= pair;
+            ceBuffer.append(Collation::makeCE(primary), errorCode);
+            primary = numericPrimary;
+            shift = 16;
+        } else {
+            primary |= pair << shift;
+            shift -= 8;
+        }
+        pair = 11 + 2 * (digits[pos] * 10 + digits[pos + 1]);
+        pos += 2;
+    }
+    primary |= (pair - 1) << shift;
+    ceBuffer.append(Collation::makeCE(primary), errorCode);
+}
+
+int64_t
+CollationIterator::previousCE(UVector32 &offsets, UErrorCode &errorCode) {
+    if(ceBuffer.length > 0) {
+        // Return the previous buffered CE.
+        return ceBuffer.get(--ceBuffer.length);
+    }
+    offsets.removeAllElements();
+    int32_t limitOffset = getOffset();
+    UChar32 c = previousCodePoint(errorCode);
+    if(c < 0) { return Collation::NO_CE; }
+    if(data->isUnsafeBackward(c, isNumeric)) {
+        return previousCEUnsafe(c, offsets, errorCode);
+    }
+    // Simple, safe-backwards iteration:
+    // Get a CE going backwards, handle prefixes but no contractions.
+    uint32_t ce32 = data->getCE32(c);
+    const CollationData *d;
+    if(ce32 == Collation::FALLBACK_CE32) {
+        d = data->base;
+        ce32 = d->getCE32(c);
+    } else {
+        d = data;
+    }
+    if(Collation::isSimpleOrLongCE32(ce32)) {
+        return Collation::ceFromCE32(ce32);
+    }
+    appendCEsFromCE32(d, c, ce32, FALSE, errorCode);
+    if(U_SUCCESS(errorCode)) {
+        if(ceBuffer.length > 1) {
+            offsets.addElement(getOffset(), errorCode);
+            // For an expansion, the offset of each non-initial CE is the limit offset,
+            // consistent with forward iteration.
+            while(offsets.size() <= ceBuffer.length) {
+                offsets.addElement(limitOffset, errorCode);
+            };
+        }
+        return ceBuffer.get(--ceBuffer.length);
+    } else {
+        return Collation::NO_CE_PRIMARY;
+    }
+}
+
+int64_t
+CollationIterator::previousCEUnsafe(UChar32 c, UVector32 &offsets, UErrorCode &errorCode) {
+    // We just move through the input counting safe and unsafe code points
+    // without collecting the unsafe-backward substring into a buffer and
+    // switching to it.
+    // This is to keep the logic simple. Otherwise we would have to handle
+    // prefix matching going before the backward buffer, switching
+    // to iteration and back, etc.
+    // In the most important case of iterating over a normal string,
+    // reading from the string itself is already maximally fast.
+    // The only drawback there is that after getting the CEs we always
+    // skip backward to the safe character rather than switching out
+    // of a backwardBuffer.
+    // But this should not be the common case for previousCE(),
+    // and correctness and maintainability are more important than
+    // complex optimizations.
+    // Find the first safe character before c.
+    int32_t numBackward = 1;
+    while((c = previousCodePoint(errorCode)) >= 0) {
+        ++numBackward;
+        if(!data->isUnsafeBackward(c, isNumeric)) {
+            break;
+        }
+    }
+    // Set the forward iteration limit.
+    // Note: This counts code points.
+    // We cannot enforce a limit in the middle of a surrogate pair or similar.
+    numCpFwd = numBackward;
+    // Reset the forward iterator.
+    cesIndex = 0;
+    U_ASSERT(ceBuffer.length == 0);
+    // Go forward and collect the CEs.
+    int32_t offset = getOffset();
+    while(numCpFwd > 0) {
+        // nextCE() normally reads one code point.
+        // Contraction matching and digit specials read more and check numCpFwd.
+        --numCpFwd;
+        // Append one or more CEs to the ceBuffer.
+        (void)nextCE(errorCode);
+        U_ASSERT(U_FAILURE(errorCode) || ceBuffer.get(ceBuffer.length - 1) != Collation::NO_CE);
+        // No need to loop for getting each expansion CE from nextCE().
+        cesIndex = ceBuffer.length;
+        // However, we need to write an offset for each CE.
+        // This is for CollationElementIterator::getOffset() to return
+        // intermediate offsets from the unsafe-backwards segment.
+        U_ASSERT(offsets.size() < ceBuffer.length);
+        offsets.addElement(offset, errorCode);
+        // For an expansion, the offset of each non-initial CE is the limit offset,
+        // consistent with forward iteration.
+        offset = getOffset();
+        while(offsets.size() < ceBuffer.length) {
+            offsets.addElement(offset, errorCode);
+        };
+    }
+    U_ASSERT(offsets.size() == ceBuffer.length);
+    // End offset corresponding to just after the unsafe-backwards segment.
+    offsets.addElement(offset, errorCode);
+    // Reset the forward iteration limit
+    // and move backward to before the segment for which we fetched CEs.
+    numCpFwd = -1;
+    backwardNumCodePoints(numBackward, errorCode);
+    // Use the collected CEs and return the last one.
+    cesIndex = 0;  // Avoid cesIndex > ceBuffer.length when that gets decremented.
+    if(U_SUCCESS(errorCode)) {
+        return ceBuffer.get(--ceBuffer.length);
+    } else {
+        return Collation::NO_CE_PRIMARY;
+    }
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationiterator.h b/icu4c/source/i18n/collationiterator.h
new file mode 100644 (file)
index 0000000..a7b2cbf
--- /dev/null
@@ -0,0 +1,319 @@
+/*
+*******************************************************************************
+* Copyright (C) 2010-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationiterator.h
+*
+* created on: 2010oct27
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONITERATOR_H__
+#define __COLLATIONITERATOR_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+
+U_NAMESPACE_BEGIN
+
+class SkippedState;
+class UCharsTrie;
+class UVector32;
+
+/**
+ * Collation element iterator and abstract character iterator.
+ *
+ * When a method returns a code point value, it must be in 0..10FFFF,
+ * except it can be negative as a sentinel value.
+ */
+class U_I18N_API CollationIterator : public UObject {
+private:
+    class CEBuffer {
+    private:
+        /** Large enough for CEs of most short strings. */
+        static const int32_t INITIAL_CAPACITY = 40;
+    public:
+        CEBuffer() : length(0) {}
+        ~CEBuffer();
+
+        inline void append(int64_t ce, UErrorCode &errorCode) {
+            if(length < INITIAL_CAPACITY || ensureAppendCapacity(1, errorCode)) {
+                buffer[length++] = ce;
+            }
+        }
+
+        inline void appendUnsafe(int64_t ce) {
+            buffer[length++] = ce;
+        }
+
+        UBool ensureAppendCapacity(int32_t appCap, UErrorCode &errorCode);
+
+        inline UBool incLength(UErrorCode &errorCode) {
+            // Use INITIAL_CAPACITY for a very simple fastpath.
+            // (Rather than buffer.getCapacity().)
+            if(length < INITIAL_CAPACITY || ensureAppendCapacity(1, errorCode)) {
+                ++length;
+                return TRUE;
+            } else {
+                return FALSE;
+            }
+        }
+
+        inline int64_t set(int32_t i, int64_t ce) {
+            return buffer[i] = ce;
+        }
+        inline int64_t get(int32_t i) const { return buffer[i]; }
+
+        const int64_t *getCEs() const { return buffer.getAlias(); }
+
+        int32_t length;
+
+    private:
+        CEBuffer(const CEBuffer &);
+        void operator=(const CEBuffer &);
+
+        MaybeStackArray<int64_t, INITIAL_CAPACITY> buffer;
+    };
+
+public:
+    CollationIterator(const CollationData *d, UBool numeric)
+            : trie(d->trie),
+              data(d),
+              cesIndex(0),
+              skipped(NULL),
+              numCpFwd(-1),
+              isNumeric(numeric) {}
+
+    virtual ~CollationIterator();
+
+    virtual UBool operator==(const CollationIterator &other) const;
+    inline UBool operator!=(const CollationIterator &other) const {
+        return !operator==(other);
+    }
+
+    /**
+     * Resets the iterator state and sets the position to the specified offset.
+     * Subclasses must implement, and must call the parent class method,
+     * or CollationIterator::reset().
+     */
+    virtual void resetToOffset(int32_t newOffset) = 0;
+
+    virtual int32_t getOffset() const = 0;
+
+    /**
+     * Returns the next collation element.
+     */
+    inline int64_t nextCE(UErrorCode &errorCode) {
+        if(cesIndex < ceBuffer.length) {
+            // Return the next buffered CE.
+            return ceBuffer.get(cesIndex++);
+        }
+        // assert cesIndex == ceBuffer.length;
+        if(!ceBuffer.incLength(errorCode)) {
+            return Collation::NO_CE;
+        }
+        UChar32 c;
+        uint32_t ce32 = handleNextCE32(c, errorCode);
+        uint32_t t = ce32 & 0xff;
+        if(t < Collation::SPECIAL_CE32_LOW_BYTE) {  // Forced-inline of isSpecialCE32(ce32).
+            // Normal CE from the main data.
+            // Forced-inline of ceFromSimpleCE32(ce32).
+            return ceBuffer.set(cesIndex++,
+                    ((int64_t)(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | (t << 8));
+        }
+        const CollationData *d;
+        // The compiler should be able to optimize the previous and the following
+        // comparisons of t with the same constant.
+        if(t == Collation::SPECIAL_CE32_LOW_BYTE) {
+            if(c < 0) {
+                return ceBuffer.set(cesIndex++, Collation::NO_CE);
+            }
+            d = data->base;
+            ce32 = d->getCE32(c);
+            t = ce32 & 0xff;
+            if(t < Collation::SPECIAL_CE32_LOW_BYTE) {
+                // Normal CE from the base data.
+                return ceBuffer.set(cesIndex++,
+                        ((int64_t)(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | (t << 8));
+            }
+        } else {
+            d = data;
+        }
+        if(t == Collation::LONG_PRIMARY_CE32_LOW_BYTE) {
+            // Forced-inline of ceFromLongPrimaryCE32(ce32).
+            return ceBuffer.set(cesIndex++,
+                    ((int64_t)(ce32 - t) << 32) | Collation::COMMON_SEC_AND_TER_CE);
+        }
+        return nextCEFromCE32(d, c, ce32, errorCode);
+    }
+
+    /**
+     * Fetches all CEs.
+     * @return getCEsLength()
+     */
+    int32_t fetchCEs(UErrorCode &errorCode);
+
+    /**
+     * Overwrites the current CE (the last one returned by nextCE()).
+     */
+    void setCurrentCE(int64_t ce) {
+        // assert cesIndex > 0;
+        ceBuffer.set(cesIndex - 1, ce);
+    }
+
+    /**
+     * Returns the previous collation element.
+     */
+    int64_t previousCE(UVector32 &offsets, UErrorCode &errorCode);
+
+    inline int32_t getCEsLength() const {
+        return ceBuffer.length;
+    }
+
+    inline int64_t getCE(int32_t i) const {
+        return ceBuffer.get(i);
+    }
+
+    const int64_t *getCEs() const {
+        return ceBuffer.getCEs();
+    }
+
+    void clearCEs() {
+        cesIndex = ceBuffer.length = 0;
+    }
+
+    void clearCEsIfNoneRemaining() {
+        if(cesIndex == ceBuffer.length) { clearCEs(); }
+    }
+
+    /**
+     * Returns the next code point (with post-increment).
+     * Public for identical-level comparison and for testing.
+     */
+    virtual UChar32 nextCodePoint(UErrorCode &errorCode) = 0;
+
+    /**
+     * Returns the previous code point (with pre-decrement).
+     * Public for identical-level comparison and for testing.
+     */
+    virtual UChar32 previousCodePoint(UErrorCode &errorCode) = 0;
+
+protected:
+    CollationIterator(const CollationIterator &other);
+
+    void reset();
+
+    /**
+     * Returns the next code point and its local CE32 value.
+     * Returns Collation::FALLBACK_CE32 at the end of the text (c<0)
+     * or when c's CE32 value is to be looked up in the base data (fallback).
+     *
+     * The code point is used for fallbacks, context and implicit weights.
+     * It is ignored when the returned CE32 is not special (e.g., FFFD_CE32).
+     */
+    virtual uint32_t handleNextCE32(UChar32 &c, UErrorCode &errorCode);
+
+    /**
+     * Called when handleNextCE32() returns a LEAD_SURROGATE_TAG for a lead surrogate code unit.
+     * Returns the trail surrogate in that case and advances past it,
+     * if a trail surrogate follows the lead surrogate.
+     * Otherwise returns any other code unit and does not advance.
+     */
+    virtual UChar handleGetTrailSurrogate();
+
+    /**
+     * Called when handleNextCE32() returns with c==0, to see whether it is a NUL terminator.
+     * (Not needed in Java.)
+     */
+    virtual UBool foundNULTerminator();
+
+    /**
+     * @return FALSE if surrogate code points U+D800..U+DFFF
+     *         map to their own implicit primary weights (for UTF-16),
+     *         or TRUE if they map to CE(U+FFFD) (for UTF-8)
+     */
+    virtual UBool forbidSurrogateCodePoints() const;
+
+    virtual void forwardNumCodePoints(int32_t num, UErrorCode &errorCode) = 0;
+
+    virtual void backwardNumCodePoints(int32_t num, UErrorCode &errorCode) = 0;
+
+    /**
+     * Returns the CE32 from the data trie.
+     * Normally the same as data->getCE32(), but overridden in the builder.
+     * Call this only when the faster data->getCE32() cannot be used.
+     */
+    virtual uint32_t getDataCE32(UChar32 c) const;
+
+    virtual uint32_t getCE32FromBuilderData(uint32_t ce32, UErrorCode &errorCode);
+
+    void appendCEsFromCE32(const CollationData *d, UChar32 c, uint32_t ce32,
+                           UBool forward, UErrorCode &errorCode);
+
+    // Main lookup trie of the data object.
+    const UTrie2 *trie;
+    const CollationData *data;
+
+private:
+    int64_t nextCEFromCE32(const CollationData *d, UChar32 c, uint32_t ce32,
+                           UErrorCode &errorCode);
+
+    uint32_t getCE32FromPrefix(const CollationData *d, uint32_t ce32,
+                               UErrorCode &errorCode);
+
+    UChar32 nextSkippedCodePoint(UErrorCode &errorCode);
+
+    void backwardNumSkipped(int32_t n, UErrorCode &errorCode);
+
+    uint32_t nextCE32FromContraction(
+            const CollationData *d, uint32_t contractionCE32,
+            const UChar *p, uint32_t ce32, UChar32 c,
+            UErrorCode &errorCode);
+
+    uint32_t nextCE32FromDiscontiguousContraction(
+            const CollationData *d, UCharsTrie &suffixes, uint32_t ce32,
+            int32_t lookAhead, UChar32 c,
+            UErrorCode &errorCode);
+
+    /**
+     * Returns the previous CE when data->isUnsafeBackward(c, isNumeric).
+     */
+    int64_t previousCEUnsafe(UChar32 c, UVector32 &offsets, UErrorCode &errorCode);
+
+    /**
+     * Turns a string of digits (bytes 0..9)
+     * into a sequence of CEs that will sort in numeric order.
+     *
+     * Starts from this ce32's digit value and consumes the following/preceding digits.
+     * The digits string must not be empty and must not have leading zeros.
+     */
+    void appendNumericCEs(uint32_t ce32, UBool forward, UErrorCode &errorCode);
+
+    /**
+     * Turns 1..254 digits into a sequence of CEs.
+     * Called by appendNumericCEs() for each segment of at most 254 digits.
+     */
+    void appendNumericSegmentCEs(const char *digits, int32_t length, UErrorCode &errorCode);
+
+    CEBuffer ceBuffer;
+    int32_t cesIndex;
+
+    SkippedState *skipped;
+
+    // Number of code points to read forward, or -1.
+    // Used as a forward iteration limit in previousCEUnsafe().
+    int32_t numCpFwd;
+    // Numeric collation (CollationSettings::NUMERIC).
+    UBool isNumeric;
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONITERATOR_H__
diff --git a/icu4c/source/i18n/collationkeys.cpp b/icu4c/source/i18n/collationkeys.cpp
new file mode 100644 (file)
index 0000000..6006811
--- /dev/null
@@ -0,0 +1,695 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationkeys.cpp
+*
+* created on: 2012sep02
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/bytestream.h"
+#include "collation.h"
+#include "collationiterator.h"
+#include "collationkeys.h"
+#include "collationsettings.h"
+#include "uassert.h"
+
+U_NAMESPACE_BEGIN
+
+SortKeyByteSink::~SortKeyByteSink() {}
+
+void
+SortKeyByteSink::Append(const char *bytes, int32_t n) {
+    if (n <= 0 || bytes == NULL) {
+        return;
+    }
+    if (ignore_ > 0) {
+        int32_t ignoreRest = ignore_ - n;
+        if (ignoreRest >= 0) {
+            ignore_ = ignoreRest;
+            return;
+        } else {
+            bytes += ignore_;
+            n = -ignoreRest;
+            ignore_ = 0;
+        }
+    }
+    int32_t length = appended_;
+    appended_ += n;
+    if ((buffer_ + length) == bytes) {
+        return;  // the caller used GetAppendBuffer() and wrote the bytes already
+    }
+    int32_t available = capacity_ - length;
+    if (n <= available) {
+        uprv_memcpy(buffer_ + length, bytes, n);
+    } else {
+        AppendBeyondCapacity(bytes, n, length);
+    }
+}
+
+char *
+SortKeyByteSink::GetAppendBuffer(int32_t min_capacity,
+                                 int32_t desired_capacity_hint,
+                                 char *scratch,
+                                 int32_t scratch_capacity,
+                                 int32_t *result_capacity) {
+    if (min_capacity < 1 || scratch_capacity < min_capacity) {
+        *result_capacity = 0;
+        return NULL;
+    }
+    if (ignore_ > 0) {
+        // Do not write ignored bytes right at the end of the buffer.
+        *result_capacity = scratch_capacity;
+        return scratch;
+    }
+    int32_t available = capacity_ - appended_;
+    if (available >= min_capacity) {
+        *result_capacity = available;
+        return buffer_ + appended_;
+    } else if (Resize(desired_capacity_hint, appended_)) {
+        *result_capacity = capacity_ - appended_;
+        return buffer_ + appended_;
+    } else {
+        *result_capacity = scratch_capacity;
+        return scratch;
+    }
+}
+
+namespace {
+
+/**
+ * uint8_t byte buffer, similar to CharString but simpler.
+ */
+class SortKeyLevel : public UMemory {
+public:
+    SortKeyLevel() : len(0), ok(TRUE) {}
+    ~SortKeyLevel() {}
+
+    /** @return FALSE if memory allocation failed */
+    UBool isOk() const { return ok; }
+    UBool isEmpty() const { return len == 0; }
+    int32_t length() const { return len; }
+    const uint8_t *data() const { return buffer.getAlias(); }
+    uint8_t operator[](int32_t index) const { return buffer[index]; }
+
+    uint8_t *data() { return buffer.getAlias(); }
+
+    void appendByte(uint32_t b);
+    void appendWeight16(uint32_t w);
+    void appendWeight32(uint32_t w);
+    void appendReverseWeight16(uint32_t w);
+
+    /** Appends all but the last byte to the sink. The last byte should be the 01 terminator. */
+    void appendTo(ByteSink &sink) const {
+        U_ASSERT(len > 0 && buffer[len - 1] == 1);
+        sink.Append(reinterpret_cast<const char *>(buffer.getAlias()), len - 1);
+    }
+
+private:
+    MaybeStackArray<uint8_t, 40> buffer;
+    int32_t len;
+    UBool ok;
+
+    UBool ensureCapacity(int32_t appendCapacity);
+
+    SortKeyLevel(const SortKeyLevel &other); // forbid copying of this class
+    SortKeyLevel &operator=(const SortKeyLevel &other); // forbid copying of this class
+};
+
+void SortKeyLevel::appendByte(uint32_t b) {
+    if(len < buffer.getCapacity() || ensureCapacity(1)) {
+        buffer[len++] = (uint8_t)b;
+    }
+}
+
+void
+SortKeyLevel::appendWeight16(uint32_t w) {
+    U_ASSERT((w & 0xffff) != 0);
+    uint8_t b0 = (uint8_t)(w >> 8);
+    uint8_t b1 = (uint8_t)w;
+    int32_t appendLength = (b1 == 0) ? 1 : 2;
+    if((len + appendLength) <= buffer.getCapacity() || ensureCapacity(appendLength)) {
+        buffer[len++] = b0;
+        if(b1 != 0) {
+            buffer[len++] = b1;
+        }
+    }
+}
+
+void
+SortKeyLevel::appendWeight32(uint32_t w) {
+    U_ASSERT(w != 0);
+    uint8_t bytes[4] = { (uint8_t)(w >> 24), (uint8_t)(w >> 16), (uint8_t)(w >> 8), (uint8_t)w };
+    int32_t appendLength = (bytes[1] == 0) ? 1 : (bytes[2] == 0) ? 2 : (bytes[3] == 0) ? 3 : 4;
+    if((len + appendLength) <= buffer.getCapacity() || ensureCapacity(appendLength)) {
+        buffer[len++] = bytes[0];
+        if(bytes[1] != 0) {
+            buffer[len++] = bytes[1];
+            if(bytes[2] != 0) {
+                buffer[len++] = bytes[2];
+                if(bytes[3] != 0) {
+                    buffer[len++] = bytes[3];
+                }
+            }
+        }
+    }
+}
+
+void
+SortKeyLevel::appendReverseWeight16(uint32_t w) {
+    U_ASSERT((w & 0xffff) != 0);
+    uint8_t b0 = (uint8_t)(w >> 8);
+    uint8_t b1 = (uint8_t)w;
+    int32_t appendLength = (b1 == 0) ? 1 : 2;
+    if((len + appendLength) <= buffer.getCapacity() || ensureCapacity(appendLength)) {
+        if(b1 == 0) {
+            buffer[len++] = b0;
+        } else {
+            buffer[len] = b1;
+            buffer[len + 1] = b0;
+            len += 2;
+        }
+    }
+}
+
+UBool SortKeyLevel::ensureCapacity(int32_t appendCapacity) {
+    if(!ok) {
+        return FALSE;
+    }
+    int32_t newCapacity = 2 * buffer.getCapacity();
+    int32_t altCapacity = len + 2 * appendCapacity;
+    if (newCapacity < altCapacity) {
+        newCapacity = altCapacity;
+    }
+    if (newCapacity < 200) {
+        newCapacity = 200;
+    }
+    if(buffer.resize(newCapacity, len)==NULL) {
+        return ok = FALSE;
+    }
+    return TRUE;
+}
+
+}  // namespace
+
+CollationKeys::LevelCallback::~LevelCallback() {}
+
+UBool
+CollationKeys::LevelCallback::needToWrite(Collation::Level /*level*/) { return TRUE; }
+
+/**
+ * Map from collation strength (UColAttributeValue)
+ * to a mask of Collation::Level bits up to that strength,
+ * excluding the CASE_LEVEL which is independent of the strength,
+ * and excluding IDENTICAL_LEVEL which this function does not write.
+ */
+static const uint32_t levelMasks[UCOL_STRENGTH_LIMIT] = {
+    2,          // UCOL_PRIMARY -> PRIMARY_LEVEL
+    6,          // UCOL_SECONDARY -> up to SECONDARY_LEVEL
+    0x16,       // UCOL_TERTIARY -> up to TERTIARY_LEVEL
+    0x36,       // UCOL_QUATERNARY -> up to QUATERNARY_LEVEL
+    0, 0, 0, 0,
+    0, 0, 0, 0,
+    0, 0, 0,
+    0x36        // UCOL_IDENTICAL -> up to QUATERNARY_LEVEL
+};
+
+void
+CollationKeys::writeSortKeyUpToQuaternary(CollationIterator &iter,
+                                          const UBool *compressibleBytes,
+                                          const CollationSettings &settings,
+                                          SortKeyByteSink &sink,
+                                          Collation::Level minLevel, LevelCallback &callback,
+                                          UBool preflight, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+
+    int32_t options = settings.options;
+    // Set of levels to process and write.
+    uint32_t levels = levelMasks[CollationSettings::getStrength(options)];
+    if((options & CollationSettings::CASE_LEVEL) != 0) {
+        levels |= Collation::CASE_LEVEL_FLAG;
+    }
+    // Minus the levels below minLevel.
+    levels &= ~(((uint32_t)1 << minLevel) - 1);
+    if(levels == 0) { return; }
+
+    uint32_t variableTop;
+    if((options & CollationSettings::ALTERNATE_MASK) == 0) {
+        variableTop = 0;
+    } else {
+        // +1 so that we can use "<" and primary ignorables test out early.
+        variableTop = settings.variableTop + 1;
+    }
+    const uint8_t *reorderTable = settings.reorderTable;
+
+    uint32_t tertiaryMask = CollationSettings::getTertiaryMask(options);
+
+    SortKeyLevel cases;
+    SortKeyLevel secondaries;
+    SortKeyLevel tertiaries;
+    SortKeyLevel quaternaries;
+
+    uint32_t compressedP1 = 0;  // 0==no compression; otherwise reordered compressible lead byte
+    int32_t commonCases = 0;
+    int32_t commonSecondaries = 0;
+    int32_t commonTertiaries = 0;
+    int32_t commonQuaternaries = 0;
+
+    uint32_t prevSecondary = 0;
+    UBool anyMergeSeparators = FALSE;
+
+    for(;;) {
+        // No need to keep all CEs in the buffer when we write a sort key.
+        iter.clearCEsIfNoneRemaining();
+        int64_t ce = iter.nextCE(errorCode);
+        uint32_t p = (uint32_t)(ce >> 32);
+        if(p < variableTop && p > Collation::MERGE_SEPARATOR_PRIMARY) {
+            // Variable CE, shift it to quaternary level.
+            // Ignore all following primary ignorables, and shift further variable CEs.
+            if(commonQuaternaries != 0) {
+                --commonQuaternaries;
+                while(commonQuaternaries >= QUAT_COMMON_MAX_COUNT) {
+                    quaternaries.appendByte(QUAT_COMMON_MIDDLE);
+                    commonQuaternaries -= QUAT_COMMON_MAX_COUNT;
+                }
+                // Shifted primary weights are lower than the common weight.
+                quaternaries.appendByte(QUAT_COMMON_LOW + commonQuaternaries);
+                commonQuaternaries = 0;
+            }
+            do {
+                if((levels & Collation::QUATERNARY_LEVEL_FLAG) != 0) {
+                    uint32_t p1 = p >> 24;
+                    if(reorderTable != NULL) { p1 = reorderTable[p1]; }
+                    if(p1 >= QUAT_SHIFTED_LIMIT_BYTE) {
+                        // Prevent shifted primary lead bytes from
+                        // overlapping with the common compression range.
+                        quaternaries.appendByte(QUAT_SHIFTED_LIMIT_BYTE);
+                    }
+                    quaternaries.appendWeight32((p1 << 24) | (p & 0xffffff));
+                }
+                do {
+                    ce = iter.nextCE(errorCode);
+                    p = (uint32_t)(ce >> 32);
+                } while(p == 0);
+            } while(p < variableTop && p > Collation::MERGE_SEPARATOR_PRIMARY);
+        }
+        // ce could be primary ignorable, or NO_CE, or the merge separator,
+        // or a regular primary CE, but it is not variable.
+        // If ce==NO_CE, then write nothing for the primary level but
+        // terminate compression on all levels and then exit the loop.
+        if(p > Collation::NO_CE_PRIMARY && (levels & Collation::PRIMARY_LEVEL_FLAG) != 0) {
+            uint32_t p1 = p >> 24;
+            if(reorderTable != NULL) { p1 = reorderTable[p1]; }
+            if(p1 != compressedP1) {
+                if(compressedP1 != 0) {
+                    if(p1 < compressedP1) {
+                        // No primary compression terminator
+                        // at the end of the level or merged segment.
+                        if(p1 > Collation::MERGE_SEPARATOR_BYTE) {
+                            sink.Append(Collation::PRIMARY_COMPRESSION_LOW_BYTE);
+                        }
+                    } else {
+                        sink.Append(Collation::PRIMARY_COMPRESSION_HIGH_BYTE);
+                    }
+                }
+                sink.Append(p1);
+                // Test the un-reordered lead byte for compressibility but
+                // remember the reordered lead byte.
+                if(compressibleBytes[p >> 24]) {
+                    compressedP1 = p1;
+                } else {
+                    compressedP1 = 0;
+                }
+            }
+            char p2 = (char)(p >> 16);
+            if(p2 != 0) {
+                char buffer[3] = { p2, (char)(p >> 8), (char)p };
+                sink.Append(buffer, (buffer[1] == 0) ? 1 : (buffer[2] == 0) ? 2 : 3);
+            }
+            // Optimization for internalNextSortKeyPart():
+            // When the primary level overflows we can stop because we need not
+            // calculate (preflight) the whole sort key length.
+            if(!preflight && sink.Overflowed()) {
+                if(U_SUCCESS(errorCode) && !sink.IsOk()) {
+                    errorCode = U_MEMORY_ALLOCATION_ERROR;
+                }
+                return;
+            }
+        }
+
+        uint32_t lower32 = (uint32_t)ce;
+        if(lower32 == 0) { continue; }  // completely ignorable, no secondary/case/tertiary/quaternary
+
+        if((levels & Collation::SECONDARY_LEVEL_FLAG) != 0) {
+            uint32_t s = lower32 >> 16;
+            if(s == 0) {
+                // secondary ignorable
+            } else if(s == Collation::COMMON_WEIGHT16) {
+                ++commonSecondaries;
+            } else if((options & CollationSettings::BACKWARD_SECONDARY) == 0) {
+                if(commonSecondaries != 0) {
+                    --commonSecondaries;
+                    while(commonSecondaries >= SEC_COMMON_MAX_COUNT) {
+                        secondaries.appendByte(SEC_COMMON_MIDDLE);
+                        commonSecondaries -= SEC_COMMON_MAX_COUNT;
+                    }
+                    uint32_t b;
+                    if(s < Collation::COMMON_WEIGHT16) {
+                        b = SEC_COMMON_LOW + commonSecondaries;
+                    } else {
+                        b = SEC_COMMON_HIGH - commonSecondaries;
+                    }
+                    secondaries.appendByte(b);
+                    commonSecondaries = 0;
+                }
+                secondaries.appendWeight16(s);
+            } else {
+                if(commonSecondaries != 0) {
+                    --commonSecondaries;
+                    // Append reverse weights. The level will be re-reversed later.
+                    int32_t remainder = commonSecondaries % SEC_COMMON_MAX_COUNT;
+                    uint32_t b;
+                    if(prevSecondary < Collation::COMMON_WEIGHT16) {
+                        b = SEC_COMMON_LOW + remainder;
+                    } else {
+                        b = SEC_COMMON_HIGH - remainder;
+                    }
+                    secondaries.appendByte(b);
+                    commonSecondaries -= remainder;
+                    // commonSecondaries is now a multiple of SEC_COMMON_MAX_COUNT.
+                    while(commonSecondaries > 0) {  // same as >= SEC_COMMON_MAX_COUNT
+                        secondaries.appendByte(SEC_COMMON_MIDDLE);
+                        commonSecondaries -= SEC_COMMON_MAX_COUNT;
+                    }
+                    // commonSecondaries == 0
+                }
+                // Reduce separators so that we can look for byte<=1 later.
+                if(s <= Collation::MERGE_SEPARATOR_WEIGHT16) {
+                    if(s == Collation::MERGE_SEPARATOR_WEIGHT16) {
+                        anyMergeSeparators = TRUE;
+                    }
+                    secondaries.appendByte((s >> 8) - 1);
+                } else {
+                    secondaries.appendReverseWeight16(s);
+                }
+                prevSecondary = s;
+            }
+        }
+
+        if((levels & Collation::CASE_LEVEL_FLAG) != 0) {
+            if((CollationSettings::getStrength(options) == UCOL_PRIMARY) ?
+                    p == 0 : lower32 <= 0xffff) {
+                // Primary+caseLevel: Ignore case level weights of primary ignorables.
+                // Otherwise: Ignore case level weights of secondary ignorables.
+                // For details see the comments in the CollationCompare class.
+            } else {
+                uint32_t c = (lower32 >> 8) & 0xff;  // case bits & tertiary lead byte
+                U_ASSERT((c & 0xc0) != 0xc0);
+                if((c & 0xc0) == 0 && c > Collation::MERGE_SEPARATOR_BYTE) {
+                    ++commonCases;
+                } else {
+                    if((options & CollationSettings::UPPER_FIRST) == 0) {
+                        // lowerFirst: Compress common weights to nibbles 1..7..13, mixed=14, upper=15.
+                        if(commonCases != 0) {
+                            --commonCases;
+                            while(commonCases >= CASE_LOWER_FIRST_COMMON_MAX_COUNT) {
+                                cases.appendByte(CASE_LOWER_FIRST_COMMON_MIDDLE << 4);
+                                commonCases -= CASE_LOWER_FIRST_COMMON_MAX_COUNT;
+                            }
+                            uint32_t b;
+                            if(c <= Collation::MERGE_SEPARATOR_BYTE) {
+                                b = CASE_LOWER_FIRST_COMMON_LOW + commonCases;
+                            } else {
+                                b = CASE_LOWER_FIRST_COMMON_HIGH - commonCases;
+                            }
+                            cases.appendByte(b << 4);
+                            commonCases = 0;
+                        }
+                        if(c > Collation::MERGE_SEPARATOR_BYTE) {
+                            c = (CASE_LOWER_FIRST_COMMON_HIGH + (c >> 6)) << 4;  // 14 or 15
+                        }
+                    } else {
+                        // upperFirst: Compress common weights to nibbles 3..15, mixed=2, upper=1.
+                        // The compressed common case weights only go up from the "low" value
+                        // because with upperFirst the common weight is the highest one.
+                        if(commonCases != 0) {
+                            --commonCases;
+                            while(commonCases >= CASE_UPPER_FIRST_COMMON_MAX_COUNT) {
+                                cases.appendByte(CASE_UPPER_FIRST_COMMON_LOW << 4);
+                                commonCases -= CASE_UPPER_FIRST_COMMON_MAX_COUNT;
+                            }
+                            cases.appendByte((CASE_UPPER_FIRST_COMMON_LOW + commonCases) << 4);
+                            commonCases = 0;
+                        }
+                        if(c > Collation::MERGE_SEPARATOR_BYTE) {
+                            c = (CASE_UPPER_FIRST_COMMON_LOW - (c >> 6)) << 4;  // 2 or 1
+                        }
+                    }
+                    // c is a separator byte 01 or 02,
+                    // or a left-shifted nibble 0x10, 0x20, ... 0xf0.
+                    cases.appendByte(c);
+                }
+            }
+        }
+
+        if((levels & Collation::TERTIARY_LEVEL_FLAG) != 0) {
+            uint32_t t = lower32 & tertiaryMask;
+            U_ASSERT((lower32 & 0xc000) != 0xc000);
+            if(t == Collation::COMMON_WEIGHT16) {
+                ++commonTertiaries;
+            } else if((tertiaryMask & 0x8000) == 0) {
+                // Tertiary weights without case bits.
+                // Move lead bytes 06..3F to C6..FF for a large common-weight range.
+                if(commonTertiaries != 0) {
+                    --commonTertiaries;
+                    while(commonTertiaries >= TER_ONLY_COMMON_MAX_COUNT) {
+                        tertiaries.appendByte(TER_ONLY_COMMON_MIDDLE);
+                        commonTertiaries -= TER_ONLY_COMMON_MAX_COUNT;
+                    }
+                    uint32_t b;
+                    if(t < Collation::COMMON_WEIGHT16) {
+                        b = TER_ONLY_COMMON_LOW + commonTertiaries;
+                    } else {
+                        b = TER_ONLY_COMMON_HIGH - commonTertiaries;
+                    }
+                    tertiaries.appendByte(b);
+                    commonTertiaries = 0;
+                }
+                if(t > Collation::COMMON_WEIGHT16) { t += 0xc000; }
+                tertiaries.appendWeight16(t);
+            } else if((options & CollationSettings::UPPER_FIRST) == 0) {
+                // Tertiary weights with caseFirst=lowerFirst.
+                // Move lead bytes 06..BF to 46..FF for the common-weight range.
+                if(commonTertiaries != 0) {
+                    --commonTertiaries;
+                    while(commonTertiaries >= TER_LOWER_FIRST_COMMON_MAX_COUNT) {
+                        tertiaries.appendByte(TER_LOWER_FIRST_COMMON_MIDDLE);
+                        commonTertiaries -= TER_LOWER_FIRST_COMMON_MAX_COUNT;
+                    }
+                    uint32_t b;
+                    if(t < Collation::COMMON_WEIGHT16) {
+                        b = TER_LOWER_FIRST_COMMON_LOW + commonTertiaries;
+                    } else {
+                        b = TER_LOWER_FIRST_COMMON_HIGH - commonTertiaries;
+                    }
+                    tertiaries.appendByte(b);
+                    commonTertiaries = 0;
+                }
+                if(t > Collation::COMMON_WEIGHT16) { t += 0x4000; }
+                tertiaries.appendWeight16(t);
+            } else {
+                // Tertiary weights with caseFirst=upperFirst.
+                // Do not change the artificial uppercase weight of a tertiary CE (0.0.ut),
+                // to keep tertiary CEs well-formed.
+                // Their case+tertiary weights must be greater than those of
+                // primary and secondary CEs.
+                //
+                // Separators    01..02 -> 01..02  (unchanged)
+                // Lowercase     03..04 -> 83..84  (includes uncased)
+                // Common weight     05 -> 85..C5  (common-weight compression range)
+                // Lowercase     06..3F -> C6..FF
+                // Mixed case    43..7F -> 43..7F
+                // Uppercase     83..BF -> 03..3F
+                // Tertiary CE   86..BF -> C6..FF
+                if(t <= Collation::MERGE_SEPARATOR_WEIGHT16) {
+                    // Keep separators unchanged.
+                } else if(lower32 > 0xffff) {
+                    // Invert case bits of primary & secondary CEs.
+                    t ^= 0xc000;
+                    if(t < (TER_UPPER_FIRST_COMMON_HIGH << 8)) {
+                        t -= 0x4000;
+                    }
+                } else {
+                    // Keep uppercase bits of tertiary CEs.
+                    U_ASSERT(0x8600 <= t && t <= 0xbfff);
+                    t += 0x4000;
+                }
+                if(commonTertiaries != 0) {
+                    --commonTertiaries;
+                    while(commonTertiaries >= TER_UPPER_FIRST_COMMON_MAX_COUNT) {
+                        tertiaries.appendByte(TER_UPPER_FIRST_COMMON_MIDDLE);
+                        commonTertiaries -= TER_UPPER_FIRST_COMMON_MAX_COUNT;
+                    }
+                    uint32_t b;
+                    if(t < (TER_UPPER_FIRST_COMMON_LOW << 8)) {
+                        b = TER_UPPER_FIRST_COMMON_LOW + commonTertiaries;
+                    } else {
+                        b = TER_UPPER_FIRST_COMMON_HIGH - commonTertiaries;
+                    }
+                    tertiaries.appendByte(b);
+                    commonTertiaries = 0;
+                }
+                tertiaries.appendWeight16(t);
+            }
+        }
+
+        if((levels & Collation::QUATERNARY_LEVEL_FLAG) != 0) {
+            uint32_t q = lower32 & 0xffff;
+            if((q & 0xc0) == 0 && q > Collation::MERGE_SEPARATOR_WEIGHT16) {
+                ++commonQuaternaries;
+            } else if(q <= Collation::MERGE_SEPARATOR_WEIGHT16 &&
+                    (options & CollationSettings::ALTERNATE_MASK) == 0 &&
+                    (quaternaries.isEmpty() ||
+                        quaternaries[quaternaries.length() - 1] == Collation::MERGE_SEPARATOR_BYTE)) {
+                // If alternate=non-ignorable and there are only
+                // common quaternary weights between two separators,
+                // then we need not write anything between these separators.
+                // The only weights greater than the merge separator and less than the common weight
+                // are shifted primary weights, which are not generated for alternate=non-ignorable.
+                // There are also exactly as many quaternary weights as tertiary weights,
+                // so level length differences are handled already on tertiary level.
+                // Any above-common quaternary weight will compare greater regardless.
+                quaternaries.appendByte(q >> 8);
+            } else {
+                if(q <= Collation::MERGE_SEPARATOR_WEIGHT16) {
+                    q >>= 8;
+                } else {
+                    q = 0xfc + ((q >> 6) & 3);
+                }
+                if(commonQuaternaries != 0) {
+                    --commonQuaternaries;
+                    while(commonQuaternaries >= QUAT_COMMON_MAX_COUNT) {
+                        quaternaries.appendByte(QUAT_COMMON_MIDDLE);
+                        commonQuaternaries -= QUAT_COMMON_MAX_COUNT;
+                    }
+                    uint32_t b;
+                    if(q < QUAT_COMMON_LOW) {
+                        b = QUAT_COMMON_LOW + commonQuaternaries;
+                    } else {
+                        b = QUAT_COMMON_HIGH - commonQuaternaries;
+                    }
+                    quaternaries.appendByte(b);
+                    commonQuaternaries = 0;
+                }
+                quaternaries.appendByte(q);
+            }
+        }
+
+        if((lower32 >> 24) == Collation::LEVEL_SEPARATOR_BYTE) { break; }  // ce == NO_CE
+    }
+
+    if(U_FAILURE(errorCode)) { return; }
+
+    // Append the beyond-primary levels.
+    UBool ok = TRUE;
+    if((levels & Collation::SECONDARY_LEVEL_FLAG) != 0) {
+        if(!callback.needToWrite(Collation::SECONDARY_LEVEL)) { return; }
+        ok &= secondaries.isOk();
+        sink.Append(Collation::LEVEL_SEPARATOR_BYTE);
+        uint8_t *secs = secondaries.data();
+        int32_t length = secondaries.length() - 1;  // Ignore the trailing NO_CE.
+        if((options & CollationSettings::BACKWARD_SECONDARY) != 0) {
+            // The backwards secondary level compares secondary weights backwards
+            // within segments separated by the merge separator (U+FFFE, weight 02).
+            // The separator weights 01 & 02 were reduced to 00 & 01 so that
+            // we do not accidentally separate at a _second_ weight byte of 02.
+            int32_t start = 0;
+            for(;;) {
+                // Find the merge separator or the NO_CE terminator.
+                int32_t limit;
+                if(anyMergeSeparators) {
+                    limit = start;
+                    while(secs[limit] > 1) { ++limit; }
+                } else {
+                    limit = length;
+                }
+                // Reverse this segment.
+                if(start < limit) {
+                    uint8_t *p = secs + start;
+                    uint8_t *q = secs + limit - 1;
+                    while(p < q) {
+                        uint8_t s = *p;
+                        *p++ = *q;
+                        *q-- = s;
+                    }
+                }
+                // Did we reach the end of the string?
+                if(secs[limit] == 0) { break; }
+                // Restore the merge separator.
+                secs[limit] = 2;
+                // Skip the merge separator and continue.
+                start = limit + 1;
+            }
+        }
+        sink.Append(reinterpret_cast<char *>(secs), length);
+    }
+
+    if((levels & Collation::CASE_LEVEL_FLAG) != 0) {
+        if(!callback.needToWrite(Collation::CASE_LEVEL)) { return; }
+        ok &= cases.isOk();
+        sink.Append(Collation::LEVEL_SEPARATOR_BYTE);
+        // Write pairs of nibbles as bytes, except separator bytes as themselves.
+        int32_t length = cases.length() - 1;  // Ignore the trailing NO_CE.
+        uint8_t b = 0;
+        for(int32_t i = 0; i < length; ++i) {
+            uint8_t c = (uint8_t)cases[i];
+            if(c <= Collation::MERGE_SEPARATOR_BYTE) {
+                U_ASSERT(c != 0);
+                if(b != 0) {
+                    sink.Append(b);
+                    b = 0;
+                }
+                sink.Append(c);
+            } else {
+                U_ASSERT((c & 0xf) == 0);
+                if(b == 0) {
+                    b = c;
+                } else {
+                    sink.Append(b | (c >> 4));
+                    b = 0;
+                }
+            }
+        }
+        if(b != 0) {
+            sink.Append(b);
+        }
+    }
+
+    if((levels & Collation::TERTIARY_LEVEL_FLAG) != 0) {
+        if(!callback.needToWrite(Collation::TERTIARY_LEVEL)) { return; }
+        ok &= tertiaries.isOk();
+        sink.Append(Collation::LEVEL_SEPARATOR_BYTE);
+        tertiaries.appendTo(sink);
+    }
+
+    if((levels & Collation::QUATERNARY_LEVEL_FLAG) != 0) {
+        if(!callback.needToWrite(Collation::QUATERNARY_LEVEL)) { return; }
+        ok &= quaternaries.isOk();
+        sink.Append(Collation::LEVEL_SEPARATOR_BYTE);
+        quaternaries.appendTo(sink);
+    }
+
+    if(!ok || !sink.IsOk()) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+    }
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationkeys.h b/icu4c/source/i18n/collationkeys.h
new file mode 100644 (file)
index 0000000..d1cc76f
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationkeys.h
+*
+* created on: 2012sep02
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONKEYS_H__
+#define __COLLATIONKEYS_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/bytestream.h"
+#include "unicode/ucol.h"
+#include "charstr.h"
+#include "collation.h"
+
+U_NAMESPACE_BEGIN
+
+class CollationIterator;
+struct CollationDataReader;
+struct CollationSettings;
+
+class SortKeyByteSink : public ByteSink {
+public:
+    SortKeyByteSink(char *dest, int32_t destCapacity)
+            : buffer_(dest), capacity_(destCapacity),
+              appended_(0), ignore_(0) {}
+    virtual ~SortKeyByteSink();
+
+    void IgnoreBytes(int32_t numIgnore) { ignore_ = numIgnore; }
+
+    virtual void Append(const char *bytes, int32_t n);
+    void Append(uint32_t b) {
+        if (ignore_ > 0) {
+            --ignore_;
+        } else {
+            if (appended_ < capacity_ || Resize(1, appended_)) {
+                buffer_[appended_] = (char)b;
+            }
+            ++appended_;
+        }
+    }
+    virtual char *GetAppendBuffer(int32_t min_capacity,
+                                  int32_t desired_capacity_hint,
+                                  char *scratch, int32_t scratch_capacity,
+                                  int32_t *result_capacity);
+    int32_t NumberOfBytesAppended() const { return appended_; }
+
+    /**
+     * @return how many bytes can be appended (including ignored ones)
+     *         without reallocation
+     */
+    int32_t GetRemainingCapacity() const {
+        // Either ignore_ or appended_ should be 0.
+        return ignore_ + capacity_ - appended_;
+    }
+
+    UBool Overflowed() const { return appended_ > capacity_; }
+    /** @return FALSE if memory allocation failed */
+    UBool IsOk() const { return buffer_ != NULL; }
+
+protected:
+    virtual void AppendBeyondCapacity(const char *bytes, int32_t n, int32_t length) = 0;
+    virtual UBool Resize(int32_t appendCapacity, int32_t length) = 0;
+
+    void SetNotOk() {
+        buffer_ = NULL;
+        capacity_ = 0;
+    }
+
+    char *buffer_;
+    int32_t capacity_;
+    int32_t appended_;
+    int32_t ignore_;
+
+private:
+    SortKeyByteSink(const SortKeyByteSink &); // copy constructor not implemented
+    SortKeyByteSink &operator=(const SortKeyByteSink &); // assignment operator not implemented
+};
+
+class U_I18N_API CollationKeys /* not : public UObject because all methods are static */ {
+public:
+    class LevelCallback : public UMemory {
+    public:
+        virtual ~LevelCallback();
+        /**
+         * @param level The next level about to be written to the ByteSink.
+         * @return TRUE if the level is to be written
+         *         (the base class implementation always returns TRUE)
+         */
+        virtual UBool needToWrite(Collation::Level level);
+    };
+
+    /**
+     * Writes the sort key bytes for minLevel up to the iterator data's strength.
+     * Optionally writes the case level.
+     * Stops writing levels when callback.needToWrite(level) returns FALSE.
+     * Separates levels with the LEVEL_SEPARATOR_BYTE
+     * but does not write a TERMINATOR_BYTE.
+     */
+    static void writeSortKeyUpToQuaternary(CollationIterator &iter,
+                                           const UBool *compressibleBytes,
+                                           const CollationSettings &settings,
+                                           SortKeyByteSink &sink,
+                                           Collation::Level minLevel, LevelCallback &callback,
+                                           UBool preflight, UErrorCode &errorCode);
+private:
+    friend struct CollationDataReader;
+
+    CollationKeys();  // no instantiation
+
+    // Secondary level: Compress up to 33 common weights as 05..25 or 25..45.
+    static const uint32_t SEC_COMMON_LOW = Collation::COMMON_BYTE;
+    static const uint32_t SEC_COMMON_MIDDLE = SEC_COMMON_LOW + 0x20;
+    static const uint32_t SEC_COMMON_HIGH = SEC_COMMON_LOW + 0x40;
+    static const int32_t SEC_COMMON_MAX_COUNT = 0x21;
+
+    // Case level, lowerFirst: Compress up to 7 common weights as 1..7 or 7..13.
+    static const uint32_t CASE_LOWER_FIRST_COMMON_LOW = 1;
+    static const uint32_t CASE_LOWER_FIRST_COMMON_MIDDLE = 7;
+    static const uint32_t CASE_LOWER_FIRST_COMMON_HIGH = 13;
+    static const int32_t CASE_LOWER_FIRST_COMMON_MAX_COUNT = 7;
+
+    // Case level, upperFirst: Compress up to 13 common weights as 3..15.
+    static const uint32_t CASE_UPPER_FIRST_COMMON_LOW = 3;
+    static const uint32_t CASE_UPPER_FIRST_COMMON_HIGH = 15;
+    static const int32_t CASE_UPPER_FIRST_COMMON_MAX_COUNT = 13;
+
+    // Tertiary level only (no case): Compress up to 97 common weights as 05..65 or 65..C5.
+    static const uint32_t TER_ONLY_COMMON_LOW = Collation::COMMON_BYTE;
+    static const uint32_t TER_ONLY_COMMON_MIDDLE = TER_ONLY_COMMON_LOW + 0x60;
+    static const uint32_t TER_ONLY_COMMON_HIGH = TER_ONLY_COMMON_LOW + 0xc0;
+    static const int32_t TER_ONLY_COMMON_MAX_COUNT = 0x61;
+
+    // Tertiary with case, lowerFirst: Compress up to 33 common weights as 05..25 or 25..45.
+    static const uint32_t TER_LOWER_FIRST_COMMON_LOW = Collation::COMMON_BYTE;
+    static const uint32_t TER_LOWER_FIRST_COMMON_MIDDLE = TER_LOWER_FIRST_COMMON_LOW + 0x20;
+    static const uint32_t TER_LOWER_FIRST_COMMON_HIGH = TER_LOWER_FIRST_COMMON_LOW + 0x40;
+    static const int32_t TER_LOWER_FIRST_COMMON_MAX_COUNT = 0x21;
+
+    // Tertiary with case, upperFirst: Compress up to 33 common weights as 85..A5 or A5..C5.
+    static const uint32_t TER_UPPER_FIRST_COMMON_LOW = Collation::COMMON_BYTE + 0x80;
+    static const uint32_t TER_UPPER_FIRST_COMMON_MIDDLE = TER_UPPER_FIRST_COMMON_LOW + 0x20;
+    static const uint32_t TER_UPPER_FIRST_COMMON_HIGH = TER_UPPER_FIRST_COMMON_LOW + 0x40;
+    static const int32_t TER_UPPER_FIRST_COMMON_MAX_COUNT = 0x21;
+
+    // Quaternary level: Compress up to 113 common weights as 1C..8C or 8C..FC.
+    static const uint32_t QUAT_COMMON_LOW = 0x1c;
+    static const uint32_t QUAT_COMMON_MIDDLE = QUAT_COMMON_LOW + 0x70;
+    static const uint32_t QUAT_COMMON_HIGH = QUAT_COMMON_LOW + 0xE0;
+    static const int32_t QUAT_COMMON_MAX_COUNT = 0x71;
+    // Primary weights shifted to quaternary level must be encoded with
+    // a lead byte below the common-weight compression range.
+    static const uint32_t QUAT_SHIFTED_LIMIT_BYTE = QUAT_COMMON_LOW - 1;  // 0x1b
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONKEYS_H__
diff --git a/icu4c/source/i18n/collationroot.cpp b/icu4c/source/i18n/collationroot.cpp
new file mode 100644 (file)
index 0000000..b5d8b49
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationroot.cpp
+*
+* created on: 2012dec17
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/coll.h"
+#include "unicode/udata.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationdatareader.h"
+#include "collationroot.h"
+#include "collationsettings.h"
+#include "collationtailoring.h"
+#include "normalizer2impl.h"
+#include "ucln_in.h"
+#include "udatamem.h"
+#include "umutex.h"
+
+U_NAMESPACE_BEGIN
+
+namespace {
+
+static const CollationTailoring *rootSingleton = NULL;
+static UInitOnce initOnce = U_INITONCE_INITIALIZER;
+
+}  // namespace
+
+U_CDECL_BEGIN
+
+static UBool U_CALLCONV uprv_collation_root_cleanup() {
+    SharedObject::clearPtr(rootSingleton);
+    initOnce.reset();
+    return TRUE;
+}
+
+U_CDECL_END
+
+void
+CollationRoot::load(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    LocalPointer<CollationTailoring> t(new CollationTailoring(NULL));
+    if(t.isNull() || t->isBogus()) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return;
+    }
+    t->memory = udata_openChoice(U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "coll",
+                                 "icu", "ucadata",
+                                 CollationDataReader::isAcceptable, t->version, &errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    const uint8_t *inBytes = static_cast<const uint8_t *>(udata_getMemory(t->memory));
+    CollationDataReader::read(NULL, inBytes, udata_getLength(t->memory), *t, errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    ucln_i18n_registerCleanup(UCLN_I18N_COLLATION_ROOT, uprv_collation_root_cleanup);
+    t->addRef();  // The rootSingleton takes ownership.
+    rootSingleton = t.orphan();
+}
+
+const CollationTailoring *
+CollationRoot::getRoot(UErrorCode &errorCode) {
+    umtx_initOnce(initOnce, CollationRoot::load, errorCode);
+    if(U_FAILURE(errorCode)) { return NULL; }
+    return rootSingleton;
+}
+
+const CollationData *
+CollationRoot::getData(UErrorCode &errorCode) {
+    const CollationTailoring *root = getRoot(errorCode);
+    if(U_FAILURE(errorCode)) { return NULL; }
+    return root->data;
+}
+
+const CollationSettings *
+CollationRoot::getSettings(UErrorCode &errorCode) {
+    const CollationTailoring *root = getRoot(errorCode);
+    if(U_FAILURE(errorCode)) { return NULL; }
+    return root->settings;
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationroot.h b/icu4c/source/i18n/collationroot.h
new file mode 100644 (file)
index 0000000..576d620
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationroot.h
+*
+* created on: 2012dec17
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONROOT_H__
+#define __COLLATIONROOT_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+U_NAMESPACE_BEGIN
+
+struct CollationData;
+struct CollationSettings;
+struct CollationTailoring;
+
+/**
+ * Collation root provider.
+ */
+class U_I18N_API CollationRoot {  // purely static
+public:
+    static const CollationTailoring *getRoot(UErrorCode &errorCode);
+    static const CollationData *getData(UErrorCode &errorCode);
+    static const CollationSettings *getSettings(UErrorCode &errorCode);
+
+private:
+    static void load(UErrorCode &errorCode);
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONROOT_H__
diff --git a/icu4c/source/i18n/collationrootelements.cpp b/icu4c/source/i18n/collationrootelements.cpp
new file mode 100644 (file)
index 0000000..d59048b
--- /dev/null
@@ -0,0 +1,314 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationrootelements.cpp
+*
+* created on: 2013mar05
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "collation.h"
+#include "collationrootelements.h"
+#include "uassert.h"
+
+U_NAMESPACE_BEGIN
+
+int64_t
+CollationRootElements::lastCEWithPrimaryBefore(uint32_t p) const {
+    if(p == 0) { return 0; }
+    U_ASSERT(p > elements[elements[IX_FIRST_PRIMARY_INDEX]]);
+    int32_t index = findP(p);
+    uint32_t q = elements[index];
+    uint32_t secTer;
+    if(p == (q & 0xffffff00)) {
+        // p == elements[index] is a root primary. Find the CE before it.
+        // We must not be in a primary range.
+        U_ASSERT((q & PRIMARY_STEP_MASK) == 0);
+        secTer = elements[index - 1];
+        if((secTer & SEC_TER_DELTA_FLAG) == 0) {
+            // Primary CE just before p.
+            p = secTer & 0xffffff00;
+            secTer = Collation::COMMON_SEC_AND_TER_CE;
+        } else {
+            // secTer = last secondary & tertiary for the previous primary
+            index -= 2;
+            for(;;) {
+                p = elements[index];
+                if((p & SEC_TER_DELTA_FLAG) == 0) {
+                    p &= 0xffffff00;
+                    break;
+                }
+                --index;
+            }
+        }
+    } else {
+        // p > elements[index] which is the previous primary.
+        // Find the last secondary & tertiary weights for it.
+        p = q & 0xffffff00;
+        secTer = Collation::COMMON_SEC_AND_TER_CE;
+        for(;;) {
+            q = elements[++index];
+            if((q & SEC_TER_DELTA_FLAG) == 0) {
+                // We must not be in a primary range.
+                U_ASSERT((q & PRIMARY_STEP_MASK) == 0);
+                break;
+            }
+            secTer = q;
+        }
+    }
+    return ((int64_t)p << 32) | (secTer & ~SEC_TER_DELTA_FLAG);
+}
+
+int64_t
+CollationRootElements::firstCEWithPrimaryAtLeast(uint32_t p) const {
+    if(p == 0) { return 0; }
+    int32_t index = findP(p);
+    if(p != (elements[index] & 0xffffff00)) {
+        for(;;) {
+            p = elements[++index];
+            if((p & SEC_TER_DELTA_FLAG) == 0) {
+                // First primary after p. We must not be in a primary range.
+                U_ASSERT((p & PRIMARY_STEP_MASK) == 0);
+                break;
+            }
+        }
+    }
+    // The code above guarantees that p has at most 3 bytes: (p & 0xff) == 0.
+    return ((int64_t)p << 32) | Collation::COMMON_SEC_AND_TER_CE;
+}
+
+uint32_t
+CollationRootElements::getPrimaryBefore(uint32_t p, UBool isCompressible) const {
+    int32_t index = findPrimary(p);
+    int32_t step;
+    uint32_t q = elements[index];
+    if(p == (q & 0xffffff00)) {
+        // Found p itself. Return the previous primary.
+        // See if p is at the end of a previous range.
+        step = (int32_t)q & PRIMARY_STEP_MASK;
+        if(step == 0) {
+            // p is not at the end of a range. Look for the previous primary.
+            do {
+                p = elements[--index];
+            } while((p & SEC_TER_DELTA_FLAG) != 0);
+            return p & 0xffffff00;
+        }
+    } else {
+        // p is in a range, and not at the start.
+        uint32_t nextElement = elements[index + 1];
+        U_ASSERT(isEndOfPrimaryRange(nextElement));
+        step = (int32_t)nextElement & PRIMARY_STEP_MASK;
+    }
+    // Return the previous range primary.
+    if((p & 0xffff) == 0) {
+        return Collation::decTwoBytePrimaryByOneStep(p, isCompressible, step);
+    } else {
+        return Collation::decThreeBytePrimaryByOneStep(p, isCompressible, step);
+    }
+}
+
+uint32_t
+CollationRootElements::getSecondaryBefore(uint32_t p, uint32_t s) const {
+    int32_t index;
+    uint32_t previousSec, sec;
+    if(p == 0) {
+        index = (int32_t)elements[IX_FIRST_SECONDARY_INDEX];
+        // Gap at the beginning of the secondary CE range.
+        previousSec = 0;
+        sec = elements[index] >> 16;
+    } else {
+        index = findPrimary(p) + 1;
+        previousSec = Collation::MERGE_SEPARATOR_WEIGHT16;
+        sec = Collation::COMMON_WEIGHT16;
+    }
+    U_ASSERT(s >= sec);
+    while(s > sec) {
+        previousSec = sec;
+        U_ASSERT((elements[index] & SEC_TER_DELTA_FLAG) != 0);
+        sec = elements[index++] >> 16;
+    }
+    U_ASSERT(sec == s);
+    return previousSec;
+}
+
+uint32_t
+CollationRootElements::getTertiaryBefore(uint32_t p, uint32_t s, uint32_t t) const {
+    U_ASSERT((t & ~Collation::ONLY_TERTIARY_MASK) == 0);
+    int32_t index;
+    uint32_t previousTer, secTer;
+    if(p == 0) {
+        if(s == 0) {
+            index = (int32_t)elements[IX_FIRST_TERTIARY_INDEX];
+            // Gap at the beginning of the tertiary CE range.
+            previousTer = 0;
+        } else {
+            index = (int32_t)elements[IX_FIRST_SECONDARY_INDEX];
+            previousTer = Collation::MERGE_SEPARATOR_WEIGHT16;
+        }
+        secTer = elements[index] & ~SEC_TER_DELTA_FLAG;
+    } else {
+        index = findPrimary(p) + 1;
+        previousTer = Collation::MERGE_SEPARATOR_WEIGHT16;
+        secTer = Collation::COMMON_SEC_AND_TER_CE;
+    }
+    uint32_t st = (s << 16) | t;
+    while(st > secTer) {
+        if((secTer >> 16) == s) { previousTer = secTer; }
+        U_ASSERT((elements[index] & SEC_TER_DELTA_FLAG) != 0);
+        secTer = elements[index++] & ~SEC_TER_DELTA_FLAG;
+    }
+    U_ASSERT(secTer == st);
+    return previousTer & 0xffff;
+}
+
+uint32_t
+CollationRootElements::getPrimaryAfter(uint32_t p, int32_t index, UBool isCompressible) const {
+    U_ASSERT(p == (elements[index] & 0xffffff00) || isEndOfPrimaryRange(elements[index + 1]));
+    uint32_t q = elements[++index];
+    int32_t step;
+    if((q & SEC_TER_DELTA_FLAG) == 0 && (step = (int32_t)q & PRIMARY_STEP_MASK) != 0) {
+        // Return the next primary in this range.
+        if((p & 0xffff) == 0) {
+            return Collation::incTwoBytePrimaryByOffset(p, isCompressible, step);
+        } else {
+            return Collation::incThreeBytePrimaryByOffset(p, isCompressible, step);
+        }
+    } else {
+        // Return the next primary in the list.
+        while((q & SEC_TER_DELTA_FLAG) != 0) {
+            q = elements[++index];
+        }
+        U_ASSERT((q & PRIMARY_STEP_MASK) == 0);
+        return q;
+    }
+}
+
+uint32_t
+CollationRootElements::getSecondaryAfter(int32_t index, uint32_t s) const {
+    uint32_t secLimit;
+    if(index == 0) {
+        // primary = 0
+        index = (int32_t)elements[IX_FIRST_SECONDARY_INDEX];
+        // Gap at the end of the secondary CE range.
+        secLimit = 0x10000;
+    } else {
+        U_ASSERT(index >= (int32_t)elements[IX_FIRST_PRIMARY_INDEX]);
+        ++index;
+        // Gap for secondaries of primary CEs.
+        secLimit = getSecondaryBoundary();
+    }
+    for(;;) {
+        uint32_t secTer = elements[index];
+        if((secTer & SEC_TER_DELTA_FLAG) == 0) { return secLimit; }
+        uint32_t sec = secTer >> 16;
+        if(sec > s) { return sec; }
+        ++index;
+    }
+}
+
+uint32_t
+CollationRootElements::getTertiaryAfter(int32_t index, uint32_t s, uint32_t t) const {
+    uint32_t terLimit;
+    if(index == 0) {
+        // primary = 0
+        if(s == 0) {
+            index = (int32_t)elements[IX_FIRST_TERTIARY_INDEX];
+            // Gap at the end of the tertiary CE range.
+            terLimit = 0x4000;
+        } else {
+            index = (int32_t)elements[IX_FIRST_SECONDARY_INDEX];
+            // Gap for tertiaries of primary/secondary CEs.
+            terLimit = getTertiaryBoundary();
+        }
+    } else {
+        U_ASSERT(index >= (int32_t)elements[IX_FIRST_PRIMARY_INDEX]);
+        ++index;
+        terLimit = getTertiaryBoundary();
+    }
+    uint32_t st = (s << 16) | t;
+    for(;;) {
+        uint32_t secTer = elements[index];
+        // No tertiary greater than t for this primary+secondary.
+        if((secTer & SEC_TER_DELTA_FLAG) == 0 || (secTer >> 16) > s) { return terLimit; }
+        secTer &= ~SEC_TER_DELTA_FLAG;
+        if(secTer > st) { return secTer & 0xffff; }
+        ++index;
+    }
+}
+
+int32_t
+CollationRootElements::findPrimary(uint32_t p) const {
+    // Requirement: p must occur as a root primary.
+    U_ASSERT((p & 0xff) == 0);  // at most a 3-byte primary
+    int32_t index = findP(p);
+    // If p is in a range, then we just assume that p is an actual primary in this range.
+    // (Too cumbersome/expensive to check.)
+    // Otherwise, it must be an exact match.
+    U_ASSERT(isEndOfPrimaryRange(elements[index + 1]) || p == (elements[index] & 0xffffff00));
+    return index;
+}
+
+int32_t
+CollationRootElements::findP(uint32_t p) const {
+    // p need not occur as a root primary.
+    // For example, it might be a reordering group boundary.
+    U_ASSERT((p >> 24) != Collation::UNASSIGNED_IMPLICIT_BYTE);
+    // modified binary search
+    int32_t start = (int32_t)elements[IX_FIRST_PRIMARY_INDEX];
+    U_ASSERT(p >= elements[start]);
+    int32_t limit = length - 1;
+    U_ASSERT(elements[limit] >= PRIMARY_SENTINEL);
+    U_ASSERT(p < elements[limit]);
+    while((start + 1) < limit) {
+        // Invariant: elements[start] and elements[limit] are primaries,
+        // and elements[start]<=p<=elements[limit].
+        int32_t i = (start + limit) / 2;
+        uint32_t q = elements[i];
+        if((q & SEC_TER_DELTA_FLAG) != 0) {
+            // Find the next primary.
+            int32_t j = i + 1;
+            for(;;) {
+                if(j == limit) { break; }
+                q = elements[j];
+                if((q & SEC_TER_DELTA_FLAG) == 0) {
+                    i = j;
+                    break;
+                }
+                ++j;
+            }
+            if((q & SEC_TER_DELTA_FLAG) != 0) {
+                // Find the preceding primary.
+                j = i - 1;
+                for(;;) {
+                    if(j == start) { break; }
+                    q = elements[j];
+                    if((q & SEC_TER_DELTA_FLAG) == 0) {
+                        i = j;
+                        break;
+                    }
+                    --j;
+                }
+                if((q & SEC_TER_DELTA_FLAG) != 0) {
+                    // No primary between start and limit.
+                    break;
+                }
+            }
+        }
+        if(p < (q & 0xffffff00)) {  // Reset the "step" bits of a range end primary.
+            limit = i;
+        } else {
+            start = i;
+        }
+    }
+    return start;
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationrootelements.h b/icu4c/source/i18n/collationrootelements.h
new file mode 100644 (file)
index 0000000..1fa2561
--- /dev/null
@@ -0,0 +1,254 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationrootelements.h
+*
+* created on: 2013mar01
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONROOTELEMENTS_H__
+#define __COLLATIONROOTELEMENTS_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/uobject.h"
+#include "collation.h"
+
+U_NAMESPACE_BEGIN
+
+/**
+ * Container and access methods for collation elements and weights
+ * that occur in the root collator.
+ * Needed for finding boundaries for building a tailoring.
+ *
+ * This class takes and returns 16-bit secondary and tertiary weights.
+ */
+class U_I18N_API CollationRootElements : public UMemory {
+public:
+    CollationRootElements(const uint32_t *rootElements, int32_t rootElementsLength)
+            : elements(rootElements), length(rootElementsLength) {}
+
+    /**
+     * Higher than any root primary.
+     */
+    static const uint32_t PRIMARY_SENTINEL = 0xffffff00;
+
+    /**
+     * Flag in a root element, set if the element contains secondary & tertiary weights,
+     * rather than a primary.
+     */
+    static const uint32_t SEC_TER_DELTA_FLAG = 0x80;
+    /**
+     * Mask for getting the primary range step value from a primary-range-end element.
+     */
+    static const uint8_t PRIMARY_STEP_MASK = 0x7f;
+
+    enum {
+        /**
+         * Index of the first CE with a non-zero tertiary weight.
+         * Same as the start of the compact root elements table.
+         */
+        IX_FIRST_TERTIARY_INDEX,
+        /**
+         * Index of the first CE with a non-zero secondary weight.
+         */
+        IX_FIRST_SECONDARY_INDEX,
+        /**
+         * Index of the first CE with a non-zero primary weight.
+         */
+        IX_FIRST_PRIMARY_INDEX,
+        /**
+         * Must match Collation::COMMON_SEC_AND_TER_CE.
+         */
+        IX_COMMON_SEC_AND_TER_CE,
+        /**
+         * Secondary & tertiary boundaries.
+         * Bits 31..24: [fixed last secondary common byte 45]
+         * Bits 23..16: [fixed first ignorable secondary byte 80]
+         * Bits 15.. 8: reserved, 0
+         * Bits  7.. 0: [fixed first ignorable tertiary byte 3C]
+         */
+        IX_SEC_TER_BOUNDARIES,
+        /**
+         * The current number of indexes.
+         * Currently the same as elements[IX_FIRST_TERTIARY_INDEX].
+         */
+        IX_COUNT
+    };
+
+    /**
+     * Returns the boundary between tertiary weights of primary/secondary CEs
+     * and those of tertiary CEs.
+     * This is the upper limit for tertiaries of primary/secondary CEs.
+     * This minus one is the lower limit for tertiaries of tertiary CEs.
+     */
+    uint32_t getTertiaryBoundary() const {
+        return (elements[IX_SEC_TER_BOUNDARIES] << 8) & 0xff00;
+    }
+
+    /**
+     * Returns the first assigned tertiary CE.
+     */
+    uint32_t getFirstTertiaryCE() const {
+        return elements[elements[IX_FIRST_TERTIARY_INDEX]] & ~SEC_TER_DELTA_FLAG;
+    }
+
+    /**
+     * Returns the last assigned tertiary CE.
+     */
+    uint32_t getLastTertiaryCE() const {
+        return elements[elements[IX_FIRST_SECONDARY_INDEX] - 1] & ~SEC_TER_DELTA_FLAG;
+    }
+
+    /**
+     * Returns the last common secondary weight.
+     * This is the lower limit for secondaries of primary CEs.
+     */
+    uint32_t getLastCommonSecondary() const {
+        return (elements[IX_SEC_TER_BOUNDARIES] >> 16) & 0xff00;
+    }
+
+    /**
+     * Returns the boundary between secondary weights of primary CEs
+     * and those of secondary CEs.
+     * This is the upper limit for secondaries of primary CEs.
+     * This minus one is the lower limit for secondaries of secondary CEs.
+     */
+    uint32_t getSecondaryBoundary() const {
+        return (elements[IX_SEC_TER_BOUNDARIES] >> 8) & 0xff00;
+    }
+
+    /**
+     * Returns the first assigned secondary CE.
+     */
+    uint32_t getFirstSecondaryCE() const {
+        return elements[elements[IX_FIRST_SECONDARY_INDEX]] & ~SEC_TER_DELTA_FLAG;
+    }
+
+    /**
+     * Returns the last assigned secondary CE.
+     */
+    uint32_t getLastSecondaryCE() const {
+        return elements[elements[IX_FIRST_PRIMARY_INDEX] - 1] & ~SEC_TER_DELTA_FLAG;
+    }
+
+    /**
+     * Returns the first assigned primary weight.
+     */
+    uint32_t getFirstPrimary() const {
+        return elements[elements[IX_FIRST_PRIMARY_INDEX]];  // step=0: cannot be a range end
+    }
+
+    /**
+     * Returns the first assigned primary CE.
+     */
+    int64_t getFirstPrimaryCE() const {
+        return Collation::makeCE(getFirstPrimary());
+    }
+
+    /**
+     * Returns the last root CE with a primary weight before p.
+     * Intended only for reordering group boundaries.
+     */
+    int64_t lastCEWithPrimaryBefore(uint32_t p) const;
+
+    /**
+     * Returns the first root CE with a primary weight of at least p.
+     * Intended only for reordering group boundaries.
+     */
+    int64_t firstCEWithPrimaryAtLeast(uint32_t p) const;
+
+    /**
+     * Returns the primary weight before p.
+     * p must be greater than the first root primary.
+     */
+    uint32_t getPrimaryBefore(uint32_t p, UBool isCompressible) const;
+
+    /** Returns the secondary weight before [p, s]. */
+    uint32_t getSecondaryBefore(uint32_t p, uint32_t s) const;
+
+    /** Returns the tertiary weight before [p, s, t]. */
+    uint32_t getTertiaryBefore(uint32_t p, uint32_t s, uint32_t t) const;
+
+    /**
+     * Finds the index of the input primary.
+     * p must occur as a root primary, and must not be 0.
+     */
+    int32_t findPrimary(uint32_t p) const;
+
+    /**
+     * Returns the primary weight after p where index=findPrimary(p).
+     * p must be at least the first root primary.
+     */
+    uint32_t getPrimaryAfter(uint32_t p, int32_t index, UBool isCompressible) const;
+    /**
+     * Returns the secondary weight after [p, s] where index=findPrimary(p)
+     * except use index=0 for p=0.
+     */
+    uint32_t getSecondaryAfter(int32_t index, uint32_t s) const;
+    /**
+     * Returns the tertiary weight after [p, s, t] where index=findPrimary(p)
+     * except use index=0 for p=0.
+     */
+    uint32_t getTertiaryAfter(int32_t index, uint32_t s, uint32_t t) const;
+
+private:
+    /**
+     * Finds the largest index i where elements[i]<=p.
+     * Requires first primary<=p<0xffffff00 (PRIMARY_SENTINEL).
+     * Does not require that p is a root collator primary.
+     */
+    int32_t findP(uint32_t p) const;
+
+    static inline UBool isEndOfPrimaryRange(uint32_t q) {
+        return (q & SEC_TER_DELTA_FLAG) == 0 && (q & PRIMARY_STEP_MASK) != 0;
+    }
+
+    /**
+     * Data structure:
+     *
+     * The first few entries are indexes, up to elements[IX_FIRST_TERTIARY_INDEX].
+     * See the comments on the IX_ constants.
+     *
+     * All other elements are a compact form of the root collator CEs
+     * in collation order.
+     *
+     * Primary weights have the SEC_TER_DELTA_FLAG flag not set.
+     * A primary-weight element by itself represents a root CE
+     * with Collation::COMMON_SEC_AND_TER_CE.
+     *
+     * If there are root CEs with the same primary but other secondary/tertiary weights,
+     * then for each such CE there is an element with those secondary and tertiary weights,
+     * and with the SEC_TER_DELTA_FLAG flag set.
+     *
+     * A range of only-primary CEs with a consistent "step" increment
+     * from each primary to the next may be stored as a range.
+     * Only the first and last primary are stored, and the last has the step
+     * value in the low bits (PRIMARY_STEP_MASK).
+     *
+     * An range-end element may also either start a new range or be followed by
+     * elements with secondary/tertiary deltas.
+     *
+     * A primary element that is not a range end has zero step bits.
+     *
+     * There is no element for the completely ignorable CE (all weights 0).
+     *
+     * Before elements[IX_FIRST_PRIMARY_INDEX], all elements are secondary/tertiary deltas,
+     * for all of the ignorable root CEs.
+     *
+     * There are no elements for unassigned-implicit primary CEs.
+     * All primaries stored here are at most 3 bytes long.
+     */
+    const uint32_t *elements;
+    int32_t length;
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONROOTELEMENTS_H__
diff --git a/icu4c/source/i18n/collationruleparser.cpp b/icu4c/source/i18n/collationruleparser.cpp
new file mode 100644 (file)
index 0000000..a47af87
--- /dev/null
@@ -0,0 +1,887 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationruleparser.cpp
+*
+* (replaced the former ucol_tok.cpp)
+*
+* created on: 2013apr10
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/normalizer2.h"
+#include "unicode/parseerr.h"
+#include "unicode/uchar.h"
+#include "unicode/ucol.h"
+#include "unicode/uloc.h"
+#include "unicode/unistr.h"
+#include "unicode/utf16.h"
+#include "charstr.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationruleparser.h"
+#include "collationsettings.h"
+#include "collationtailoring.h"
+#include "cstring.h"
+#include "patternprops.h"
+#include "uassert.h"
+#include "uvectr32.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
+
+U_NAMESPACE_BEGIN
+
+namespace {
+
+static const UChar BEFORE[] = { 0x5b, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0 };  // "[before"
+const int32_t BEFORE_LENGTH = 7;
+
+}  // namespace
+
+CollationRuleParser::Sink::~Sink() {}
+
+void
+CollationRuleParser::Sink::suppressContractions(const UnicodeSet &, const char *&, UErrorCode &) {}
+
+void
+CollationRuleParser::Sink::optimize(const UnicodeSet &, const char *&, UErrorCode &) {}
+
+CollationRuleParser::Importer::~Importer() {}
+
+CollationRuleParser::CollationRuleParser(const CollationData *base, UErrorCode &errorCode)
+        : nfd(*Normalizer2::getNFDInstance(errorCode)),
+          nfc(*Normalizer2::getNFCInstance(errorCode)),
+          rules(NULL), baseData(base), settings(NULL),
+          parseError(NULL), errorReason(NULL),
+          sink(NULL), importer(NULL),
+          ruleIndex(0) {
+}
+
+CollationRuleParser::~CollationRuleParser() {
+}
+
+void
+CollationRuleParser::parse(const UnicodeString &ruleString,
+                           CollationSettings &outSettings,
+                           UParseError *outParseError,
+                           UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    settings = &outSettings;
+    parseError = outParseError;
+    if(parseError != NULL) {
+        parseError->line = 0;
+        parseError->offset = -1;
+        parseError->preContext[0] = 0;
+        parseError->postContext[0] = 0;
+    }
+    errorReason = NULL;
+    parse(ruleString, errorCode);
+}
+
+void
+CollationRuleParser::parse(const UnicodeString &ruleString, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    rules = &ruleString;
+    ruleIndex = 0;
+
+    while(ruleIndex < rules->length()) {
+        UChar c = rules->charAt(ruleIndex);
+        if(PatternProps::isWhiteSpace(c)) {
+            ++ruleIndex;
+            continue;
+        }
+        switch(c) {
+        case 0x26:  // '&'
+            parseRuleChain(errorCode);
+            break;
+        case 0x5b:  // '['
+            parseSetting(errorCode);
+            break;
+        case 0x23:  // '#' starts a comment, until the end of the line
+            ruleIndex = skipComment(ruleIndex + 1);
+            break;
+        case 0x40:  // '@' is equivalent to [backwards 2]
+            settings->setFlag(CollationSettings::BACKWARD_SECONDARY,
+                              UCOL_ON, 0, errorCode);
+            ++ruleIndex;
+            break;
+        case 0x21:  // '!' used to turn on Thai/Lao character reversal
+            // Accept but ignore. The root collator has contractions
+            // that are equivalent to the character reversal, where appropriate.
+            ++ruleIndex;
+            break;
+        default:
+            setParseError("expected a reset or setting or comment", errorCode);
+            break;
+        }
+        if(U_FAILURE(errorCode)) { return; }
+    }
+}
+
+void
+CollationRuleParser::parseRuleChain(UErrorCode &errorCode) {
+    int32_t resetStrength = parseResetAndPosition(errorCode);
+    UBool isFirstRelation = TRUE;
+    for(;;) {
+        int32_t result = parseRelationOperator(errorCode);
+        if(U_FAILURE(errorCode)) { return; }
+        if(result < 0) {
+            if(ruleIndex < rules->length() && rules->charAt(ruleIndex) == 0x23) {
+                // '#' starts a comment, until the end of the line
+                ruleIndex = skipComment(ruleIndex + 1);
+                continue;
+            }
+            if(isFirstRelation) {
+                setParseError("reset not followed by a relation", errorCode);
+            }
+            return;
+        }
+        int32_t strength = result & STRENGTH_MASK;
+        if(resetStrength < UCOL_IDENTICAL) {
+            // reset-before rule chain
+            if(isFirstRelation) {
+                if(strength != resetStrength) {
+                    setParseError("reset-before strength differs from its first relation", errorCode);
+                    return;
+                }
+            } else {
+                if(strength < resetStrength) {
+                    setParseError("reset-before strength followed by a stronger relation", errorCode);
+                    return;
+                }
+            }
+        }
+        int32_t i = ruleIndex + (result >> OFFSET_SHIFT);  // skip over the relation operator
+        if((result & STARRED_FLAG) == 0) {
+            parseRelationStrings(strength, i, errorCode);
+        } else {
+            parseStarredCharacters(strength, i, errorCode);
+        }
+        if(U_FAILURE(errorCode)) { return; }
+        isFirstRelation = FALSE;
+    }
+}
+
+int32_t
+CollationRuleParser::parseResetAndPosition(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return UCOL_DEFAULT; }
+    int32_t i = skipWhiteSpace(ruleIndex + 1);
+    int32_t j;
+    UChar c;
+    int32_t resetStrength;
+    if(rules->compare(i, BEFORE_LENGTH, BEFORE, 0, BEFORE_LENGTH) == 0 &&
+            (j = i + BEFORE_LENGTH) < rules->length() &&
+            PatternProps::isWhiteSpace(rules->charAt(j)) &&
+            ((j = skipWhiteSpace(j + 1)) + 1) < rules->length() &&
+            0x31 <= (c = rules->charAt(j)) && c <= 0x33 &&
+            rules->charAt(j + 1) == 0x5d) {
+        // &[before n] with n=1 or 2 or 3
+        resetStrength = UCOL_PRIMARY + (c - 0x31);
+        i = skipWhiteSpace(j + 2);
+    } else {
+        resetStrength = UCOL_IDENTICAL;
+    }
+    if(i >= rules->length()) {
+        setParseError("reset without position", errorCode);
+        return UCOL_DEFAULT;
+    }
+    UnicodeString str;
+    if(rules->charAt(i) == 0x5b) {  // '['
+        i = parseSpecialPosition(i, str, errorCode);
+    } else {
+        i = parseTailoringString(i, str, errorCode);
+    }
+    sink->addReset(resetStrength, str, errorReason, errorCode);
+    if(U_FAILURE(errorCode)) { setErrorContext(); }
+    ruleIndex = i;
+    return resetStrength;
+}
+
+int32_t
+CollationRuleParser::parseRelationOperator(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return UCOL_DEFAULT; }
+    ruleIndex = skipWhiteSpace(ruleIndex);
+    if(ruleIndex >= rules->length()) { return UCOL_DEFAULT; }
+    int32_t strength;
+    int32_t i = ruleIndex;
+    UChar c = rules->charAt(i++);
+    switch(c) {
+    case 0x3c:  // '<'
+        if(i < rules->length() && rules->charAt(i) == 0x3c) {  // <<
+            ++i;
+            if(i < rules->length() && rules->charAt(i) == 0x3c) {  // <<<
+                ++i;
+                if(i < rules->length() && rules->charAt(i) == 0x3c) {  // <<<<
+                    ++i;
+                    strength = UCOL_QUATERNARY;
+                } else {
+                    strength = UCOL_TERTIARY;
+                }
+            } else {
+                strength = UCOL_SECONDARY;
+            }
+        } else {
+            strength = UCOL_PRIMARY;
+        }
+        if(i < rules->length() && rules->charAt(i) == 0x2a) {  // '*'
+            ++i;
+            strength |= STARRED_FLAG;
+        }
+        break;
+    case 0x3b:  // ';' same as <<
+        strength = UCOL_SECONDARY;
+        break;
+    case 0x2c:  // ',' same as <<<
+        strength = UCOL_TERTIARY;
+        break;
+    case 0x3d:  // '='
+        strength = UCOL_IDENTICAL;
+        if(i < rules->length() && rules->charAt(i) == 0x2a) {  // '*'
+            ++i;
+            strength |= STARRED_FLAG;
+        }
+        break;
+    default:
+        return UCOL_DEFAULT;
+    }
+    return ((i - ruleIndex) << OFFSET_SHIFT) | strength;
+}
+
+void
+CollationRuleParser::parseRelationStrings(int32_t strength, int32_t i, UErrorCode &errorCode) {
+    // Parse
+    //     prefix | str / extension
+    // where prefix and extension are optional.
+    UnicodeString prefix, str, extension;
+    i = parseTailoringString(i, str, errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    UChar next = (i < rules->length()) ? rules->charAt(i) : 0;
+    if(next == 0x7c) {  // '|' separates the context prefix from the string.
+        prefix = str;
+        i = parseTailoringString(i + 1, str, errorCode);
+        if(U_FAILURE(errorCode)) { return; }
+        next = (i < rules->length()) ? rules->charAt(i) : 0;
+    }
+    if(next == 0x2f) {  // '/' separates the string from the extension.
+        i = parseTailoringString(i + 1, extension, errorCode);
+    }
+    if(!prefix.isEmpty()) {
+        UChar32 prefix0 = prefix.char32At(0);
+        UChar32 c = str.char32At(0);
+        if(!nfc.hasBoundaryBefore(prefix0) || !nfc.hasBoundaryBefore(c)) {
+            setParseError("in 'prefix|str', prefix and str must each start with an NFC boundary",
+                          errorCode);
+            return;
+        }
+    }
+    sink->addRelation(strength, prefix, str, extension, errorReason, errorCode);
+    if(U_FAILURE(errorCode)) { setErrorContext(); }
+    ruleIndex = i;
+}
+
+void
+CollationRuleParser::parseStarredCharacters(int32_t strength, int32_t i, UErrorCode &errorCode) {
+    UnicodeString empty, raw;
+    i = parseString(skipWhiteSpace(i), raw, errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    if(raw.isEmpty()) {
+        setParseError("missing starred-relation string", errorCode);
+        return;
+    }
+    UChar32 prev = -1;
+    int32_t j = 0;
+    for(;;) {
+        while(j < raw.length()) {
+            UChar32 c = raw.char32At(j);
+            if(!nfd.isInert(c)) {
+                setParseError("starred-relation string is not all NFD-inert", errorCode);
+                return;
+            }
+            sink->addRelation(strength, empty, UnicodeString(c), empty, errorReason, errorCode);
+            if(U_FAILURE(errorCode)) {
+                setErrorContext();
+                return;
+            }
+            j += U16_LENGTH(c);
+            prev = c;
+        }
+        if(i >= rules->length() || rules->charAt(i) != 0x2d) {  // '-'
+            break;
+        }
+        if(prev < 0) {
+            setParseError("range without start in starred-relation string", errorCode);
+            return;
+        }
+        i = parseString(i + 1, raw, errorCode);
+        if(U_FAILURE(errorCode)) { return; }
+        if(raw.isEmpty()) {
+            setParseError("range without end in starred-relation string", errorCode);
+            return;
+        }
+        UChar32 c = raw.char32At(0);
+        if(c < prev) {
+            setParseError("range start greater than end in starred-relation string", errorCode);
+            return;
+        }
+        // range prev-c
+        UnicodeString s;
+        while(++prev <= c) {
+            if(!nfd.isInert(prev)) {
+                setParseError("starred-relation string range is not all NFD-inert", errorCode);
+                return;
+            }
+            if(U_IS_SURROGATE(prev)) {
+                setParseError("starred-relation string range contains a surrogate", errorCode);
+                return;
+            }
+            if(0xfffd <= prev && prev <= 0xffff) {
+                setParseError("starred-relation string range contains U+FFFD, U+FFFE or U+FFFF", errorCode);
+                return;
+            }
+            s.setTo(prev);
+            sink->addRelation(strength, empty, s, empty, errorReason, errorCode);
+            if(U_FAILURE(errorCode)) {
+                setErrorContext();
+                return;
+            }
+        }
+        prev = -1;
+        j = U16_LENGTH(c);
+    }
+    ruleIndex = skipWhiteSpace(i);
+}
+
+int32_t
+CollationRuleParser::parseTailoringString(int32_t i, UnicodeString &raw, UErrorCode &errorCode) {
+    i = parseString(skipWhiteSpace(i), raw, errorCode);
+    if(U_SUCCESS(errorCode) && raw.isEmpty()) {
+        setParseError("missing relation string", errorCode);
+    }
+    return skipWhiteSpace(i);
+}
+
+int32_t
+CollationRuleParser::parseString(int32_t i, UnicodeString &raw, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return i; }
+    raw.remove();
+    while(i < rules->length()) {
+        UChar32 c = rules->charAt(i++);
+        if(isSyntaxChar(c)) {
+            if(c == 0x27) {  // apostrophe
+                if(i < rules->length() && rules->charAt(i) == 0x27) {
+                    // Double apostrophe, encodes a single one.
+                    raw.append((UChar)0x27);
+                    ++i;
+                    continue;
+                }
+                // Quote literal text until the next single apostrophe.
+                for(;;) {
+                    if(i == rules->length()) {
+                        setParseError("quoted literal text missing terminating apostrophe", errorCode);
+                        return i;
+                    }
+                    c = rules->charAt(i++);
+                    if(c == 0x27) {
+                        if(i < rules->length() && rules->charAt(i) == 0x27) {
+                            // Double apostrophe inside quoted literal text,
+                            // still encodes a single apostrophe.
+                            ++i;
+                        } else {
+                            break;
+                        }
+                    }
+                    raw.append((UChar)c);
+                }
+            } else if(c == 0x5c) {  // backslash
+                if(i == rules->length()) {
+                    setParseError("backslash escape at the end of the rule string", errorCode);
+                    return i;
+                }
+                c = rules->char32At(i);
+                raw.append(c);
+                i += U16_LENGTH(c);
+            } else {
+                // Any other syntax character terminates a string.
+                --i;
+                break;
+            }
+        } else if(PatternProps::isWhiteSpace(c)) {
+            // Unquoted white space terminates a string.
+            --i;
+            break;
+        } else {
+            raw.append((UChar)c);
+        }
+    }
+    for(int32_t j = 0; j < raw.length();) {
+        UChar32 c = raw.char32At(j);
+        if(U_IS_SURROGATE(c)) {
+            setParseError("string contains an unpaired surrogate", errorCode);
+            return i;
+        }
+        if(0xfffd <= c && c <= 0xffff) {
+            setParseError("string contains U+FFFD, U+FFFE or U+FFFF", errorCode);
+            return i;
+        }
+        j += U16_LENGTH(c);
+    }
+    return i;
+}
+
+namespace {
+
+static const char *const positions[] = {
+    "first tertiary ignorable",
+    "last tertiary ignorable",
+    "first secondary ignorable",
+    "last secondary ignorable",
+    "first primary ignorable",
+    "last primary ignorable",
+    "first variable",
+    "last variable",
+    "first regular",
+    "last regular",
+    "first implicit",
+    "last implicit",
+    "first trailing",
+    "last trailing"
+};
+
+}  // namespace
+
+int32_t
+CollationRuleParser::parseSpecialPosition(int32_t i, UnicodeString &str, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    UnicodeString raw;
+    int32_t j = readWords(i + 1, raw);
+    if(j > i && rules->charAt(j) == 0x5d && !raw.isEmpty()) {  // words end with ]
+        ++j;
+        for(int32_t pos = 0; pos < LENGTHOF(positions); ++pos) {
+            if(raw == UnicodeString(positions[pos], -1, US_INV)) {
+                str.setTo((UChar)POS_LEAD).append((UChar)(POS_BASE + pos));
+                return j;
+            }
+        }
+        if(raw == UNICODE_STRING_SIMPLE("top")) {
+            str.setTo((UChar)POS_LEAD).append((UChar)(POS_BASE + LAST_REGULAR));
+            return j;
+        }
+        if(raw == UNICODE_STRING_SIMPLE("variable top")) {
+            str.setTo((UChar)POS_LEAD).append((UChar)(POS_BASE + LAST_VARIABLE));
+            return j;
+        }
+    }
+    setParseError("not a valid special reset position", errorCode);
+    return i;
+}
+
+void
+CollationRuleParser::parseSetting(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    UnicodeString raw;
+    int32_t i = ruleIndex + 1;
+    int32_t j = readWords(i, raw);
+    if(j <= i || raw.isEmpty()) {
+        setParseError("expected a setting/option at '['", errorCode);
+    }
+    if(rules->charAt(j) == 0x5d) {  // words end with ]
+        ++j;
+        if(raw.startsWith(UNICODE_STRING_SIMPLE("reorder")) &&
+                (raw.length() == 7 || raw.charAt(7) == 0x20)) {
+            parseReordering(raw, errorCode);
+            ruleIndex = j;
+            return;
+        }
+        if(raw == UNICODE_STRING_SIMPLE("backwards 2")) {
+            settings->setFlag(CollationSettings::BACKWARD_SECONDARY,
+                              UCOL_ON, 0, errorCode);
+            ruleIndex = j;
+            return;
+        }
+        UnicodeString v;
+        int32_t valueIndex = raw.lastIndexOf((UChar)0x20);
+        if(valueIndex >= 0) {
+            v.setTo(raw, valueIndex + 1);
+            raw.truncate(valueIndex);
+        }
+        if(raw == UNICODE_STRING_SIMPLE("strength") && v.length() == 1) {
+            int32_t value = UCOL_DEFAULT;
+            UChar c = v.charAt(0);
+            if(0x31 <= c && c <= 0x34) {  // 1..4
+                value = UCOL_PRIMARY + (c - 0x31);
+            } else if(c == 0x49) {  // 'I'
+                value = UCOL_IDENTICAL;
+            }
+            if(value != UCOL_DEFAULT) {
+                settings->setStrength(value, 0, errorCode);
+                ruleIndex = j;
+                return;
+            }
+        } else if(raw == UNICODE_STRING_SIMPLE("alternate")) {
+            UColAttributeValue value = UCOL_DEFAULT;
+            if(v == UNICODE_STRING_SIMPLE("non-ignorable")) {
+                value = UCOL_NON_IGNORABLE;
+            } else if(v == UNICODE_STRING_SIMPLE("shifted")) {
+                value = UCOL_SHIFTED;
+            }
+            if(value != UCOL_DEFAULT) {
+                settings->setAlternateHandling(value, 0, errorCode);
+                ruleIndex = j;
+                return;
+            }
+        } else if(raw == UNICODE_STRING_SIMPLE("maxVariable")) {
+            int32_t value = UCOL_DEFAULT;
+            if(v == UNICODE_STRING_SIMPLE("space")) {
+                value = CollationSettings::MAX_VAR_SPACE;
+            } else if(v == UNICODE_STRING_SIMPLE("punct")) {
+                value = CollationSettings::MAX_VAR_PUNCT;
+            } else if(v == UNICODE_STRING_SIMPLE("symbol")) {
+                value = CollationSettings::MAX_VAR_SYMBOL;
+            } else if(v == UNICODE_STRING_SIMPLE("currency")) {
+                value = CollationSettings::MAX_VAR_CURRENCY;
+            }
+            if(value != UCOL_DEFAULT) {
+                settings->setMaxVariable(value, 0, errorCode);
+                settings->variableTop = baseData->getLastPrimaryForGroup(
+                    UCOL_REORDER_CODE_FIRST + value);
+                U_ASSERT(settings->variableTop != 0);
+                ruleIndex = j;
+                return;
+            }
+        } else if(raw == UNICODE_STRING_SIMPLE("caseFirst")) {
+            UColAttributeValue value = UCOL_DEFAULT;
+            if(v == UNICODE_STRING_SIMPLE("off")) {
+                value = UCOL_OFF;
+            } else if(v == UNICODE_STRING_SIMPLE("lower")) {
+                value = UCOL_LOWER_FIRST;
+            } else if(v == UNICODE_STRING_SIMPLE("upper")) {
+                value = UCOL_UPPER_FIRST;
+            }
+            if(value != UCOL_DEFAULT) {
+                settings->setCaseFirst(value, 0, errorCode);
+                ruleIndex = j;
+                return;
+            }
+        } else if(raw == UNICODE_STRING_SIMPLE("caseLevel")) {
+            UColAttributeValue value = getOnOffValue(v);
+            if(value != UCOL_DEFAULT) {
+                settings->setFlag(CollationSettings::CASE_LEVEL, value, 0, errorCode);
+                ruleIndex = j;
+                return;
+            }
+        } else if(raw == UNICODE_STRING_SIMPLE("normalization")) {
+            UColAttributeValue value = getOnOffValue(v);
+            if(value != UCOL_DEFAULT) {
+                settings->setFlag(CollationSettings::CHECK_FCD, value, 0, errorCode);
+                ruleIndex = j;
+                return;
+            }
+        } else if(raw == UNICODE_STRING_SIMPLE("numericOrdering")) {
+            UColAttributeValue value = getOnOffValue(v);
+            if(value != UCOL_DEFAULT) {
+                settings->setFlag(CollationSettings::NUMERIC, value, 0, errorCode);
+                ruleIndex = j;
+                return;
+            }
+        } else if(raw == UNICODE_STRING_SIMPLE("hiraganaQ")) {
+            UColAttributeValue value = getOnOffValue(v);
+            if(value != UCOL_DEFAULT) {
+                if(value == UCOL_ON) {
+                    setParseError("[hiraganaQ on] is not supported", errorCode);
+                }
+                ruleIndex = j;
+                return;
+            }
+        } else if(raw == UNICODE_STRING_SIMPLE("import")) {
+            CharString lang;
+            lang.appendInvariantChars(v, errorCode);
+            if(errorCode == U_MEMORY_ALLOCATION_ERROR) { return; }
+            // BCP 47 language tag -> ICU locale ID
+            char localeID[ULOC_FULLNAME_CAPACITY];
+            int32_t parsedLength;
+            int32_t length = uloc_forLanguageTag(lang.data(), localeID, ULOC_FULLNAME_CAPACITY,
+                                                 &parsedLength, &errorCode);
+            if(U_FAILURE(errorCode) ||
+                    parsedLength != lang.length() || length >= ULOC_FULLNAME_CAPACITY) {
+                errorCode = U_ZERO_ERROR;
+                setParseError("expected language tag in [import langTag]", errorCode);
+                return;
+            }
+            // localeID minus all keywords
+            char baseID[ULOC_FULLNAME_CAPACITY];
+            length = uloc_getBaseName(localeID, baseID, ULOC_FULLNAME_CAPACITY, &errorCode);
+            if(U_FAILURE(errorCode) || length >= ULOC_KEYWORDS_CAPACITY) {
+                errorCode = U_ZERO_ERROR;
+                setParseError("expected language tag in [import langTag]", errorCode);
+                return;
+            }
+            // @collation=type, or length=0 if not specified
+            char collationType[ULOC_KEYWORDS_CAPACITY];
+            length = uloc_getKeywordValue(localeID, "collation",
+                                          collationType, ULOC_KEYWORDS_CAPACITY,
+                                          &errorCode);
+            if(U_FAILURE(errorCode) || length >= ULOC_KEYWORDS_CAPACITY) {
+                errorCode = U_ZERO_ERROR;
+                setParseError("expected language tag in [import langTag]", errorCode);
+                return;
+            }
+            if(importer == NULL) {
+                setParseError("[import langTag] is not supported", errorCode);
+            } else {
+                const UnicodeString *importedRules =
+                    importer->getRules(baseID,
+                                       length > 0 ? collationType : "standard",
+                                       errorReason, errorCode);
+                if(U_FAILURE(errorCode)) {
+                    if(errorReason == NULL) {
+                        errorReason = "[import langTag] failed";
+                    }
+                    setErrorContext();
+                    return;
+                }
+                const UnicodeString *outerRules = rules;
+                int32_t outerRuleIndex = ruleIndex;
+                parse(*importedRules, errorCode);
+                if(U_FAILURE(errorCode)) {
+                    if(parseError != NULL) {
+                        parseError->offset = outerRuleIndex;
+                    }
+                }
+                rules = outerRules;
+                ruleIndex = j;
+            }
+            return;
+        }
+    } else if(rules->charAt(j) == 0x5b) {  // words end with [
+        UnicodeSet set;
+        j = parseUnicodeSet(j, set, errorCode);
+        if(U_FAILURE(errorCode)) { return; }
+        if(raw == UNICODE_STRING_SIMPLE("optimize")) {
+            sink->optimize(set, errorReason, errorCode);
+            if(U_FAILURE(errorCode)) { setErrorContext(); }
+            ruleIndex = j;
+            return;
+        } else if(raw == UNICODE_STRING_SIMPLE("suppressContractions")) {
+            sink->suppressContractions(set, errorReason, errorCode);
+            if(U_FAILURE(errorCode)) { setErrorContext(); }
+            ruleIndex = j;
+            return;
+        }
+    }
+    setParseError("not a valid setting/option", errorCode);
+}
+
+void
+CollationRuleParser::parseReordering(const UnicodeString &raw, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    int32_t i = 7;  // after "reorder"
+    if(i == raw.length()) {
+        // empty [reorder] with no codes
+        settings->resetReordering();
+        return;
+    }
+    // Parse the codes in [reorder aa bb cc].
+    UVector32 reorderCodes(errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    CharString word;
+    while(i < raw.length()) {
+        ++i;  // skip the word-separating space
+        int32_t limit = raw.indexOf((UChar)0x20, i);
+        if(limit < 0) { limit = raw.length(); }
+        word.clear().appendInvariantChars(raw.tempSubStringBetween(i, limit), errorCode);
+        if(U_FAILURE(errorCode)) { return; }
+        int32_t code = getReorderCode(word.data());
+        if(code < 0) {
+            setParseError("unknown script or reorder code", errorCode);
+            return;
+        }
+        reorderCodes.addElement(code, errorCode);
+        if(U_FAILURE(errorCode)) { return; }
+        i = limit;
+    }
+    int32_t length = reorderCodes.size();
+    if(length == 1 && reorderCodes.elementAti(0) == UCOL_REORDER_CODE_DEFAULT) {
+        // The root collator does not have a reordering, by definition.
+        settings->resetReordering();
+        return;
+    }
+    uint8_t table[256];
+    baseData->makeReorderTable(reorderCodes.getBuffer(), length, table, errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    if(!settings->setReordering(reorderCodes.getBuffer(), length, table)) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+    }
+}
+
+static const char *const gSpecialReorderCodes[] = {
+    "space", "punct", "symbol", "currency", "digit"
+};
+
+int32_t
+CollationRuleParser::getReorderCode(const char *word) {
+    for(int32_t i = 0; i < LENGTHOF(gSpecialReorderCodes); ++i) {
+        if(uprv_stricmp(word, gSpecialReorderCodes[i]) == 0) {
+            return UCOL_REORDER_CODE_FIRST + i;
+        }
+    }
+    int32_t script = u_getPropertyValueEnum(UCHAR_SCRIPT, word);
+    if(script >= 0) {
+        return script;
+    }
+    if(uprv_stricmp(word, "default") == 0) {
+        return UCOL_REORDER_CODE_DEFAULT;
+    }
+    return -2;
+}
+
+UColAttributeValue
+CollationRuleParser::getOnOffValue(const UnicodeString &s) {
+    if(s == UNICODE_STRING_SIMPLE("on")) {
+        return UCOL_ON;
+    } else if(s == UNICODE_STRING_SIMPLE("off")) {
+        return UCOL_OFF;
+    } else {
+        return UCOL_DEFAULT;
+    }
+}
+
+int32_t
+CollationRuleParser::parseUnicodeSet(int32_t i, UnicodeSet &set, UErrorCode &errorCode) {
+    // Collect a UnicodeSet pattern between a balanced pair of [brackets].
+    int32_t level = 0;
+    int32_t j = i;
+    for(;;) {
+        if(j == rules->length()) {
+            setParseError("unbalanced UnicodeSet pattern brackets", errorCode);
+            return j;
+        }
+        UChar c = rules->charAt(j++);
+        if(c == 0x5b) {  // '['
+            ++level;
+        } else if(c == 0x5d) {  // ']'
+            if(--level == 0) { break; }
+        }
+    }
+    set.applyPattern(rules->tempSubStringBetween(i, j), errorCode);
+    if(U_FAILURE(errorCode)) {
+        errorCode = U_ZERO_ERROR;
+        setParseError("not a valid UnicodeSet pattern", errorCode);
+        return j;
+    }
+    j = skipWhiteSpace(j);
+    if(j == rules->length() || rules->charAt(j) != 0x5d) {
+        setParseError("missing option-terminating ']' after UnicodeSet pattern", errorCode);
+        return j;
+    }
+    return ++j;
+}
+
+int32_t
+CollationRuleParser::readWords(int32_t i, UnicodeString &raw) const {
+    static const UChar sp = 0x20;
+    raw.remove();
+    i = skipWhiteSpace(i);
+    for(;;) {
+        if(i >= rules->length()) { return 0; }
+        UChar c = rules->charAt(i);
+        if(isSyntaxChar(c) && c != 0x2d && c != 0x5f) {  // syntax except -_
+            if(raw.isEmpty()) { return i; }
+            if(raw.endsWith(&sp, 1)) {  // remove trailing space
+                raw.truncate(raw.length() - 1);
+            }
+            return i;
+        }
+        if(PatternProps::isWhiteSpace(c)) {
+            raw.append(0x20);
+            i = skipWhiteSpace(i + 1);
+        } else {
+            raw.append(c);
+            ++i;
+        }
+    }
+}
+
+int32_t
+CollationRuleParser::skipComment(int32_t i) const {
+    // skip to past the newline
+    while(i < rules->length()) {
+        UChar c = rules->charAt(i++);
+        // LF or FF or CR or NEL or LS or PS
+        if(c == 0xa || c == 0xc || c == 0xd || c == 0x85 || c == 0x2028 || c == 0x2029) {
+            // Unicode Newline Guidelines: "A readline function should stop at NLF, LS, FF, or PS."
+            // NLF (new line function) = CR or LF or CR+LF or NEL.
+            // No need to collect all of CR+LF because a following LF will be ignored anyway.
+            break;
+        }
+    }
+    return i;
+}
+
+void
+CollationRuleParser::setParseError(const char *reason, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    // Error code consistent with the old parser (from ca. 2001),
+    // rather than U_PARSE_ERROR;
+    errorCode = U_INVALID_FORMAT_ERROR;
+    errorReason = reason;
+    if(parseError != NULL) { setErrorContext(); }
+}
+
+void
+CollationRuleParser::setErrorContext() {
+    if(parseError == NULL) { return; }
+
+    // Note: This relies on the calling code maintaining the ruleIndex
+    // at a position that is useful for debugging.
+    // For example, at the beginning of a reset or relation etc.
+    parseError->offset = ruleIndex;
+    parseError->line = 0;  // We are not counting line numbers.
+
+    // before ruleIndex
+    int32_t start = ruleIndex - (U_PARSE_CONTEXT_LEN - 1);
+    if(start < 0) {
+        start = 0;
+    } else if(start > 0 && U16_IS_TRAIL(rules->charAt(start))) {
+        ++start;
+    }
+    int32_t length = ruleIndex - start;
+    rules->extract(start, length, parseError->preContext);
+    parseError->preContext[length] = 0;
+
+    // starting from ruleIndex
+    length = rules->length() - ruleIndex;
+    if(length >= U_PARSE_CONTEXT_LEN) {
+        length = U_PARSE_CONTEXT_LEN - 1;
+        if(U16_IS_LEAD(rules->charAt(ruleIndex + length - 1))) {
+            --length;
+        }
+    }
+    rules->extract(ruleIndex, length, parseError->postContext);
+    parseError->postContext[length] = 0;
+}
+
+UBool
+CollationRuleParser::isSyntaxChar(UChar32 c) {
+    return 0x21 <= c && c <= 0x7e &&
+            (c <= 0x2f || (0x3a <= c && c <= 0x40) ||
+            (0x5b <= c && c <= 0x60) || (0x7b <= c));
+}
+
+int32_t
+CollationRuleParser::skipWhiteSpace(int32_t i) const {
+    while(i < rules->length() && PatternProps::isWhiteSpace(rules->charAt(i))) {
+        ++i;
+    }
+    return i;
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationruleparser.h b/icu4c/source/i18n/collationruleparser.h
new file mode 100644 (file)
index 0000000..3cfc4c3
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationruleparser.h
+*
+* created on: 2013apr10
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONRULEPARSER_H__
+#define __COLLATIONRULEPARSER_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/ucol.h"
+#include "unicode/uniset.h"
+#include "unicode/unistr.h"
+
+struct UParseError;
+
+U_NAMESPACE_BEGIN
+
+struct CollationData;
+struct CollationTailoring;
+
+class Locale;
+class Normalizer2;
+
+struct CollationSettings;
+
+class U_I18N_API CollationRuleParser : public UMemory {
+public:
+    /** Special reset positions. */
+    enum Position {
+        FIRST_TERTIARY_IGNORABLE,
+        LAST_TERTIARY_IGNORABLE,
+        FIRST_SECONDARY_IGNORABLE,
+        LAST_SECONDARY_IGNORABLE,
+        FIRST_PRIMARY_IGNORABLE,
+        LAST_PRIMARY_IGNORABLE,
+        FIRST_VARIABLE,
+        LAST_VARIABLE,
+        FIRST_REGULAR,
+        LAST_REGULAR,
+        FIRST_IMPLICIT,
+        LAST_IMPLICIT,
+        FIRST_TRAILING,
+        LAST_TRAILING
+    };
+
+    /**
+     * First character of contractions that encode special reset positions.
+     * U+FFFE cannot be tailored via rule syntax.
+     *
+     * The second contraction character is POS_BASE + Position.
+     */
+    static const UChar POS_LEAD = 0xfffe;
+    /**
+     * Base for the second character of contractions that encode special reset positions.
+     * Braille characters U+28xx are printable and normalization-inert.
+     * @see POS_LEAD
+     */
+    static const UChar POS_BASE = 0x2800;
+
+    class U_I18N_API Sink : public UObject {
+    public:
+        virtual ~Sink();
+        /**
+         * Adds a reset.
+         * strength=UCOL_IDENTICAL for &str.
+         * strength=UCOL_PRIMARY/UCOL_SECONDARY/UCOL_TERTIARY for &[before n]str where n=1/2/3.
+         */
+        virtual void addReset(int32_t strength, const UnicodeString &str,
+                              const char *&errorReason, UErrorCode &errorCode) = 0;
+        /**
+         * Adds a relation with strength and prefix | str / extension.
+         */
+        virtual void addRelation(int32_t strength, const UnicodeString &prefix,
+                                 const UnicodeString &str, const UnicodeString &extension,
+                                 const char *&errorReason, UErrorCode &errorCode) = 0;
+
+        virtual void suppressContractions(const UnicodeSet &set, const char *&errorReason,
+                                          UErrorCode &errorCode);
+
+        virtual void optimize(const UnicodeSet &set, const char *&errorReason,
+                              UErrorCode &errorCode);
+    };
+
+    class U_I18N_API Importer : public UObject {
+    public:
+        virtual ~Importer();
+        virtual const UnicodeString *getRules(
+                const char *localeID, const char *collationType,
+                const char *&errorReason, UErrorCode &errorCode) = 0;
+    };
+
+    /**
+     * Constructor.
+     * The Sink must be set before parsing.
+     * The Importer can be set, otherwise [import locale] syntax is not supported.
+     */
+    CollationRuleParser(const CollationData *base, UErrorCode &errorCode);
+    ~CollationRuleParser();
+
+    /**
+     * Sets the pointer to a Sink object.
+     * The pointer is aliased: Pointer copy without cloning or taking ownership.
+     */
+    void setSink(Sink *sinkAlias) {
+        sink = sinkAlias;
+    }
+
+    /**
+     * Sets the pointer to an Importer object.
+     * The pointer is aliased: Pointer copy without cloning or taking ownership.
+     */
+    void setImporter(Importer *importerAlias) {
+        importer = importerAlias;
+    }
+
+    void parse(const UnicodeString &ruleString,
+               CollationSettings &outSettings,
+               UParseError *outParseError,
+               UErrorCode &errorCode);
+
+    const char *getErrorReason() const { return errorReason; }
+
+    /**
+     * Gets a script or reorder code from its string representation.
+     * @return the script/reorder code, or
+     * -1==UCOL_REORDER_CODE_DEFAULT, or
+     * -2 if not recognized
+     */
+    static int32_t getReorderCode(const char *word);
+
+private:
+    /** UCOL_PRIMARY=0 .. UCOL_IDENTICAL=15 */
+    static const int32_t STRENGTH_MASK = 0xf;
+    static const int32_t STARRED_FLAG = 0x10;
+    static const int32_t OFFSET_SHIFT = 8;
+
+    void parse(const UnicodeString &ruleString, UErrorCode &errorCode);
+    void parseRuleChain(UErrorCode &errorCode);
+    int32_t parseResetAndPosition(UErrorCode &errorCode);
+    int32_t parseRelationOperator(UErrorCode &errorCode);
+    void parseRelationStrings(int32_t strength, int32_t i, UErrorCode &errorCode);
+    void parseStarredCharacters(int32_t strength, int32_t i, UErrorCode &errorCode);
+    int32_t parseTailoringString(int32_t i, UnicodeString &raw, UErrorCode &errorCode);
+    int32_t parseString(int32_t i, UnicodeString &raw, UErrorCode &errorCode);
+
+    /**
+     * Sets str to a contraction of U+FFFE and (U+2800 + Position).
+     * @return rule index after the special reset position
+     */
+    int32_t parseSpecialPosition(int32_t i, UnicodeString &str, UErrorCode &errorCode);
+    void parseSetting(UErrorCode &errorCode);
+    void parseReordering(const UnicodeString &raw, UErrorCode &errorCode);
+    static UColAttributeValue getOnOffValue(const UnicodeString &s);
+
+    int32_t parseUnicodeSet(int32_t i, UnicodeSet &set, UErrorCode &errorCode);
+    int32_t readWords(int32_t i, UnicodeString &raw) const;
+    int32_t skipComment(int32_t i) const;
+
+    void setParseError(const char *reason, UErrorCode &errorCode);
+    void setErrorContext();
+
+    /**
+     * ASCII [:P:] and [:S:]:
+     * [\u0021-\u002F \u003A-\u0040 \u005B-\u0060 \u007B-\u007E]
+     */
+    static UBool isSyntaxChar(UChar32 c);
+    int32_t skipWhiteSpace(int32_t i) const;
+
+    const Normalizer2 &nfd, &nfc;
+
+    const UnicodeString *rules;
+    const CollationData *const baseData;
+    CollationSettings *settings;
+    UParseError *parseError;
+    const char *errorReason;
+
+    Sink *sink;
+    Importer *importer;
+
+    int32_t ruleIndex;
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONRULEPARSER_H__
diff --git a/icu4c/source/i18n/collationsets.cpp b/icu4c/source/i18n/collationsets.cpp
new file mode 100644 (file)
index 0000000..ab282d8
--- /dev/null
@@ -0,0 +1,610 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationsets.cpp
+*
+* created on: 2013feb09
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/ucharstrie.h"
+#include "unicode/uniset.h"
+#include "unicode/unistr.h"
+#include "unicode/ustringtrie.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationsets.h"
+#include "normalizer2impl.h"
+#include "uassert.h"
+#include "utf16collationiterator.h"
+#include "utrie2.h"
+
+U_NAMESPACE_BEGIN
+
+U_CDECL_BEGIN
+
+static UBool U_CALLCONV
+enumTailoredRange(const void *context, UChar32 start, UChar32 end, uint32_t ce32) {
+    if(ce32 == Collation::FALLBACK_CE32) {
+        return TRUE;  // fallback to base, not tailored
+    }
+    TailoredSet *ts = (TailoredSet *)context;
+    return ts->handleCE32(start, end, ce32);
+}
+
+U_CDECL_END
+
+void
+TailoredSet::forData(const CollationData *d, UErrorCode &ec) {
+    if(U_FAILURE(ec)) { return; }
+    errorCode = ec;  // Preserve info & warning codes.
+    data = d;
+    baseData = d->base;
+    U_ASSERT(baseData != NULL);
+    utrie2_enum(data->trie, NULL, enumTailoredRange, this);
+    ec = errorCode;
+}
+
+UBool
+TailoredSet::handleCE32(UChar32 start, UChar32 end, uint32_t ce32) {
+    U_ASSERT(ce32 != Collation::FALLBACK_CE32);
+    if(Collation::isSpecialCE32(ce32)) {
+        ce32 = data->getIndirectCE32(ce32);
+        if(ce32 == Collation::FALLBACK_CE32) {
+            return U_SUCCESS(errorCode);
+        }
+    }
+    do {
+        uint32_t baseCE32 = baseData->getFinalCE32(baseData->getCE32(start));
+        // Do not just continue if ce32 == baseCE32 because
+        // contractions and expansions in different data objects
+        // normally differ even if they have the same data offsets.
+        if(Collation::isSelfContainedCE32(ce32) && Collation::isSelfContainedCE32(baseCE32)) {
+            // fastpath
+            if(ce32 != baseCE32) {
+                tailored->add(start);
+            }
+        } else {
+            compare(start, ce32, baseCE32);
+        }
+    } while(++start <= end);
+    return U_SUCCESS(errorCode);
+}
+
+void
+TailoredSet::compare(UChar32 c, uint32_t ce32, uint32_t baseCE32) {
+    if(Collation::isPrefixCE32(ce32)) {
+        const UChar *p = data->contexts + Collation::indexFromCE32(ce32);
+        ce32 = data->getFinalCE32(CollationData::readCE32(p));
+        if(Collation::isPrefixCE32(baseCE32)) {
+            const UChar *q = baseData->contexts + Collation::indexFromCE32(baseCE32);
+            baseCE32 = baseData->getFinalCE32(CollationData::readCE32(q));
+            comparePrefixes(c, p + 2, q + 2);
+        } else {
+            addPrefixes(data, c, p + 2);
+        }
+    } else if(Collation::isPrefixCE32(baseCE32)) {
+        const UChar *q = baseData->contexts + Collation::indexFromCE32(baseCE32);
+        baseCE32 = baseData->getFinalCE32(CollationData::readCE32(q));
+        addPrefixes(baseData, c, q + 2);
+    }
+
+    if(Collation::isContractionCE32(ce32)) {
+        const UChar *p = data->contexts + Collation::indexFromCE32(ce32);
+        if((ce32 & Collation::CONTRACT_SINGLE_CP_NO_MATCH) != 0) {
+            ce32 = Collation::NO_CE32;
+        } else {
+            ce32 = data->getFinalCE32(CollationData::readCE32(p));
+        }
+        if(Collation::isContractionCE32(baseCE32)) {
+            const UChar *q = baseData->contexts + Collation::indexFromCE32(baseCE32);
+            if((baseCE32 & Collation::CONTRACT_SINGLE_CP_NO_MATCH) != 0) {
+                baseCE32 = Collation::NO_CE32;
+            } else {
+                baseCE32 = baseData->getFinalCE32(CollationData::readCE32(q));
+            }
+            compareContractions(c, p + 2, q + 2);
+        } else {
+            addContractions(c, p + 2);
+        }
+    } else if(Collation::isContractionCE32(baseCE32)) {
+        const UChar *q = baseData->contexts + Collation::indexFromCE32(baseCE32);
+        baseCE32 = baseData->getFinalCE32(CollationData::readCE32(q));
+        addContractions(c, q + 2);
+    }
+
+    int32_t tag;
+    if(Collation::isSpecialCE32(ce32)) {
+        tag = Collation::tagFromCE32(ce32);
+        U_ASSERT(tag != Collation::PREFIX_TAG);
+        U_ASSERT(tag != Collation::CONTRACTION_TAG);
+        // Currently, the tailoring data builder does not write offset tags.
+        // They might be useful for saving space,
+        // but they would complicate the builder,
+        // and in tailorings we assume that performance of tailored characters is more important.
+        U_ASSERT(tag != Collation::OFFSET_TAG);
+    } else {
+        tag = -1;
+    }
+    int32_t baseTag;
+    if(Collation::isSpecialCE32(baseCE32)) {
+        baseTag = Collation::tagFromCE32(baseCE32);
+        U_ASSERT(baseTag != Collation::PREFIX_TAG);
+        U_ASSERT(baseTag != Collation::CONTRACTION_TAG);
+    } else {
+        baseTag = -1;
+    }
+
+    // Non-contextual mappings, expansions, etc.
+    if(baseTag == Collation::OFFSET_TAG) {
+        // We might be comparing a tailoring CE which is a copy of
+        // a base offset-tag CE, via the [optimize [set]] syntax
+        // or when a single-character mapping was copied for tailored contractions.
+        // Offset tags always result in long-primary CEs,
+        // with common secondary/tertiary weights.
+        if(!Collation::isLongPrimaryCE32(ce32)) {
+            add(c);
+            return;
+        }
+        int64_t dataCE = baseData->ces[Collation::indexFromCE32(baseCE32)];
+        uint32_t p = Collation::getThreeBytePrimaryForOffsetData(c, dataCE);
+        if(Collation::primaryFromLongPrimaryCE32(ce32) != p) {
+            add(c);
+            return;
+        }
+    }
+
+    if(tag != baseTag) {
+        add(c);
+        return;
+    }
+
+    if(tag == Collation::EXPANSION32_TAG) {
+        const uint32_t *ce32s = data->ce32s + Collation::indexFromCE32(ce32);
+        int32_t length = Collation::lengthFromCE32(ce32);
+
+        const uint32_t *baseCE32s = baseData->ce32s + Collation::indexFromCE32(baseCE32);
+        int32_t baseLength = Collation::lengthFromCE32(baseCE32);
+
+        if(length != baseLength) {
+            add(c);
+            return;
+        }
+        for(int32_t i = 0; i < length; ++i) {
+            if(ce32s[i] != baseCE32s[i]) {
+                add(c);
+                break;
+            }
+        }
+    } else if(tag == Collation::EXPANSION_TAG) {
+        const int64_t *ces = data->ces + Collation::indexFromCE32(ce32);
+        int32_t length = Collation::lengthFromCE32(ce32);
+
+        const int64_t *baseCEs = baseData->ces + Collation::indexFromCE32(baseCE32);
+        int32_t baseLength = Collation::lengthFromCE32(baseCE32);
+
+        if(length != baseLength) {
+            add(c);
+            return;
+        }
+        for(int32_t i = 0; i < length; ++i) {
+            if(ces[i] != baseCEs[i]) {
+                add(c);
+                break;
+            }
+        }
+    } else if(tag == Collation::HANGUL_TAG) {
+        UChar jamos[3];
+        int32_t length = Hangul::decompose(c, jamos);
+        if(tailored->contains(jamos[0]) || tailored->contains(jamos[1]) ||
+                (length == 3 && tailored->contains(jamos[2]))) {
+            add(c);
+        }
+    } else if(ce32 != baseCE32) {
+        add(c);
+    }
+}
+
+void
+TailoredSet::comparePrefixes(UChar32 c, const UChar *p, const UChar *q) {
+    // Parallel iteration over prefixes of both tables.
+    UCharsTrie::Iterator prefixes(p, 0, errorCode);
+    UCharsTrie::Iterator basePrefixes(q, 0, errorCode);
+    const UnicodeString *tp = NULL;  // Tailoring prefix.
+    const UnicodeString *bp = NULL;  // Base prefix.
+    // Use a string with a U+FFFF as the limit sentinel.
+    // U+FFFF is untailorable and will not occur in prefixes.
+    UnicodeString none((UChar)0xffff);
+    for(;;) {
+        if(tp == NULL) {
+            if(prefixes.next(errorCode)) {
+                tp = &prefixes.getString();
+            } else {
+                tp = &none;
+            }
+        }
+        if(bp == NULL) {
+            if(basePrefixes.next(errorCode)) {
+                bp = &basePrefixes.getString();
+            } else {
+                bp = &none;
+            }
+        }
+        if(tp == &none && bp == &none) { break; }
+        int32_t cmp = tp->compare(*bp);
+        if(cmp < 0) {
+            // tp occurs in the tailoring but not in the base.
+            addPrefix(data, *tp, c, (uint32_t)prefixes.getValue());
+            tp = NULL;
+        } else if(cmp > 0) {
+            // bp occurs in the base but not in the tailoring.
+            addPrefix(baseData, *bp, c, (uint32_t)basePrefixes.getValue());
+            bp = NULL;
+        } else {
+            setPrefix(*tp);
+            compare(c, (uint32_t)prefixes.getValue(), (uint32_t)basePrefixes.getValue());
+            resetPrefix();
+            tp = NULL;
+            bp = NULL;
+        }
+    }
+}
+
+void
+TailoredSet::compareContractions(UChar32 c, const UChar *p, const UChar *q) {
+    // Parallel iteration over suffixes of both tables.
+    UCharsTrie::Iterator suffixes(p, 0, errorCode);
+    UCharsTrie::Iterator baseSuffixes(q, 0, errorCode);
+    const UnicodeString *ts = NULL;  // Tailoring suffix.
+    const UnicodeString *bs = NULL;  // Base suffix.
+    // Use a string with two U+FFFF as the limit sentinel.
+    // U+FFFF is untailorable and will not occur in contractions except maybe
+    // as a single suffix character for a root-collator boundary contraction.
+    UnicodeString none((UChar)0xffff);
+    none.append((UChar)0xffff);
+    for(;;) {
+        if(ts == NULL) {
+            if(suffixes.next(errorCode)) {
+                ts = &suffixes.getString();
+            } else {
+                ts = &none;
+            }
+        }
+        if(bs == NULL) {
+            if(baseSuffixes.next(errorCode)) {
+                bs = &baseSuffixes.getString();
+            } else {
+                bs = &none;
+            }
+        }
+        if(ts == &none && bs == &none) { break; }
+        int32_t cmp = ts->compare(*bs);
+        if(cmp < 0) {
+            // ts occurs in the tailoring but not in the base.
+            addSuffix(c, *ts);
+            ts = NULL;
+        } else if(cmp > 0) {
+            // bs occurs in the base but not in the tailoring.
+            addSuffix(c, *bs);
+            bs = NULL;
+        } else {
+            suffix = ts;
+            compare(c, (uint32_t)suffixes.getValue(), (uint32_t)baseSuffixes.getValue());
+            suffix = NULL;
+            ts = NULL;
+            bs = NULL;
+        }
+    }
+}
+
+void
+TailoredSet::addPrefixes(const CollationData *d, UChar32 c, const UChar *p) {
+    UCharsTrie::Iterator prefixes(p, 0, errorCode);
+    while(prefixes.next(errorCode)) {
+        addPrefix(d, prefixes.getString(), c, (uint32_t)prefixes.getValue());
+    }
+}
+
+void
+TailoredSet::addPrefix(const CollationData *d, const UnicodeString &pfx, UChar32 c, uint32_t ce32) {
+    setPrefix(pfx);
+    ce32 = d->getFinalCE32(ce32);
+    if(Collation::isContractionCE32(ce32)) {
+        const UChar *p = d->contexts + Collation::indexFromCE32(ce32);
+        addContractions(c, p + 2);
+    }
+    tailored->add(UnicodeString(unreversedPrefix).append(c));
+    resetPrefix();
+}
+
+void
+TailoredSet::addContractions(UChar32 c, const UChar *p) {
+    UCharsTrie::Iterator suffixes(p, 0, errorCode);
+    while(suffixes.next(errorCode)) {
+        addSuffix(c, suffixes.getString());
+    }
+}
+
+void
+TailoredSet::addSuffix(UChar32 c, const UnicodeString &sfx) {
+    tailored->add(UnicodeString(unreversedPrefix).append(c).append(sfx));
+}
+
+void
+TailoredSet::add(UChar32 c) {
+    if(unreversedPrefix.isEmpty() && suffix == NULL) {
+        tailored->add(c);
+    } else {
+        UnicodeString s(unreversedPrefix);
+        s.append(c);
+        if(suffix != NULL) {
+            s.append(*suffix);
+        }
+        tailored->add(s);
+    }
+}
+
+ContractionsAndExpansions::CESink::~CESink() {}
+
+U_CDECL_BEGIN
+
+static UBool U_CALLCONV
+enumCnERange(const void *context, UChar32 start, UChar32 end, uint32_t ce32) {
+    ContractionsAndExpansions *cne = (ContractionsAndExpansions *)context;
+    if(cne->checkTailored == 0) {
+        // There is no tailoring.
+        // No need to collect nor check the tailored set.
+    } else if(cne->checkTailored < 0) {
+        // Collect the set of code points with mappings in the tailoring data.
+        if(ce32 == Collation::FALLBACK_CE32) {
+            return TRUE;  // fallback to base, not tailored
+        } else {
+            cne->tailored.add(start, end);
+        }
+        // checkTailored > 0: Exclude tailored ranges from the base data enumeration.
+    } else if(start == end) {
+        if(cne->tailored.contains(start)) {
+            return TRUE;
+        }
+    } else if(cne->tailored.containsSome(start, end)) {
+        cne->ranges.set(start, end).removeAll(cne->tailored);
+        int32_t count = cne->ranges.getRangeCount();
+        for(int32_t i = 0; i < count; ++i) {
+            cne->handleCE32(cne->ranges.getRangeStart(i), cne->ranges.getRangeEnd(i), ce32);
+        }
+        return U_SUCCESS(cne->errorCode);
+    }
+    cne->handleCE32(start, end, ce32);
+    return U_SUCCESS(cne->errorCode);
+}
+
+U_CDECL_END
+
+void
+ContractionsAndExpansions::forData(const CollationData *d, UErrorCode &ec) {
+    if(U_FAILURE(ec)) { return; }
+    errorCode = ec;  // Preserve info & warning codes.
+    // Add all from the data, can be tailoring or base.
+    if(d->base != NULL) {
+        checkTailored = -1;
+    }
+    data = d;
+    utrie2_enum(data->trie, NULL, enumCnERange, this);
+    if(d->base == NULL || U_FAILURE(errorCode)) {
+        ec = errorCode;
+        return;
+    }
+    // Add all from the base data but only for un-tailored code points.
+    tailored.freeze();
+    checkTailored = 1;
+    data = d->base;
+    utrie2_enum(data->trie, NULL, enumCnERange, this);
+    ec = errorCode;
+}
+
+void
+ContractionsAndExpansions::forCodePoint(const CollationData *d, UChar32 c, UErrorCode &ec) {
+    if(U_FAILURE(ec)) { return; }
+    errorCode = ec;  // Preserve info & warning codes.
+    uint32_t ce32 = d->getCE32(c);
+    if(ce32 == Collation::FALLBACK_CE32) {
+        d = d->base;
+        ce32 = d->getCE32(c);
+    }
+    data = d;
+    handleCE32(c, c, ce32);
+    ec = errorCode;
+}
+
+void
+ContractionsAndExpansions::handleCE32(UChar32 start, UChar32 end, uint32_t ce32) {
+    for(;;) {
+        if((ce32 & 0xff) < Collation::SPECIAL_CE32_LOW_BYTE) {
+            // !isSpecialCE32()
+            if(sink != NULL) {
+                sink->handleCE(Collation::ceFromSimpleCE32(ce32));
+            }
+            return;
+        }
+        switch(Collation::tagFromCE32(ce32)) {
+        case Collation::FALLBACK_TAG:
+            return;
+        case Collation::RESERVED_TAG_3:
+        case Collation::BUILDER_DATA_TAG:
+        case Collation::LEAD_SURROGATE_TAG:
+            if(U_SUCCESS(errorCode)) { errorCode = U_INTERNAL_PROGRAM_ERROR; }
+            return;
+        case Collation::LONG_PRIMARY_TAG:
+            if(sink != NULL) {
+                sink->handleCE(Collation::ceFromLongPrimaryCE32(ce32));
+            }
+            return;
+        case Collation::LONG_SECONDARY_TAG:
+            if(sink != NULL) {
+                sink->handleCE(Collation::ceFromLongSecondaryCE32(ce32));
+            }
+            return;
+        case Collation::LATIN_EXPANSION_TAG:
+            if(sink != NULL) {
+                ces[0] = Collation::latinCE0FromCE32(ce32);
+                ces[1] = Collation::latinCE1FromCE32(ce32);
+                sink->handleExpansion(ces, 2);
+            }
+            // Optimization: If we have a prefix,
+            // then the relevant strings have been added already.
+            if(unreversedPrefix.isEmpty()) {
+                addExpansions(start, end);
+            }
+            return;
+        case Collation::EXPANSION32_TAG:
+            if(sink != NULL) {
+                const uint32_t *ce32s = data->ce32s + Collation::indexFromCE32(ce32);
+                int32_t length = Collation::lengthFromCE32(ce32);
+                for(int32_t i = 0; i < length; ++i) {
+                    ces[i] = Collation::ceFromCE32(*ce32s++);
+                }
+                sink->handleExpansion(ces, length);
+            }
+            // Optimization: If we have a prefix,
+            // then the relevant strings have been added already.
+            if(unreversedPrefix.isEmpty()) {
+                addExpansions(start, end);
+            }
+            return;
+        case Collation::EXPANSION_TAG:
+            if(sink != NULL) {
+                int32_t length = Collation::lengthFromCE32(ce32);
+                sink->handleExpansion(data->ces + Collation::indexFromCE32(ce32), length);
+            }
+            // Optimization: If we have a prefix,
+            // then the relevant strings have been added already.
+            if(unreversedPrefix.isEmpty()) {
+                addExpansions(start, end);
+            }
+            return;
+        case Collation::PREFIX_TAG:
+            handlePrefixes(start, end, ce32);
+            return;
+        case Collation::CONTRACTION_TAG:
+            handleContractions(start, end, ce32);
+            return;
+        case Collation::DIGIT_TAG:
+            // Fetch the non-numeric-collation CE32 and continue.
+            ce32 = data->ce32s[Collation::indexFromCE32(ce32)];
+            break;
+        case Collation::U0000_TAG:
+            U_ASSERT(start == 0 && end == 0);
+            // Fetch the normal ce32 for U+0000 and continue.
+            ce32 = data->ce32s[0];
+            break;
+        case Collation::HANGUL_TAG:
+            if(sink != NULL) {
+                // TODO: This should be optimized,
+                // especially if [start..end] is the complete Hangul range. (assert that)
+                UTF16CollationIterator iter(data, FALSE, NULL, NULL, NULL);
+                UChar hangul[1] = { 0 };
+                for(UChar32 c = start; c <= end; ++c) {
+                    hangul[0] = (UChar)c;
+                    iter.setText(hangul, hangul + 1);
+                    int32_t length = iter.fetchCEs(errorCode);
+                    if(U_FAILURE(errorCode)) { return; }
+                    // Ignore the terminating non-CE.
+                    U_ASSERT(length >= 2 && iter.getCE(length - 1) == Collation::NO_CE);
+                    sink->handleExpansion(iter.getCEs(), length - 1);
+                }
+            }
+            // Optimization: If we have a prefix,
+            // then the relevant strings have been added already.
+            if(unreversedPrefix.isEmpty()) {
+                addExpansions(start, end);
+            }
+            return;
+        case Collation::OFFSET_TAG:
+            // Currently no need to send offset CEs to the sink.
+            return;
+        case Collation::IMPLICIT_TAG:
+            // Currently no need to send implicit CEs to the sink.
+            return;
+        }
+    }
+}
+
+void
+ContractionsAndExpansions::handlePrefixes(
+        UChar32 start, UChar32 end, uint32_t ce32) {
+    const UChar *p = data->contexts + Collation::indexFromCE32(ce32);
+    ce32 = CollationData::readCE32(p);  // Default if no prefix match.
+    handleCE32(start, end, ce32);
+    if(!addPrefixes) { return; }
+    UCharsTrie::Iterator prefixes(p + 2, 0, errorCode);
+    while(prefixes.next(errorCode)) {
+        setPrefix(prefixes.getString());
+        // Prefix/pre-context mappings are special kinds of contractions
+        // that always yield expansions.
+        addStrings(start, end, contractions);
+        addStrings(start, end, expansions);
+        handleCE32(start, end, (uint32_t)prefixes.getValue());
+    }
+    resetPrefix();
+}
+
+void
+ContractionsAndExpansions::handleContractions(
+        UChar32 start, UChar32 end, uint32_t ce32) {
+    const UChar *p = data->contexts + Collation::indexFromCE32(ce32);
+    if((ce32 & Collation::CONTRACT_SINGLE_CP_NO_MATCH) != 0) {
+        // No match on the single code point.
+        // We are underneath a prefix, and the default mapping is just
+        // a fallback to the mappings for a shorter prefix.
+        U_ASSERT(!unreversedPrefix.isEmpty());
+    } else {
+        ce32 = CollationData::readCE32(p);  // Default if no suffix match.
+        U_ASSERT(!Collation::isContractionCE32(ce32));
+        handleCE32(start, end, ce32);
+    }
+    UCharsTrie::Iterator suffixes(p + 2, 0, errorCode);
+    while(suffixes.next(errorCode)) {
+        suffix = &suffixes.getString();
+        addStrings(start, end, contractions);
+        if(!unreversedPrefix.isEmpty()) {
+            addStrings(start, end, expansions);
+        }
+        handleCE32(start, end, (uint32_t)suffixes.getValue());
+    }
+    suffix = NULL;
+}
+
+void
+ContractionsAndExpansions::addExpansions(UChar32 start, UChar32 end) {
+    if(unreversedPrefix.isEmpty() && suffix == NULL) {
+        if(expansions != NULL) {
+            expansions->add(start, end);
+        }
+    } else {
+        addStrings(start, end, expansions);
+    }
+}
+
+void
+ContractionsAndExpansions::addStrings(UChar32 start, UChar32 end, UnicodeSet *set) {
+    if(set == NULL) { return; }
+    UnicodeString s(unreversedPrefix);
+    do {
+        s.append(start);
+        if(suffix != NULL) {
+            s.append(*suffix);
+        }
+        set->add(s);
+        s.truncate(unreversedPrefix.length());
+    } while(++start <= end);
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationsets.h b/icu4c/source/i18n/collationsets.h
new file mode 100644 (file)
index 0000000..4f0a2b6
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationsets.h
+*
+* created on: 2013feb09
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONSETS_H__
+#define __COLLATIONSETS_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/uniset.h"
+#include "collation.h"
+
+U_NAMESPACE_BEGIN
+
+struct CollationData;
+
+/**
+ * Finds the set of characters and strings that sort differently in the tailoring
+ * from the base data.
+ *
+ * Every mapping in the tailoring needs to be compared to the base,
+ * because some mappings are copied for optimization, and
+ * all contractions for a character are copied if any contractions for that character
+ * are added, modified or removed.
+ *
+ * It might be simpler to re-parse the rule string, but:
+ * - That would require duplicating some of the from-rules builder code.
+ * - That would make the runtime code depend on the builder.
+ * - That would only work if we have the rule string, and we allow users to
+ *   omit the rule string from data files.
+ */
+class TailoredSet : public UMemory {
+public:
+    TailoredSet(UnicodeSet *t)
+            : data(NULL), baseData(NULL),
+              tailored(t),
+              suffix(NULL),
+              errorCode(U_ZERO_ERROR) {}
+
+    void forData(const CollationData *d, UErrorCode &errorCode);
+
+    /**
+     * @return U_SUCCESS(errorCode) in C++, void in Java
+     * @internal only public for access by callback
+     */
+    UBool handleCE32(UChar32 start, UChar32 end, uint32_t ce32);
+
+private:
+    void compare(UChar32 c, uint32_t ce32, uint32_t baseCE32);
+    void comparePrefixes(UChar32 c, const UChar *p, const UChar *q);
+    void compareContractions(UChar32 c, const UChar *p, const UChar *q);
+
+    void addPrefixes(const CollationData *d, UChar32 c, const UChar *p);
+    void addPrefix(const CollationData *d, const UnicodeString &pfx, UChar32 c, uint32_t ce32);
+    void addContractions(UChar32 c, const UChar *p);
+    void addSuffix(UChar32 c, const UnicodeString &sfx);
+    void add(UChar32 c);
+
+    /** Prefixes are reversed in the data structure. */
+    void setPrefix(const UnicodeString &pfx) {
+        unreversedPrefix = pfx;
+        unreversedPrefix.reverse();
+    }
+    void resetPrefix() {
+        unreversedPrefix.remove();
+    }
+
+    const CollationData *data;
+    const CollationData *baseData;
+    UnicodeSet *tailored;
+    UnicodeString unreversedPrefix;
+    const UnicodeString *suffix;
+    UErrorCode errorCode;
+};
+
+class ContractionsAndExpansions : public UMemory {
+public:
+    class CESink : public UMemory {
+    public:
+        virtual ~CESink();
+        virtual void handleCE(int64_t ce) = 0;
+        virtual void handleExpansion(const int64_t ces[], int32_t length) = 0;
+    };
+
+    ContractionsAndExpansions(UnicodeSet *con, UnicodeSet *exp, CESink *s, UBool prefixes)
+            : data(NULL),
+              contractions(con), expansions(exp),
+              sink(s),
+              addPrefixes(prefixes),
+              checkTailored(0),
+              suffix(NULL),
+              errorCode(U_ZERO_ERROR) {}
+
+    void forData(const CollationData *d, UErrorCode &errorCode);
+    void forCodePoint(const CollationData *d, UChar32 c, UErrorCode &ec);
+
+    // all following: @internal, only public for access by callback
+
+    void handleCE32(UChar32 start, UChar32 end, uint32_t ce32);
+
+    void handlePrefixes(UChar32 start, UChar32 end, uint32_t ce32);
+    void handleContractions(UChar32 start, UChar32 end, uint32_t ce32);
+
+    void addExpansions(UChar32 start, UChar32 end);
+    void addStrings(UChar32 start, UChar32 end, UnicodeSet *set);
+
+    /** Prefixes are reversed in the data structure. */
+    void setPrefix(const UnicodeString &pfx) {
+        unreversedPrefix = pfx;
+        unreversedPrefix.reverse();
+    }
+    void resetPrefix() {
+        unreversedPrefix.remove();
+    }
+
+    const CollationData *data;
+    UnicodeSet *contractions;
+    UnicodeSet *expansions;
+    CESink *sink;
+    UBool addPrefixes;
+    int8_t checkTailored;  // -1: collected tailored  +1: exclude tailored
+    UnicodeSet tailored;
+    UnicodeSet ranges;
+    UnicodeString unreversedPrefix;
+    const UnicodeString *suffix;
+    int64_t ces[Collation::MAX_EXPANSION_LENGTH];
+    UErrorCode errorCode;
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONSETS_H__
diff --git a/icu4c/source/i18n/collationsettings.cpp b/icu4c/source/i18n/collationsettings.cpp
new file mode 100644 (file)
index 0000000..b63d6bf
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationsettings.cpp
+*
+* created on: 2013feb07
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/ucol.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationsettings.h"
+#include "sharedobject.h"
+#include "uassert.h"
+#include "umutex.h"
+
+U_NAMESPACE_BEGIN
+
+CollationSettings::CollationSettings(const CollationSettings &other)
+        : SharedObject(other),
+          options(other.options), variableTop(other.variableTop),
+          reorderTable(NULL),
+          reorderCodes(NULL), reorderCodesLength(0), reorderCodesCapacity(0),
+          fastLatinOptions(other.fastLatinOptions) {
+    int32_t length = other.reorderCodesLength;
+    if(length == 0) {
+        U_ASSERT(other.reorderTable == NULL);
+    } else {
+        U_ASSERT(other.reorderTable != NULL);
+        if(other.reorderCodesCapacity == 0) {
+            aliasReordering(other.reorderCodes, length, other.reorderTable);
+        } else {
+            setReordering(other.reorderCodes, length, other.reorderTable);
+        }
+    }
+    if(fastLatinOptions >= 0) {
+        uprv_memcpy(fastLatinPrimaries, other.fastLatinPrimaries, sizeof(fastLatinPrimaries));
+    }
+}
+
+CollationSettings::~CollationSettings() {
+    if(reorderCodesCapacity != 0) {
+        uprv_free(const_cast<int32_t *>(reorderCodes));
+    }
+}
+
+UBool
+CollationSettings::operator==(const CollationSettings &other) const {
+    if(options != other.options) { return FALSE; }
+    if((options & ALTERNATE_MASK) != 0 && variableTop != other.variableTop) { return FALSE; }
+    if(reorderCodesLength != other.reorderCodesLength) { return FALSE; }
+    for(int32_t i = 0; i < reorderCodesLength; ++i) {
+        if(reorderCodes[i] != other.reorderCodes[i]) { return FALSE; }
+    }
+    return TRUE;
+}
+
+int32_t
+CollationSettings::hashCode() const {
+    int32_t h = options << 8;
+    if((options & ALTERNATE_MASK) != 0) { h ^= variableTop; }
+    h ^= reorderCodesLength;
+    for(int32_t i = 0; i < reorderCodesLength; ++i) {
+        h ^= (reorderCodes[i] << i);
+    }
+    return h;
+}
+
+void
+CollationSettings::resetReordering() {
+    // When we turn off reordering, we want to set a NULL permutation
+    // rather than a no-op permutation.
+    // Keep the memory via reorderCodes and its capacity.
+    reorderTable = NULL;
+    reorderCodesLength = 0;
+}
+
+void
+CollationSettings::aliasReordering(const int32_t *codes, int32_t length, const uint8_t *table) {
+    if(length == 0) {
+        resetReordering();
+    } else {
+        // We need to release the memory before setting the alias pointer.
+        if(reorderCodesCapacity != 0) {
+            uprv_free(const_cast<int32_t *>(reorderCodes));
+            reorderCodesCapacity = 0;
+        }
+        reorderTable = table;
+        reorderCodes = codes;
+        reorderCodesLength = length;
+    }
+}
+
+UBool
+CollationSettings::setReordering(const int32_t *codes, int32_t length, const uint8_t table[256]) {
+    if(length == 0) {
+        resetReordering();
+    } else {
+        uint8_t *ownedTable;
+        int32_t *ownedCodes;
+        if(length <= reorderCodesCapacity) {
+            ownedTable = const_cast<uint8_t *>(reorderTable);
+            ownedCodes = const_cast<int32_t *>(reorderCodes);
+        } else {
+            // Allocate one memory block for the codes and the 16-aligned table.
+            int32_t capacity = (length + 3) & ~3;  // round up to a multiple of 4 ints
+            uint8_t *bytes = (uint8_t *)uprv_malloc(256 + capacity * 4);
+            if(bytes == NULL) { return FALSE; }
+            if(reorderCodesCapacity != 0) {
+                uprv_free(const_cast<int32_t *>(reorderCodes));
+            }
+            reorderTable = ownedTable = bytes + capacity * 4;
+            reorderCodes = ownedCodes = (int32_t *)bytes;
+            reorderCodesCapacity = capacity;
+        }
+        uprv_memcpy(ownedTable, table, 256);
+        uprv_memcpy(ownedCodes, codes, length * 4);
+        reorderCodesLength = length;
+    }
+    return TRUE;
+}
+
+void
+CollationSettings::setStrength(int32_t value, int32_t defaultOptions, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    int32_t noStrength = options & ~STRENGTH_MASK;
+    switch(value) {
+    case UCOL_PRIMARY:
+    case UCOL_SECONDARY:
+    case UCOL_TERTIARY:
+    case UCOL_QUATERNARY:
+    case UCOL_IDENTICAL:
+        options = noStrength | (value << STRENGTH_SHIFT);
+        break;
+    case UCOL_DEFAULT:
+        options = noStrength | (defaultOptions & STRENGTH_MASK);
+        break;
+    default:
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        break;
+    }
+}
+
+void
+CollationSettings::setFlag(int32_t bit, UColAttributeValue value,
+                           int32_t defaultOptions, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    switch(value) {
+    case UCOL_ON:
+        options |= bit;
+        break;
+    case UCOL_OFF:
+        options &= ~bit;
+        break;
+    case UCOL_DEFAULT:
+        options = (options & ~bit) | (defaultOptions & bit);
+        break;
+    default:
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        break;
+    }
+}
+
+void
+CollationSettings::setCaseFirst(UColAttributeValue value,
+                                int32_t defaultOptions, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    int32_t noCaseFirst = options & ~CASE_FIRST_AND_UPPER_MASK;
+    switch(value) {
+    case UCOL_OFF:
+        options = noCaseFirst;
+        break;
+    case UCOL_LOWER_FIRST:
+        options = noCaseFirst | CASE_FIRST;
+        break;
+    case UCOL_UPPER_FIRST:
+        options = noCaseFirst | CASE_FIRST_AND_UPPER_MASK;
+        break;
+    case UCOL_DEFAULT:
+        options = noCaseFirst | (defaultOptions & CASE_FIRST_AND_UPPER_MASK);
+        break;
+    default:
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        break;
+    }
+}
+
+void
+CollationSettings::setAlternateHandling(UColAttributeValue value,
+                                        int32_t defaultOptions, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    int32_t noAlternate = options & ~ALTERNATE_MASK;
+    switch(value) {
+    case UCOL_NON_IGNORABLE:
+        options = noAlternate;
+        break;
+    case UCOL_SHIFTED:
+        options = noAlternate | SHIFTED;
+        break;
+    case UCOL_DEFAULT:
+        options = noAlternate | (defaultOptions & ALTERNATE_MASK);
+        break;
+    default:
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        break;
+    }
+}
+
+void
+CollationSettings::setMaxVariable(int32_t value, int32_t defaultOptions, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    int32_t noMax = options & ~MAX_VARIABLE_MASK;
+    switch(value) {
+    case MAX_VAR_SPACE:
+    case MAX_VAR_PUNCT:
+    case MAX_VAR_SYMBOL:
+    case MAX_VAR_CURRENCY:
+        options = noMax | (value << MAX_VARIABLE_SHIFT);
+        break;
+    case UCOL_DEFAULT:
+        options = noMax | (defaultOptions & MAX_VARIABLE_MASK);
+        break;
+    default:
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        break;
+    }
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationsettings.h b/icu4c/source/i18n/collationsettings.h
new file mode 100644 (file)
index 0000000..93ded9b
--- /dev/null
@@ -0,0 +1,219 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationsettings.h
+*
+* created on: 2013feb07
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONSETTINGS_H__
+#define __COLLATIONSETTINGS_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/ucol.h"
+#include "collation.h"
+#include "sharedobject.h"
+#include "umutex.h"
+
+U_NAMESPACE_BEGIN
+
+/**
+ * Collation settings/options/attributes.
+ * These are the values that can be changed via API.
+ */
+struct U_I18N_API CollationSettings : public SharedObject {
+    /**
+     * Options bit 0: Perform the FCD check on the input text and deliver normalized text.
+     */
+    static const int32_t CHECK_FCD = 1;
+    /**
+     * Options bit 1: Numeric collation.
+     * Also known as CODAN = COllate Digits As Numbers.
+     *
+     * Treat digit sequences as numbers with CE sequences in numeric order,
+     * rather than returning a normal CE for each digit.
+     */
+    static const int32_t NUMERIC = 2;
+    /**
+     * "Shifted" alternate handling, see ALTERNATE_MASK.
+     */
+    static const int32_t SHIFTED = 4;
+    /**
+     * Options bits 3..2: Alternate-handling mask. 0 for non-ignorable.
+     * Reserve values 8 and 0xc for shift-trimmed and blanked.
+     */
+    static const int32_t ALTERNATE_MASK = 0xc;
+    /**
+     * Options bits 6..4: The 3-bit maxVariable value bit field is shifted by this value.
+     */
+    static const int32_t MAX_VARIABLE_SHIFT = 4;
+    /** maxVariable options bit mask before shifting. */
+    static const int32_t MAX_VARIABLE_MASK = 0x70;
+    /** Options bit 7: Reserved/unused/0. */
+    /**
+     * Options bit 8: Sort uppercase first if caseLevel or caseFirst is on.
+     */
+    static const int32_t UPPER_FIRST = 0x100;
+    /**
+     * Options bit 9: Keep the case bits in the tertiary weight (they trump other tertiary values)
+     * unless case level is on (when they are *moved* into the separate case level).
+     * By default, the case bits are removed from the tertiary weight (ignored).
+     *
+     * When CASE_FIRST is off, UPPER_FIRST must be off too, corresponding to
+     * the tri-value UCOL_CASE_FIRST attribute: UCOL_OFF vs. UCOL_LOWER_FIRST vs. UCOL_UPPER_FIRST.
+     */
+    static const int32_t CASE_FIRST = 0x200;
+    /**
+     * Options bit mask for caseFirst and upperFirst, before shifting.
+     * Same value as caseFirst==upperFirst.
+     */
+    static const int32_t CASE_FIRST_AND_UPPER_MASK = CASE_FIRST | UPPER_FIRST;
+    /**
+     * Options bit 10: Insert the case level between the secondary and tertiary levels.
+     */
+    static const int32_t CASE_LEVEL = 0x400;
+    /**
+     * Options bit 11: Compare secondary weights backwards. ("French secondary")
+     */
+    static const int32_t BACKWARD_SECONDARY = 0x800;
+    /**
+     * Options bits 15..12: The 4-bit strength value bit field is shifted by this value.
+     * It is the top used bit field in the options. (No need to mask after shifting.)
+     */
+    static const int32_t STRENGTH_SHIFT = 12;
+    /** Strength options bit mask before shifting. */
+    static const int32_t STRENGTH_MASK = 0xf000;
+
+    /** maxVariable values */
+    enum MaxVariable {
+        MAX_VAR_SPACE,
+        MAX_VAR_PUNCT,
+        MAX_VAR_SYMBOL,
+        MAX_VAR_CURRENCY
+    };
+
+    CollationSettings()
+            : options((UCOL_DEFAULT_STRENGTH << STRENGTH_SHIFT) |
+                      (MAX_VAR_PUNCT << MAX_VARIABLE_SHIFT)),
+              variableTop(0),
+              reorderTable(NULL),
+              reorderCodes(NULL), reorderCodesLength(0), reorderCodesCapacity(0),
+              fastLatinOptions(-1) {}
+
+    CollationSettings(const CollationSettings &other);
+    virtual ~CollationSettings();
+
+    UBool operator==(const CollationSettings &other) const;
+
+    inline UBool operator!=(const CollationSettings &other) const {
+        return !operator==(other);
+    }
+
+    int32_t hashCode() const;
+
+    void resetReordering();
+    void aliasReordering(const int32_t *codes, int32_t length, const uint8_t *table);
+    UBool setReordering(const int32_t *codes, int32_t length, const uint8_t table[256]);
+
+    void setStrength(int32_t value, int32_t defaultOptions, UErrorCode &errorCode);
+
+    static int32_t getStrength(int32_t options) {
+        return options >> STRENGTH_SHIFT;
+    }
+
+    int32_t getStrength() const {
+        return getStrength(options);
+    }
+
+    /** Sets the options bit for an on/off attribute. */
+    void setFlag(int32_t bit, UColAttributeValue value,
+                 int32_t defaultOptions, UErrorCode &errorCode);
+
+    UColAttributeValue getFlag(int32_t bit) const {
+        return ((options & bit) != 0) ? UCOL_ON : UCOL_OFF;
+    }
+
+    void setCaseFirst(UColAttributeValue value, int32_t defaultOptions, UErrorCode &errorCode);
+
+    UColAttributeValue getCaseFirst() const {
+        int32_t option = options & CASE_FIRST_AND_UPPER_MASK;
+        return (option == 0) ? UCOL_OFF :
+                (option == CASE_FIRST) ? UCOL_LOWER_FIRST : UCOL_UPPER_FIRST;
+    }
+
+    void setAlternateHandling(UColAttributeValue value,
+                              int32_t defaultOptions, UErrorCode &errorCode);
+
+    UColAttributeValue getAlternateHandling() const {
+        return ((options & ALTERNATE_MASK) == 0) ? UCOL_NON_IGNORABLE : UCOL_SHIFTED;
+    }
+
+    void setMaxVariable(int32_t value, int32_t defaultOptions, UErrorCode &errorCode);
+
+    MaxVariable getMaxVariable() const {
+        return (MaxVariable)((options & MAX_VARIABLE_MASK) >> MAX_VARIABLE_SHIFT);
+    }
+
+    /**
+     * Include case bits in the tertiary level if caseLevel=off and caseFirst!=off.
+     */
+    static inline UBool isTertiaryWithCaseBits(int32_t options) {
+        return (options & (CASE_LEVEL | CASE_FIRST)) == CASE_FIRST;
+    }
+    static uint32_t getTertiaryMask(int32_t options) {
+        // Remove the case bits from the tertiary weight when caseLevel is on or caseFirst is off.
+        return isTertiaryWithCaseBits(options) ?
+                Collation::CASE_AND_TERTIARY_MASK : Collation::ONLY_TERTIARY_MASK;
+    }
+
+    static UBool sortsTertiaryUpperCaseFirst(int32_t options) {
+        // On tertiary level, consider case bits and sort uppercase first
+        // if caseLevel is off and caseFirst==upperFirst.
+        return (options & (CASE_LEVEL | CASE_FIRST_AND_UPPER_MASK)) == CASE_FIRST_AND_UPPER_MASK;
+    }
+
+    inline UBool dontCheckFCD() const {
+        return (options & CHECK_FCD) == 0;
+    }
+
+    inline UBool hasBackwardSecondary() const {
+        return (options & BACKWARD_SECONDARY) != 0;
+    }
+
+    inline UBool isNumeric() const {
+        return (options & NUMERIC) != 0;
+    }
+
+    /** CHECK_FCD etc. */
+    int32_t options;
+    /** Variable-top primary weight. */
+    uint32_t variableTop;
+    /** 256-byte table for reordering permutation of primary lead bytes; NULL if no reordering. */
+    const uint8_t *reorderTable;
+    /** Array of reorder codes; ignored if reorderCodesLength == 0. */
+    const int32_t *reorderCodes;
+    /** Number of reorder codes; 0 if no reordering. */
+    int32_t reorderCodesLength;
+    /**
+     * Capacity of reorderCodes.
+     * If 0, then the table and codes are aliases.
+     * Otherwise, this object owns the memory via the reorderCodes pointer;
+     * the table and the codes are in the same memory block, with the codes first.
+     */
+    int32_t reorderCodesCapacity;
+
+    /** Options for CollationFastLatin. Negative if disabled. */
+    int32_t fastLatinOptions;
+    uint16_t fastLatinPrimaries[0x180];
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONSETTINGS_H__
diff --git a/icu4c/source/i18n/collationtailoring.cpp b/icu4c/source/i18n/collationtailoring.cpp
new file mode 100644 (file)
index 0000000..666b07b
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationtailoring.cpp
+*
+* created on: 2013mar12
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/udata.h"
+#include "unicode/unistr.h"
+#include "unicode/ures.h"
+#include "unicode/uversion.h"
+#include "unicode/uvernum.h"
+#include "cmemory.h"
+#include "collationdata.h"
+#include "collationsettings.h"
+#include "collationtailoring.h"
+#include "normalizer2impl.h"
+#include "uassert.h"
+#include "uhash.h"
+#include "umutex.h"
+#include "utrie2.h"
+
+U_NAMESPACE_BEGIN
+
+CollationTailoring::CollationTailoring(const CollationSettings *baseSettings)
+        : data(NULL), settings(baseSettings),
+          actualLocale(""),
+          ownedData(NULL),
+          builder(NULL), memory(NULL), bundle(NULL),
+          trie(NULL), unsafeBackwardSet(NULL),
+          maxExpansions(NULL) {
+    if(baseSettings != NULL) {
+        U_ASSERT(baseSettings->reorderCodesLength == 0);
+        U_ASSERT(baseSettings->reorderTable == NULL);
+    } else {
+        settings = new CollationSettings();
+    }
+    if(settings != NULL) {
+        settings->addRef();
+    }
+    rules.getTerminatedBuffer();  // ensure NUL-termination
+    version[0] = version[1] = version[2] = version[3] = 0;
+    maxExpansionsInitOnce.reset();
+}
+
+CollationTailoring::~CollationTailoring() {
+    SharedObject::clearPtr(settings);
+    delete ownedData;
+    delete builder;
+    udata_close(memory);
+    ures_close(bundle);
+    utrie2_close(trie);
+    delete unsafeBackwardSet;
+    uhash_close(maxExpansions);
+    maxExpansionsInitOnce.reset();
+}
+
+UBool
+CollationTailoring::ensureOwnedData(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    if(ownedData == NULL) {
+        const Normalizer2Impl *nfcImpl = Normalizer2Factory::getNFCImpl(errorCode);
+        if(U_FAILURE(errorCode)) { return FALSE; }
+        ownedData = new CollationData(*nfcImpl);
+        if(ownedData == NULL) {
+            errorCode = U_MEMORY_ALLOCATION_ERROR;
+            return FALSE;
+        }
+    }
+    data = ownedData;
+    return TRUE;
+}
+
+void
+CollationTailoring::makeBaseVersion(const UVersionInfo ucaVersion, UVersionInfo version) {
+    version[0] = UCOL_BUILDER_VERSION;
+    version[1] = (ucaVersion[0] << 3) + ucaVersion[1];
+    version[2] = ucaVersion[2] << 6;
+    version[3] = 0;
+}
+
+void
+CollationTailoring::setVersion(const UVersionInfo baseVersion, const UVersionInfo rulesVersion) {
+    version[0] = UCOL_BUILDER_VERSION;
+    version[1] = baseVersion[1];
+    version[2] = (baseVersion[2] & 0xc0) + ((rulesVersion[0] + (rulesVersion[0] >> 6)) & 0x3f);
+    version[3] = (rulesVersion[1] << 3) + (rulesVersion[1] >> 5) + rulesVersion[2] +
+            (rulesVersion[3] << 4) + (rulesVersion[3] >> 4);
+}
+
+int32_t
+CollationTailoring::getUCAVersion() const {
+    return ((int32_t)version[1] << 4) | (version[2] >> 6);
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/collationtailoring.h b/icu4c/source/i18n/collationtailoring.h
new file mode 100644 (file)
index 0000000..e81c403
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationtailoring.h
+*
+* created on: 2013mar12
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONTAILORING_H__
+#define __COLLATIONTAILORING_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/locid.h"
+#include "unicode/unistr.h"
+#include "unicode/uversion.h"
+#include "collationsettings.h"
+#include "uhash.h"
+#include "umutex.h"
+
+struct UDataMemory;
+struct UResourceBundle;
+struct UTrie2;
+
+U_NAMESPACE_BEGIN
+
+struct CollationData;
+
+class UnicodeSet;
+
+/**
+ * Collation tailoring data & settings.
+ * This is a container of values for a collation tailoring
+ * built from rules or deserialized from binary data.
+ *
+ * It is logically immutable: Do not modify its values.
+ * The fields are public for convenience.
+ *
+ * It is shared, reference-counted, and auto-deleted; see SharedObject.
+ */
+struct U_I18N_API CollationTailoring : public SharedObject {
+    CollationTailoring(const CollationSettings *baseSettings);
+    virtual ~CollationTailoring();
+
+    /**
+     * Returns TRUE if the constructor could not initialize properly.
+     */
+    UBool isBogus() { return settings == NULL; }
+
+    UBool ensureOwnedData(UErrorCode &errorCode);
+
+    static void makeBaseVersion(const UVersionInfo ucaVersion, UVersionInfo version);
+    void setVersion(const UVersionInfo baseVersion, const UVersionInfo rulesVersion);
+    int32_t getUCAVersion() const;
+
+    // data for sorting etc.
+    const CollationData *data;  // == base data or ownedData
+    const CollationSettings *settings;  // reference-counted
+    UnicodeString rules;
+    // The locale is bogus when built from rules or constructed from a binary blob.
+    // It can then be set by the service registration code which is thread-safe.
+    mutable Locale actualLocale;
+    // UCA version u.v.w & rules version r.s.t.q:
+    // version[0]: builder version (runtime version is mixed in at runtime)
+    // version[1]: bits 7..3=u, bits 2..0=v
+    // version[2]: bits 7..6=w, bits 5..0=r
+    // version[3]= (s<<5)+(s>>3)+t+(q<<4)+(q>>4)
+    UVersionInfo version;
+
+    // owned objects
+    CollationData *ownedData;
+    UObject *builder;
+    UDataMemory *memory;
+    UResourceBundle *bundle;
+    UTrie2 *trie;
+    UnicodeSet *unsafeBackwardSet;
+    mutable UHashtable *maxExpansions;
+    mutable UInitOnce maxExpansionsInitOnce;
+
+private:
+    /**
+     * No copy constructor: A CollationTailoring cannot be copied.
+     * It is immutable, and the data trie cannot be copied either.
+     */
+    CollationTailoring(const CollationTailoring &other);
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONTAILORING_H__
diff --git a/icu4c/source/i18n/collationweights.cpp b/icu4c/source/i18n/collationweights.cpp
new file mode 100644 (file)
index 0000000..17c044f
--- /dev/null
@@ -0,0 +1,543 @@
+/*  
+*******************************************************************************
+*
+*   Copyright (C) 1999-2014, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  collationweights.cpp
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2001mar08 as ucol_wgt.cpp
+*   created by: Markus W. Scherer
+*
+*   This file contains code for allocating n collation element weights
+*   between two exclusive limits.
+*   It is used only internally by the collation tailoring builder.
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "cmemory.h"
+#include "collation.h"
+#include "collationweights.h"
+#include "uarrsort.h"
+#include "uassert.h"
+
+#ifdef UCOL_DEBUG
+#   include <stdio.h>
+#endif
+
+U_NAMESPACE_BEGIN
+
+/* collation element weight allocation -------------------------------------- */
+
+/* helper functions for CE weights */
+
+static inline uint32_t
+getWeightTrail(uint32_t weight, int32_t length) {
+    return (uint32_t)(weight>>(8*(4-length)))&0xff;
+}
+
+static inline uint32_t
+setWeightTrail(uint32_t weight, int32_t length, uint32_t trail) {
+    length=8*(4-length);
+    return (uint32_t)((weight&(0xffffff00<<length))|(trail<<length));
+}
+
+static inline uint32_t
+getWeightByte(uint32_t weight, int32_t idx) {
+    return getWeightTrail(weight, idx); /* same calculation */
+}
+
+static inline uint32_t
+setWeightByte(uint32_t weight, int32_t idx, uint32_t byte) {
+    uint32_t mask; /* 0xffffffff except a 00 "hole" for the index-th byte */
+
+    idx*=8;
+    if(idx<32) {
+        mask=((uint32_t)0xffffffff)>>idx;
+    } else {
+        // Do not use uint32_t>>32 because on some platforms that does not shift at all
+        // while we need it to become 0.
+        // PowerPC: 0xffffffff>>32 = 0           (wanted)
+        // x86:     0xffffffff>>32 = 0xffffffff  (not wanted)
+        //
+        // ANSI C99 6.5.7 Bitwise shift operators:
+        // "If the value of the right operand is negative
+        // or is greater than or equal to the width of the promoted left operand,
+        // the behavior is undefined."
+        mask=0;
+    }
+    idx=32-idx;
+    mask|=0xffffff00<<idx;
+    return (uint32_t)((weight&mask)|(byte<<idx));
+}
+
+static inline uint32_t
+truncateWeight(uint32_t weight, int32_t length) {
+    return (uint32_t)(weight&(0xffffffff<<(8*(4-length))));
+}
+
+static inline uint32_t
+incWeightTrail(uint32_t weight, int32_t length) {
+    return (uint32_t)(weight+(1UL<<(8*(4-length))));
+}
+
+static inline uint32_t
+decWeightTrail(uint32_t weight, int32_t length) {
+    return (uint32_t)(weight-(1UL<<(8*(4-length))));
+}
+
+CollationWeights::CollationWeights()
+        : middleLength(0), rangeIndex(0), rangeCount(0) {
+    for(int32_t i = 0; i < 5; ++i) {
+        minBytes[i] = maxBytes[i] = 0;
+    }
+}
+
+void
+CollationWeights::initForPrimary(UBool compressible) {
+    middleLength=1;
+    minBytes[1] = Collation::MERGE_SEPARATOR_BYTE + 1;
+    maxBytes[1] = Collation::TRAIL_WEIGHT_BYTE;
+    if(compressible) {
+        minBytes[2] = Collation::PRIMARY_COMPRESSION_LOW_BYTE + 1;
+        maxBytes[2] = Collation::PRIMARY_COMPRESSION_HIGH_BYTE - 1;
+    } else {
+        minBytes[2] = 2;
+        maxBytes[2] = 0xff;
+    }
+    minBytes[3] = 2;
+    maxBytes[3] = 0xff;
+    minBytes[4] = 2;
+    maxBytes[4] = 0xff;
+}
+
+void
+CollationWeights::initForSecondary() {
+    // We use only the lower 16 bits for secondary weights.
+    middleLength=3;
+    minBytes[1] = 0;
+    maxBytes[1] = 0;
+    minBytes[2] = 0;
+    maxBytes[2] = 0;
+    minBytes[3] = Collation::MERGE_SEPARATOR_BYTE + 1;
+    maxBytes[3] = 0xff;
+    minBytes[4] = 2;
+    maxBytes[4] = 0xff;
+}
+
+void
+CollationWeights::initForTertiary() {
+    // We use only the lower 16 bits for tertiary weights.
+    middleLength=3;
+    minBytes[1] = 0;
+    maxBytes[1] = 0;
+    minBytes[2] = 0;
+    maxBytes[2] = 0;
+    // We use only 6 bits per byte.
+    // The other bits are used for case & quaternary weights.
+    minBytes[3] = Collation::MERGE_SEPARATOR_BYTE + 1;
+    maxBytes[3] = 0x3f;
+    minBytes[4] = 2;
+    maxBytes[4] = 0x3f;
+}
+
+uint32_t
+CollationWeights::incWeight(uint32_t weight, int32_t length) const {
+    for(;;) {
+        uint32_t byte=getWeightByte(weight, length);
+        if(byte<maxBytes[length]) {
+            return setWeightByte(weight, length, byte+1);
+        } else {
+            // Roll over, set this byte to the minimum and increment the previous one.
+            weight=setWeightByte(weight, length, minBytes[length]);
+            --length;
+            U_ASSERT(length > 0);
+        }
+    }
+}
+
+uint32_t
+CollationWeights::incWeightByOffset(uint32_t weight, int32_t length, int32_t offset) const {
+    for(;;) {
+        offset += getWeightByte(weight, length);
+        if((uint32_t)offset <= maxBytes[length]) {
+            return setWeightByte(weight, length, offset);
+        } else {
+            // Split the offset between this byte and the previous one.
+            offset -= minBytes[length];
+            weight = setWeightByte(weight, length, minBytes[length] + offset % countBytes(length));
+            offset /= countBytes(length);
+            --length;
+            U_ASSERT(length > 0);
+        }
+    }
+}
+
+void
+CollationWeights::lengthenRange(WeightRange &range) const {
+    int32_t length=range.length+1;
+    range.start=setWeightTrail(range.start, length, minBytes[length]);
+    range.end=setWeightTrail(range.end, length, maxBytes[length]);
+    range.count*=countBytes(length);
+    range.length=length;
+}
+
+/* for uprv_sortArray: sort ranges in weight order */
+static int32_t U_CALLCONV
+compareRanges(const void * /*context*/, const void *left, const void *right) {
+    uint32_t l, r;
+
+    l=((const CollationWeights::WeightRange *)left)->start;
+    r=((const CollationWeights::WeightRange *)right)->start;
+    if(l<r) {
+        return -1;
+    } else if(l>r) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+UBool
+CollationWeights::getWeightRanges(uint32_t lowerLimit, uint32_t upperLimit) {
+    U_ASSERT(lowerLimit != 0);
+    U_ASSERT(upperLimit != 0);
+
+    /* get the lengths of the limits */
+    int32_t lowerLength=lengthOfWeight(lowerLimit);
+    int32_t upperLength=lengthOfWeight(upperLimit);
+
+#ifdef UCOL_DEBUG
+    printf("length of lower limit 0x%08lx is %ld\n", lowerLimit, lowerLength);
+    printf("length of upper limit 0x%08lx is %ld\n", upperLimit, upperLength);
+#endif
+    U_ASSERT(lowerLength>=middleLength);
+    // Permit upperLength<middleLength: The upper limit for secondaries is 0x10000.
+
+    if(lowerLimit>=upperLimit) {
+#ifdef UCOL_DEBUG
+        printf("error: no space between lower & upper limits\n");
+#endif
+        return FALSE;
+    }
+
+    /* check that neither is a prefix of the other */
+    if(lowerLength<upperLength) {
+        if(lowerLimit==truncateWeight(upperLimit, lowerLength)) {
+#ifdef UCOL_DEBUG
+            printf("error: lower limit 0x%08lx is a prefix of upper limit 0x%08lx\n", lowerLimit, upperLimit);
+#endif
+            return FALSE;
+        }
+    }
+    /* if the upper limit is a prefix of the lower limit then the earlier test lowerLimit>=upperLimit has caught it */
+
+    WeightRange lower[5], middle, upper[5]; /* [0] and [1] are not used - this simplifies indexing */
+    uprv_memset(lower, 0, sizeof(lower));
+    uprv_memset(&middle, 0, sizeof(middle));
+    uprv_memset(upper, 0, sizeof(upper));
+
+    /*
+     * With the limit lengths of 1..4, there are up to 7 ranges for allocation:
+     * range     minimum length
+     * lower[4]  4
+     * lower[3]  3
+     * lower[2]  2
+     * middle    1
+     * upper[2]  2
+     * upper[3]  3
+     * upper[4]  4
+     *
+     * We are now going to calculate up to 7 ranges.
+     * Some of them will typically overlap, so we will then have to merge and eliminate ranges.
+     */
+    uint32_t weight=lowerLimit;
+    for(int32_t length=lowerLength; length>middleLength; --length) {
+        uint32_t trail=getWeightTrail(weight, length);
+        if(trail<maxBytes[length]) {
+            lower[length].start=incWeightTrail(weight, length);
+            lower[length].end=setWeightTrail(weight, length, maxBytes[length]);
+            lower[length].length=length;
+            lower[length].count=maxBytes[length]-trail;
+        }
+        weight=truncateWeight(weight, length-1);
+    }
+    if(weight<0xff000000) {
+        middle.start=incWeightTrail(weight, middleLength);
+    } else {
+        // Prevent overflow for primary lead byte FF
+        // which would yield a middle range starting at 0.
+        middle.start=0xffffffff;  // no middle range
+    }
+
+    weight=upperLimit;
+    for(int32_t length=upperLength; length>middleLength; --length) {
+        uint32_t trail=getWeightTrail(weight, length);
+        if(trail>minBytes[length]) {
+            upper[length].start=setWeightTrail(weight, length, minBytes[length]);
+            upper[length].end=decWeightTrail(weight, length);
+            upper[length].length=length;
+            upper[length].count=trail-minBytes[length];
+        }
+        weight=truncateWeight(weight, length-1);
+    }
+    middle.end=decWeightTrail(weight, middleLength);
+
+    /* set the middle range */
+    middle.length=middleLength;
+    if(middle.end>=middle.start) {
+        middle.count=(int32_t)((middle.end-middle.start)>>(8*(4-middleLength)))+1;
+    } else {
+        /* no middle range, eliminate overlaps */
+
+        /* reduce or remove the lower ranges that go beyond upperLimit */
+        for(int32_t length=4; length>middleLength; --length) {
+            if(lower[length].count>0 && upper[length].count>0) {
+                uint32_t start=upper[length].start;
+                uint32_t end=lower[length].end;
+
+                if(end>=start || incWeight(end, length)==start) {
+                    /* lower and upper ranges collide or are directly adjacent: merge these two and remove all shorter ranges */
+                    start=lower[length].start;
+                    end=lower[length].end=upper[length].end;
+                    /*
+                     * merging directly adjacent ranges needs to subtract the 0/1 gaps in between;
+                     * it may result in a range with count>countBytes
+                     */
+                    lower[length].count=
+                        (int32_t)(getWeightTrail(end, length)-getWeightTrail(start, length)+1+
+                                  countBytes(length)*(getWeightByte(end, length-1)-getWeightByte(start, length-1)));
+                    upper[length].count=0;
+                    while(--length>middleLength) {
+                        lower[length].count=upper[length].count=0;
+                    }
+                    break;
+                }
+            }
+        }
+    }
+
+#ifdef UCOL_DEBUG
+    /* print ranges */
+    for(int32_t length=4; length>=2; --length) {
+        if(lower[length].count>0) {
+            printf("lower[%ld] .start=0x%08lx .end=0x%08lx .count=%ld\n", length, lower[length].start, lower[length].end, lower[length].count);
+        }
+    }
+    if(middle.count>0) {
+        printf("middle   .start=0x%08lx .end=0x%08lx .count=%ld\n", middle.start, middle.end, middle.count);
+    }
+    for(int32_t length=2; length<=4; ++length) {
+        if(upper[length].count>0) {
+            printf("upper[%ld] .start=0x%08lx .end=0x%08lx .count=%ld\n", length, upper[length].start, upper[length].end, upper[length].count);
+        }
+    }
+#endif
+
+    /* copy the ranges, shortest first, into the result array */
+    rangeCount=0;
+    if(middle.count>0) {
+        uprv_memcpy(ranges, &middle, sizeof(WeightRange));
+        rangeCount=1;
+    }
+    for(int32_t length=middleLength+1; length<=4; ++length) {
+        /* copy upper first so that later the middle range is more likely the first one to use */
+        if(upper[length].count>0) {
+            uprv_memcpy(ranges+rangeCount, upper+length, sizeof(WeightRange));
+            ++rangeCount;
+        }
+        if(lower[length].count>0) {
+            uprv_memcpy(ranges+rangeCount, lower+length, sizeof(WeightRange));
+            ++rangeCount;
+        }
+    }
+    return rangeCount>0;
+}
+
+UBool
+CollationWeights::allocWeightsInShortRanges(int32_t n, int32_t minLength) {
+    // See if the first few minLength and minLength+1 ranges have enough weights.
+    for(int32_t i = 0; i < rangeCount && ranges[i].length <= (minLength + 1); ++i) {
+        if(n <= ranges[i].count) {
+            // Use the first few minLength and minLength+1 ranges.
+            if(ranges[i].length > minLength) {
+                // Reduce the number of weights from the last minLength+1 range
+                // which might sort before some minLength ranges,
+                // so that we use all weights in the minLength ranges.
+                ranges[i].count = n;
+            }
+            rangeCount = i + 1;
+#ifdef UCOL_DEBUG
+            printf("take first %ld ranges\n", rangeCount);
+#endif
+
+            if(rangeCount>1) {
+                /* sort the ranges by weight values */
+                UErrorCode errorCode=U_ZERO_ERROR;
+                uprv_sortArray(ranges, rangeCount, sizeof(WeightRange),
+                               compareRanges, NULL, FALSE, &errorCode);
+                /* ignore error code: we know that the internal sort function will not fail here */
+            }
+            return TRUE;
+        }
+        n -= ranges[i].count;  // still >0
+    }
+    return FALSE;
+}
+
+UBool
+CollationWeights::allocWeightsInMinLengthRanges(int32_t n, int32_t minLength) {
+    // See if the minLength ranges have enough weights
+    // when we split one and lengthen the following ones.
+    int32_t count = 0;
+    int32_t minLengthRangeCount;
+    for(minLengthRangeCount = 0;
+            minLengthRangeCount < rangeCount &&
+                ranges[minLengthRangeCount].length == minLength;
+            ++minLengthRangeCount) {
+        count += ranges[minLengthRangeCount].count;
+    }
+
+    int32_t nextCountBytes = countBytes(minLength + 1);
+    if(n > count * nextCountBytes) { return FALSE; }
+
+    // Use the minLength ranges. Merge them, and then split again as necessary.
+    uint32_t start = ranges[0].start;
+    uint32_t end = ranges[0].end;
+    for(int32_t i = 1; i < minLengthRangeCount; ++i) {
+        if(ranges[i].start < start) { start = ranges[i].start; }
+        if(ranges[i].end > end) { end = ranges[i].end; }
+    }
+
+    // Calculate how to split the range between minLength (count1) and minLength+1 (count2).
+    // Goal:
+    //   count1 + count2 * nextCountBytes = n
+    //   count1 + count2 = count
+    // These turn into
+    //   (count - count2) + count2 * nextCountBytes = n
+    // and then into the following count1 & count2 computations.
+    int32_t count2 = (n - count) / (nextCountBytes - 1);  // number of weights to be lengthened
+    int32_t count1 = count - count2;  // number of minLength weights
+    if(count2 == 0 || (count1 + count2 * nextCountBytes) < n) {
+        // round up
+        ++count2;
+        --count1;
+        U_ASSERT((count1 + count2 * nextCountBytes) >= n);
+    }
+
+    ranges[0].start = start;
+
+    if(count1 == 0) {
+        // Make one long range.
+        ranges[0].end = end;
+        ranges[0].count = count;
+        lengthenRange(ranges[0]);
+        rangeCount = 1;
+    } else {
+        // Split the range, lengthen the second part.
+#ifdef UCOL_DEBUG
+        printf("split the range number %ld (out of %ld minLength ranges) by %ld:%ld\n",
+               splitRange, rangeCount, count1, count2);
+#endif
+
+        // Next start = start + count1. First end = 1 before that.
+        ranges[0].end = incWeightByOffset(start, minLength, count1 - 1);
+        ranges[0].count = count1;
+
+        ranges[1].start = incWeight(ranges[0].end, minLength);
+        ranges[1].end = end;
+        ranges[1].length = minLength;  // +1 when lengthened
+        ranges[1].count = count2;  // *countBytes when lengthened
+        lengthenRange(ranges[1]);
+        rangeCount = 2;
+    }
+    return TRUE;
+}
+
+/*
+ * call getWeightRanges and then determine heuristically
+ * which ranges to use for a given number of weights between (excluding)
+ * two limits
+ */
+UBool
+CollationWeights::allocWeights(uint32_t lowerLimit, uint32_t upperLimit, int32_t n) {
+#ifdef UCOL_DEBUG
+    puts("");
+#endif
+
+    if(!getWeightRanges(lowerLimit, upperLimit)) {
+#ifdef UCOL_DEBUG
+        printf("error: unable to get Weight ranges\n");
+#endif
+        return FALSE;
+    }
+
+    /* try until we find suitably large ranges */
+    for(;;) {
+        /* get the smallest number of bytes in a range */
+        int32_t minLength=ranges[0].length;
+
+        if(allocWeightsInShortRanges(n, minLength)) { break; }
+
+        if(minLength == 4) {
+#ifdef UCOL_DEBUG
+            printf("error: the maximum number of %ld weights is insufficient for n=%ld\n",
+                   minLengthCount, n);
+#endif
+            return FALSE;
+        }
+
+        if(allocWeightsInMinLengthRanges(n, minLength)) { break; }
+
+        /* no good match, lengthen all minLength ranges and iterate */
+#ifdef UCOL_DEBUG
+        printf("lengthen the short ranges from %ld bytes to %ld and iterate\n", minLength, minLength+1);
+#endif
+        for(int32_t i=0; ranges[i].length==minLength; ++i) {
+            lengthenRange(ranges[i]);
+        }
+    }
+
+#ifdef UCOL_DEBUG
+    puts("final ranges:");
+    for(int32_t i=0; i<rangeCount; ++i) {
+        printf("ranges[%ld] .start=0x%08lx .end=0x%08lx .length=%ld .count=%ld\n",
+               i, ranges[i].start, ranges[i].end, ranges[i].length, ranges[i].count);
+    }
+#endif
+
+    rangeIndex = 0;
+    return TRUE;
+}
+
+uint32_t
+CollationWeights::nextWeight() {
+    if(rangeIndex >= rangeCount) {
+        return 0xffffffff;
+    } else {
+        /* get the next weight */
+        WeightRange &range = ranges[rangeIndex];
+        uint32_t weight = range.start;
+        if(--range.count == 0) {
+            /* this range is finished */
+            ++rangeIndex;
+        } else {
+            /* increment the weight for the next value */
+            range.start = incWeight(weight, range.length);
+            U_ASSERT(range.start <= range.end);
+        }
+
+        return weight;
+    }
+}
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_COLLATION */
diff --git a/icu4c/source/i18n/collationweights.h b/icu4c/source/i18n/collationweights.h
new file mode 100644 (file)
index 0000000..556bedb
--- /dev/null
@@ -0,0 +1,111 @@
+/*  
+*******************************************************************************
+*
+*   Copyright (C) 1999-2014, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*   file name:  collationweights.h
+*   encoding:   US-ASCII
+*   tab size:   8 (not used)
+*   indentation:4
+*
+*   created on: 2001mar08 as ucol_wgt.h
+*   created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONWEIGHTS_H__
+#define __COLLATIONWEIGHTS_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/uobject.h"
+
+U_NAMESPACE_BEGIN
+
+/**
+ * Allocates n collation element weights between two exclusive limits.
+ * Used only internally by the collation tailoring builder.
+ */
+class U_I18N_API CollationWeights : public UMemory {
+public:
+    CollationWeights();
+
+    static inline int32_t lengthOfWeight(uint32_t weight) {
+        if((weight&0xffffff)==0) {
+            return 1;
+        } else if((weight&0xffff)==0) {
+            return 2;
+        } else if((weight&0xff)==0) {
+            return 3;
+        } else {
+            return 4;
+        }
+    }
+
+    void initForPrimary(UBool compressible);
+    void initForSecondary();
+    void initForTertiary();
+
+    /**
+     * Determine heuristically
+     * what ranges to use for a given number of weights between (excluding)
+     * two limits.
+     *
+     * @param lowerLimit A collation element weight; the ranges will be filled to cover
+     *                   weights greater than this one.
+     * @param upperLimit A collation element weight; the ranges will be filled to cover
+     *                   weights less than this one.
+     * @param n          The number of collation element weights w necessary such that
+     *                   lowerLimit<w<upperLimit in lexical order.
+     * @return TRUE if it is possible to fit n elements between the limits
+     */
+    UBool allocWeights(uint32_t lowerLimit, uint32_t upperLimit, int32_t n);
+
+    /**
+     * Given a set of ranges calculated by allocWeights(),
+     * iterate through the weights.
+     * The ranges are modified to keep the current iteration state.
+     *
+     * @return The next weight in the ranges, or 0xffffffff if there is none left.
+     */
+    uint32_t nextWeight();
+
+    /** @internal */
+    struct WeightRange {
+        uint32_t start, end;
+        int32_t length, count;
+    };
+
+private:
+    /** @return number of usable byte values for byte idx */
+    inline int32_t countBytes(int32_t idx) const {
+        return (int32_t)(maxBytes[idx] - minBytes[idx] + 1);
+    }
+
+    uint32_t incWeight(uint32_t weight, int32_t length) const;
+    uint32_t incWeightByOffset(uint32_t weight, int32_t length, int32_t offset) const;
+    void lengthenRange(WeightRange &range) const;
+    /**
+     * Takes two CE weights and calculates the
+     * possible ranges of weights between the two limits, excluding them.
+     * For weights with up to 4 bytes there are up to 2*4-1=7 ranges.
+     */
+    UBool getWeightRanges(uint32_t lowerLimit, uint32_t upperLimit);
+    UBool allocWeightsInShortRanges(int32_t n, int32_t minLength);
+    UBool allocWeightsInMinLengthRanges(int32_t n, int32_t minLength);
+
+    int32_t middleLength;
+    uint32_t minBytes[5];  // for byte 1, 2, 3, 4
+    uint32_t maxBytes[5];
+    WeightRange ranges[7];
+    int32_t rangeIndex;
+    int32_t rangeCount;
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONWEIGHTS_H__
index 39ebd67eb72fc7dd26524990a73d860b777cee12..96bd28cc91295f8d1660e73e653b8649d5c94e74 100644 (file)
     </Link>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
+    <ClCompile Include="region.cpp" />\r
+    <ClCompile Include="uregion.cpp" />\r
     <ClCompile Include="alphaindex.cpp" />\r
     <ClCompile Include="bocsu.cpp" />\r
     <ClCompile Include="coleitr.cpp" />\r
     <ClCompile Include="coll.cpp" />\r
-    <ClCompile Include="region.cpp" />\r
-    <ClCompile Include="uregion.cpp" />\r
+    <ClCompile Include="collation.cpp" />\r
+    <ClCompile Include="collationbasedatabuilder.cpp" />\r
+    <ClCompile Include="collationbuilder.cpp" />\r
+    <ClCompile Include="collationcompare.cpp" />\r
+    <ClCompile Include="collationdata.cpp" />\r
+    <ClCompile Include="collationdatabuilder.cpp" />\r
+    <ClCompile Include="collationdatareader.cpp" />\r
+    <ClCompile Include="collationdatawriter.cpp" />\r
+    <ClCompile Include="collationfastlatin.cpp" />\r
+    <ClCompile Include="collationfastlatinbuilder.cpp" />\r
+    <ClCompile Include="collationfcd.cpp" />\r
+    <ClCompile Include="collationiterator.cpp" />\r
+    <ClCompile Include="collationkeys.cpp" />\r
+    <ClCompile Include="collationroot.cpp" />\r
+    <ClCompile Include="collationrootelements.cpp" />\r
+    <ClCompile Include="collationruleparser.cpp" />\r
+    <ClCompile Include="collationsets.cpp" />\r
+    <ClCompile Include="collationsettings.cpp" />\r
+    <ClCompile Include="collationtailoring.cpp" />\r
+    <ClCompile Include="collationweights.cpp" />\r
+    <ClCompile Include="rulebasedcollator.cpp" />\r
     <ClCompile Include="search.cpp" />\r
     <ClCompile Include="sortkey.cpp" />\r
     <ClCompile Include="stsearch.cpp" />\r
-    <ClCompile Include="tblcoll.cpp" />\r
     <ClCompile Include="tzfmt.cpp" />\r
     <ClCompile Include="tzgnames.cpp" />\r
     <ClCompile Include="tznames.cpp" />\r
     <ClCompile Include="tznames_impl.cpp" />\r
     <ClCompile Include="ucol.cpp" />\r
-    <ClCompile Include="ucol_bld.cpp" />\r
-    <ClCompile Include="ucol_cnt.cpp" />\r
-    <ClCompile Include="ucol_elm.cpp" />\r
     <ClCompile Include="ucol_res.cpp" />\r
     <ClCompile Include="ucol_sit.cpp" />\r
-    <ClCompile Include="ucol_tok.cpp" />\r
-    <ClCompile Include="ucol_wgt.cpp" />\r
     <ClCompile Include="ucoleitr.cpp" />\r
+    <ClCompile Include="uitercollationiterator.cpp" />\r
     <ClCompile Include="usearch.cpp" />\r
     <ClCompile Include="astro.cpp" />\r
     <ClCompile Include="basictz.cpp" />\r
     <ClCompile Include="unum.cpp" />\r
     <ClCompile Include="unumsys.cpp" />\r
     <ClCompile Include="upluralrules.cpp" />\r
+    <ClCompile Include="utf16collationiterator.cpp" />\r
+    <ClCompile Include="utf8collationiterator.cpp" />\r
     <ClCompile Include="utmscale.c" />\r
     <ClCompile Include="vtzone.cpp" />\r
     <ClCompile Include="vzone.cpp" />\r
 </Command>\r
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>\r
     </CustomBuild>\r
+    <ClInclude Include="collation.h" />\r
+    <ClInclude Include="collationbasedatabuilder.h" />\r
+    <ClInclude Include="collationbuilder.h" />\r
+    <ClInclude Include="collationcompare.h" />\r
+    <ClInclude Include="collationdata.h" />\r
+    <ClInclude Include="collationdatabuilder.h" />\r
+    <ClInclude Include="collationdatareader.h" />\r
+    <ClInclude Include="collationdatawriter.h" />\r
+    <ClInclude Include="collationfastlatin.h" />\r
+    <ClInclude Include="collationfastlatinbuilder.h" />\r
+    <ClInclude Include="collationfcd.h" />\r
+    <ClInclude Include="collationiterator.h" />\r
+    <ClInclude Include="collationkeys.h" />\r
+    <ClInclude Include="collationroot.h" />\r
+    <ClInclude Include="collationrootelements.h" />\r
+    <ClInclude Include="collationruleparser.h" />\r
+    <ClInclude Include="collationsets.h" />\r
+    <ClInclude Include="collationsettings.h" />\r
+    <ClInclude Include="collationtailoring.h" />\r
+    <ClInclude Include="collationweights.h" />\r
     <ClInclude Include="dcfmtimp.h" />\r
     <ClInclude Include="numsys_impl.h" />\r
     <ClInclude Include="region_impl.h" />\r
     <ClInclude Include="selfmtimpl.h" />\r
     <ClInclude Include="tzgnames.h" />\r
     <ClInclude Include="tznames_impl.h" />\r
-    <ClInclude Include="ucol_bld.h" />\r
-    <ClInclude Include="ucol_cnt.h" />\r
-    <ClInclude Include="ucol_elm.h" />\r
     <ClInclude Include="ucol_imp.h" />\r
-    <ClInclude Include="ucol_tok.h" />\r
-    <ClInclude Include="ucol_wgt.h" />\r
     <CustomBuild Include="unicode\ucoleitr.h">\r
       <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode\r
 </Command>\r
       <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode</Command>\r
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>\r
     </CustomBuild>\r
+    <ClInclude Include="uitercollationiterator.h" />\r
     <CustomBuild Include="unicode\region.h">\r
       <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode\r
 </Command>\r
 </Command>\r
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>\r
     </CustomBuild>\r
+    <ClInclude Include="utf16collationiterator.h" />\r
+    <ClInclude Include="utf8collationiterator.h" />\r
     <ClInclude Include="vzone.h" />\r
     <ClInclude Include="windtfmt.h" />\r
     <ClInclude Include="winnmfmt.h" />\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
   <ImportGroup Label="ExtensionTargets">\r
   </ImportGroup>\r
-</Project>\r
+</Project>
\ No newline at end of file
index e6dd664b1bcbb970946e6b9b4549d8932bd70c7f..839bfb23299921fc43adadb8675f035a8eaacd09 100644 (file)
     <ClCompile Include="stsearch.cpp">\r
       <Filter>collation</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="tblcoll.cpp">\r
-      <Filter>collation</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="ucol.cpp">\r
       <Filter>collation</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="ucol_bld.cpp">\r
-      <Filter>collation</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="ucol_cnt.cpp">\r
-      <Filter>collation</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="ucol_elm.cpp">\r
-      <Filter>collation</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="ucol_res.cpp">\r
       <Filter>collation</Filter>\r
     </ClCompile>\r
     <ClCompile Include="ucol_sit.cpp">\r
       <Filter>collation</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="ucol_tok.cpp">\r
-      <Filter>collation</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="ucol_wgt.cpp">\r
-      <Filter>collation</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="ucoleitr.cpp">\r
       <Filter>collation</Filter>\r
     </ClCompile>\r
     <ClCompile Include="uregion.cpp">\r
       <Filter>formatting</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="bocsu.cpp">\r
-      <Filter>transforms</Filter>\r
-    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
-    <ClInclude Include="bocsu.h">\r
+    <ClCompile Include="bocsu.cpp">\r
       <Filter>collation</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="ucol_bld.h">\r
+    </ClCompile>\r
+    <ClCompile Include="collation.cpp">\r
       <Filter>collation</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="ucol_cnt.h">\r
+    </ClCompile>\r
+    <ClCompile Include="collationbasedatabuilder.cpp">\r
       <Filter>collation</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="ucol_elm.h">\r
+    </ClCompile>\r
+    <ClCompile Include="collationbuilder.cpp">\r
       <Filter>collation</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="ucol_imp.h">\r
+    </ClCompile>\r
+    <ClCompile Include="collationcompare.cpp">\r
       <Filter>collation</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="ucol_tok.h">\r
+    </ClCompile>\r
+    <ClCompile Include="collationdata.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationdatabuilder.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationdatareader.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationdatawriter.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationfastlatin.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationfastlatinbuilder.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationfcd.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationiterator.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationkeys.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationroot.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationrootelements.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationruleparser.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationsets.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationsettings.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationtailoring.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="collationweights.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="rulebasedcollator.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="uitercollationiterator.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="utf8collationiterator.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="utf16collationiterator.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
+    <ClInclude Include="bocsu.h">\r
       <Filter>collation</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="ucol_wgt.h">\r
+    <ClInclude Include="ucol_imp.h">\r
       <Filter>collation</Filter>\r
     </ClInclude>\r
     <ClInclude Include="usrchimp.h">\r
     <ClInclude Include="region_impl.h">\r
       <Filter>formatting</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="collation.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationbasedatabuilder.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationbuilder.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationcompare.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationdata.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationdatabuilder.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationdatareader.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationdatawriter.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationfastlatin.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationfastlatinbuilder.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationfcd.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationiterator.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationkeys.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationroot.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationrootelements.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationruleparser.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationsets.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationsettings.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationtailoring.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="collationweights.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="utf16collationiterator.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="uitercollationiterator.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="utf8collationiterator.h">\r
+      <Filter>collation</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ResourceCompile Include="i18n.rc">\r
       <Filter>misc</Filter>\r
     </CustomBuild>\r
   </ItemGroup>\r
-</Project>\r
+</Project>
\ No newline at end of file
index b96a84eb91d80c474316e162fa983cf4a26ec8b5..ddf86c1859185b05aa38878c6ec2774edebeb41c 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ******************************************************************************
-*   Copyright (C) 1997-2011, International Business Machines
+*   Copyright (C) 1997-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 ******************************************************************************
 *   file name:  nfrule.cpp
@@ -17,6 +17,7 @@
 
 #if U_HAVE_RBNF
 
+#include "unicode/localpointer.h"
 #include "unicode/rbnf.h"
 #include "unicode/tblcoll.h"
 #include "unicode/coleitr.h"
@@ -1136,16 +1137,17 @@ NFRule::prefixLength(const UnicodeString& str, const UnicodeString& prefix, UErr
         // isn't a RuleBasedCollator, because RuleBasedCollator defines
         // the CollationElementIterator protocol.  Hopefully, this
         // will change someday.)
-        RuleBasedCollator* collator = (RuleBasedCollator*)formatter->getCollator();
-        CollationElementIterator* strIter = collator->createCollationElementIterator(str);
-        CollationElementIterator* prefixIter = collator->createCollationElementIterator(prefix);
+        const RuleBasedCollator* collator = formatter->getCollator();
+        if (collator == NULL) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            return 0;
+        }
+        LocalPointer<CollationElementIterator> strIter(collator->createCollationElementIterator(str));
+        LocalPointer<CollationElementIterator> prefixIter(collator->createCollationElementIterator(prefix));
         // Check for memory allocation error.
-        if (collator == NULL || strIter == NULL || prefixIter == NULL) {
-               delete collator;
-               delete strIter;
-               delete prefixIter;
-               status = U_MEMORY_ALLOCATION_ERROR;
-               return 0;
+        if (strIter.isNull() || prefixIter.isNull()) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            return 0;
         }
 
         UErrorCode err = U_ZERO_ERROR;
@@ -1197,8 +1199,6 @@ NFRule::prefixLength(const UnicodeString& str, const UnicodeString& prefix, UErr
             // if skipping over ignorables brought us to the end
             // of the target string, we didn't match and return 0
             if (oStr == CollationElementIterator::NULLORDER) {
-                delete prefixIter;
-                delete strIter;
                 return 0;
             }
 
@@ -1207,8 +1207,6 @@ NFRule::prefixLength(const UnicodeString& str, const UnicodeString& prefix, UErr
             // get a mismatch, dump out and return 0
             if (CollationElementIterator::primaryOrder(oStr)
                 != CollationElementIterator::primaryOrder(oPrefix)) {
-                delete prefixIter;
-                delete strIter;
                 return 0;
 
                 // otherwise, advance to the next character in each string
@@ -1228,9 +1226,6 @@ NFRule::prefixLength(const UnicodeString& str, const UnicodeString& prefix, UErr
 #ifdef RBNF_DEBUG
         fprintf(stderr, "prefix length: %d\n", result);
 #endif
-        delete prefixIter;
-        delete strIter;
-
         return result;
 #if 0
         //----------------------------------------------------------------
@@ -1438,15 +1433,17 @@ NFRule::allIgnorable(const UnicodeString& str, UErrorCode& status) const
     // a collation element iterator and make sure each collation
     // element is 0 (ignorable) at the primary level
     if (formatter->isLenient()) {
-        RuleBasedCollator* collator = (RuleBasedCollator*)(formatter->getCollator());
-        CollationElementIterator* iter = collator->createCollationElementIterator(str);
-        
+        const RuleBasedCollator* collator = formatter->getCollator();
+        if (collator == NULL) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            return FALSE;
+        }
+        LocalPointer<CollationElementIterator> iter(collator->createCollationElementIterator(str));
+
         // Memory allocation error check.
-        if (collator == NULL || iter == NULL) {
-               delete collator;
-               delete iter;
-               status = U_MEMORY_ALLOCATION_ERROR;
-               return FALSE;
+        if (iter.isNull()) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            return FALSE;
         }
 
         UErrorCode err = U_ZERO_ERROR;
@@ -1456,7 +1453,6 @@ NFRule::allIgnorable(const UnicodeString& str, UErrorCode& status) const
             o = iter->next(err);
         }
 
-        delete iter;
         return o == CollationElementIterator::NULLORDER;
     }
 #endif
@@ -1470,5 +1466,3 @@ U_NAMESPACE_END
 
 /* U_HAVE_RBNF */
 #endif
-
-
index df236f2b46d45fd29a389e21d20ecc957755ecee..a82b52acf37bedd7eebfb4b02b09297430512bec 100644 (file)
@@ -1629,7 +1629,7 @@ RuleBasedNumberFormat::dispose()
  * @return The collator to use for lenient parsing, or null if lenient parsing
  * is turned off.
 */
-Collator*
+const RuleBasedCollator*
 RuleBasedNumberFormat::getCollator() const
 {
 #if !UCONFIG_NO_COLLATION
@@ -1637,7 +1637,7 @@ RuleBasedNumberFormat::getCollator() const
         return NULL;
     }
 
-    // lazy-evaulate the collator
+    // lazy-evaluate the collator
     if (collator == NULL && lenient) {
         // create a default collator based on the formatter's locale,
         // then pull out that collator's rules, append any additional
@@ -1656,7 +1656,7 @@ RuleBasedNumberFormat::getCollator() const
                 newCollator = new RuleBasedCollator(rules, status);
                 // Exit if newCollator could not be created.
                 if (newCollator == NULL) {
-                       return NULL;
+                    return NULL;
                 }
             } else {
                 temp = NULL;
diff --git a/icu4c/source/i18n/rulebasedcollator.cpp b/icu4c/source/i18n/rulebasedcollator.cpp
new file mode 100644 (file)
index 0000000..e393fab
--- /dev/null
@@ -0,0 +1,1653 @@
+/*
+*******************************************************************************
+* Copyright (C) 1996-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* rulebasedcollator.cpp
+*
+* (replaced the former tblcoll.cpp)
+*
+* created on: 2012feb14 with new and old collation code
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/coll.h"
+#include "unicode/coleitr.h"
+#include "unicode/localpointer.h"
+#include "unicode/locid.h"
+#include "unicode/sortkey.h"
+#include "unicode/tblcoll.h"
+#include "unicode/ucol.h"
+#include "unicode/uiter.h"
+#include "unicode/uloc.h"
+#include "unicode/uniset.h"
+#include "unicode/unistr.h"
+#include "unicode/usetiter.h"
+#include "unicode/utf8.h"
+#include "unicode/uversion.h"
+#include "bocsu.h"
+#include "charstr.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationcompare.h"
+#include "collationdata.h"
+#include "collationdatareader.h"
+#include "collationfastlatin.h"
+#include "collationiterator.h"
+#include "collationkeys.h"
+#include "collationroot.h"
+#include "collationsets.h"
+#include "collationsettings.h"
+#include "collationtailoring.h"
+#include "cstring.h"
+#include "uassert.h"
+#include "ucol_imp.h"
+#include "uhash.h"
+#include "uitercollationiterator.h"
+#include "ustr_imp.h"
+#include "utf16collationiterator.h"
+#include "utf8collationiterator.h"
+#include "uvectr64.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
+
+U_NAMESPACE_BEGIN
+
+namespace {
+
+class FixedSortKeyByteSink : public SortKeyByteSink {
+public:
+    FixedSortKeyByteSink(char *dest, int32_t destCapacity)
+            : SortKeyByteSink(dest, destCapacity) {}
+    virtual ~FixedSortKeyByteSink();
+
+private:
+    virtual void AppendBeyondCapacity(const char *bytes, int32_t n, int32_t length);
+    virtual UBool Resize(int32_t appendCapacity, int32_t length);
+};
+
+FixedSortKeyByteSink::~FixedSortKeyByteSink() {}
+
+void
+FixedSortKeyByteSink::AppendBeyondCapacity(const char *bytes, int32_t /*n*/, int32_t length) {
+    // buffer_ != NULL && bytes != NULL && n > 0 && appended_ > capacity_
+    // Fill the buffer completely.
+    int32_t available = capacity_ - length;
+    if (available > 0) {
+        uprv_memcpy(buffer_ + length, bytes, available);
+    }
+}
+
+UBool
+FixedSortKeyByteSink::Resize(int32_t /*appendCapacity*/, int32_t /*length*/) {
+    return FALSE;
+}
+
+}  // namespace
+
+// Not in an anonymous namespace, so that it can be a friend of CollationKey.
+class CollationKeyByteSink : public SortKeyByteSink {
+public:
+    CollationKeyByteSink(CollationKey &key)
+            : SortKeyByteSink(reinterpret_cast<char *>(key.getBytes()), key.getCapacity()),
+              key_(key) {}
+    virtual ~CollationKeyByteSink();
+
+private:
+    virtual void AppendBeyondCapacity(const char *bytes, int32_t n, int32_t length);
+    virtual UBool Resize(int32_t appendCapacity, int32_t length);
+
+    CollationKey &key_;
+};
+
+CollationKeyByteSink::~CollationKeyByteSink() {}
+
+void
+CollationKeyByteSink::AppendBeyondCapacity(const char *bytes, int32_t n, int32_t length) {
+    // buffer_ != NULL && bytes != NULL && n > 0 && appended_ > capacity_
+    if (Resize(n, length)) {
+        uprv_memcpy(buffer_ + length, bytes, n);
+    }
+}
+
+UBool
+CollationKeyByteSink::Resize(int32_t appendCapacity, int32_t length) {
+    if (buffer_ == NULL) {
+        return FALSE;  // allocation failed before already
+    }
+    int32_t newCapacity = 2 * capacity_;
+    int32_t altCapacity = length + 2 * appendCapacity;
+    if (newCapacity < altCapacity) {
+        newCapacity = altCapacity;
+    }
+    if (newCapacity < 200) {
+        newCapacity = 200;
+    }
+    uint8_t *newBuffer = key_.reallocate(newCapacity, length);
+    if (newBuffer == NULL) {
+        SetNotOk();
+        return FALSE;
+    }
+    buffer_ = reinterpret_cast<char *>(newBuffer);
+    capacity_ = newCapacity;
+    return TRUE;
+}
+
+RuleBasedCollator::RuleBasedCollator(const RuleBasedCollator &other)
+        : Collator(other),
+          data(other.data),
+          settings(other.settings),
+          tailoring(other.tailoring),
+          validLocale(other.validLocale),
+          explicitlySetAttributes(other.explicitlySetAttributes),
+          actualLocaleIsSameAsValid(other.actualLocaleIsSameAsValid) {
+    settings->addRef();
+    tailoring->addRef();
+}
+
+RuleBasedCollator::RuleBasedCollator(const uint8_t *bin, int32_t length,
+                                     const RuleBasedCollator *base, UErrorCode &errorCode)
+        : data(NULL),
+          settings(NULL),
+          tailoring(NULL),
+          validLocale(""),
+          explicitlySetAttributes(0),
+          actualLocaleIsSameAsValid(FALSE) {
+    if(U_FAILURE(errorCode)) { return; }
+    if(bin == NULL || length <= 0 || base == NULL) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
+    const CollationTailoring *root = CollationRoot::getRoot(errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    if(base->tailoring != root) {
+        errorCode = U_UNSUPPORTED_ERROR;
+        return;
+    }
+    LocalPointer<CollationTailoring> t(new CollationTailoring(base->tailoring->settings));
+    if(t.isNull() || t->isBogus()) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return;
+    }
+    CollationDataReader::read(base->tailoring, bin, length, *t, errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    t->actualLocale.setToBogus();
+    adoptTailoring(t.orphan());
+}
+
+RuleBasedCollator::RuleBasedCollator(const CollationTailoring *t, const Locale &vl)
+        : data(t->data),
+          settings(t->settings),
+          tailoring(t),
+          validLocale(vl),
+          explicitlySetAttributes(0),
+          actualLocaleIsSameAsValid(FALSE) {
+    settings->addRef();
+    tailoring->addRef();
+}
+
+RuleBasedCollator::~RuleBasedCollator() {
+    SharedObject::clearPtr(settings);
+    SharedObject::clearPtr(tailoring);
+}
+
+void
+RuleBasedCollator::adoptTailoring(CollationTailoring *t) {
+    U_ASSERT(settings == NULL && data == NULL && tailoring == NULL);
+    data = t->data;
+    settings = t->settings;
+    settings->addRef();
+    t->addRef();
+    tailoring = t;
+    validLocale = t->actualLocale;
+    actualLocaleIsSameAsValid = FALSE;
+}
+
+Collator *
+RuleBasedCollator::clone() const {
+    return new RuleBasedCollator(*this);
+}
+
+RuleBasedCollator &RuleBasedCollator::operator=(const RuleBasedCollator &other) {
+    if(this == &other) { return *this; }
+    SharedObject::copyPtr(other.settings, settings);
+    SharedObject::copyPtr(other.tailoring, tailoring);
+    data = tailoring->data;
+    validLocale = other.validLocale;
+    explicitlySetAttributes = other.explicitlySetAttributes;
+    actualLocaleIsSameAsValid = other.actualLocaleIsSameAsValid;
+    return *this;
+}
+
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedCollator)
+
+UBool
+RuleBasedCollator::operator==(const Collator& other) const {
+    if(this == &other) { return TRUE; }
+    if(!Collator::operator==(other)) { return FALSE; }
+    const RuleBasedCollator &o = static_cast<const RuleBasedCollator &>(other);
+    if(*settings != *o.settings) { return FALSE; }
+    if(data == o.data) { return TRUE; }
+    UBool thisIsRoot = data->base == NULL;
+    UBool otherIsRoot = o.data->base == NULL;
+    U_ASSERT(!thisIsRoot || !otherIsRoot);  // otherwise their data pointers should be ==
+    if(thisIsRoot != otherIsRoot) { return FALSE; }
+    if((thisIsRoot || !tailoring->rules.isEmpty()) &&
+            (otherIsRoot || !o.tailoring->rules.isEmpty())) {
+        // Shortcut: If both collators have valid rule strings, then compare those.
+        if(tailoring->rules == o.tailoring->rules) { return TRUE; }
+    }
+    // Different rule strings can result in the same or equivalent tailoring.
+    // The rule strings are optional in ICU resource bundles, although included by default.
+    // cloneBinary() drops the rule string.
+    UErrorCode errorCode = U_ZERO_ERROR;
+    LocalPointer<UnicodeSet> thisTailored(getTailoredSet(errorCode));
+    LocalPointer<UnicodeSet> otherTailored(o.getTailoredSet(errorCode));
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    if(*thisTailored != *otherTailored) { return FALSE; }
+    // For completeness, we should compare all of the mappings;
+    // or we should create a list of strings, sort it with one collator,
+    // and check if both collators compare adjacent strings the same
+    // (order & strength, down to quaternary); or similar.
+    // Testing equality of collators seems unusual.
+    return TRUE;
+}
+
+int32_t
+RuleBasedCollator::hashCode() const {
+    int32_t h = settings->hashCode();
+    if(data->base == NULL) { return h; }  // root collator
+    // Do not rely on the rule string, see comments in operator==().
+    UErrorCode errorCode = U_ZERO_ERROR;
+    LocalPointer<UnicodeSet> set(getTailoredSet(errorCode));
+    if(U_FAILURE(errorCode)) { return 0; }
+    UnicodeSetIterator iter(*set);
+    while(iter.next() && !iter.isString()) {
+        h ^= data->getCE32(iter.getCodepoint());
+    }
+    return h;
+}
+
+void
+RuleBasedCollator::setLocales(const Locale &requested, const Locale &valid,
+                              const Locale &actual) {
+    if(actual == tailoring->actualLocale) {
+        actualLocaleIsSameAsValid = FALSE;
+    } else {
+        U_ASSERT(actual == valid);
+        actualLocaleIsSameAsValid = TRUE;
+    }
+    // Do not modify tailoring.actualLocale:
+    // We cannot be sure that that would be thread-safe.
+    validLocale = valid;
+    (void)requested;  // Ignore, see also ticket #10477.
+}
+
+Locale
+RuleBasedCollator::getLocale(ULocDataLocaleType type, UErrorCode& errorCode) const {
+    if(U_FAILURE(errorCode)) {
+        return Locale::getRoot();
+    }
+    switch(type) {
+    case ULOC_ACTUAL_LOCALE:
+        return actualLocaleIsSameAsValid ? validLocale : tailoring->actualLocale;
+    case ULOC_VALID_LOCALE:
+    case ULOC_REQUESTED_LOCALE:  // TODO: Drop this, see ticket #10477.
+        return validLocale;
+    default:
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return Locale::getRoot();
+    }
+}
+
+const char *
+RuleBasedCollator::internalGetLocaleID(ULocDataLocaleType type, UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) {
+        return NULL;
+    }
+    const Locale *result;
+    switch(type) {
+    case ULOC_ACTUAL_LOCALE:
+        result = actualLocaleIsSameAsValid ? &validLocale : &tailoring->actualLocale;
+        break;
+    case ULOC_VALID_LOCALE:
+    case ULOC_REQUESTED_LOCALE:  // TODO: Drop this, see ticket #10477.
+        result = &validLocale;
+        break;
+    default:
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return NULL;
+    }
+    if(result->isBogus()) { return NULL; }
+    const char *id = result->getName();
+    return id[0] == 0 ? "root" : id;
+}
+
+const UnicodeString&
+RuleBasedCollator::getRules() const {
+    return tailoring->rules;
+}
+
+void
+RuleBasedCollator::getRules(UColRuleOption delta, UnicodeString &buffer) const {
+    if(delta == UCOL_TAILORING_ONLY) {
+        buffer = tailoring->rules;
+        return;
+    }
+    // UCOL_FULL_RULES
+    buffer.remove();
+    CollationLoader::appendRootRules(buffer);
+    buffer.append(tailoring->rules).getTerminatedBuffer();
+}
+
+void
+RuleBasedCollator::getVersion(UVersionInfo version) const {
+    uprv_memcpy(version, tailoring->version, U_MAX_VERSION_LENGTH);
+    version[0] += (UCOL_RUNTIME_VERSION << 4) + (UCOL_RUNTIME_VERSION >> 4);
+}
+
+UnicodeSet *
+RuleBasedCollator::getTailoredSet(UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return NULL; }
+    UnicodeSet *tailored = new UnicodeSet();
+    if(tailored == NULL) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return NULL;
+    }
+    if(data->base != NULL) {
+        TailoredSet(tailored).forData(data, errorCode);
+        if(U_FAILURE(errorCode)) {
+            delete tailored;
+            return NULL;
+        }
+    }
+    return tailored;
+}
+
+void
+RuleBasedCollator::internalGetContractionsAndExpansions(
+        UnicodeSet *contractions, UnicodeSet *expansions,
+        UBool addPrefixes, UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return; }
+    if(contractions != NULL) {
+        contractions->clear();
+    }
+    if(expansions != NULL) {
+        expansions->clear();
+    }
+    ContractionsAndExpansions(contractions, expansions, NULL, addPrefixes).forData(data, errorCode);
+}
+
+void
+RuleBasedCollator::internalAddContractions(UChar32 c, UnicodeSet &set, UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return; }
+    ContractionsAndExpansions(&set, NULL, NULL, FALSE).forCodePoint(data, c, errorCode);
+}
+
+const CollationSettings &
+RuleBasedCollator::getDefaultSettings() const {
+    return *tailoring->settings;
+}
+
+UColAttributeValue
+RuleBasedCollator::getAttribute(UColAttribute attr, UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return UCOL_DEFAULT; }
+    int32_t option;
+    switch(attr) {
+    case UCOL_FRENCH_COLLATION:
+        option = CollationSettings::BACKWARD_SECONDARY;
+        break;
+    case UCOL_ALTERNATE_HANDLING:
+        return settings->getAlternateHandling();
+    case UCOL_CASE_FIRST:
+        return settings->getCaseFirst();
+    case UCOL_CASE_LEVEL:
+        option = CollationSettings::CASE_LEVEL;
+        break;
+    case UCOL_NORMALIZATION_MODE:
+        option = CollationSettings::CHECK_FCD;
+        break;
+    case UCOL_STRENGTH:
+        return (UColAttributeValue)settings->getStrength();
+    case UCOL_HIRAGANA_QUATERNARY_MODE:
+        // Deprecated attribute, unsettable.
+        return UCOL_OFF;
+    case UCOL_NUMERIC_COLLATION:
+        option = CollationSettings::NUMERIC;
+        break;
+    default:
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return UCOL_DEFAULT;
+    }
+    return ((settings->options & option) == 0) ? UCOL_OFF : UCOL_ON;
+}
+
+void
+RuleBasedCollator::setAttribute(UColAttribute attr, UColAttributeValue value,
+                                UErrorCode &errorCode) {
+    UColAttributeValue oldValue = getAttribute(attr, errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    if(value == oldValue) {
+        setAttributeExplicitly(attr);
+        return;
+    }
+    const CollationSettings &defaultSettings = getDefaultSettings();
+    if(settings == &defaultSettings) {
+        if(value == UCOL_DEFAULT) {
+            setAttributeDefault(attr);
+            return;
+        }
+    }
+    CollationSettings *ownedSettings = SharedObject::copyOnWrite(settings);
+    if(ownedSettings == NULL) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return;
+    }
+
+    switch(attr) {
+    case UCOL_FRENCH_COLLATION:
+        ownedSettings->setFlag(CollationSettings::BACKWARD_SECONDARY, value,
+                               defaultSettings.options, errorCode);
+        break;
+    case UCOL_ALTERNATE_HANDLING:
+        ownedSettings->setAlternateHandling(value, defaultSettings.options, errorCode);
+        break;
+    case UCOL_CASE_FIRST:
+        ownedSettings->setCaseFirst(value, defaultSettings.options, errorCode);
+        break;
+    case UCOL_CASE_LEVEL:
+        ownedSettings->setFlag(CollationSettings::CASE_LEVEL, value,
+                               defaultSettings.options, errorCode);
+        break;
+    case UCOL_NORMALIZATION_MODE:
+        ownedSettings->setFlag(CollationSettings::CHECK_FCD, value,
+                               defaultSettings.options, errorCode);
+        break;
+    case UCOL_STRENGTH:
+        ownedSettings->setStrength(value, defaultSettings.options, errorCode);
+        break;
+    case UCOL_HIRAGANA_QUATERNARY_MODE:
+        // Deprecated attribute. Check for valid values but do not change anything.
+        if(value != UCOL_OFF && value != UCOL_ON && value != UCOL_DEFAULT) {
+            errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        }
+        break;
+    case UCOL_NUMERIC_COLLATION:
+        ownedSettings->setFlag(CollationSettings::NUMERIC, value, defaultSettings.options, errorCode);
+        break;
+    default:
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        break;
+    }
+    if(U_FAILURE(errorCode)) { return; }
+    setFastLatinOptions(*ownedSettings);
+    if(value == UCOL_DEFAULT) {
+        setAttributeDefault(attr);
+    } else {
+        setAttributeExplicitly(attr);
+    }
+}
+
+Collator &
+RuleBasedCollator::setMaxVariable(UColReorderCode group, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return *this; }
+    // Convert the reorder code into a MaxVariable number, or UCOL_DEFAULT=-1.
+    int32_t value;
+    if(group == UCOL_REORDER_CODE_DEFAULT) {
+        value = UCOL_DEFAULT;
+    } else if(UCOL_REORDER_CODE_FIRST <= group && group <= UCOL_REORDER_CODE_CURRENCY) {
+        value = group - UCOL_REORDER_CODE_FIRST;
+    } else {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return *this;
+    }
+    CollationSettings::MaxVariable oldValue = settings->getMaxVariable();
+    if(value == oldValue) {
+        setAttributeExplicitly(ATTR_VARIABLE_TOP);
+        return *this;
+    }
+    const CollationSettings &defaultSettings = getDefaultSettings();
+    if(settings == &defaultSettings) {
+        if(value == UCOL_DEFAULT) {
+            setAttributeDefault(ATTR_VARIABLE_TOP);
+            return *this;
+        }
+    }
+    CollationSettings *ownedSettings = SharedObject::copyOnWrite(settings);
+    if(ownedSettings == NULL) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return *this;
+    }
+
+    if(group == UCOL_REORDER_CODE_DEFAULT) {
+        group = (UColReorderCode)(UCOL_REORDER_CODE_FIRST + defaultSettings.getMaxVariable());
+    }
+    uint32_t varTop = data->getLastPrimaryForGroup(group);
+    U_ASSERT(varTop != 0);
+    ownedSettings->setMaxVariable(value, defaultSettings.options, errorCode);
+    if(U_FAILURE(errorCode)) { return *this; }
+    ownedSettings->variableTop = varTop;
+    setFastLatinOptions(*ownedSettings);
+    if(value == UCOL_DEFAULT) {
+        setAttributeDefault(ATTR_VARIABLE_TOP);
+    } else {
+        setAttributeExplicitly(ATTR_VARIABLE_TOP);
+    }
+    return *this;
+}
+
+UColReorderCode
+RuleBasedCollator::getMaxVariable() const {
+    return (UColReorderCode)(UCOL_REORDER_CODE_FIRST + settings->getMaxVariable());
+}
+
+uint32_t
+RuleBasedCollator::getVariableTop(UErrorCode & /*errorCode*/) const {
+    return settings->variableTop;
+}
+
+uint32_t
+RuleBasedCollator::setVariableTop(const UChar *varTop, int32_t len, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return 0; }
+    if(varTop == NULL && len !=0) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return 0;
+    }
+    if(len < 0) { len = u_strlen(varTop); }
+    if(len == 0) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return 0;
+    }
+    UBool numeric = settings->isNumeric();
+    int64_t ce1, ce2;
+    if(settings->dontCheckFCD()) {
+        UTF16CollationIterator ci(data, numeric, varTop, varTop, varTop + len);
+        ce1 = ci.nextCE(errorCode);
+        ce2 = ci.nextCE(errorCode);
+    } else {
+        FCDUTF16CollationIterator ci(data, numeric, varTop, varTop, varTop + len);
+        ce1 = ci.nextCE(errorCode);
+        ce2 = ci.nextCE(errorCode);
+    }
+    if(ce1 == Collation::NO_CE || ce2 != Collation::NO_CE) {
+        errorCode = U_CE_NOT_FOUND_ERROR;
+        return 0;
+    }
+    setVariableTop((uint32_t)(ce1 >> 32), errorCode);
+    return settings->variableTop;
+}
+
+uint32_t
+RuleBasedCollator::setVariableTop(const UnicodeString &varTop, UErrorCode &errorCode) {
+    return setVariableTop(varTop.getBuffer(), varTop.length(), errorCode);
+}
+
+void
+RuleBasedCollator::setVariableTop(uint32_t varTop, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    if(varTop != settings->variableTop) {
+        // Pin the variable top to the end of the reordering group which contains it.
+        // Only a few special groups are supported.
+        int32_t group = data->getGroupForPrimary(varTop);
+        if(group < UCOL_REORDER_CODE_FIRST || UCOL_REORDER_CODE_CURRENCY < group) {
+            errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+            return;
+        }
+        uint32_t v = data->getLastPrimaryForGroup(group);
+        U_ASSERT(v != 0 && v >= varTop);
+        varTop = v;
+        if(varTop != settings->variableTop) {
+            CollationSettings *ownedSettings = SharedObject::copyOnWrite(settings);
+            if(ownedSettings == NULL) {
+                errorCode = U_MEMORY_ALLOCATION_ERROR;
+                return;
+            }
+            ownedSettings->setMaxVariable(group - UCOL_REORDER_CODE_FIRST,
+                                          getDefaultSettings().options, errorCode);
+            if(U_FAILURE(errorCode)) { return; }
+            ownedSettings->variableTop = varTop;
+            setFastLatinOptions(*ownedSettings);
+        }
+    }
+    if(varTop == getDefaultSettings().variableTop) {
+        setAttributeDefault(ATTR_VARIABLE_TOP);
+    } else {
+        setAttributeExplicitly(ATTR_VARIABLE_TOP);
+    }
+}
+
+int32_t
+RuleBasedCollator::getReorderCodes(int32_t *dest, int32_t capacity,
+                                   UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return 0; }
+    if(capacity < 0 || (dest == NULL && capacity > 0)) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return 0;
+    }
+    int32_t length = settings->reorderCodesLength;
+    if(length == 0) { return 0; }
+    if(length > capacity) {
+        errorCode = U_BUFFER_OVERFLOW_ERROR;
+        return length;
+    }
+    uprv_memcpy(dest, settings->reorderCodes, length * 4);
+    return length;
+}
+
+void
+RuleBasedCollator::setReorderCodes(const int32_t *reorderCodes, int32_t length,
+                                   UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    if(length < 0 || (reorderCodes == NULL && length > 0)) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
+    if(length == settings->reorderCodesLength &&
+            uprv_memcmp(reorderCodes, settings->reorderCodes, length * 4) == 0) {
+        return;
+    }
+    const CollationSettings &defaultSettings = getDefaultSettings();
+    if(length == 1 && reorderCodes[0] == UCOL_REORDER_CODE_DEFAULT) {
+        if(settings != &defaultSettings) {
+            CollationSettings *ownedSettings = SharedObject::copyOnWrite(settings);
+            if(ownedSettings == NULL) {
+                errorCode = U_MEMORY_ALLOCATION_ERROR;
+                return;
+            }
+            ownedSettings->aliasReordering(defaultSettings.reorderCodes,
+                                           defaultSettings.reorderCodesLength,
+                                           defaultSettings.reorderTable);
+            setFastLatinOptions(*ownedSettings);
+        }
+        return;
+    }
+    CollationSettings *ownedSettings = SharedObject::copyOnWrite(settings);
+    if(ownedSettings == NULL) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return;
+    }
+    if(length == 0) {
+        ownedSettings->resetReordering();
+    } else {
+        uint8_t reorderTable[256];
+        data->makeReorderTable(reorderCodes, length, reorderTable, errorCode);
+        if(U_FAILURE(errorCode)) { return; }
+        if(!ownedSettings->setReordering(reorderCodes, length, reorderTable)) {
+            errorCode = U_MEMORY_ALLOCATION_ERROR;
+            return;
+        }
+    }
+    setFastLatinOptions(*ownedSettings);
+}
+
+void
+RuleBasedCollator::setFastLatinOptions(CollationSettings &ownedSettings) const {
+    ownedSettings.fastLatinOptions = CollationFastLatin::getOptions(
+            data, ownedSettings,
+            ownedSettings.fastLatinPrimaries, LENGTHOF(ownedSettings.fastLatinPrimaries));
+}
+
+UCollationResult
+RuleBasedCollator::compare(const UnicodeString &left, const UnicodeString &right,
+                           UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return UCOL_EQUAL; }
+    return doCompare(left.getBuffer(), left.length(),
+                     right.getBuffer(), right.length(), errorCode);
+}
+
+UCollationResult
+RuleBasedCollator::compare(const UnicodeString &left, const UnicodeString &right,
+                           int32_t length, UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode) || length == 0) { return UCOL_EQUAL; }
+    if(length < 0) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return UCOL_EQUAL;
+    }
+    int32_t leftLength = left.length();
+    int32_t rightLength = right.length();
+    if(leftLength > length) { leftLength = length; }
+    if(rightLength > length) { rightLength = length; }
+    return doCompare(left.getBuffer(), leftLength,
+                     right.getBuffer(), rightLength, errorCode);
+}
+
+UCollationResult
+RuleBasedCollator::compare(const UChar *left, int32_t leftLength,
+                           const UChar *right, int32_t rightLength,
+                           UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return UCOL_EQUAL; }
+    if((left == NULL && leftLength != 0) || (right == NULL && rightLength != 0)) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return UCOL_EQUAL;
+    }
+    // Make sure both or neither strings have a known length.
+    // We do not optimize for mixed length/termination.
+    if(leftLength >= 0) {
+        if(rightLength < 0) { rightLength = u_strlen(right); }
+    } else {
+        if(rightLength >= 0) { leftLength = u_strlen(left); }
+    }
+    return doCompare(left, leftLength, right, rightLength, errorCode);
+}
+
+UCollationResult
+RuleBasedCollator::compareUTF8(const StringPiece &left, const StringPiece &right,
+                               UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return UCOL_EQUAL; }
+    const uint8_t *leftBytes = reinterpret_cast<const uint8_t *>(left.data());
+    const uint8_t *rightBytes = reinterpret_cast<const uint8_t *>(right.data());
+    if((leftBytes == NULL && !left.empty()) || (rightBytes == NULL && !right.empty())) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return UCOL_EQUAL;
+    }
+    return doCompare(leftBytes, left.length(), rightBytes, right.length(), errorCode);
+}
+
+UCollationResult
+RuleBasedCollator::internalCompareUTF8(const char *left, int32_t leftLength,
+                                       const char *right, int32_t rightLength,
+                                       UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return UCOL_EQUAL; }
+    if((left == NULL && leftLength != 0) || (right == NULL && rightLength != 0)) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return UCOL_EQUAL;
+    }
+    // Make sure both or neither strings have a known length.
+    // We do not optimize for mixed length/termination.
+    if(leftLength >= 0) {
+        if(rightLength < 0) { rightLength = uprv_strlen(right); }
+    } else {
+        if(rightLength >= 0) { leftLength = uprv_strlen(left); }
+    }
+    return doCompare(reinterpret_cast<const uint8_t *>(left), leftLength,
+                     reinterpret_cast<const uint8_t *>(right), rightLength, errorCode);
+}
+
+namespace {
+
+/**
+ * Abstract iterator for identical-level string comparisons.
+ * Returns FCD code points and handles temporary switching to NFD.
+ */
+class NFDIterator {
+public:
+    NFDIterator() : index(-1), length(0) {}
+    virtual ~NFDIterator() {}
+    /**
+     * Returns the next code point from the internal normalization buffer,
+     * or else the next text code point.
+     * Returns -1 at the end of the text.
+     */
+    UChar32 nextCodePoint() {
+        if(index >= 0) {
+            if(index == length) {
+                index = -1;
+            } else {
+                UChar32 c;
+                U16_NEXT_UNSAFE(decomp, index, c);
+                return c;
+            }
+        }
+        return nextRawCodePoint();
+    }
+    /**
+     * @param nfcImpl
+     * @param c the last code point returned by nextCodePoint() or nextDecomposedCodePoint()
+     * @return the first code point in c's decomposition,
+     *         or c itself if it was decomposed already or if it does not decompose
+     */
+    UChar32 nextDecomposedCodePoint(const Normalizer2Impl &nfcImpl, UChar32 c) {
+        if(index >= 0) { return c; }
+        decomp = nfcImpl.getDecomposition(c, buffer, length);
+        if(decomp == NULL) { return c; }
+        index = 0;
+        U16_NEXT_UNSAFE(decomp, index, c);
+        return c;
+    }
+protected:
+    /**
+     * Returns the next text code point in FCD order.
+     * Returns -1 at the end of the text.
+     */
+    virtual UChar32 nextRawCodePoint() = 0;
+private:
+    const UChar *decomp;
+    UChar buffer[4];
+    int32_t index;
+    int32_t length;
+};
+
+class UTF16NFDIterator : public NFDIterator {
+public:
+    UTF16NFDIterator(const UChar *text, const UChar *textLimit) : s(text), limit(textLimit) {}
+protected:
+    virtual UChar32 nextRawCodePoint() {
+        if(s == limit) { return U_SENTINEL; }
+        UChar32 c = *s++;
+        if(limit == NULL && c == 0) {
+            s = NULL;
+            return U_SENTINEL;
+        }
+        UChar trail;
+        if(U16_IS_LEAD(c) && s != limit && U16_IS_TRAIL(trail = *s)) {
+            ++s;
+            c = U16_GET_SUPPLEMENTARY(c, trail);
+        }
+        return c;
+    }
+
+    const UChar *s;
+    const UChar *limit;
+};
+
+class FCDUTF16NFDIterator : public UTF16NFDIterator {
+public:
+    FCDUTF16NFDIterator(const Normalizer2Impl &nfcImpl, const UChar *text, const UChar *textLimit)
+            : UTF16NFDIterator(NULL, NULL) {
+        UErrorCode errorCode = U_ZERO_ERROR;
+        const UChar *spanLimit = nfcImpl.makeFCD(text, textLimit, NULL, errorCode);
+        if(U_FAILURE(errorCode)) { return; }
+        if(spanLimit == textLimit || (textLimit == NULL && *spanLimit == 0)) {
+            s = text;
+            limit = spanLimit;
+        } else {
+            str.setTo(text, (int32_t)(spanLimit - text));
+            {
+                ReorderingBuffer buffer(nfcImpl, str);
+                if(buffer.init(str.length(), errorCode)) {
+                    nfcImpl.makeFCD(spanLimit, textLimit, &buffer, errorCode);
+                }
+            }
+            if(U_SUCCESS(errorCode)) {
+                s = str.getBuffer();
+                limit = s + str.length();
+            }
+        }
+    }
+private:
+    UnicodeString str;
+};
+
+class UTF8NFDIterator : public NFDIterator {
+public:
+    UTF8NFDIterator(const uint8_t *text, int32_t textLength)
+        : s(text), pos(0), length(textLength) {}
+protected:
+    virtual UChar32 nextRawCodePoint() {
+        if(pos == length || (s[pos] == 0 && length < 0)) { return U_SENTINEL; }
+        UChar32 c;
+        U8_NEXT_OR_FFFD(s, pos, length, c);
+        return c;
+    }
+
+    const uint8_t *s;
+    int32_t pos;
+    int32_t length;
+};
+
+class FCDUTF8NFDIterator : public NFDIterator {
+public:
+    FCDUTF8NFDIterator(const CollationData *data, const uint8_t *text, int32_t textLength)
+            : u8ci(data, FALSE, text, 0, textLength) {}
+protected:
+    virtual UChar32 nextRawCodePoint() {
+        UErrorCode errorCode = U_ZERO_ERROR;
+        return u8ci.nextCodePoint(errorCode);
+    }
+private:
+    FCDUTF8CollationIterator u8ci;
+};
+
+class UIterNFDIterator : public NFDIterator {
+public:
+    UIterNFDIterator(UCharIterator &it) : iter(it) {}
+protected:
+    virtual UChar32 nextRawCodePoint() {
+        return uiter_next32(&iter);
+    }
+private:
+    UCharIterator &iter;
+};
+
+class FCDUIterNFDIterator : public NFDIterator {
+public:
+    FCDUIterNFDIterator(const CollationData *data, UCharIterator &it, int32_t startIndex)
+            : uici(data, FALSE, it, startIndex) {}
+protected:
+    virtual UChar32 nextRawCodePoint() {
+        UErrorCode errorCode = U_ZERO_ERROR;
+        return uici.nextCodePoint(errorCode);
+    }
+private:
+    FCDUIterCollationIterator uici;
+};
+
+UCollationResult compareNFDIter(const Normalizer2Impl &nfcImpl,
+                                NFDIterator &left, NFDIterator &right) {
+    for(;;) {
+        // Fetch the next FCD code point from each string.
+        UChar32 leftCp = left.nextCodePoint();
+        UChar32 rightCp = right.nextCodePoint();
+        if(leftCp == rightCp) {
+            if(leftCp < 0) { break; }
+            continue;
+        }
+        // If they are different, then decompose each and compare again.
+        if(leftCp < 0) {
+            leftCp = -2;  // end of string
+        } else if(leftCp == 0xfffe) {
+            leftCp = -1;  // U+FFFE: merge separator
+        } else {
+            leftCp = left.nextDecomposedCodePoint(nfcImpl, leftCp);
+        }
+        if(rightCp < 0) {
+            rightCp = -2;  // end of string
+        } else if(rightCp == 0xfffe) {
+            rightCp = -1;  // U+FFFE: merge separator
+        } else {
+            rightCp = right.nextDecomposedCodePoint(nfcImpl, rightCp);
+        }
+        if(leftCp < rightCp) { return UCOL_LESS; }
+        if(leftCp > rightCp) { return UCOL_GREATER; }
+    }
+    return UCOL_EQUAL;
+}
+
+}  // namespace
+
+UCollationResult
+RuleBasedCollator::doCompare(const UChar *left, int32_t leftLength,
+                             const UChar *right, int32_t rightLength,
+                             UErrorCode &errorCode) const {
+    // U_FAILURE(errorCode) checked by caller.
+    if(left == right && leftLength == rightLength) {
+        return UCOL_EQUAL;
+    }
+
+    // Identical-prefix test.
+    const UChar *leftLimit;
+    const UChar *rightLimit;
+    int32_t equalPrefixLength = 0;
+    if(leftLength < 0) {
+        leftLimit = NULL;
+        rightLimit = NULL;
+        UChar c;
+        while((c = left[equalPrefixLength]) == right[equalPrefixLength]) {
+            if(c == 0) { return UCOL_EQUAL; }
+            ++equalPrefixLength;
+        }
+    } else {
+        leftLimit = left + leftLength;
+        rightLimit = right + rightLength;
+        for(;;) {
+            if(equalPrefixLength == leftLength) {
+                if(equalPrefixLength == rightLength) { return UCOL_EQUAL; }
+                break;
+            } else if(equalPrefixLength == rightLength ||
+                      left[equalPrefixLength] != right[equalPrefixLength]) {
+                break;
+            }
+            ++equalPrefixLength;
+        }
+    }
+
+    UBool numeric = settings->isNumeric();
+    if(equalPrefixLength > 0) {
+        if((equalPrefixLength != leftLength &&
+                    data->isUnsafeBackward(left[equalPrefixLength], numeric)) ||
+                (equalPrefixLength != rightLength &&
+                    data->isUnsafeBackward(right[equalPrefixLength], numeric))) {
+            // Identical prefix: Back up to the start of a contraction or reordering sequence.
+            while(--equalPrefixLength > 0 &&
+                    data->isUnsafeBackward(left[equalPrefixLength], numeric)) {}
+        }
+        // Notes:
+        // - A longer string can compare equal to a prefix of it if only ignorables follow.
+        // - With a backward level, a longer string can compare less-than a prefix of it.
+
+        // Pass the actual start of each string into the CollationIterators,
+        // plus the equalPrefixLength position,
+        // so that prefix matches back into the equal prefix work.
+    }
+
+    int32_t result;
+    int32_t fastLatinOptions = settings->fastLatinOptions;
+    if(fastLatinOptions >= 0 &&
+            (equalPrefixLength == leftLength ||
+                left[equalPrefixLength] <= CollationFastLatin::LATIN_MAX) &&
+            (equalPrefixLength == rightLength ||
+                right[equalPrefixLength] <= CollationFastLatin::LATIN_MAX)) {
+        if(leftLength >= 0) {
+            result = CollationFastLatin::compareUTF16(data->fastLatinTable,
+                                                      settings->fastLatinPrimaries,
+                                                      fastLatinOptions,
+                                                      left + equalPrefixLength,
+                                                      leftLength - equalPrefixLength,
+                                                      right + equalPrefixLength,
+                                                      rightLength - equalPrefixLength);
+        } else {
+            result = CollationFastLatin::compareUTF16(data->fastLatinTable,
+                                                      settings->fastLatinPrimaries,
+                                                      fastLatinOptions,
+                                                      left + equalPrefixLength, -1,
+                                                      right + equalPrefixLength, -1);
+        }
+    } else {
+        result = CollationFastLatin::BAIL_OUT_RESULT;
+    }
+
+    if(result == CollationFastLatin::BAIL_OUT_RESULT) {
+        if(settings->dontCheckFCD()) {
+            UTF16CollationIterator leftIter(data, numeric,
+                                            left, left + equalPrefixLength, leftLimit);
+            UTF16CollationIterator rightIter(data, numeric,
+                                            right, right + equalPrefixLength, rightLimit);
+            result = CollationCompare::compareUpToQuaternary(leftIter, rightIter, *settings, errorCode);
+        } else {
+            FCDUTF16CollationIterator leftIter(data, numeric,
+                                              left, left + equalPrefixLength, leftLimit);
+            FCDUTF16CollationIterator rightIter(data, numeric,
+                                                right, right + equalPrefixLength, rightLimit);
+            result = CollationCompare::compareUpToQuaternary(leftIter, rightIter, *settings, errorCode);
+        }
+    }
+    if(result != UCOL_EQUAL || settings->getStrength() < UCOL_IDENTICAL || U_FAILURE(errorCode)) {
+        return (UCollationResult)result;
+    }
+
+    // Note: If NUL-terminated, we could get the actual limits from the iterators now.
+    // That would complicate the iterators a bit, NUL-terminated strings are only a C convenience,
+    // and the benefit seems unlikely to be measurable.
+
+    // Compare identical level.
+    const Normalizer2Impl &nfcImpl = data->nfcImpl;
+    left += equalPrefixLength;
+    right += equalPrefixLength;
+    if(settings->dontCheckFCD()) {
+        UTF16NFDIterator leftIter(left, leftLimit);
+        UTF16NFDIterator rightIter(right, rightLimit);
+        return compareNFDIter(nfcImpl, leftIter, rightIter);
+    } else {
+        FCDUTF16NFDIterator leftIter(nfcImpl, left, leftLimit);
+        FCDUTF16NFDIterator rightIter(nfcImpl, right, rightLimit);
+        return compareNFDIter(nfcImpl, leftIter, rightIter);
+    }
+}
+
+UCollationResult
+RuleBasedCollator::doCompare(const uint8_t *left, int32_t leftLength,
+                             const uint8_t *right, int32_t rightLength,
+                             UErrorCode &errorCode) const {
+    // U_FAILURE(errorCode) checked by caller.
+    if(left == right && leftLength == rightLength) {
+        return UCOL_EQUAL;
+    }
+
+    // Identical-prefix test.
+    int32_t equalPrefixLength = 0;
+    if(leftLength < 0) {
+        uint8_t c;
+        while((c = left[equalPrefixLength]) == right[equalPrefixLength]) {
+            if(c == 0) { return UCOL_EQUAL; }
+            ++equalPrefixLength;
+        }
+    } else {
+        for(;;) {
+            if(equalPrefixLength == leftLength) {
+                if(equalPrefixLength == rightLength) { return UCOL_EQUAL; }
+                break;
+            } else if(equalPrefixLength == rightLength ||
+                      left[equalPrefixLength] != right[equalPrefixLength]) {
+                break;
+            }
+            ++equalPrefixLength;
+        }
+    }
+    // Back up to the start of a partially-equal code point.
+    if(equalPrefixLength > 0 &&
+            ((equalPrefixLength != leftLength && U8_IS_TRAIL(left[equalPrefixLength])) ||
+            (equalPrefixLength != rightLength && U8_IS_TRAIL(right[equalPrefixLength])))) {
+        while(--equalPrefixLength > 0 && U8_IS_TRAIL(left[equalPrefixLength])) {}
+    }
+
+    UBool numeric = settings->isNumeric();
+    if(equalPrefixLength > 0) {
+        UBool unsafe = FALSE;
+        if(equalPrefixLength != leftLength) {
+            int32_t i = equalPrefixLength;
+            UChar32 c;
+            U8_NEXT_OR_FFFD(left, i, leftLength, c);
+            unsafe = data->isUnsafeBackward(c, numeric);
+        }
+        if(!unsafe && equalPrefixLength != rightLength) {
+            int32_t i = equalPrefixLength;
+            UChar32 c;
+            U8_NEXT_OR_FFFD(right, i, rightLength, c);
+            unsafe = data->isUnsafeBackward(c, numeric);
+        }
+        if(unsafe) {
+            // Identical prefix: Back up to the start of a contraction or reordering sequence.
+            UChar32 c;
+            do {
+                U8_PREV_OR_FFFD(left, 0, equalPrefixLength, c);
+            } while(equalPrefixLength > 0 && data->isUnsafeBackward(c, numeric));
+        }
+        // See the notes in the UTF-16 version.
+
+        // Pass the actual start of each string into the CollationIterators,
+        // plus the equalPrefixLength position,
+        // so that prefix matches back into the equal prefix work.
+    }
+
+    int32_t result;
+    int32_t fastLatinOptions = settings->fastLatinOptions;
+    if(fastLatinOptions >= 0 &&
+            (equalPrefixLength == leftLength ||
+                left[equalPrefixLength] <= CollationFastLatin::LATIN_MAX_UTF8_LEAD) &&
+            (equalPrefixLength == rightLength ||
+                right[equalPrefixLength] <= CollationFastLatin::LATIN_MAX_UTF8_LEAD)) {
+        if(leftLength >= 0) {
+            result = CollationFastLatin::compareUTF8(data->fastLatinTable,
+                                                     settings->fastLatinPrimaries,
+                                                     fastLatinOptions,
+                                                     left + equalPrefixLength,
+                                                     leftLength - equalPrefixLength,
+                                                     right + equalPrefixLength,
+                                                     rightLength - equalPrefixLength);
+        } else {
+            result = CollationFastLatin::compareUTF8(data->fastLatinTable,
+                                                     settings->fastLatinPrimaries,
+                                                     fastLatinOptions,
+                                                     left + equalPrefixLength, -1,
+                                                     right + equalPrefixLength, -1);
+        }
+    } else {
+        result = CollationFastLatin::BAIL_OUT_RESULT;
+    }
+
+    if(result == CollationFastLatin::BAIL_OUT_RESULT) {
+        if(settings->dontCheckFCD()) {
+            UTF8CollationIterator leftIter(data, numeric, left, equalPrefixLength, leftLength);
+            UTF8CollationIterator rightIter(data, numeric, right, equalPrefixLength, rightLength);
+            result = CollationCompare::compareUpToQuaternary(leftIter, rightIter, *settings, errorCode);
+        } else {
+            FCDUTF8CollationIterator leftIter(data, numeric, left, equalPrefixLength, leftLength);
+            FCDUTF8CollationIterator rightIter(data, numeric, right, equalPrefixLength, rightLength);
+            result = CollationCompare::compareUpToQuaternary(leftIter, rightIter, *settings, errorCode);
+        }
+    }
+    if(result != UCOL_EQUAL || settings->getStrength() < UCOL_IDENTICAL || U_FAILURE(errorCode)) {
+        return (UCollationResult)result;
+    }
+
+    // Note: If NUL-terminated, we could get the actual limits from the iterators now.
+    // That would complicate the iterators a bit, NUL-terminated strings are only a C convenience,
+    // and the benefit seems unlikely to be measurable.
+
+    // Compare identical level.
+    const Normalizer2Impl &nfcImpl = data->nfcImpl;
+    left += equalPrefixLength;
+    right += equalPrefixLength;
+    if(leftLength > 0) {
+        leftLength -= equalPrefixLength;
+        rightLength -= equalPrefixLength;
+    }
+    if(settings->dontCheckFCD()) {
+        UTF8NFDIterator leftIter(left, leftLength);
+        UTF8NFDIterator rightIter(right, rightLength);
+        return compareNFDIter(nfcImpl, leftIter, rightIter);
+    } else {
+        FCDUTF8NFDIterator leftIter(data, left, leftLength);
+        FCDUTF8NFDIterator rightIter(data, right, rightLength);
+        return compareNFDIter(nfcImpl, leftIter, rightIter);
+    }
+}
+
+UCollationResult
+RuleBasedCollator::compare(UCharIterator &left, UCharIterator &right,
+                           UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode) || &left == &right) { return UCOL_EQUAL; }
+    UBool numeric = settings->isNumeric();
+
+    // Identical-prefix test.
+    int32_t equalPrefixLength = 0;
+    {
+        UChar32 leftUnit;
+        UChar32 rightUnit;
+        while((leftUnit = left.next(&left)) == (rightUnit = right.next(&right))) {
+            if(leftUnit < 0) { return UCOL_EQUAL; }
+            ++equalPrefixLength;
+        }
+
+        // Back out the code units that differed, for the real collation comparison.
+        if(leftUnit >= 0) { left.previous(&left); }
+        if(rightUnit >= 0) { right.previous(&right); }
+
+        if(equalPrefixLength > 0) {
+            if((leftUnit >= 0 && data->isUnsafeBackward(leftUnit, numeric)) ||
+                    (rightUnit >= 0 && data->isUnsafeBackward(rightUnit, numeric))) {
+                // Identical prefix: Back up to the start of a contraction or reordering sequence.
+                do {
+                    --equalPrefixLength;
+                    leftUnit = left.previous(&left);
+                    right.previous(&right);
+                } while(equalPrefixLength > 0 && data->isUnsafeBackward(leftUnit, numeric));
+            }
+            // See the notes in the UTF-16 version.
+        }
+    }
+
+    UCollationResult result;
+    if(settings->dontCheckFCD()) {
+        UIterCollationIterator leftIter(data, numeric, left);
+        UIterCollationIterator rightIter(data, numeric, right);
+        result = CollationCompare::compareUpToQuaternary(leftIter, rightIter, *settings, errorCode);
+    } else {
+        FCDUIterCollationIterator leftIter(data, numeric, left, equalPrefixLength);
+        FCDUIterCollationIterator rightIter(data, numeric, right, equalPrefixLength);
+        result = CollationCompare::compareUpToQuaternary(leftIter, rightIter, *settings, errorCode);
+    }
+    if(result != UCOL_EQUAL || settings->getStrength() < UCOL_IDENTICAL || U_FAILURE(errorCode)) {
+        return result;
+    }
+
+    // Compare identical level.
+    left.move(&left, equalPrefixLength, UITER_ZERO);
+    right.move(&right, equalPrefixLength, UITER_ZERO);
+    const Normalizer2Impl &nfcImpl = data->nfcImpl;
+    if(settings->dontCheckFCD()) {
+        UIterNFDIterator leftIter(left);
+        UIterNFDIterator rightIter(right);
+        return compareNFDIter(nfcImpl, leftIter, rightIter);
+    } else {
+        FCDUIterNFDIterator leftIter(data, left, equalPrefixLength);
+        FCDUIterNFDIterator rightIter(data, right, equalPrefixLength);
+        return compareNFDIter(nfcImpl, leftIter, rightIter);
+    }
+}
+
+CollationKey &
+RuleBasedCollator::getCollationKey(const UnicodeString &s, CollationKey &key,
+                                   UErrorCode &errorCode) const {
+    return getCollationKey(s.getBuffer(), s.length(), key, errorCode);
+}
+
+CollationKey &
+RuleBasedCollator::getCollationKey(const UChar *s, int32_t length, CollationKey& key,
+                                   UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) {
+        return key.setToBogus();
+    }
+    if(s == NULL && length != 0) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return key.setToBogus();
+    }
+    key.reset();  // resets the "bogus" state
+    CollationKeyByteSink sink(key);
+    writeSortKey(s, length, sink, errorCode);
+    if(U_FAILURE(errorCode)) {
+        key.setToBogus();
+    } else if(key.isBogus()) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+    } else {
+        key.setLength(sink.NumberOfBytesAppended());
+    }
+    return key;
+}
+
+int32_t
+RuleBasedCollator::getSortKey(const UnicodeString &s,
+                              uint8_t *dest, int32_t capacity) const {
+    return getSortKey(s.getBuffer(), s.length(), dest, capacity);
+}
+
+int32_t
+RuleBasedCollator::getSortKey(const UChar *s, int32_t length,
+                              uint8_t *dest, int32_t capacity) const {
+    if((s == NULL && length != 0) || capacity < 0 || (dest == NULL && capacity > 0)) {
+        return 0;
+    }
+    uint8_t noDest[1] = { 0 };
+    if(dest == NULL) {
+        // Distinguish pure preflighting from an allocation error.
+        dest = noDest;
+        capacity = 0;
+    }
+    FixedSortKeyByteSink sink(reinterpret_cast<char *>(dest), capacity);
+    UErrorCode errorCode = U_ZERO_ERROR;
+    writeSortKey(s, length, sink, errorCode);
+    return U_SUCCESS(errorCode) ? sink.NumberOfBytesAppended() : 0;
+}
+
+void
+RuleBasedCollator::writeSortKey(const UChar *s, int32_t length,
+                                SortKeyByteSink &sink, UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return; }
+    const UChar *limit = (length >= 0) ? s + length : NULL;
+    UBool numeric = settings->isNumeric();
+    CollationKeys::LevelCallback callback;
+    if(settings->dontCheckFCD()) {
+        UTF16CollationIterator iter(data, numeric, s, s, limit);
+        CollationKeys::writeSortKeyUpToQuaternary(iter, data->compressibleBytes, *settings,
+                                                  sink, Collation::PRIMARY_LEVEL,
+                                                  callback, TRUE, errorCode);
+    } else {
+        FCDUTF16CollationIterator iter(data, numeric, s, s, limit);
+        CollationKeys::writeSortKeyUpToQuaternary(iter, data->compressibleBytes, *settings,
+                                                  sink, Collation::PRIMARY_LEVEL,
+                                                  callback, TRUE, errorCode);
+    }
+    if(settings->getStrength() == UCOL_IDENTICAL) {
+        writeIdenticalLevel(s, limit, sink, errorCode);
+    }
+    static const char terminator = 0;  // TERMINATOR_BYTE
+    sink.Append(&terminator, 1);
+}
+
+void
+RuleBasedCollator::writeIdenticalLevel(const UChar *s, const UChar *limit,
+                                       SortKeyByteSink &sink, UErrorCode &errorCode) const {
+    // NFD quick check
+    const UChar *nfdQCYesLimit = data->nfcImpl.decompose(s, limit, NULL, errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    sink.Append(Collation::LEVEL_SEPARATOR_BYTE);
+    UChar32 prev = 0;
+    if(nfdQCYesLimit != s) {
+        prev = u_writeIdenticalLevelRun(prev, s, (int32_t)(nfdQCYesLimit - s), sink);
+    }
+    // Is there non-NFD text?
+    int32_t destLengthEstimate;
+    if(limit != NULL) {
+        if(nfdQCYesLimit == limit) { return; }
+        destLengthEstimate = (int32_t)(limit - nfdQCYesLimit);
+    } else {
+        // s is NUL-terminated
+        if(*nfdQCYesLimit == 0) { return; }
+        destLengthEstimate = -1;
+    }
+    UnicodeString nfd;
+    data->nfcImpl.decompose(nfdQCYesLimit, limit, nfd, destLengthEstimate, errorCode);
+    u_writeIdenticalLevelRun(prev, nfd.getBuffer(), nfd.length(), sink);
+}
+
+namespace {
+
+/**
+ * internalNextSortKeyPart() calls CollationKeys::writeSortKeyUpToQuaternary()
+ * with an instance of this callback class.
+ * When another level is about to be written, the callback
+ * records the level and the number of bytes that will be written until
+ * the sink (which is actually a FixedSortKeyByteSink) fills up.
+ *
+ * When internalNextSortKeyPart() is called again, it restarts with the last level
+ * and ignores as many bytes as were written previously for that level.
+ */
+class PartLevelCallback : public CollationKeys::LevelCallback {
+public:
+    PartLevelCallback(const SortKeyByteSink &s)
+            : sink(s), level(Collation::PRIMARY_LEVEL) {
+        levelCapacity = sink.GetRemainingCapacity();
+    }
+    virtual ~PartLevelCallback() {}
+    virtual UBool needToWrite(Collation::Level l) {
+        if(!sink.Overflowed()) {
+            // Remember a level that will be at least partially written.
+            level = l;
+            levelCapacity = sink.GetRemainingCapacity();
+            return TRUE;
+        } else {
+            return FALSE;
+        }
+    }
+    Collation::Level getLevel() const { return level; }
+    int32_t getLevelCapacity() const { return levelCapacity; }
+
+private:
+    const SortKeyByteSink &sink;
+    Collation::Level level;
+    int32_t levelCapacity;
+};
+
+}  // namespace
+
+int32_t
+RuleBasedCollator::internalNextSortKeyPart(UCharIterator *iter, uint32_t state[2],
+                                           uint8_t *dest, int32_t count, UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return 0; }
+    if(iter == NULL || state == NULL || count < 0 || (count > 0 && dest == NULL)) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return 0;
+    }
+    if(count == 0) { return 0; }
+
+    FixedSortKeyByteSink sink(reinterpret_cast<char *>(dest), count);
+    sink.IgnoreBytes((int32_t)state[1]);
+    iter->move(iter, 0, UITER_START);
+
+    Collation::Level level = (Collation::Level)state[0];
+    if(level <= Collation::QUATERNARY_LEVEL) {
+        UBool numeric = settings->isNumeric();
+        PartLevelCallback callback(sink);
+        if(settings->dontCheckFCD()) {
+            UIterCollationIterator ci(data, numeric, *iter);
+            CollationKeys::writeSortKeyUpToQuaternary(ci, data->compressibleBytes, *settings,
+                                                      sink, level, callback, FALSE, errorCode);
+        } else {
+            FCDUIterCollationIterator ci(data, numeric, *iter, 0);
+            CollationKeys::writeSortKeyUpToQuaternary(ci, data->compressibleBytes, *settings,
+                                                      sink, level, callback, FALSE, errorCode);
+        }
+        if(U_FAILURE(errorCode)) { return 0; }
+        if(sink.NumberOfBytesAppended() > count) {
+            state[0] = (uint32_t)callback.getLevel();
+            state[1] = (uint32_t)callback.getLevelCapacity();
+            return count;
+        }
+        // All of the normal levels are done.
+        if(settings->getStrength() == UCOL_IDENTICAL) {
+            level = Collation::IDENTICAL_LEVEL;
+            iter->move(iter, 0, UITER_START);
+        }
+        // else fall through to setting ZERO_LEVEL
+    }
+
+    if(level == Collation::IDENTICAL_LEVEL) {
+        int32_t levelCapacity = sink.GetRemainingCapacity();
+        UnicodeString s;
+        for(;;) {
+            UChar32 c = iter->next(iter);
+            if(c < 0) { break; }
+            s.append((UChar)c);
+        }
+        const UChar *sArray = s.getBuffer();
+        writeIdenticalLevel(sArray, sArray + s.length(), sink, errorCode);
+        if(U_FAILURE(errorCode)) { return 0; }
+        if(sink.NumberOfBytesAppended() > count) {
+            state[0] = (uint32_t)level;
+            state[1] = (uint32_t)levelCapacity;
+            return count;
+        }
+    }
+
+    // ZERO_LEVEL: Fill the remainder of dest with 00 bytes.
+    state[0] = (uint32_t)Collation::ZERO_LEVEL;
+    state[1] = 0;
+    int32_t length = sink.NumberOfBytesAppended();
+    int32_t i = length;
+    while(i < count) { dest[i++] = 0; }
+    return length;
+}
+
+void
+RuleBasedCollator::internalGetCEs(const UnicodeString &str, UVector64 &ces,
+                                  UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return; }
+    const UChar *s = str.getBuffer();
+    const UChar *limit = s + str.length();
+    UBool numeric = settings->isNumeric();
+    if(settings->dontCheckFCD()) {
+        UTF16CollationIterator iter(data, numeric, s, s, limit);
+        int64_t ce;
+        while((ce = iter.nextCE(errorCode)) != Collation::NO_CE) {
+            ces.addElement(ce, errorCode);
+        }
+    } else {
+        FCDUTF16CollationIterator iter(data, numeric, s, s, limit);
+        int64_t ce;
+        while((ce = iter.nextCE(errorCode)) != Collation::NO_CE) {
+            ces.addElement(ce, errorCode);
+        }
+    }
+}
+
+namespace {
+
+void appendSubtag(CharString &s, char letter, const char *subtag, int32_t length,
+                  UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode) || length == 0) { return; }
+    if(!s.isEmpty()) {
+        s.append('_', errorCode);
+    }
+    s.append(letter, errorCode);
+    for(int32_t i = 0; i < length; ++i) {
+        s.append(uprv_toupper(subtag[i]), errorCode);
+    }
+}
+
+void appendAttribute(CharString &s, char letter, UColAttributeValue value,
+                     UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    if(!s.isEmpty()) {
+        s.append('_', errorCode);
+    }
+    static const char *valueChars = "1234...........IXO..SN..LU......";
+    s.append(letter, errorCode);
+    s.append(valueChars[value], errorCode);
+}
+
+}  // namespace
+
+int32_t
+RuleBasedCollator::internalGetShortDefinitionString(const char *locale,
+                                                    char *buffer, int32_t capacity,
+                                                    UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode)) { return 0; }
+    if(buffer == NULL ? capacity != 0 : capacity < 0) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return 0;
+    }
+    if(locale == NULL) {
+        locale = internalGetLocaleID(ULOC_VALID_LOCALE, errorCode);
+    }
+
+    char resultLocale[ULOC_FULLNAME_CAPACITY + 1];
+    int32_t length = ucol_getFunctionalEquivalent(resultLocale, ULOC_FULLNAME_CAPACITY,
+                                                  "collation", locale,
+                                                  NULL, &errorCode);
+    if(U_FAILURE(errorCode)) { return 0; }
+    if(length == 0) {
+        uprv_strcpy(resultLocale, "root");
+    } else {
+        resultLocale[length] = 0;
+    }
+
+    // Append items in alphabetic order of their short definition letters.
+    CharString result;
+    char subtag[ULOC_KEYWORD_AND_VALUES_CAPACITY];
+
+    if(attributeHasBeenSetExplicitly(UCOL_ALTERNATE_HANDLING)) {
+        appendAttribute(result, 'A', getAttribute(UCOL_ALTERNATE_HANDLING, errorCode), errorCode);
+    }
+    // ATTR_VARIABLE_TOP not supported because 'B' was broken.
+    // See ICU tickets #10372 and #10386.
+    if(attributeHasBeenSetExplicitly(UCOL_CASE_FIRST)) {
+        appendAttribute(result, 'C', getAttribute(UCOL_CASE_FIRST, errorCode), errorCode);
+    }
+    if(attributeHasBeenSetExplicitly(UCOL_NUMERIC_COLLATION)) {
+        appendAttribute(result, 'D', getAttribute(UCOL_NUMERIC_COLLATION, errorCode), errorCode);
+    }
+    if(attributeHasBeenSetExplicitly(UCOL_CASE_LEVEL)) {
+        appendAttribute(result, 'E', getAttribute(UCOL_CASE_LEVEL, errorCode), errorCode);
+    }
+    if(attributeHasBeenSetExplicitly(UCOL_FRENCH_COLLATION)) {
+        appendAttribute(result, 'F', getAttribute(UCOL_FRENCH_COLLATION, errorCode), errorCode);
+    }
+    // Note: UCOL_HIRAGANA_QUATERNARY_MODE is deprecated and never changes away from default.
+    length = uloc_getKeywordValue(resultLocale, "collation", subtag, LENGTHOF(subtag), &errorCode);
+    appendSubtag(result, 'K', subtag, length, errorCode);
+    length = uloc_getLanguage(resultLocale, subtag, LENGTHOF(subtag), &errorCode);
+    appendSubtag(result, 'L', subtag, length, errorCode);
+    if(attributeHasBeenSetExplicitly(UCOL_NORMALIZATION_MODE)) {
+        appendAttribute(result, 'N', getAttribute(UCOL_NORMALIZATION_MODE, errorCode), errorCode);
+    }
+    length = uloc_getCountry(resultLocale, subtag, LENGTHOF(subtag), &errorCode);
+    appendSubtag(result, 'R', subtag, length, errorCode);
+    if(attributeHasBeenSetExplicitly(UCOL_STRENGTH)) {
+        appendAttribute(result, 'S', getAttribute(UCOL_STRENGTH, errorCode), errorCode);
+    }
+    length = uloc_getVariant(resultLocale, subtag, LENGTHOF(subtag), &errorCode);
+    appendSubtag(result, 'V', subtag, length, errorCode);
+    length = uloc_getScript(resultLocale, subtag, LENGTHOF(subtag), &errorCode);
+    appendSubtag(result, 'Z', subtag, length, errorCode);
+
+    if(U_FAILURE(errorCode)) { return 0; }
+    if(result.length() <= capacity) {
+        uprv_memcpy(buffer, result.data(), result.length());
+    }
+    return u_terminateChars(buffer, capacity, result.length(), &errorCode);
+}
+
+UBool
+RuleBasedCollator::isUnsafe(UChar32 c) const {
+    return data->isUnsafeBackward(c, settings->isNumeric());
+}
+
+void
+RuleBasedCollator::computeMaxExpansions(const CollationTailoring *t, UErrorCode &errorCode) {
+    t->maxExpansions = CollationElementIterator::computeMaxExpansions(t->data, errorCode);
+}
+
+UBool
+RuleBasedCollator::initMaxExpansions(UErrorCode &errorCode) const {
+    umtx_initOnce(tailoring->maxExpansionsInitOnce, computeMaxExpansions, tailoring, errorCode);
+    return U_SUCCESS(errorCode);
+}
+
+CollationElementIterator *
+RuleBasedCollator::createCollationElementIterator(const UnicodeString& source) const {
+    UErrorCode errorCode = U_ZERO_ERROR;
+    if(!initMaxExpansions(errorCode)) { return NULL; }
+    CollationElementIterator *cei = new CollationElementIterator(source, this, errorCode);
+    if(U_FAILURE(errorCode)) {
+        delete cei;
+        return NULL;
+    }
+    return cei;
+}
+
+CollationElementIterator *
+RuleBasedCollator::createCollationElementIterator(const CharacterIterator& source) const {
+    UErrorCode errorCode = U_ZERO_ERROR;
+    if(!initMaxExpansions(errorCode)) { return NULL; }
+    CollationElementIterator *cei = new CollationElementIterator(source, this, errorCode);
+    if(U_FAILURE(errorCode)) {
+        delete cei;
+        return NULL;
+    }
+    return cei;
+}
+
+int32_t
+RuleBasedCollator::getMaxExpansion(int32_t order) const {
+    UErrorCode errorCode = U_ZERO_ERROR;
+    (void)initMaxExpansions(errorCode);
+    return CollationElementIterator::getMaxExpansion(tailoring->maxExpansions, order);
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
index 447f95f3b341ad024ac0797cd6de497e2c3149f8..7b5028a71a1432edbd54873c18943f95bc6e6527 100644 (file)
@@ -1,6 +1,6 @@
 /*
 **********************************************************************
-*   Copyright (C) 2001-2008 IBM and others. All rights reserved.
+*   Copyright (C) 2001-2014 IBM and others. All rights reserved.
 **********************************************************************
 *   Date        Name        Description
 *  03/22/2000   helena      Creation.
@@ -27,7 +27,6 @@ StringSearch::StringSearch(const UnicodeString &pattern,
                                  BreakIterator *breakiter,
                                  UErrorCode    &status) :
                            SearchIterator(text, breakiter),
-                           m_collator_(),
                            m_pattern_(pattern)
 {
     if (U_FAILURE(status)) {
@@ -42,19 +41,7 @@ StringSearch::StringSearch(const UnicodeString &pattern,
     uprv_free(m_search_);
     m_search_ = NULL;
 
-    // !!! dlf m_collator_ is an odd beast.  basically it is an aliasing
-    // wrapper around the internal collator and rules, which (here) are
-    // owned by this stringsearch object.  this means 1) it's destructor
-    // _should not_ delete the ucollator or rules, and 2) changes made
-    // to the exposed collator (setStrength etc) _should_ modify the
-    // ucollator.  thus the collator is not a copy-on-write alias, and it
-    // needs to distinguish itself not merely from 'stand alone' colators
-    // but also from copy-on-write ones.  it needs additional state, which
-    // setUCollator should set.
-
     if (U_SUCCESS(status)) {
-        // Alias the collator
-        m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
         // m_search_ has been created by the base SearchIterator class
         m_search_        = m_strsrch_->search;
     }
@@ -66,7 +53,6 @@ StringSearch::StringSearch(const UnicodeString     &pattern,
                                  BreakIterator     *breakiter,
                                  UErrorCode        &status) :
                            SearchIterator(text, breakiter),
-                           m_collator_(),
                            m_pattern_(pattern)
 {
     if (U_FAILURE(status)) {
@@ -81,15 +67,13 @@ StringSearch::StringSearch(const UnicodeString     &pattern,
     m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(),
                                           m_pattern_.length(),
                                           m_text_.getBuffer(),
-                                          m_text_.length(), coll->ucollator,
+                                          m_text_.length(), coll->toUCollator(),
                                           (UBreakIterator *)breakiter,
                                           &status);
     uprv_free(m_search_);
     m_search_ = NULL;
 
     if (U_SUCCESS(status)) {
-        // Alias the collator
-        m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
         // m_search_ has been created by the base SearchIterator class
         m_search_ = m_strsrch_->search;
     }
@@ -101,7 +85,6 @@ StringSearch::StringSearch(const UnicodeString     &pattern,
                                  BreakIterator     *breakiter,
                                  UErrorCode        &status) :
                            SearchIterator(text, breakiter),
-                           m_collator_(),
                            m_pattern_(pattern)
 {
     if (U_FAILURE(status)) {
@@ -116,8 +99,6 @@ StringSearch::StringSearch(const UnicodeString     &pattern,
     m_search_ = NULL;
 
     if (U_SUCCESS(status)) {
-        // Alias the collator
-        m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
         // m_search_ has been created by the base SearchIterator class
         m_search_ = m_strsrch_->search;
     }
@@ -129,7 +110,6 @@ StringSearch::StringSearch(const UnicodeString     &pattern,
                                  BreakIterator     *breakiter,
                                  UErrorCode        &status) :
                            SearchIterator(text, breakiter),
-                           m_collator_(),
                            m_pattern_(pattern)
 {
     if (U_FAILURE(status)) {
@@ -144,15 +124,13 @@ StringSearch::StringSearch(const UnicodeString     &pattern,
     m_strsrch_ = usearch_openFromCollator(m_pattern_.getBuffer(),
                                           m_pattern_.length(),
                                           m_text_.getBuffer(),
-                                          m_text_.length(), coll->ucollator,
+                                          m_text_.length(), coll->toUCollator(),
                                           (UBreakIterator *)breakiter,
                                           &status);
     uprv_free(m_search_);
     m_search_ = NULL;
 
     if (U_SUCCESS(status)) {
-        // Alias the collator
-        m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
         // m_search_ has been created by the base SearchIterator class
         m_search_ = m_strsrch_->search;
     }
@@ -160,7 +138,6 @@ StringSearch::StringSearch(const UnicodeString     &pattern,
 
 StringSearch::StringSearch(const StringSearch &that) :
                        SearchIterator(that.m_text_, that.m_breakiterator_),
-                       m_collator_(),
                        m_pattern_(that.m_pattern_)
 {
     UErrorCode status = U_ZERO_ERROR;
@@ -183,8 +160,6 @@ StringSearch::StringSearch(const StringSearch &that) :
                                              (UBreakIterator *)that.m_breakiterator_,
                                               &status);
         if (U_SUCCESS(status)) {
-            // Alias the collator
-            m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
             // m_search_ has been created by the base SearchIterator class
             m_search_        = m_strsrch_->search;
         }
@@ -222,9 +197,7 @@ StringSearch & StringSearch::operator=(const StringSearch &that)
                                               NULL, &status);
         // Check null pointer
         if (m_strsrch_ != NULL) {
-               // Alias the collator
-               m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
-               m_search_ = m_strsrch_->search;
+            m_search_ = m_strsrch_->search;
         }
     }
     return *this;
@@ -274,15 +247,14 @@ void StringSearch::setText(CharacterIterator &text, UErrorCode &status)
 
 RuleBasedCollator * StringSearch::getCollator() const
 {
-    return (RuleBasedCollator *)&m_collator_;
+    // Note the const_cast. It would be cleaner if this const method returned a const collator.
+    return RuleBasedCollator::rbcFromUCollator(const_cast<UCollator *>(m_strsrch_->collator));
 }
 
 void StringSearch::setCollator(RuleBasedCollator *coll, UErrorCode &status)
 {
     if (U_SUCCESS(status)) {
-        usearch_setCollator(m_strsrch_, coll->getUCollator(), &status);
-        // Alias the collator
-        m_collator_.setUCollator((UCollator *)m_strsrch_->collator);
+        usearch_setCollator(m_strsrch_, coll->toUCollator(), &status);
     }
 }
 
@@ -312,7 +284,7 @@ SearchIterator * StringSearch::safeClone(void) const
 {
     UErrorCode status = U_ZERO_ERROR;
     StringSearch *result = new StringSearch(m_pattern_, m_text_,
-                                            (RuleBasedCollator *)&m_collator_,
+                                            getCollator(),
                                             m_breakiterator_,
                                             status);
     /* test for NULL */
diff --git a/icu4c/source/i18n/tblcoll.cpp b/icu4c/source/i18n/tblcoll.cpp
deleted file mode 100644 (file)
index 744600d..0000000
+++ /dev/null
@@ -1,695 +0,0 @@
-/*
- ******************************************************************************
- * Copyright (C) 1996-2013, International Business Machines Corporation and
- * others. All Rights Reserved.
- ******************************************************************************
- */
-
-/**
- * File tblcoll.cpp
- *
- * Created by: Helena Shih
- *
- * Modification History:
- *
- *  Date        Name        Description
- *  2/5/97      aliu        Added streamIn and streamOut methods.  Added
- *                          constructor which reads RuleBasedCollator object from
- *                          a binary file.  Added writeToFile method which streams
- *                          RuleBasedCollator out to a binary file.  The streamIn
- *                          and streamOut methods use istream and ostream objects
- *                          in binary mode.
- *  2/11/97     aliu        Moved declarations out of for loop initializer.
- *                          Added Mac compatibility #ifdef for ios::nocreate.
- *  2/12/97     aliu        Modified to use TableCollationData sub-object to
- *                          hold invariant data.
- *  2/13/97     aliu        Moved several methods into this class from Collation.
- *                          Added a private RuleBasedCollator(Locale&) constructor,
- *                          to be used by Collator::getInstance().  General
- *                          clean up.  Made use of UErrorCode variables consistent.
- *  2/20/97     helena      Added clone, operator==, operator!=, operator=, and copy
- *                          constructor and getDynamicClassID.
- *  3/5/97      aliu        Changed compaction cycle to improve performance.  We
- *                          use the maximum allowable value which is kBlockCount.
- *                          Modified getRules() to load rules dynamically.  Changed
- *                          constructFromFile() call to accomodate this (added
- *                          parameter to specify whether binary loading is to
- *                          take place).
- * 05/06/97     helena      Added memory allocation error check.
- *  6/20/97     helena      Java class name change.
- *  6/23/97     helena      Adding comments to make code more readable.
- * 09/03/97     helena      Added createCollationKeyValues().
- * 06/26/98     erm         Changes for CollationKeys using byte arrays.
- * 08/10/98     erm         Synched with 1.2 version of RuleBasedCollator.java
- * 04/23/99     stephen     Removed EDecompositionMode, merged with
- *                          Normalizer::EMode
- * 06/14/99     stephen     Removed kResourceBundleSuffix
- * 06/22/99     stephen     Fixed logic in constructFromFile() since .ctx
- *                          files are no longer used.
- * 11/02/99     helena      Collator performance enhancements.  Special case
- *                          for NO_OP situations.
- * 11/17/99     srl         More performance enhancements. Inlined some internal functions.
- * 12/15/99     aliu        Update to support Thai collation.  Move NormalizerIterator
- *                          to implementation file.
- * 01/29/01     synwee      Modified into a C++ wrapper calling C APIs (ucol.h)
- */
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION
-
-#include "unicode/tblcoll.h"
-#include "unicode/coleitr.h"
-#include "unicode/ures.h"
-#include "unicode/uset.h"
-#include "ucol_imp.h"
-#include "uresimp.h"
-#include "uhash.h"
-#include "cmemory.h"
-#include "cstring.h"
-#include "putilimp.h"
-#include "ustr_imp.h"
-
-/* public RuleBasedCollator constructor ---------------------------------- */
-
-U_NAMESPACE_BEGIN
-
-/**
-* Copy constructor, aliasing, not write-through
-*/
-RuleBasedCollator::RuleBasedCollator(const RuleBasedCollator& that)
-: Collator(that)
-, dataIsOwned(FALSE)
-, isWriteThroughAlias(FALSE)
-, ucollator(NULL)
-{
-    RuleBasedCollator::operator=(that);
-}
-
-RuleBasedCollator::RuleBasedCollator(const UnicodeString& rules,
-                                     UErrorCode& status) :
-dataIsOwned(FALSE)
-{
-    construct(rules,
-        UCOL_DEFAULT_STRENGTH,
-        UCOL_DEFAULT,
-        status);
-}
-
-RuleBasedCollator::RuleBasedCollator(const UnicodeString& rules,
-                                     ECollationStrength collationStrength,
-                                     UErrorCode& status) : dataIsOwned(FALSE)
-{
-    construct(rules,
-        (UColAttributeValue)collationStrength,
-        UCOL_DEFAULT,
-        status);
-}
-
-RuleBasedCollator::RuleBasedCollator(const UnicodeString& rules,
-                                     UColAttributeValue decompositionMode,
-                                     UErrorCode& status) :
-dataIsOwned(FALSE)
-{
-    construct(rules,
-        UCOL_DEFAULT_STRENGTH,
-        decompositionMode,
-        status);
-}
-
-RuleBasedCollator::RuleBasedCollator(const UnicodeString& rules,
-                                     ECollationStrength collationStrength,
-                                     UColAttributeValue decompositionMode,
-                                     UErrorCode& status) : dataIsOwned(FALSE)
-{
-    construct(rules,
-        (UColAttributeValue)collationStrength,
-        decompositionMode,
-        status);
-}
-RuleBasedCollator::RuleBasedCollator(const uint8_t *bin, int32_t length,
-                    const RuleBasedCollator *base,
-                    UErrorCode &status) :
-dataIsOwned(TRUE),
-isWriteThroughAlias(FALSE)
-{
-  ucollator = ucol_openBinary(bin, length, base->ucollator, &status);
-}
-
-void
-RuleBasedCollator::setRuleStringFromCollator()
-{
-    int32_t length;
-    const UChar *r = ucol_getRules(ucollator, &length);
-
-    if (r && length > 0) {
-        // alias the rules string
-        urulestring.setTo(TRUE, r, length);
-    }
-    else {
-        urulestring.truncate(0); // Clear string.
-    }
-}
-
-// not aliasing, not write-through
-void
-RuleBasedCollator::construct(const UnicodeString& rules,
-                             UColAttributeValue collationStrength,
-                             UColAttributeValue decompositionMode,
-                             UErrorCode& status)
-{
-    ucollator = ucol_openRules(rules.getBuffer(), rules.length(),
-        decompositionMode, collationStrength,
-        NULL, &status);
-
-    dataIsOwned = TRUE; // since we own a collator now, we need to get rid of it
-    isWriteThroughAlias = FALSE;
-
-    if(ucollator == NULL) {
-        if(U_SUCCESS(status)) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-        }
-        return; // Failure
-    }
-
-    setRuleStringFromCollator();
-}
-
-/* RuleBasedCollator public destructor ----------------------------------- */
-
-RuleBasedCollator::~RuleBasedCollator()
-{
-    if (dataIsOwned)
-    {
-        ucol_close(ucollator);
-    }
-    ucollator = 0;
-}
-
-/* RuleBaseCollator public methods --------------------------------------- */
-
-UBool RuleBasedCollator::operator==(const Collator& that) const
-{
-  /* only checks for address equals here */
-  if (this == &that) {
-    return TRUE;
-  }
-  if (!Collator::operator==(that)) {
-    return FALSE;  /* not the same class */
-  }
-
-  RuleBasedCollator& thatAlias = (RuleBasedCollator&)that;
-
-  return ucol_equals(this->ucollator, thatAlias.ucollator);
-}
-
-// aliasing, not write-through
-RuleBasedCollator& RuleBasedCollator::operator=(const RuleBasedCollator& that)
-{
-    if (this == &that) { return *this; }
-
-    UErrorCode intStatus = U_ZERO_ERROR;
-    UCollator *ucol = ucol_safeClone(that.ucollator, NULL, NULL, &intStatus);
-    if (U_FAILURE(intStatus)) { return *this; }
-
-    if (dataIsOwned) {
-        ucol_close(ucollator);
-    }
-    ucollator = ucol;
-    dataIsOwned = TRUE;
-    isWriteThroughAlias = FALSE;
-    setRuleStringFromCollator();
-    return *this;
-}
-
-// aliasing, not write-through
-Collator* RuleBasedCollator::clone() const
-{
-    RuleBasedCollator* coll = new RuleBasedCollator(*this);
-    // There is a small chance that the internal ucol_safeClone() call fails.
-    if (coll != NULL && coll->ucollator == NULL) {
-        delete coll;
-        return NULL;
-    }
-    return coll;
-}
-
-
-CollationElementIterator* RuleBasedCollator::createCollationElementIterator
-                                           (const UnicodeString& source) const
-{
-    UErrorCode status = U_ZERO_ERROR;
-    CollationElementIterator *result = new CollationElementIterator(source, this,
-                                                                    status);
-    if (U_FAILURE(status)) {
-        delete result;
-        return NULL;
-    }
-
-    return result;
-}
-
-/**
-* Create a CollationElementIterator object that will iterate over the
-* elements in a string, using the collation rules defined in this
-* RuleBasedCollator
-*/
-CollationElementIterator* RuleBasedCollator::createCollationElementIterator
-                                       (const CharacterIterator& source) const
-{
-    UErrorCode status = U_ZERO_ERROR;
-    CollationElementIterator *result = new CollationElementIterator(source, this,
-                                                                    status);
-
-    if (U_FAILURE(status)) {
-        delete result;
-        return NULL;
-    }
-
-    return result;
-}
-
-/**
-* Return a string representation of this collator's rules. The string can
-* later be passed to the constructor that takes a UnicodeString argument,
-* which will construct a collator that's functionally identical to this one.
-* You can also allow users to edit the string in order to change the collation
-* data, or you can print it out for inspection, or whatever.
-*/
-const UnicodeString& RuleBasedCollator::getRules() const
-{
-    return urulestring;
-}
-
-void RuleBasedCollator::getRules(UColRuleOption delta, UnicodeString &buffer)
-{
-    int32_t rulesize = ucol_getRulesEx(ucollator, delta, NULL, -1);
-
-    if (rulesize > 0) {
-        UChar *rules = (UChar*) uprv_malloc( sizeof(UChar) * (rulesize) );
-        if(rules != NULL) {
-            ucol_getRulesEx(ucollator, delta, rules, rulesize);
-            buffer.setTo(rules, rulesize);
-            uprv_free(rules);
-        } else { // couldn't allocate
-            buffer.remove();
-        }
-    }
-    else {
-        buffer.remove();
-    }
-}
-
-UnicodeSet *
-RuleBasedCollator::getTailoredSet(UErrorCode &status) const
-{
-    if(U_FAILURE(status)) {
-        return NULL;
-    }
-    return (UnicodeSet *)ucol_getTailoredSet(this->ucollator, &status);
-}
-
-
-void RuleBasedCollator::getVersion(UVersionInfo versionInfo) const
-{
-    if (versionInfo!=NULL){
-        ucol_getVersion(ucollator, versionInfo);
-    }
-}
-
-/**
-* Compare two strings using this collator
-*/
-UCollationResult RuleBasedCollator::compare(
-                                               const UnicodeString& source,
-                                               const UnicodeString& target,
-                                               int32_t length,
-                                               UErrorCode &status) const
-{
-    return compare(source.getBuffer(), uprv_min(length,source.length()), target.getBuffer(), uprv_min(length,target.length()), status);
-}
-
-UCollationResult RuleBasedCollator::compare(const UChar* source,
-                                                       int32_t sourceLength,
-                                                       const UChar* target,
-                                                       int32_t targetLength,
-                                                       UErrorCode &status) const
-{
-    if(U_SUCCESS(status)) {
-        return  ucol_strcoll(ucollator, source, sourceLength, target, targetLength);
-    } else {
-        return UCOL_EQUAL;
-    }
-}
-
-UCollationResult RuleBasedCollator::compare(
-                                             const UnicodeString& source,
-                                             const UnicodeString& target,
-                                             UErrorCode &status) const
-{
-    if(U_SUCCESS(status)) {
-        return ucol_strcoll(ucollator, source.getBuffer(), source.length(),
-                                       target.getBuffer(), target.length());
-    } else {
-        return UCOL_EQUAL;
-    }
-}
-
-UCollationResult RuleBasedCollator::compare(UCharIterator &sIter,
-                                            UCharIterator &tIter,
-                                            UErrorCode &status) const {
-    if(U_SUCCESS(status)) {
-        return ucol_strcollIter(ucollator, &sIter, &tIter, &status);
-    } else {
-        return UCOL_EQUAL;
-    }
-}
-
-/**
-* Retrieve a collation key for the specified string. The key can be compared
-* with other collation keys using a bitwise comparison (e.g. memcmp) to find
-* the ordering of their respective source strings. This is handy when doing a
-* sort, where each sort key must be compared many times.
-*
-* The basic algorithm here is to find all of the collation elements for each
-* character in the source string, convert them to an ASCII representation, and
-* put them into the collation key.  But it's trickier than that. Each
-* collation element in a string has three components: primary ('A' vs 'B'),
-* secondary ('u' vs '\u00FC'), and tertiary ('A' vs 'a'), and a primary difference
-* at the end of a string takes precedence over a secondary or tertiary
-* difference earlier in the string.
-*
-* To account for this, we put all of the primary orders at the beginning of
-* the string, followed by the secondary and tertiary orders. Each set of
-* orders is terminated by nulls so that a key for a string which is a initial
-* substring of another key will compare less without any special case.
-*
-* Here's a hypothetical example, with the collation element represented as a
-* three-digit number, one digit for primary, one for secondary, etc.
-*
-* String:              A     a     B    \u00C9
-* Collation Elements: 101   100   201  511
-* Collation Key:      1125<null>0001<null>1011<null>
-*
-* To make things even trickier, secondary differences (accent marks) are
-* compared starting at the *end* of the string in languages with French
-* secondary ordering. But when comparing the accent marks on a single base
-* character, they are compared from the beginning. To handle this, we reverse
-* all of the accents that belong to each base character, then we reverse the
-* entire string of secondary orderings at the end.
-*/
-CollationKey& RuleBasedCollator::getCollationKey(
-                                                  const UnicodeString& source,
-                                                  CollationKey& sortkey,
-                                                  UErrorCode& status) const
-{
-    return getCollationKey(source.getBuffer(), source.length(), sortkey, status);
-}
-
-CollationKey& RuleBasedCollator::getCollationKey(const UChar* source,
-                                                    int32_t sourceLen,
-                                                    CollationKey& sortkey,
-                                                    UErrorCode& status) const
-{
-    if (U_FAILURE(status)) {
-        return sortkey.setToBogus();
-    }
-    if (sourceLen < -1 || (source == NULL && sourceLen != 0)) {
-        status = U_ILLEGAL_ARGUMENT_ERROR;
-        return sortkey.setToBogus();
-    }
-
-    if (sourceLen < 0) {
-        sourceLen = u_strlen(source);
-    }
-    if (sourceLen == 0) {
-        return sortkey.reset();
-    }
-
-    int32_t resultLen = ucol_getCollationKey(ucollator, source, sourceLen, sortkey, status);
-
-    if (U_SUCCESS(status)) {
-        sortkey.setLength(resultLen);
-    } else {
-        sortkey.setToBogus();
-    }
-    return sortkey;
-}
-
-/**
- * Return the maximum length of any expansion sequences that end with the
- * specified comparison order.
- * @param order a collation order returned by previous or next.
- * @return the maximum length of any expansion seuences ending with the
- *         specified order or 1 if collation order does not occur at the end of any
- *         expansion sequence.
- * @see CollationElementIterator#getMaxExpansion
- */
-int32_t RuleBasedCollator::getMaxExpansion(int32_t order) const
-{
-    uint8_t result;
-    UCOL_GETMAXEXPANSION(ucollator, (uint32_t)order, result);
-    return result;
-}
-
-uint8_t* RuleBasedCollator::cloneRuleData(int32_t &length,
-                                              UErrorCode &status)
-{
-    if (U_FAILURE(status)) { return NULL; }
-    LocalMemory<uint8_t> buffer((uint8_t *)uprv_malloc(20000));
-    if (buffer.isNull()) {
-        status = U_MEMORY_ALLOCATION_ERROR;
-        return NULL;
-    }
-    length = cloneBinary(buffer.getAlias(), 20000, status);
-    if (status == U_BUFFER_OVERFLOW_ERROR) {
-        if (buffer.allocateInsteadAndCopy(length, 0) == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return NULL;
-        }
-        status = U_ZERO_ERROR;
-        length = cloneBinary(buffer.getAlias(), length, status);
-    }
-    if (U_FAILURE(status)) { return NULL; }
-    return buffer.orphan();
-}
-
-
-int32_t RuleBasedCollator::cloneBinary(uint8_t *buffer, int32_t capacity, UErrorCode &status)
-{
-  return ucol_cloneBinary(ucollator, buffer, capacity, &status);
-}
-
-void RuleBasedCollator::setAttribute(UColAttribute attr,
-                                     UColAttributeValue value,
-                                     UErrorCode &status)
-{
-    if (U_FAILURE(status))
-        return;
-    checkOwned();
-    ucol_setAttribute(ucollator, attr, value, &status);
-}
-
-UColAttributeValue RuleBasedCollator::getAttribute(UColAttribute attr,
-                                                      UErrorCode &status) const
-{
-    if (U_FAILURE(status))
-        return UCOL_DEFAULT;
-    return ucol_getAttribute(ucollator, attr, &status);
-}
-
-uint32_t RuleBasedCollator::setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status) {
-    checkOwned();
-    return ucol_setVariableTop(ucollator, varTop, len, &status);
-}
-
-uint32_t RuleBasedCollator::setVariableTop(const UnicodeString &varTop, UErrorCode &status) {
-    checkOwned();
-    return ucol_setVariableTop(ucollator, varTop.getBuffer(), varTop.length(), &status);
-}
-
-void RuleBasedCollator::setVariableTop(uint32_t varTop, UErrorCode &status) {
-    checkOwned();
-    ucol_restoreVariableTop(ucollator, varTop, &status);
-}
-
-uint32_t RuleBasedCollator::getVariableTop(UErrorCode &status) const {
-  return ucol_getVariableTop(ucollator, &status);
-}
-
-int32_t RuleBasedCollator::getSortKey(const UnicodeString& source,
-                                         uint8_t *result, int32_t resultLength)
-                                         const
-{
-    return ucol_getSortKey(ucollator, source.getBuffer(), source.length(), result, resultLength);
-}
-
-int32_t RuleBasedCollator::getSortKey(const UChar *source,
-                                         int32_t sourceLength, uint8_t *result,
-                                         int32_t resultLength) const
-{
-    return ucol_getSortKey(ucollator, source, sourceLength, result, resultLength);
-}
-
-int32_t RuleBasedCollator::getReorderCodes(int32_t *dest,
-                                          int32_t destCapacity,
-                                          UErrorCode& status) const
-{
-    return ucol_getReorderCodes(ucollator, dest, destCapacity, &status);
-}
-
-void RuleBasedCollator::setReorderCodes(const int32_t *reorderCodes,
-                                       int32_t reorderCodesLength,
-                                       UErrorCode& status)
-{
-    checkOwned();
-    ucol_setReorderCodes(ucollator, reorderCodes, reorderCodesLength, &status);
-}
-
-int32_t RuleBasedCollator::getEquivalentReorderCodes(int32_t reorderCode,
-                                int32_t* dest,
-                                int32_t destCapacity,
-                                UErrorCode& status)
-{
-    return ucol_getEquivalentReorderCodes(reorderCode, dest, destCapacity, &status);
-}
-
-/**
-* Create a hash code for this collation. Just hash the main rule table -- that
-* should be good enough for almost any use.
-*/
-int32_t RuleBasedCollator::hashCode() const
-{
-    int32_t length;
-    const UChar *rules = ucol_getRules(ucollator, &length);
-    return ustr_hashUCharsN(rules, length);
-}
-
-/**
-* return the locale of this collator
-*/
-Locale RuleBasedCollator::getLocale(ULocDataLocaleType type, UErrorCode &status) const {
-    const char *result = ucol_getLocaleByType(ucollator, type, &status);
-    if(result == NULL) {
-        Locale res("");
-        res.setToBogus();
-        return res;
-    } else {
-        return Locale(result);
-    }
-}
-
-void
-RuleBasedCollator::setLocales(const Locale& requestedLocale, const Locale& validLocale, const Locale& actualLocale) {
-    checkOwned();
-    char* rloc  = uprv_strdup(requestedLocale.getName());
-    if (rloc) {
-        char* vloc = uprv_strdup(validLocale.getName());
-        if (vloc) {
-            char* aloc = uprv_strdup(actualLocale.getName());
-            if (aloc) {
-                ucol_setReqValidLocales(ucollator, rloc, vloc, aloc);
-                return;
-            }
-            uprv_free(vloc);
-        }
-        uprv_free(rloc);
-    }
-}
-
-// RuleBaseCollatorNew private constructor ----------------------------------
-
-RuleBasedCollator::RuleBasedCollator()
-  : dataIsOwned(FALSE), isWriteThroughAlias(FALSE), ucollator(NULL)
-{
-}
-
-RuleBasedCollator::RuleBasedCollator(const Locale& desiredLocale,
-                                           UErrorCode& status)
- : dataIsOwned(FALSE), isWriteThroughAlias(FALSE), ucollator(NULL)
-{
-    if (U_FAILURE(status))
-        return;
-
-    /*
-    Try to load, in order:
-     1. The desired locale's collation.
-     2. A fallback of the desired locale.
-     3. The default locale's collation.
-     4. A fallback of the default locale.
-     5. The default collation rules, which contains en_US collation rules.
-
-     To reiterate, we try:
-     Specific:
-      language+country+variant
-      language+country
-      language
-     Default:
-      language+country+variant
-      language+country
-      language
-     Root: (aka DEFAULTRULES)
-     steps 1-5 are handled by resource bundle fallback mechanism.
-     however, in a very unprobable situation that no resource bundle
-     data exists, step 5 is repeated with hardcoded default rules.
-    */
-
-    setUCollator(desiredLocale, status);
-
-    if (U_FAILURE(status))
-    {
-        status = U_ZERO_ERROR;
-
-        setUCollator(kRootLocaleName, status);
-        if (status == U_ZERO_ERROR) {
-            status = U_USING_DEFAULT_WARNING;
-        }
-    }
-
-    if (U_SUCCESS(status))
-    {
-        setRuleStringFromCollator();
-    }
-}
-
-void
-RuleBasedCollator::setUCollator(const char *locale,
-                                UErrorCode &status)
-{
-    if (U_FAILURE(status)) {
-        return;
-    }
-    if (ucollator && dataIsOwned)
-        ucol_close(ucollator);
-    ucollator = ucol_open_internal(locale, &status);
-    dataIsOwned = TRUE;
-    isWriteThroughAlias = FALSE;
-}
-
-
-void
-RuleBasedCollator::checkOwned() {
-    if (!(dataIsOwned || isWriteThroughAlias)) {
-        UErrorCode status = U_ZERO_ERROR;
-        ucollator = ucol_safeClone(ucollator, NULL, NULL, &status);
-        setRuleStringFromCollator();
-        dataIsOwned = TRUE;
-        isWriteThroughAlias = FALSE;
-    }
-}
-
-
-int32_t RuleBasedCollator::internalGetShortDefinitionString(const char *locale,
-                                                                      char *buffer,
-                                                                      int32_t capacity,
-                                                                      UErrorCode &status) const {
-  /* simply delegate */
-  return ucol_getShortDefinitionString(ucollator, locale, buffer, capacity, &status);
-}
-
-
-UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedCollator)
-
-U_NAMESPACE_END
-
-#endif /* #if !UCONFIG_NO_COLLATION */
index 33bd468112d17e56dbcf31b1f1ed9c02e7db8975..bbf8a2400bc7803034d7a923cbc31d94d68080f3 100644 (file)
@@ -1,9 +1,7 @@
 /*
 ******************************************************************************
-*                                                                            *
-* Copyright (C) 2001-2014, International Business Machines                   *
-*                Corporation and others. All Rights Reserved.                *
-*                                                                            *
+* Copyright (C) 2001-2014, International Business Machines
+*                Corporation and others. All Rights Reserved.
 ******************************************************************************
 *   file name:  ucln_cmn.h
 *   encoding:   US-ASCII
@@ -50,10 +48,9 @@ typedef enum ECleanupI18NType {
     UCLN_I18N_SMPDTFMT,
     UCLN_I18N_USEARCH,
     UCLN_I18N_COLLATOR,
-    UCLN_I18N_UCOL,
     UCLN_I18N_UCOL_RES,
-    UCLN_I18N_UCOL_BLD,
     UCLN_I18N_CSDET,
+    UCLN_I18N_COLLATION_ROOT,
     UCLN_I18N_GENDERINFO,
     UCLN_I18N_CDFINFO,
     UCLN_I18N_REGION,
index b0d819f4543d82468e0bb9216626f1a1164d3164..8c7c3f92c6ab578487f7f646040baec39136762a 100644 (file)
@@ -1,6 +1,6 @@
 /*
 *******************************************************************************
-*   Copyright (C) 1996-2013, International Business Machines
+*   Copyright (C) 1996-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
 *   file name:  ucol.cpp
 * 02/16/2001  synwee    Added internal method getPrevSpecialCE
 * 03/01/2001  synwee    Added maxexpansion functionality.
 * 03/16/2001  weiv      Collation framework is rewritten in C and made UCA compliant
+* 2012-2014   markus    Rewritten in C++ again.
 */
 
 #include "unicode/utypes.h"
 
 #if !UCONFIG_NO_COLLATION
 
+#include "unicode/coll.h"
+#include "unicode/tblcoll.h"
 #include "unicode/bytestream.h"
 #include "unicode/coleitr.h"
-#include "unicode/unorm.h"
-#include "unicode/udata.h"
+#include "unicode/ucoleitr.h"
 #include "unicode/ustring.h"
-#include "unicode/utf8.h"
-
-#include "ucol_imp.h"
-#include "bocsu.h"
-
-#include "normalizer2impl.h"
-#include "unorm_it.h"
-#include "umutex.h"
 #include "cmemory.h"
-#include "ucln_in.h"
+#include "collation.h"
 #include "cstring.h"
-#include "utracimp.h"
 #include "putilimp.h"
 #include "uassert.h"
-#include "unicode/coll.h"
-
-#ifdef UCOL_DEBUG
-#include <stdio.h>
-#endif
+#include "utracimp.h"
 
 U_NAMESPACE_USE
 
-#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
-
-#define LAST_BYTE_MASK_           0xFF
-#define SECOND_LAST_BYTE_SHIFT_   8
-
-#define ZERO_CC_LIMIT_            0xC0
-
-// These are static pointers to the NFC/NFD implementation instance.
-// Each of them is always the same between calls to u_cleanup
-// and therefore writing to it is not synchronized.
-// They are cleaned in ucol_cleanup
-static const Normalizer2 *g_nfd = NULL;
-static const Normalizer2Impl *g_nfcImpl = NULL;
-
-// These are values from UCA required for
-// implicit generation and supressing sort key compression
-// they should regularly be in the UCA, but if one
-// is running without UCA, it could be a problem
-static const int32_t maxRegularPrimary  = 0x7A;
-static const int32_t minImplicitPrimary = 0xE0;
-static const int32_t maxImplicitPrimary = 0xE4;
-
-U_CDECL_BEGIN
-static UBool U_CALLCONV
-ucol_cleanup(void)
-{
-    g_nfd = NULL;
-    g_nfcImpl = NULL;
-    return TRUE;
-}
-
-static int32_t U_CALLCONV
-_getFoldingOffset(uint32_t data) {
-    return (int32_t)(data&0xFFFFFF);
-}
-
-U_CDECL_END
-
-static inline
-UBool initializeNFD(UErrorCode *status) {
-    if (g_nfd != NULL) {
-        return TRUE;
-    } else {
-        // The result is constant, until the library is reloaded.
-        g_nfd = Normalizer2Factory::getNFDInstance(*status);
-        ucln_i18n_registerCleanup(UCLN_I18N_UCOL, ucol_cleanup);
-        return U_SUCCESS(*status);
-    }
-}
-
-// init FCD data
-static inline
-UBool initializeFCD(UErrorCode *status) {
-    if (g_nfcImpl != NULL) {
-        return TRUE;
-    } else {
-        // The result is constant, until the library is reloaded.
-        g_nfcImpl = Normalizer2Factory::getNFCImpl(*status);
-        // Note: Alternatively, we could also store this pointer in each collIterate struct,
-        // same as Normalizer2Factory::getImpl(collIterate->nfd).
-        ucln_i18n_registerCleanup(UCLN_I18N_UCOL, ucol_cleanup);
-        return U_SUCCESS(*status);
-    }
-}
-
-static
-inline void IInit_collIterate(const UCollator *collator, const UChar *sourceString,
-                              int32_t sourceLen, collIterate *s,
-                              UErrorCode *status)
-{
-    (s)->string = (s)->pos = sourceString;
-    (s)->origFlags = 0;
-    (s)->flags = 0;
-    if (sourceLen >= 0) {
-        s->flags |= UCOL_ITER_HASLEN;
-        (s)->endp = (UChar *)sourceString+sourceLen;
-    }
-    else {
-        /* change to enable easier checking for end of string for fcdpositon */
-        (s)->endp = NULL;
-    }
-    (s)->extendCEs = NULL;
-    (s)->extendCEsSize = 0;
-    (s)->CEpos = (s)->toReturn = (s)->CEs;
-    (s)->offsetBuffer = NULL;
-    (s)->offsetBufferSize = 0;
-    (s)->offsetReturn = (s)->offsetStore = NULL;
-    (s)->offsetRepeatCount = (s)->offsetRepeatValue = 0;
-    (s)->coll = (collator);
-    if (initializeNFD(status)) {
-        (s)->nfd = g_nfd;
-    } else {
-        return;
-    }
-    (s)->fcdPosition = 0;
-    if(collator->normalizationMode == UCOL_ON) {
-        (s)->flags |= UCOL_ITER_NORM;
-    }
-    if(collator->hiraganaQ == UCOL_ON && collator->strength >= UCOL_QUATERNARY) {
-        (s)->flags |= UCOL_HIRAGANA_Q;
-    }
-    (s)->iterator = NULL;
-    //(s)->iteratorIndex = 0;
-}
-
-U_CAPI void  U_EXPORT2
-uprv_init_collIterate(const UCollator *collator, const UChar *sourceString,
-                             int32_t sourceLen, collIterate *s,
-                             UErrorCode *status) {
-    /* Out-of-line version for use from other files. */
-    IInit_collIterate(collator, sourceString, sourceLen, s, status);
-}
-
-U_CAPI collIterate * U_EXPORT2 
-uprv_new_collIterate(UErrorCode *status) {
-    if(U_FAILURE(*status)) {
-        return NULL;
-    }
-    collIterate *s = new collIterate;
-    if(s == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return NULL;
-    }
-    return s;
-}
-
-U_CAPI void U_EXPORT2 
-uprv_delete_collIterate(collIterate *s) {
-    delete s;
-}
-
-U_CAPI UBool U_EXPORT2
-uprv_collIterateAtEnd(collIterate *s) {
-    return s == NULL || s->pos == s->endp;
-}
-
-/**
-* Backup the state of the collIterate struct data
-* @param data collIterate to backup
-* @param backup storage
-*/
-static
-inline void backupState(const collIterate *data, collIterateState *backup)
-{
-    backup->fcdPosition = data->fcdPosition;
-    backup->flags       = data->flags;
-    backup->origFlags   = data->origFlags;
-    backup->pos         = data->pos;
-    backup->bufferaddress = data->writableBuffer.getBuffer();
-    backup->buffersize    = data->writableBuffer.length();
-    backup->iteratorMove = 0;
-    backup->iteratorIndex = 0;
-    if(data->iterator != NULL) {
-        //backup->iteratorIndex = data->iterator->getIndex(data->iterator, UITER_CURRENT);
-        backup->iteratorIndex = data->iterator->getState(data->iterator);
-        // no we try to fixup if we're using a normalizing iterator and we get UITER_NO_STATE
-        if(backup->iteratorIndex == UITER_NO_STATE) {
-            while((backup->iteratorIndex = data->iterator->getState(data->iterator)) == UITER_NO_STATE) {
-                backup->iteratorMove++;
-                data->iterator->move(data->iterator, -1, UITER_CURRENT);
-            }
-            data->iterator->move(data->iterator, backup->iteratorMove, UITER_CURRENT);
-        }
-    }
-}
-
-/**
-* Loads the state into the collIterate struct data
-* @param data collIterate to backup
-* @param backup storage
-* @param forwards boolean to indicate if forwards iteration is used,
-*        false indicates backwards iteration
-*/
-static
-inline void loadState(collIterate *data, const collIterateState *backup,
-                      UBool        forwards)
-{
-    UErrorCode status = U_ZERO_ERROR;
-    data->flags       = backup->flags;
-    data->origFlags   = backup->origFlags;
-    if(data->iterator != NULL) {
-        //data->iterator->move(data->iterator, backup->iteratorIndex, UITER_ZERO);
-        data->iterator->setState(data->iterator, backup->iteratorIndex, &status);
-        if(backup->iteratorMove != 0) {
-            data->iterator->move(data->iterator, backup->iteratorMove, UITER_CURRENT);
-        }
-    }
-    data->pos         = backup->pos;
-
-    if ((data->flags & UCOL_ITER_INNORMBUF) &&
-        data->writableBuffer.getBuffer() != backup->bufferaddress) {
-        /*
-        this is when a new buffer has been reallocated and we'll have to
-        calculate the new position.
-        note the new buffer has to contain the contents of the old buffer.
-        */
-        if (forwards) {
-            data->pos = data->writableBuffer.getTerminatedBuffer() +
-                                         (data->pos - backup->bufferaddress);
-        }
-        else {
-            /* backwards direction */
-            int32_t temp = backup->buffersize -
-                                  (int32_t)(data->pos - backup->bufferaddress);
-            data->pos = data->writableBuffer.getTerminatedBuffer() + (data->writableBuffer.length() - temp);
-        }
-    }
-    if ((data->flags & UCOL_ITER_INNORMBUF) == 0) {
-        /*
-        this is alittle tricky.
-        if we are initially not in the normalization buffer, even if we
-        normalize in the later stage, the data in the buffer will be
-        ignored, since we skip back up to the data string.
-        however if we are already in the normalization buffer, any
-        further normalization will pull data into the normalization
-        buffer and modify the fcdPosition.
-        since we are keeping the data in the buffer for use, the
-        fcdPosition can not be reverted back.
-        arrgghh....
-        */
-        data->fcdPosition = backup->fcdPosition;
-    }
-}
-
-static UBool
-reallocCEs(collIterate *data, int32_t newCapacity) {
-    uint32_t *oldCEs = data->extendCEs;
-    if(oldCEs == NULL) {
-        oldCEs = data->CEs;
-    }
-    int32_t length = data->CEpos - oldCEs;
-    uint32_t *newCEs = (uint32_t *)uprv_malloc(newCapacity * 4);
-    if(newCEs == NULL) {
-        return FALSE;
-    }
-    uprv_memcpy(newCEs, oldCEs, length * 4);
-    uprv_free(data->extendCEs);
-    data->extendCEs = newCEs;
-    data->extendCEsSize = newCapacity;
-    data->CEpos = newCEs + length;
-    return TRUE;
-}
-
-static UBool
-increaseCEsCapacity(collIterate *data) {
-    int32_t oldCapacity;
-    if(data->extendCEs != NULL) {
-        oldCapacity = data->extendCEsSize;
-    } else {
-        oldCapacity = LENGTHOF(data->CEs);
-    }
-    return reallocCEs(data, 2 * oldCapacity);
-}
-
-static UBool
-ensureCEsCapacity(collIterate *data, int32_t minCapacity) {
-    int32_t oldCapacity;
-    if(data->extendCEs != NULL) {
-        oldCapacity = data->extendCEsSize;
-    } else {
-        oldCapacity = LENGTHOF(data->CEs);
-    }
-    if(minCapacity <= oldCapacity) {
-        return TRUE;
-    }
-    oldCapacity *= 2;
-    return reallocCEs(data, minCapacity > oldCapacity ? minCapacity : oldCapacity);
-}
-
-void collIterate::appendOffset(int32_t offset, UErrorCode &errorCode) {
-    if(U_FAILURE(errorCode)) {
-        return;
-    }
-    int32_t length = offsetStore == NULL ? 0 : (int32_t)(offsetStore - offsetBuffer);
-    U_ASSERT(length >= offsetBufferSize || offsetStore != NULL);
-    if(length >= offsetBufferSize) {
-        int32_t newCapacity = 2 * offsetBufferSize + UCOL_EXPAND_CE_BUFFER_SIZE;
-        int32_t *newBuffer = static_cast<int32_t *>(uprv_malloc(newCapacity * 4));
-        if(newBuffer == NULL) {
-            errorCode = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        if(length > 0) {
-            uprv_memcpy(newBuffer, offsetBuffer, length * 4);
-        }
-        uprv_free(offsetBuffer);
-        offsetBuffer = newBuffer;
-        offsetStore = offsetBuffer + length;
-        offsetBufferSize = newCapacity;
-    }
-    *offsetStore++ = offset;
-}
-
-/*
-* collIter_eos()
-*     Checks for a collIterate being positioned at the end of
-*     its source string.
-*
-*/
-static
-inline UBool collIter_eos(collIterate *s) {
-    if(s->flags & UCOL_USE_ITERATOR) {
-      return !(s->iterator->hasNext(s->iterator));
-    }
-    if ((s->flags & UCOL_ITER_HASLEN) == 0 && *s->pos != 0) {
-        // Null terminated string, but not at null, so not at end.
-        //   Whether in main or normalization buffer doesn't matter.
-        return FALSE;
-    }
-
-    // String with length.  Can't be in normalization buffer, which is always
-    //  null termintated.
-    if (s->flags & UCOL_ITER_HASLEN) {
-        return (s->pos == s->endp);
-    }
-
-    // We are at a null termination, could be either normalization buffer or main string.
-    if ((s->flags & UCOL_ITER_INNORMBUF) == 0) {
-        // At null at end of main string.
-        return TRUE;
-    }
-
-    // At null at end of normalization buffer.  Need to check whether there there are
-    //   any characters left in the main buffer.
-    if(s->origFlags & UCOL_USE_ITERATOR) {
-      return !(s->iterator->hasNext(s->iterator));
-    } else if ((s->origFlags & UCOL_ITER_HASLEN) == 0) {
-        // Null terminated main string.  fcdPosition is the 'return' position into main buf.
-        return (*s->fcdPosition == 0);
-    }
-    else {
-        // Main string with an end pointer.
-        return s->fcdPosition == s->endp;
-    }
-}
-
-/*
-* collIter_bos()
-*     Checks for a collIterate being positioned at the start of
-*     its source string.
-*
-*/
-static
-inline UBool collIter_bos(collIterate *source) {
-  // if we're going backwards, we need to know whether there is more in the
-  // iterator, even if we are in the side buffer
-  if(source->flags & UCOL_USE_ITERATOR || source->origFlags & UCOL_USE_ITERATOR) {
-    return !source->iterator->hasPrevious(source->iterator);
-  }
-  if (source->pos <= source->string ||
-      ((source->flags & UCOL_ITER_INNORMBUF) &&
-      *(source->pos - 1) == 0 && source->fcdPosition == NULL)) {
-    return TRUE;
-  }
-  return FALSE;
-}
-
-/*static
-inline UBool collIter_SimpleBos(collIterate *source) {
-  // if we're going backwards, we need to know whether there is more in the
-  // iterator, even if we are in the side buffer
-  if(source->flags & UCOL_USE_ITERATOR || source->origFlags & UCOL_USE_ITERATOR) {
-    return !source->iterator->hasPrevious(source->iterator);
-  }
-  if (source->pos == source->string) {
-    return TRUE;
-  }
-  return FALSE;
-}*/
-    //return (data->pos == data->string) ||
-
-
-/****************************************************************************/
-/* Following are the open/close functions                                   */
-/*                                                                          */
-/****************************************************************************/
-
-static UCollator*
-ucol_initFromBinary(const uint8_t *bin, int32_t length,
+U_CAPI UCollator* U_EXPORT2
+ucol_openBinary(const uint8_t *bin, int32_t length,
                 const UCollator *base,
-                UCollator *fillIn,
                 UErrorCode *status)
 {
-    UCollator *result = fillIn;
-    if(U_FAILURE(*status)) {
-        return NULL;
-    }
-    /*
-    if(base == NULL) {
-        // we don't support null base yet
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
+    if(U_FAILURE(*status)) { return NULL; }
+    RuleBasedCollator *coll = new RuleBasedCollator(
+            bin, length,
+            RuleBasedCollator::rbcFromUCollator(base),
+            *status);
+    if(coll == NULL) {
+        *status = U_MEMORY_ALLOCATION_ERROR;
         return NULL;
     }
-    */
-    // We need these and we could be running without UCA
-    uprv_uca_initImplicitConstants(status);
-    UCATableHeader *colData = (UCATableHeader *)bin;
-    // do we want version check here? We're trying to figure out whether collators are compatible
-    if((base && (uprv_memcmp(colData->UCAVersion, base->image->UCAVersion, sizeof(UVersionInfo)) != 0 ||
-        uprv_memcmp(colData->UCDVersion, base->image->UCDVersion, sizeof(UVersionInfo)) != 0)) ||
-        colData->version[0] != UCOL_BUILDER_VERSION)
-    {
-        *status = U_COLLATOR_VERSION_MISMATCH;
+    if(U_FAILURE(*status)) {
+        delete coll;
         return NULL;
     }
-    else {
-        if((uint32_t)length > (paddedsize(sizeof(UCATableHeader)) + paddedsize(sizeof(UColOptionSet)))) {
-            result = ucol_initCollator((const UCATableHeader *)bin, result, base, status);
-            if(U_FAILURE(*status)){
-                return NULL;
-            }
-            result->hasRealData = TRUE;
-        }
-        else {
-            if(base) {
-                result = ucol_initCollator(base->image, result, base, status);
-                ucol_setOptionsFromHeader(result, (UColOptionSet *)(bin+((const UCATableHeader *)bin)->options), status);
-                if(U_FAILURE(*status)){
-                    return NULL;
-                }
-                result->hasRealData = FALSE;
-            }
-            else {
-                *status = U_USELESS_COLLATOR_ERROR;
-                return NULL;
-            }
-        }
-        result->freeImageOnClose = FALSE;
-    }
-    result->actualLocale = NULL;
-    result->validLocale = NULL;
-    result->requestedLocale = NULL;
-    result->rules = NULL;
-    result->rulesLength = 0;
-    result->freeRulesOnClose = FALSE;
-    result->ucaRules = NULL;
-    return result;
-}
-
-U_CAPI UCollator* U_EXPORT2
-ucol_openBinary(const uint8_t *bin, int32_t length,
-                const UCollator *base,
-                UErrorCode *status)
-{
-    return ucol_initFromBinary(bin, length, base, NULL, status);
+    return coll->toUCollator();
 }
 
 U_CAPI int32_t U_EXPORT2
@@ -499,79 +62,20 @@ ucol_cloneBinary(const UCollator *coll,
                  uint8_t *buffer, int32_t capacity,
                  UErrorCode *status)
 {
-    int32_t length = 0;
     if(U_FAILURE(*status)) {
-        return length;
-    }
-    if(capacity < 0) {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        return length;
+        return 0;
     }
-    if(coll->hasRealData == TRUE) {
-        length = coll->image->size;
-        if(length <= capacity) {
-            uprv_memcpy(buffer, coll->image, length);
-        } else {
-            *status = U_BUFFER_OVERFLOW_ERROR;
-        }
-    } else {
-        length = (int32_t)(paddedsize(sizeof(UCATableHeader))+paddedsize(sizeof(UColOptionSet)));
-        if(length <= capacity) {
-            /* build the UCATableHeader with minimal entries */
-            /* do not copy the header from the UCA file because its values are wrong! */
-            /* uprv_memcpy(result, UCA->image, sizeof(UCATableHeader)); */
-
-            /* reset everything */
-            uprv_memset(buffer, 0, length);
-
-            /* set the tailoring-specific values */
-            UCATableHeader *myData = (UCATableHeader *)buffer;
-            myData->size = length;
-
-            /* offset for the options, the only part of the data that is present after the header */
-            myData->options = sizeof(UCATableHeader);
-
-            /* need to always set the expansion value for an upper bound of the options */
-            myData->expansion = myData->options + sizeof(UColOptionSet);
-
-            myData->magic = UCOL_HEADER_MAGIC;
-            myData->isBigEndian = U_IS_BIG_ENDIAN;
-            myData->charSetFamily = U_CHARSET_FAMILY;
-
-            /* copy UCA's version; genrb will override all but the builder version with tailoring data */
-            uprv_memcpy(myData->version, coll->image->version, sizeof(UVersionInfo));
-
-            uprv_memcpy(myData->UCAVersion, coll->image->UCAVersion, sizeof(UVersionInfo));
-            uprv_memcpy(myData->UCDVersion, coll->image->UCDVersion, sizeof(UVersionInfo));
-            uprv_memcpy(myData->formatVersion, coll->image->formatVersion, sizeof(UVersionInfo));
-            myData->jamoSpecial = coll->image->jamoSpecial;
-
-            /* copy the collator options */
-            uprv_memcpy(buffer+paddedsize(sizeof(UCATableHeader)), coll->options, sizeof(UColOptionSet));
-        } else {
-            *status = U_BUFFER_OVERFLOW_ERROR;
-        }
+    const RuleBasedCollator *rbc = RuleBasedCollator::rbcFromUCollator(coll);
+    if(rbc == NULL && coll != NULL) {
+        *status = U_UNSUPPORTED_ERROR;
+        return 0;
     }
-    return length;
+    return rbc->cloneBinary(buffer, capacity, *status);
 }
 
 U_CAPI UCollator* U_EXPORT2
 ucol_safeClone(const UCollator *coll, void * /*stackBuffer*/, int32_t * pBufferSize, UErrorCode *status)
 {
-    UCollator * localCollator;
-    int32_t bufferSizeNeeded = (int32_t)sizeof(UCollator);
-    int32_t imageSize = 0;
-    int32_t rulesSize = 0;
-    int32_t rulesPadding = 0;
-    int32_t defaultReorderCodesSize = 0;
-    int32_t reorderCodesSize = 0;
-    uint8_t *image;
-    UChar *rules;
-    int32_t* defaultReorderCodes;
-    int32_t* reorderCodes;
-    uint8_t* leadBytePermutationTable;
-    UBool imageAllocated = FALSE;
-
     if (status == NULL || U_FAILURE(*status)){
         return NULL;
     }
@@ -579,25 +83,6 @@ ucol_safeClone(const UCollator *coll, void * /*stackBuffer*/, int32_t * pBufferS
        *status = U_ILLEGAL_ARGUMENT_ERROR;
         return NULL;
     }
-
-    if (coll->rules && coll->freeRulesOnClose) {
-        rulesSize = (int32_t)(coll->rulesLength + 1)*sizeof(UChar);
-        rulesPadding = (int32_t)(bufferSizeNeeded % sizeof(UChar));
-        bufferSizeNeeded += rulesSize + rulesPadding;
-    }
-    // no padding for alignment needed from here since the next two are 4 byte quantities
-    if (coll->defaultReorderCodes) {
-        defaultReorderCodesSize = coll->defaultReorderCodesLength * sizeof(int32_t);
-        bufferSizeNeeded += defaultReorderCodesSize;
-    }
-    if (coll->reorderCodes) {
-        reorderCodesSize = coll->reorderCodesLength * sizeof(int32_t);
-        bufferSizeNeeded += reorderCodesSize;
-    }
-    if (coll->leadBytePermutationTable) {
-        bufferSizeNeeded += 256 * sizeof(uint8_t);
-    }
-
     if (pBufferSize != NULL) {
         int32_t inputSize = *pBufferSize;
         *pBufferSize = 1;
@@ -605,86 +90,13 @@ ucol_safeClone(const UCollator *coll, void * /*stackBuffer*/, int32_t * pBufferS
             return NULL;  // preflighting for deprecated functionality
         }
     }
-
-    char *stackBufferChars = (char *)uprv_malloc(bufferSizeNeeded);
-    // Null pointer check.
-    if (stackBufferChars == NULL) {
+    Collator *newColl = Collator::fromUCollator(coll)->clone();
+    if (newColl == NULL) {
         *status = U_MEMORY_ALLOCATION_ERROR;
-        return NULL;
-    }
-    *status = U_SAFECLONE_ALLOCATED_WARNING;
-
-    localCollator = (UCollator *)stackBufferChars;
-    rules = (UChar *)(stackBufferChars + sizeof(UCollator) + rulesPadding);
-    defaultReorderCodes = (int32_t*)((uint8_t*)rules + rulesSize);
-    reorderCodes = (int32_t*)((uint8_t*)defaultReorderCodes + defaultReorderCodesSize);
-    leadBytePermutationTable = (uint8_t*)reorderCodes + reorderCodesSize;
-
-    {
-        UErrorCode tempStatus = U_ZERO_ERROR;
-        imageSize = ucol_cloneBinary(coll, NULL, 0, &tempStatus);
-    }
-    if (coll->freeImageOnClose) {
-        image = (uint8_t *)uprv_malloc(imageSize);
-        // Null pointer check
-        if (image == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return NULL;
-        }
-        ucol_cloneBinary(coll, image, imageSize, status);
-        imageAllocated = TRUE;
-    }
-    else {
-        image = (uint8_t *)coll->image;
-    }
-    localCollator = ucol_initFromBinary(image, imageSize, coll->UCA, localCollator, status);
-    if (U_FAILURE(*status)) {
-        return NULL;
-    }
-
-    if (coll->rules) {
-        if (coll->freeRulesOnClose) {
-            localCollator->rules = u_strcpy(rules, coll->rules);
-            //bufferEnd += rulesSize;
-        }
-        else {
-            localCollator->rules = coll->rules;
-        }
-        localCollator->freeRulesOnClose = FALSE;
-        localCollator->rulesLength = coll->rulesLength;
-    }
-    
-    // collator reordering
-    if (coll->defaultReorderCodes) {
-        localCollator->defaultReorderCodes = 
-            (int32_t*) uprv_memcpy(defaultReorderCodes, coll->defaultReorderCodes, coll->defaultReorderCodesLength * sizeof(int32_t));
-        localCollator->defaultReorderCodesLength = coll->defaultReorderCodesLength;
-        localCollator->freeDefaultReorderCodesOnClose = FALSE;
-    }
-    if (coll->reorderCodes) {
-        localCollator->reorderCodes = 
-            (int32_t*)uprv_memcpy(reorderCodes, coll->reorderCodes, coll->reorderCodesLength * sizeof(int32_t));
-        localCollator->reorderCodesLength = coll->reorderCodesLength;
-        localCollator->freeReorderCodesOnClose = FALSE;
-    }
-    if (coll->leadBytePermutationTable) {
-        localCollator->leadBytePermutationTable = 
-            (uint8_t*) uprv_memcpy(leadBytePermutationTable, coll->leadBytePermutationTable, 256);
-        localCollator->freeLeadBytePermutationTableOnClose = FALSE;
-    }
-
-    int32_t i;
-    for(i = 0; i < UCOL_ATTRIBUTE_COUNT; i++) {
-        ucol_setAttribute(localCollator, (UColAttribute)i, ucol_getAttribute(coll, (UColAttribute)i, status), status);
+    } else {
+        *status = U_SAFECLONE_ALLOCATED_WARNING;
     }
-    // zero copies of pointers
-    localCollator->actualLocale = NULL;
-    localCollator->validLocale = NULL;
-    localCollator->requestedLocale = NULL;
-    localCollator->ucaRules = coll->ucaRules; // There should only be one copy here.
-    localCollator->freeOnClose = TRUE;
-    localCollator->freeImageOnClose = imageAllocated;
-    return localCollator;
+    return newColl->toUCollator();
 }
 
 U_CAPI void U_EXPORT2
@@ -693,7664 +105,304 @@ ucol_close(UCollator *coll)
     UTRACE_ENTRY_OC(UTRACE_UCOL_CLOSE);
     UTRACE_DATA1(UTRACE_INFO, "coll = %p", coll);
     if(coll != NULL) {
-        // these are always owned by each UCollator struct,
-        // so we always free them
-        if(coll->validLocale != NULL) {
-            uprv_free(coll->validLocale);
-        }
-        if(coll->actualLocale != NULL) {
-            uprv_free(coll->actualLocale);
-        }
-        if(coll->requestedLocale != NULL) {
-            uprv_free(coll->requestedLocale);
-        }
-        if(coll->latinOneCEs != NULL) {
-            uprv_free(coll->latinOneCEs);
-        }
-        if(coll->options != NULL && coll->freeOptionsOnClose) {
-            uprv_free(coll->options);
-        }
-        if(coll->rules != NULL && coll->freeRulesOnClose) {
-            uprv_free((UChar *)coll->rules);
-        }
-        if(coll->image != NULL && coll->freeImageOnClose) {
-            uprv_free((UCATableHeader *)coll->image);
-        }
-
-        if(coll->leadBytePermutationTable != NULL && coll->freeLeadBytePermutationTableOnClose == TRUE) {
-            uprv_free(coll->leadBytePermutationTable);
-        }
-        if(coll->defaultReorderCodes != NULL && coll->freeDefaultReorderCodesOnClose == TRUE) {
-            uprv_free(coll->defaultReorderCodes);
-        }
-        if(coll->reorderCodes != NULL && coll->freeReorderCodesOnClose == TRUE) {
-            uprv_free(coll->reorderCodes);
-        }
-
-        if(coll->delegate != NULL) {
-          delete (Collator*)coll->delegate;
-        }
-
-        /* Here, it would be advisable to close: */
-        /* - UData for UCA (unless we stuff it in the root resb */
-        /* Again, do we need additional housekeeping... HMMM! */
-        UTRACE_DATA1(UTRACE_INFO, "coll->freeOnClose: %d", coll->freeOnClose);
-        if(coll->freeOnClose){
-            /* for safeClone, if freeOnClose is FALSE,
-            don't free the other instance data */
-            uprv_free(coll);
-        }
+        delete Collator::fromUCollator(coll);
     }
     UTRACE_EXIT();
 }
 
-void ucol_setOptionsFromHeader(UCollator* result, UColOptionSet * opts, UErrorCode *status) {
-    if(U_FAILURE(*status)) {
-        return;
-    }
-    result->caseFirst = (UColAttributeValue)opts->caseFirst;
-    result->caseLevel = (UColAttributeValue)opts->caseLevel;
-    result->frenchCollation = (UColAttributeValue)opts->frenchCollation;
-    result->normalizationMode = (UColAttributeValue)opts->normalizationMode;
-    if(result->normalizationMode == UCOL_ON && !initializeFCD(status)) {
-        return;
-    }
-    result->strength = (UColAttributeValue)opts->strength;
-    result->variableTopValue = opts->variableTopValue;
-    result->alternateHandling = (UColAttributeValue)opts->alternateHandling;
-    result->hiraganaQ = (UColAttributeValue)opts->hiraganaQ;
-    result->numericCollation = (UColAttributeValue)opts->numericCollation;
-    result->caseFirstisDefault = TRUE;
-    result->caseLevelisDefault = TRUE;
-    result->frenchCollationisDefault = TRUE;
-    result->normalizationModeisDefault = TRUE;
-    result->strengthisDefault = TRUE;
-    result->variableTopValueisDefault = TRUE;
-    result->alternateHandlingisDefault = TRUE;
-    result->hiraganaQisDefault = TRUE;
-    result->numericCollationisDefault = TRUE;
-
-    ucol_updateInternalState(result, status);
-
-    result->options = opts;
-}
-
-
-/**
-* Approximate determination if a character is at a contraction end.
-* Guaranteed to be TRUE if a character is at the end of a contraction,
-* otherwise it is not deterministic.
-* @param c character to be determined
-* @param coll collator
-*/
-static
-inline UBool ucol_contractionEndCP(UChar c, const UCollator *coll) {
-    if (c < coll->minContrEndCP) {
-        return FALSE;
-    }
-
-    int32_t  hash = c;
-    uint8_t  htbyte;
-    if (hash >= UCOL_UNSAFECP_TABLE_SIZE*8) {
-        if (U16_IS_TRAIL(c)) {
-            return TRUE;
+U_CAPI int32_t U_EXPORT2
+ucol_mergeSortkeys(const uint8_t *src1, int32_t src1Length,
+                   const uint8_t *src2, int32_t src2Length,
+                   uint8_t *dest, int32_t destCapacity) {
+    /* check arguments */
+    if( src1==NULL || src1Length<-1 || src1Length==0 || (src1Length>0 && src1[src1Length-1]!=0) ||
+        src2==NULL || src2Length<-1 || src2Length==0 || (src2Length>0 && src2[src2Length-1]!=0) ||
+        destCapacity<0 || (destCapacity>0 && dest==NULL)
+    ) {
+        /* error, attempt to write a zero byte and return 0 */
+        if(dest!=NULL && destCapacity>0) {
+            *dest=0;
         }
-        hash = (hash & UCOL_UNSAFECP_TABLE_MASK) + 256;
+        return 0;
     }
-    htbyte = coll->contrEndCP[hash>>3];
-    return (((htbyte >> (hash & 7)) & 1) == 1);
-}
 
-
-
-/*
-*   i_getCombiningClass()
-*        A fast, at least partly inline version of u_getCombiningClass()
-*        This is a candidate for further optimization.  Used heavily
-*        in contraction processing.
-*/
-static
-inline uint8_t i_getCombiningClass(UChar32 c, const UCollator *coll) {
-    uint8_t sCC = 0;
-    if ((c >= 0x300 && ucol_unsafeCP(c, coll)) || c > 0xFFFF) {
-        sCC = u_getCombiningClass(c);
+    /* check lengths and capacity */
+    if(src1Length<0) {
+        src1Length=(int32_t)uprv_strlen((const char *)src1)+1;
     }
-    return sCC;
-}
-
-UCollator* ucol_initCollator(const UCATableHeader *image, UCollator *fillIn, const UCollator *UCA, UErrorCode *status) {
-    UChar c;
-    UCollator *result = fillIn;
-    if(U_FAILURE(*status) || image == NULL) {
-        return NULL;
+    if(src2Length<0) {
+        src2Length=(int32_t)uprv_strlen((const char *)src2)+1;
     }
 
-    if(result == NULL) {
-        result = (UCollator *)uprv_malloc(sizeof(UCollator));
-        if(result == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return result;
-        }
-        result->freeOnClose = TRUE;
-    } else {
-        result->freeOnClose = FALSE;
+    int32_t destLength=src1Length+src2Length;
+    if(destLength>destCapacity) {
+        /* the merged sort key does not fit into the destination */
+        return destLength;
     }
 
-    result->delegate = NULL;
-
-    result->image = image;
-    result->mapping.getFoldingOffset = _getFoldingOffset;
-    const uint8_t *mapping = (uint8_t*)result->image+result->image->mappingPosition;
-    utrie_unserialize(&result->mapping, mapping, result->image->endExpansionCE - result->image->mappingPosition, status);
-    if(U_FAILURE(*status)) {
-        if(result->freeOnClose == TRUE) {
-            uprv_free(result);
-            result = NULL;
+    /* merge the sort keys with the same number of levels */
+    uint8_t *p=dest;
+    for(;;) {
+        /* copy level from src1 not including 00 or 01 */
+        uint8_t b;
+        while((b=*src1)>=2) {
+            ++src1;
+            *p++=b;
         }
-        return result;
-    }
-
-    result->latinOneMapping = UTRIE_GET32_LATIN1(&result->mapping);
-    result->contractionCEs = (uint32_t*)((uint8_t*)result->image+result->image->contractionCEs);
-    result->contractionIndex = (UChar*)((uint8_t*)result->image+result->image->contractionIndex);
-    result->expansion = (uint32_t*)((uint8_t*)result->image+result->image->expansion);
-    result->rules = NULL;
-    result->rulesLength = 0;
-    result->freeRulesOnClose = FALSE;
-    result->defaultReorderCodes = NULL;
-    result->defaultReorderCodesLength = 0;
-    result->freeDefaultReorderCodesOnClose = FALSE;
-    result->reorderCodes = NULL;
-    result->reorderCodesLength = 0;
-    result->freeReorderCodesOnClose = FALSE;
-    result->leadBytePermutationTable = NULL;
-    result->freeLeadBytePermutationTableOnClose = FALSE;
 
-    /* get the version info from UCATableHeader and populate the Collator struct*/
-    result->dataVersion[0] = result->image->version[0]; /* UCA Builder version*/
-    result->dataVersion[1] = result->image->version[1]; /* UCA Tailoring rules version*/
-    result->dataVersion[2] = 0;
-    result->dataVersion[3] = 0;
+        /* add a 02 merge separator */
+        *p++=2;
 
-    result->unsafeCP = (uint8_t *)result->image + result->image->unsafeCP;
-    result->minUnsafeCP = 0;
-    for (c=0; c<0x300; c++) {  // Find the smallest unsafe char.
-        if (ucol_unsafeCP(c, result)) break;
-    }
-    result->minUnsafeCP = c;
-
-    result->contrEndCP = (uint8_t *)result->image + result->image->contrEndCP;
-    result->minContrEndCP = 0;
-    for (c=0; c<0x300; c++) {  // Find the Contraction-ending char.
-        if (ucol_contractionEndCP(c, result)) break;
-    }
-    result->minContrEndCP = c;
-
-    /* max expansion tables */
-    result->endExpansionCE = (uint32_t*)((uint8_t*)result->image +
-                                         result->image->endExpansionCE);
-    result->lastEndExpansionCE = result->endExpansionCE +
-                                 result->image->endExpansionCECount - 1;
-    result->expansionCESize = (uint8_t*)result->image +
-                                               result->image->expansionCESize;
-
-
-    //result->errorCode = *status;
-
-    result->latinOneCEs = NULL;
-
-    result->latinOneRegenTable = FALSE;
-    result->latinOneFailed = FALSE;
-    result->UCA = UCA;
-
-    /* Normally these will be set correctly later. This is the default if you use UCA or the default. */
-    result->ucaRules = NULL;
-    result->actualLocale = NULL;
-    result->validLocale = NULL;
-    result->requestedLocale = NULL;
-    result->hasRealData = FALSE; // real data lives in .dat file...
-    result->freeImageOnClose = FALSE;
-
-    /* set attributes */
-    ucol_setOptionsFromHeader(
-        result,
-        (UColOptionSet*)((uint8_t*)result->image+result->image->options),
-        status);
-    result->freeOptionsOnClose = FALSE;
-
-    return result;
-}
-
-/* new Mark's code */
-
-/**
- * For generation of Implicit CEs
- * @author Davis
- *
- * Cleaned up so that changes can be made more easily.
- * Old values:
-# First Implicit: E26A792D
-# Last Implicit: E3DC70C0
-# First CJK: E0030300
-# Last CJK: E0A9DD00
-# First CJK_A: E0A9DF00
-# Last CJK_A: E0DE3100
- */
-/* Following is a port of Mark's code for new treatment of implicits.
- * It is positioned here, since ucol_initUCA need to initialize the
- * variables below according to the data in the fractional UCA.
- */
-
-/**
- * Function used to:
- * a) collapse the 2 different Han ranges from UCA into one (in the right order), and
- * b) bump any non-CJK characters by 10FFFF.
- * The relevant blocks are:
- * A:    4E00..9FFF; CJK Unified Ideographs
- *       F900..FAFF; CJK Compatibility Ideographs
- * B:    3400..4DBF; CJK Unified Ideographs Extension A
- *       20000..XX;  CJK Unified Ideographs Extension B (and others later on)
- * As long as
- *   no new B characters are allocated between 4E00 and FAFF, and
- *   no new A characters are outside of this range,
- * (very high probability) this simple code will work.
- * The reordered blocks are:
- * Block1 is CJK
- * Block2 is CJK_COMPAT_USED
- * Block3 is CJK_A
- * (all contiguous)
- * Any other CJK gets its normal code point
- * Any non-CJK gets +10FFFF
- * When we reorder Block1, we make sure that it is at the very start,
- * so that it will use a 3-byte form.
- * Warning: the we only pick up the compatibility characters that are
- * NOT decomposed, so that block is smaller!
- */
-
-// CONSTANTS
-static const UChar32
-    NON_CJK_OFFSET = 0x110000,
-    UCOL_MAX_INPUT = 0x220001; // 2 * Unicode range + 2
-
-/**
- * Precomputed by initImplicitConstants()
- */
-static int32_t
-    final3Multiplier = 0,
-    final4Multiplier = 0,
-    final3Count = 0,
-    final4Count = 0,
-    medialCount = 0,
-    min3Primary = 0,
-    min4Primary = 0,
-    max4Primary = 0,
-    minTrail = 0,
-    maxTrail = 0,
-    max3Trail = 0,
-    max4Trail = 0,
-    min4Boundary = 0;
-
-static const UChar32
-    // 4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
-    // 9FCC;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;  (Unicode 6.1)
-    CJK_BASE = 0x4E00,
-    CJK_LIMIT = 0x9FCC+1,
-    // Unified CJK ideographs in the compatibility ideographs block.
-    CJK_COMPAT_USED_BASE = 0xFA0E,
-    CJK_COMPAT_USED_LIMIT = 0xFA2F+1,
-    // 3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;;
-    // 4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;;
-    CJK_A_BASE = 0x3400,
-    CJK_A_LIMIT = 0x4DB5+1,
-    // 20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;;
-    // 2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
-    CJK_B_BASE = 0x20000,
-    CJK_B_LIMIT = 0x2A6D6+1,
-    // 2A700;<CJK Ideograph Extension C, First>;Lo;0;L;;;;;N;;;;;
-    // 2B734;<CJK Ideograph Extension C, Last>;Lo;0;L;;;;;N;;;;;
-    CJK_C_BASE = 0x2A700,
-    CJK_C_LIMIT = 0x2B734+1,
-    // 2B740;<CJK Ideograph Extension D, First>;Lo;0;L;;;;;N;;;;;
-    // 2B81D;<CJK Ideograph Extension D, Last>;Lo;0;L;;;;;N;;;;;
-    CJK_D_BASE = 0x2B740,
-    CJK_D_LIMIT = 0x2B81D+1;
-    // when adding to this list, look for all occurrences (in project)
-    // of CJK_C_BASE and CJK_C_LIMIT, etc. to check for code that needs changing!!!!
-
-static UChar32 swapCJK(UChar32 i) {
-    if (i < CJK_A_BASE) {
-        // non-CJK
-    } else if (i < CJK_A_LIMIT) {
-        // Extension A has lower code points than the original Unihan+compat
-        // but sorts higher.
-        return i - CJK_A_BASE
-                + (CJK_LIMIT - CJK_BASE)
-                + (CJK_COMPAT_USED_LIMIT - CJK_COMPAT_USED_BASE);
-    } else if (i < CJK_BASE) {
-        // non-CJK
-    } else if (i < CJK_LIMIT) {
-        return i - CJK_BASE;
-    } else if (i < CJK_COMPAT_USED_BASE) {
-        // non-CJK
-    } else if (i < CJK_COMPAT_USED_LIMIT) {
-        return i - CJK_COMPAT_USED_BASE
-                + (CJK_LIMIT - CJK_BASE);
-    } else if (i < CJK_B_BASE) {
-        // non-CJK
-    } else if (i < CJK_B_LIMIT) {
-        return i; // non-BMP-CJK
-    } else if (i < CJK_C_BASE) {
-        // non-CJK
-    } else if (i < CJK_C_LIMIT) {
-        return i; // non-BMP-CJK
-    } else if (i < CJK_D_BASE) {
-        // non-CJK
-    } else if (i < CJK_D_LIMIT) {
-        return i; // non-BMP-CJK
-    }
-    return i + NON_CJK_OFFSET; // non-CJK
-}
-
-U_CAPI UChar32 U_EXPORT2
-uprv_uca_getRawFromCodePoint(UChar32 i) {
-    return swapCJK(i)+1;
-}
-
-U_CAPI UChar32 U_EXPORT2
-uprv_uca_getCodePointFromRaw(UChar32 i) {
-    i--;
-    UChar32 result = 0;
-    if(i >= NON_CJK_OFFSET) {
-        result = i - NON_CJK_OFFSET;
-    } else if(i >= CJK_B_BASE) {
-        result = i;
-    } else if(i < CJK_A_LIMIT + (CJK_LIMIT - CJK_BASE) + (CJK_COMPAT_USED_LIMIT - CJK_COMPAT_USED_BASE)) { // rest of CJKs, compacted
-        if(i < CJK_LIMIT - CJK_BASE) {
-            result = i + CJK_BASE;
-        } else if(i < (CJK_LIMIT - CJK_BASE) + (CJK_COMPAT_USED_LIMIT - CJK_COMPAT_USED_BASE)) {
-            result = i + CJK_COMPAT_USED_BASE - (CJK_LIMIT - CJK_BASE);
-        } else {
-            result = i + CJK_A_BASE - (CJK_LIMIT - CJK_BASE) - (CJK_COMPAT_USED_LIMIT - CJK_COMPAT_USED_BASE);
-        }
-    } else {
-        result = -1;
-    }
-    return result;
-}
-
-// GET IMPLICIT PRIMARY WEIGHTS
-// Return value is left justified primary key
-U_CAPI uint32_t U_EXPORT2
-uprv_uca_getImplicitFromRaw(UChar32 cp) {
-    /*
-    if (cp < 0 || cp > UCOL_MAX_INPUT) {
-        throw new IllegalArgumentException("Code point out of range " + Utility.hex(cp));
-    }
-    */
-    int32_t last0 = cp - min4Boundary;
-    if (last0 < 0) {
-        int32_t last1 = cp / final3Count;
-        last0 = cp % final3Count;
-
-        int32_t last2 = last1 / medialCount;
-        last1 %= medialCount;
-
-        last0 = minTrail + last0*final3Multiplier; // spread out, leaving gap at start
-        last1 = minTrail + last1; // offset
-        last2 = min3Primary + last2; // offset
-        /*
-        if (last2 >= min4Primary) {
-            throw new IllegalArgumentException("4-byte out of range: " + Utility.hex(cp) + ", " + Utility.hex(last2));
-        }
-        */
-        return (last2 << 24) + (last1 << 16) + (last0 << 8);
-    } else {
-        int32_t last1 = last0 / final4Count;
-        last0 %= final4Count;
-
-        int32_t last2 = last1 / medialCount;
-        last1 %= medialCount;
-
-        int32_t last3 = last2 / medialCount;
-        last2 %= medialCount;
-
-        last0 = minTrail + last0*final4Multiplier; // spread out, leaving gap at start
-        last1 = minTrail + last1; // offset
-        last2 = minTrail + last2; // offset
-        last3 = min4Primary + last3; // offset
-        /*
-        if (last3 > max4Primary) {
-            throw new IllegalArgumentException("4-byte out of range: " + Utility.hex(cp) + ", " + Utility.hex(last3));
-        }
-        */
-        return (last3 << 24) + (last2 << 16) + (last1 << 8) + last0;
-    }
-}
-
-static uint32_t U_EXPORT2
-uprv_uca_getImplicitPrimary(UChar32 cp) {
-   //fprintf(stdout, "Incoming: %04x\n", cp);
-    //if (DEBUG) System.out.println("Incoming: " + Utility.hex(cp));
-
-    cp = swapCJK(cp);
-    cp++;
-    // we now have a range of numbers from 0 to 21FFFF.
-
-    //if (DEBUG) System.out.println("CJK swapped: " + Utility.hex(cp));
-    //fprintf(stdout, "CJK swapped: %04x\n", cp);
-
-    return uprv_uca_getImplicitFromRaw(cp);
-}
-
-/**
- * Converts implicit CE into raw integer ("code point")
- * @param implicit
- * @return -1 if illegal format
- */
-U_CAPI UChar32 U_EXPORT2
-uprv_uca_getRawFromImplicit(uint32_t implicit) {
-    UChar32 result;
-    UChar32 b3 = implicit & 0xFF;
-    UChar32 b2 = (implicit >> 8) & 0xFF;
-    UChar32 b1 = (implicit >> 16) & 0xFF;
-    UChar32 b0 = (implicit >> 24) & 0xFF;
-
-    // simple parameter checks
-    if (b0 < min3Primary || b0 > max4Primary
-        || b1 < minTrail || b1 > maxTrail)
-        return -1;
-    // normal offsets
-    b1 -= minTrail;
-
-    // take care of the final values, and compose
-    if (b0 < min4Primary) {
-        if (b2 < minTrail || b2 > max3Trail || b3 != 0)
-            return -1;
-        b2 -= minTrail;
-        UChar32 remainder = b2 % final3Multiplier;
-        if (remainder != 0)
-            return -1;
-        b0 -= min3Primary;
-        b2 /= final3Multiplier;
-        result = ((b0 * medialCount) + b1) * final3Count + b2;
-    } else {
-        if (b2 < minTrail || b2 > maxTrail
-            || b3 < minTrail || b3 > max4Trail)
-            return -1;
-        b2 -= minTrail;
-        b3 -= minTrail;
-        UChar32 remainder = b3 % final4Multiplier;
-        if (remainder != 0)
-            return -1;
-        b3 /= final4Multiplier;
-        b0 -= min4Primary;
-        result = (((b0 * medialCount) + b1) * medialCount + b2) * final4Count + b3 + min4Boundary;
-    }
-    // final check
-    if (result < 0 || result > UCOL_MAX_INPUT)
-        return -1;
-    return result;
-}
-
-
-static inline int32_t divideAndRoundUp(int a, int b) {
-    return 1 + (a-1)/b;
-}
-
-/* this function is either called from initUCA or from genUCA before
- * doing canonical closure for the UCA.
- */
-
-/**
- * Set up to generate implicits.
- * Maintenance Note:  this function may end up being called more than once, due
- *                    to threading races during initialization.  Make sure that
- *                    none of the Constants is ever transiently assigned an
- *                    incorrect value.
- * @param minPrimary
- * @param maxPrimary
- * @param minTrail final byte
- * @param maxTrail final byte
- * @param gap3 the gap we leave for tailoring for 3-byte forms
- * @param gap4 the gap we leave for tailoring for 4-byte forms
- */
-static void initImplicitConstants(int minPrimary, int maxPrimary,
-                                    int minTrailIn, int maxTrailIn,
-                                    int gap3, int primaries3count,
-                                    UErrorCode *status) {
-    // some simple parameter checks
-    if ((minPrimary < 0 || minPrimary >= maxPrimary || maxPrimary > 0xFF)
-        || (minTrailIn < 0 || minTrailIn >= maxTrailIn || maxTrailIn > 0xFF)
-        || (primaries3count < 1))
-    {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        return;
-    };
-
-    minTrail = minTrailIn;
-    maxTrail = maxTrailIn;
-
-    min3Primary = minPrimary;
-    max4Primary = maxPrimary;
-    // compute constants for use later.
-    // number of values we can use in trailing bytes
-    // leave room for empty values between AND above, e.g. if gap = 2
-    // range 3..7 => +3 -4 -5 -6 -7: so 1 value
-    // range 3..8 => +3 -4 -5 +6 -7 -8: so 2 values
-    // range 3..9 => +3 -4 -5 +6 -7 -8 -9: so 2 values
-    final3Multiplier = gap3 + 1;
-    final3Count = (maxTrail - minTrail + 1) / final3Multiplier;
-    max3Trail = minTrail + (final3Count - 1) * final3Multiplier;
-
-    // medials can use full range
-    medialCount = (maxTrail - minTrail + 1);
-    // find out how many values fit in each form
-    int32_t threeByteCount = medialCount * final3Count;
-    // now determine where the 3/4 boundary is.
-    // we use 3 bytes below the boundary, and 4 above
-    int32_t primariesAvailable = maxPrimary - minPrimary + 1;
-    int32_t primaries4count = primariesAvailable - primaries3count;
-
-
-    int32_t min3ByteCoverage = primaries3count * threeByteCount;
-    min4Primary = minPrimary + primaries3count;
-    min4Boundary = min3ByteCoverage;
-    // Now expand out the multiplier for the 4 bytes, and redo.
-
-    int32_t totalNeeded = UCOL_MAX_INPUT - min4Boundary;
-    int32_t neededPerPrimaryByte = divideAndRoundUp(totalNeeded, primaries4count);
-    int32_t neededPerFinalByte = divideAndRoundUp(neededPerPrimaryByte, medialCount * medialCount);
-    int32_t gap4 = (maxTrail - minTrail - 1) / neededPerFinalByte;
-    if (gap4 < 1) {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        return;
-    }
-    final4Multiplier = gap4 + 1;
-    final4Count = neededPerFinalByte;
-    max4Trail = minTrail + (final4Count - 1) * final4Multiplier;
-}
-
-    /**
-     * Supply parameters for generating implicit CEs
-     */
-U_CAPI void U_EXPORT2
-uprv_uca_initImplicitConstants(UErrorCode *status) {
-    // 13 is the largest 4-byte gap we can use without getting 2 four-byte forms.
-    //initImplicitConstants(minPrimary, maxPrimary, 0x04, 0xFE, 1, 1, status);
-    initImplicitConstants(minImplicitPrimary, maxImplicitPrimary, 0x04, 0xFE, 1, 1, status);
-}
-
-
-/*    collIterNormalize     Incremental Normalization happens here.                       */
-/*                          pick up the range of chars identifed by FCD,                  */
-/*                          normalize it into the collIterate's writable buffer,          */
-/*                          switch the collIterate's state to use the writable buffer.    */
-/*                                                                                        */
-static
-void collIterNormalize(collIterate *collationSource)
-{
-    UErrorCode  status = U_ZERO_ERROR;
-    const UChar *srcP = collationSource->pos - 1;      /*  Start of chars to normalize    */
-    const UChar *endP = collationSource->fcdPosition;  /* End of region to normalize+1    */
-
-    collationSource->nfd->normalize(UnicodeString(FALSE, srcP, (int32_t)(endP - srcP)),
-                                    collationSource->writableBuffer,
-                                    status);
-    if (U_FAILURE(status)) {
-#ifdef UCOL_DEBUG
-        fprintf(stderr, "collIterNormalize(), NFD failed, status = %s\n", u_errorName(status));
-#endif
-        return;
-    }
-
-    collationSource->pos        = collationSource->writableBuffer.getTerminatedBuffer();
-    collationSource->origFlags  = collationSource->flags;
-    collationSource->flags     |= UCOL_ITER_INNORMBUF;
-    collationSource->flags     &= ~(UCOL_ITER_NORM | UCOL_ITER_HASLEN | UCOL_USE_ITERATOR);
-}
-
-
-// This function takes the iterator and extracts normalized stuff up to the next boundary
-// It is similar in the end results to the collIterNormalize, but for the cases when we
-// use an iterator
-/*static
-inline void normalizeIterator(collIterate *collationSource) {
-  UErrorCode status = U_ZERO_ERROR;
-  UBool wasNormalized = FALSE;
-  //int32_t iterIndex = collationSource->iterator->getIndex(collationSource->iterator, UITER_CURRENT);
-  uint32_t iterIndex = collationSource->iterator->getState(collationSource->iterator);
-  int32_t normLen = unorm_next(collationSource->iterator, collationSource->writableBuffer,
-    (int32_t)collationSource->writableBufSize, UNORM_FCD, 0, TRUE, &wasNormalized, &status);
-  if(status == U_BUFFER_OVERFLOW_ERROR || normLen == (int32_t)collationSource->writableBufSize) {
-    // reallocate and terminate
-    if(!u_growBufferFromStatic(collationSource->stackWritableBuffer,
-                               &collationSource->writableBuffer,
-                               (int32_t *)&collationSource->writableBufSize, normLen + 1,
-                               0)
-    ) {
-    #ifdef UCOL_DEBUG
-        fprintf(stderr, "normalizeIterator(), out of memory\n");
-    #endif
-        return;
-    }
-    status = U_ZERO_ERROR;
-    //collationSource->iterator->move(collationSource->iterator, iterIndex, UITER_ZERO);
-    collationSource->iterator->setState(collationSource->iterator, iterIndex, &status);
-    normLen = unorm_next(collationSource->iterator, collationSource->writableBuffer,
-    (int32_t)collationSource->writableBufSize, UNORM_FCD, 0, TRUE, &wasNormalized, &status);
-  }
-  // Terminate the buffer - we already checked that it is big enough
-  collationSource->writableBuffer[normLen] = 0;
-  if(collationSource->writableBuffer != collationSource->stackWritableBuffer) {
-      collationSource->flags |= UCOL_ITER_ALLOCATED;
-  }
-  collationSource->pos        = collationSource->writableBuffer;
-  collationSource->origFlags  = collationSource->flags;
-  collationSource->flags     |= UCOL_ITER_INNORMBUF;
-  collationSource->flags     &= ~(UCOL_ITER_NORM | UCOL_ITER_HASLEN | UCOL_USE_ITERATOR);
-}*/
-
-
-/* Incremental FCD check and normalize                                                    */
-/*   Called from getNextCE when normalization state is suspect.                           */
-/*   When entering, the state is known to be this:                                        */
-/*      o   We are working in the main buffer of the collIterate, not the side            */
-/*          writable buffer.  When in the side buffer, normalization mode is always off,  */
-/*          so we won't get here.                                                         */
-/*      o   The leading combining class from the current character is 0 or                */
-/*          the trailing combining class of the previous char was zero.                   */
-/*          True because the previous call to this function will have always exited       */
-/*          that way, and we get called for every char where cc might be non-zero.        */
-static
-inline UBool collIterFCD(collIterate *collationSource) {
-    const UChar *srcP, *endP;
-    uint8_t     leadingCC;
-    uint8_t     prevTrailingCC = 0;
-    uint16_t    fcd;
-    UBool       needNormalize = FALSE;
-
-    srcP = collationSource->pos-1;
-
-    if (collationSource->flags & UCOL_ITER_HASLEN) {
-        endP = collationSource->endp;
-    } else {
-        endP = NULL;
-    }
-
-    // Get the trailing combining class of the current character. If it's zero, we are OK.
-    fcd = g_nfcImpl->nextFCD16(srcP, endP);
-    if (fcd != 0) {
-        prevTrailingCC = (uint8_t)(fcd & LAST_BYTE_MASK_);
-
-        if (prevTrailingCC != 0) {
-            // The current char has a non-zero trailing CC.  Scan forward until we find
-            //   a char with a leading cc of zero.
-            while (endP == NULL || srcP != endP)
-            {
-                const UChar *savedSrcP = srcP;
-
-                fcd = g_nfcImpl->nextFCD16(srcP, endP);
-                leadingCC = (uint8_t)(fcd >> SECOND_LAST_BYTE_SHIFT_);
-                if (leadingCC == 0) {
-                    srcP = savedSrcP;      // Hit char that is not part of combining sequence.
-                                           //   back up over it.  (Could be surrogate pair!)
-                    break;
-                }
-
-                if (leadingCC < prevTrailingCC) {
-                    needNormalize = TRUE;
-                }
-
-                prevTrailingCC = (uint8_t)(fcd & LAST_BYTE_MASK_);
-            }
-        }
-    }
-
-    collationSource->fcdPosition = (UChar *)srcP;
-
-    return needNormalize;
-}
-
-/****************************************************************************/
-/* Following are the CE retrieval functions                                 */
-/*                                                                          */
-/****************************************************************************/
-
-static uint32_t getImplicit(UChar32 cp, collIterate *collationSource);
-static uint32_t getPrevImplicit(UChar32 cp, collIterate *collationSource);
-
-/* there should be a macro version of this function in the header file */
-/* This is the first function that tries to fetch a collation element  */
-/* If it's not succesfull or it encounters a more difficult situation  */
-/* some more sofisticated and slower functions are invoked             */
-static
-inline uint32_t ucol_IGetNextCE(const UCollator *coll, collIterate *collationSource, UErrorCode *status) {
-    uint32_t order = 0;
-    if (collationSource->CEpos > collationSource->toReturn) {       /* Are there any CEs from previous expansions? */
-        order = *(collationSource->toReturn++);                         /* if so, return them */
-        if(collationSource->CEpos == collationSource->toReturn) {
-            collationSource->CEpos = collationSource->toReturn = collationSource->extendCEs ? collationSource->extendCEs : collationSource->CEs;
-        }
-        return order;
-    }
-
-    UChar ch = 0;
-    collationSource->offsetReturn = NULL;
-
-    do {
-        for (;;)                           /* Loop handles case when incremental normalize switches   */
-        {                                  /*   to or from the side buffer / original string, and we  */
-            /*   need to start again to get the next character.        */
-
-            if ((collationSource->flags & (UCOL_ITER_HASLEN | UCOL_ITER_INNORMBUF | UCOL_ITER_NORM | UCOL_HIRAGANA_Q | UCOL_USE_ITERATOR)) == 0)
-            {
-                // The source string is null terminated and we're not working from the side buffer,
-                //   and we're not normalizing.  This is the fast path.
-                //   (We can be in the side buffer for Thai pre-vowel reordering even when not normalizing.)
-                ch = *collationSource->pos++;
-                if (ch != 0) {
-                    break;
-                }
-                else {
-                    return UCOL_NO_MORE_CES;
-                }
-            }
-
-            if (collationSource->flags & UCOL_ITER_HASLEN) {
-                // Normal path for strings when length is specified.
-                //   (We can't be in side buffer because it is always null terminated.)
-                if (collationSource->pos >= collationSource->endp) {
-                    // Ran off of the end of the main source string.  We're done.
-                    return UCOL_NO_MORE_CES;
-                }
-                ch = *collationSource->pos++;
-            }
-            else if(collationSource->flags & UCOL_USE_ITERATOR) {
-                UChar32 iterCh = collationSource->iterator->next(collationSource->iterator);
-                if(iterCh == U_SENTINEL) {
-                    return UCOL_NO_MORE_CES;
-                }
-                ch = (UChar)iterCh;
-            }
-            else
-            {
-                // Null terminated string.
-                ch = *collationSource->pos++;
-                if (ch == 0) {
-                    // Ran off end of buffer.
-                    if ((collationSource->flags & UCOL_ITER_INNORMBUF) == 0) {
-                        // Ran off end of main string. backing up one character.
-                        collationSource->pos--;
-                        return UCOL_NO_MORE_CES;
-                    }
-                    else
-                    {
-                        // Hit null in the normalize side buffer.
-                        // Usually this means the end of the normalized data,
-                        // except for one odd case: a null followed by combining chars,
-                        //   which is the case if we are at the start of the buffer.
-                        if (collationSource->pos == collationSource->writableBuffer.getBuffer()+1) {
-                            break;
-                        }
-
-                        //  Null marked end of side buffer.
-                        //   Revert to the main string and
-                        //   loop back to top to try again to get a character.
-                        collationSource->pos   = collationSource->fcdPosition;
-                        collationSource->flags = collationSource->origFlags;
-                        continue;
-                    }
-                }
-            }
-
-            if(collationSource->flags&UCOL_HIRAGANA_Q) {
-                /* Codepoints \u3099-\u309C are both Hiragana and Katakana. Set the flag
-                 * based on whether the previous codepoint was Hiragana or Katakana.
-                 */
-                if(((ch>=0x3040 && ch<=0x3096) || (ch >= 0x309d && ch <= 0x309f)) ||
-                        ((collationSource->flags & UCOL_WAS_HIRAGANA) && (ch >= 0x3099 && ch <= 0x309C))) {
-                    collationSource->flags |= UCOL_WAS_HIRAGANA;
-                } else {
-                    collationSource->flags &= ~UCOL_WAS_HIRAGANA;
-                }
-            }
-
-            // We've got a character.  See if there's any fcd and/or normalization stuff to do.
-            //    Note that UCOL_ITER_NORM flag is always zero when we are in the side buffer.
-            if ((collationSource->flags & UCOL_ITER_NORM) == 0) {
-                break;
-            }
-
-            if (collationSource->fcdPosition >= collationSource->pos) {
-                // An earlier FCD check has already covered the current character.
-                // We can go ahead and process this char.
-                break;
-            }
-
-            if (ch < ZERO_CC_LIMIT_ ) {
-                // Fast fcd safe path.  Trailing combining class == 0.  This char is OK.
-                break;
-            }
-
-            if (ch < NFC_ZERO_CC_BLOCK_LIMIT_) {
-                // We need to peek at the next character in order to tell if we are FCD
-                if ((collationSource->flags & UCOL_ITER_HASLEN) && collationSource->pos >= collationSource->endp) {
-                    // We are at the last char of source string.
-                    //  It is always OK for FCD check.
-                    break;
-                }
-
-                // Not at last char of source string (or we'll check against terminating null).  Do the FCD fast test
-                if (*collationSource->pos < NFC_ZERO_CC_BLOCK_LIMIT_) {
-                    break;
-                }
-            }
-
-
-            // Need a more complete FCD check and possible normalization.
-            if (collIterFCD(collationSource)) {
-                collIterNormalize(collationSource);
-            }
-            if ((collationSource->flags & UCOL_ITER_INNORMBUF) == 0) {
-                //  No normalization was needed.  Go ahead and process the char we already had.
-                break;
-            }
-
-            // Some normalization happened.  Next loop iteration will pick up a char
-            //   from the normalization buffer.
-
-        }   // end for (;;)
-
-
-        if (ch <= 0xFF) {
-            /*  For latin-1 characters we never need to fall back to the UCA table        */
-            /*    because all of the UCA data is replicated in the latinOneMapping array  */
-            order = coll->latinOneMapping[ch];
-            if (order > UCOL_NOT_FOUND) {
-                order = ucol_prv_getSpecialCE(coll, ch, order, collationSource, status);
-            }
-        }
-        else
-        {
-            // Always use UCA for Han, Hangul
-            // (Han extension A is before main Han block)
-            // **** Han compatibility chars ?? ****
-            if ((collationSource->flags & UCOL_FORCE_HAN_IMPLICIT) != 0 &&
-                (ch >= UCOL_FIRST_HAN_A && ch <= UCOL_LAST_HANGUL)) {
-                if (ch > UCOL_LAST_HAN && ch < UCOL_FIRST_HANGUL) {
-                    // between the two target ranges; do normal lookup
-                    // **** this range is YI, Modifier tone letters, ****
-                    // **** Latin-D, Syloti Nagari, Phagas-pa.       ****
-                    // **** Latin-D might be tailored, so we need to ****
-                    // **** do the normal lookup for these guys.     ****
-                    order = UTRIE_GET32_FROM_LEAD(&coll->mapping, ch);
-                } else {
-                    // in one of the target ranges; use UCA
-                    order = UCOL_NOT_FOUND;
-                }
-            } else {
-                order = UTRIE_GET32_FROM_LEAD(&coll->mapping, ch);
-            }
-
-            if(order > UCOL_NOT_FOUND) {                                       /* if a CE is special                */
-                order = ucol_prv_getSpecialCE(coll, ch, order, collationSource, status);    /* and try to get the special CE     */
-            }
-
-            if(order == UCOL_NOT_FOUND && coll->UCA) {   /* We couldn't find a good CE in the tailoring */
-                /* if we got here, the codepoint MUST be over 0xFF - so we look directly in the trie */
-                order = UTRIE_GET32_FROM_LEAD(&coll->UCA->mapping, ch);
-
-                if(order > UCOL_NOT_FOUND) { /* UCA also gives us a special CE */
-                    order = ucol_prv_getSpecialCE(coll->UCA, ch, order, collationSource, status);
-                }
-            }
-        }
-    } while ( order == UCOL_IGNORABLE && ch >= UCOL_FIRST_HANGUL && ch <= UCOL_LAST_HANGUL );
-
-    if(order == UCOL_NOT_FOUND) {
-        order = getImplicit(ch, collationSource);
-    }
-    return order; /* return the CE */
-}
-
-/* ucol_getNextCE, out-of-line version for use from other files.   */
-U_CAPI uint32_t  U_EXPORT2
-ucol_getNextCE(const UCollator *coll, collIterate *collationSource, UErrorCode *status) {
-    return ucol_IGetNextCE(coll, collationSource, status);
-}
-
-
-/**
-* Incremental previous normalization happens here. Pick up the range of chars
-* identifed by FCD, normalize it into the collIterate's writable buffer,
-* switch the collIterate's state to use the writable buffer.
-* @param data collation iterator data
-*/
-static
-void collPrevIterNormalize(collIterate *data)
-{
-    UErrorCode status  = U_ZERO_ERROR;
-    const UChar *pEnd   = data->pos;  /* End normalize + 1 */
-    const UChar *pStart;
-
-    /* Start normalize */
-    if (data->fcdPosition == NULL) {
-        pStart = data->string;
-    }
-    else {
-        pStart = data->fcdPosition + 1;
-    }
-
-    int32_t normLen =
-        data->nfd->normalize(UnicodeString(FALSE, pStart, (int32_t)((pEnd - pStart) + 1)),
-                             data->writableBuffer,
-                             status).
-        length();
-    if(U_FAILURE(status)) {
-        return;
-    }
-    /*
-    this puts the null termination infront of the normalized string instead
-    of the end
-    */
-    data->writableBuffer.insert(0, (UChar)0);
-
-    /*
-     * The usual case at this point is that we've got a base
-     * character followed by marks that were normalized. If
-     * fcdPosition is NULL, that means that we backed up to
-     * the beginning of the string and there's no base character.
-     *
-     * Forward processing will usually normalize when it sees
-     * the first mark, so that mark will get it's natural offset
-     * and the rest will get the offset of the character following
-     * the marks. The base character will also get its natural offset.
-     *
-     * We write the offset of the base character, if there is one,
-     * followed by the offset of the first mark and then the offsets
-     * of the rest of the marks.
-     */
-    int32_t firstMarkOffset = 0;
-    int32_t trailOffset     = (int32_t)(data->pos - data->string + 1);
-    int32_t trailCount      = normLen - 1;
-
-    if (data->fcdPosition != NULL) {
-        int32_t baseOffset = (int32_t)(data->fcdPosition - data->string);
-        UChar   baseChar   = *data->fcdPosition;
-
-        firstMarkOffset = baseOffset + 1;
-
-        /*
-         * If the base character is the start of a contraction, forward processing
-         * will normalize the marks while checking for the contraction, which means
-         * that the offset of the first mark will the same as the other marks.
-         *
-         * **** THIS IS PROBABLY NOT A COMPLETE TEST ****
-         */
-        if (baseChar >= 0x100) {
-            uint32_t baseOrder = UTRIE_GET32_FROM_LEAD(&data->coll->mapping, baseChar);
-
-            if (baseOrder == UCOL_NOT_FOUND && data->coll->UCA) {
-                baseOrder = UTRIE_GET32_FROM_LEAD(&data->coll->UCA->mapping, baseChar);
-            }
-
-            if (baseOrder > UCOL_NOT_FOUND && getCETag(baseOrder) == CONTRACTION_TAG) {
-                firstMarkOffset = trailOffset;
-            }
-        }
-
-        data->appendOffset(baseOffset, status);
-    }
-
-    data->appendOffset(firstMarkOffset, status);
-
-    for (int32_t i = 0; i < trailCount; i += 1) {
-        data->appendOffset(trailOffset, status);
-    }
-
-    data->offsetRepeatValue = trailOffset;
-
-    data->offsetReturn = data->offsetStore - 1;
-    if (data->offsetReturn == data->offsetBuffer) {
-        data->offsetStore = data->offsetBuffer;
-    }
-
-    data->pos        = data->writableBuffer.getTerminatedBuffer() + 1 + normLen;
-    data->origFlags  = data->flags;
-    data->flags     |= UCOL_ITER_INNORMBUF;
-    data->flags     &= ~(UCOL_ITER_NORM | UCOL_ITER_HASLEN);
-}
-
-
-/**
-* Incremental FCD check for previous iteration and normalize. Called from
-* getPrevCE when normalization state is suspect.
-* When entering, the state is known to be this:
-* o  We are working in the main buffer of the collIterate, not the side
-*    writable buffer. When in the side buffer, normalization mode is always
-*    off, so we won't get here.
-* o  The leading combining class from the current character is 0 or the
-*    trailing combining class of the previous char was zero.
-*    True because the previous call to this function will have always exited
-*    that way, and we get called for every char where cc might be non-zero.
-* @param data collation iterate struct
-* @return normalization status, TRUE for normalization to be done, FALSE
-*         otherwise
-*/
-static
-inline UBool collPrevIterFCD(collIterate *data)
-{
-    const UChar *src, *start;
-    uint8_t     leadingCC;
-    uint8_t     trailingCC = 0;
-    uint16_t    fcd;
-    UBool       result = FALSE;
-
-    start = data->string;
-    src = data->pos + 1;
-
-    /* Get the trailing combining class of the current character. */
-    fcd = g_nfcImpl->previousFCD16(start, src);
-
-    leadingCC = (uint8_t)(fcd >> SECOND_LAST_BYTE_SHIFT_);
-
-    if (leadingCC != 0) {
-        /*
-        The current char has a non-zero leading combining class.
-        Scan backward until we find a char with a trailing cc of zero.
-        */
-        for (;;)
-        {
-            if (start == src) {
-                data->fcdPosition = NULL;
-                return result;
-            }
-
-            fcd = g_nfcImpl->previousFCD16(start, src);
-
-            trailingCC = (uint8_t)(fcd & LAST_BYTE_MASK_);
-
-            if (trailingCC == 0) {
-                break;
-            }
-
-            if (leadingCC < trailingCC) {
-                result = TRUE;
-            }
-
-            leadingCC = (uint8_t)(fcd >> SECOND_LAST_BYTE_SHIFT_);
-        }
-    }
-
-    data->fcdPosition = (UChar *)src;
-
-    return result;
-}
-
-/** gets a code unit from the string at a given offset
- *  Handles both normal and iterative cases.
- *  No error checking - caller beware!
- */
-static inline
-UChar peekCodeUnit(collIterate *source, int32_t offset) {
-    if(source->pos != NULL) {
-        return *(source->pos + offset);
-    } else if(source->iterator != NULL) {
-        UChar32 c;
-        if(offset != 0) {
-            source->iterator->move(source->iterator, offset, UITER_CURRENT);
-            c = source->iterator->next(source->iterator);
-            source->iterator->move(source->iterator, -offset-1, UITER_CURRENT);
-        } else {
-            c = source->iterator->current(source->iterator);
-        }
-        return c >= 0 ? (UChar)c : 0xfffd;  // If the caller works properly, we should never see c<0.
-    } else {
-        return 0xfffd;
-    }
-}
-
-// Code point version. Treats the offset as a _code point_ delta.
-// We cannot use U16_FWD_1_UNSAFE and similar because we might not have well-formed UTF-16.
-// We cannot use U16_FWD_1 and similar because we do not know the start and limit of the buffer.
-static inline
-UChar32 peekCodePoint(collIterate *source, int32_t offset) {
-    UChar32 c;
-    if(source->pos != NULL) {
-        const UChar *p = source->pos;
-        if(offset >= 0) {
-            // Skip forward over (offset-1) code points.
-            while(--offset >= 0) {
-                if(U16_IS_LEAD(*p++) && U16_IS_TRAIL(*p)) {
-                    ++p;
-                }
-            }
-            // Read the code point there.
-            c = *p++;
-            UChar trail;
-            if(U16_IS_LEAD(c) && U16_IS_TRAIL(trail = *p)) {
-                c = U16_GET_SUPPLEMENTARY(c, trail);
-            }
-        } else /* offset<0 */ {
-            // Skip backward over (offset-1) code points.
-            while(++offset < 0) {
-                if(U16_IS_TRAIL(*--p) && U16_IS_LEAD(*(p - 1))) {
-                    --p;
-                }
-            }
-            // Read the code point before that.
-            c = *--p;
-            UChar lead;
-            if(U16_IS_TRAIL(c) && U16_IS_LEAD(lead = *(p - 1))) {
-                c = U16_GET_SUPPLEMENTARY(lead, c);
-            }
-        }
-    } else if(source->iterator != NULL) {
-        if(offset >= 0) {
-            // Skip forward over (offset-1) code points.
-            int32_t fwd = offset;
-            while(fwd-- > 0) {
-                uiter_next32(source->iterator);
-            }
-            // Read the code point there.
-            c = uiter_current32(source->iterator);
-            // Return to the starting point, skipping backward over (offset-1) code points.
-            while(offset-- > 0) {
-                uiter_previous32(source->iterator);
-            }
-        } else /* offset<0 */ {
-            // Read backward, reading offset code points, remember only the last-read one.
-            int32_t back = offset;
-            do {
-                c = uiter_previous32(source->iterator);
-            } while(++back < 0);
-            // Return to the starting position, skipping forward over offset code points.
-            do {
-                uiter_next32(source->iterator);
-            } while(++offset < 0);
-        }
-    } else {
-        c = U_SENTINEL;
-    }
-    return c;
-}
-
-/**
-* Determines if we are at the start of the data string in the backwards
-* collation iterator
-* @param data collation iterator
-* @return TRUE if we are at the start
-*/
-static
-inline UBool isAtStartPrevIterate(collIterate *data) {
-    if(data->pos == NULL && data->iterator != NULL) {
-        return !data->iterator->hasPrevious(data->iterator);
-    }
-    //return (collIter_bos(data)) ||
-    return (data->pos == data->string) ||
-              ((data->flags & UCOL_ITER_INNORMBUF) && (data->pos != NULL) &&
-              *(data->pos - 1) == 0 && data->fcdPosition == NULL);
-}
-
-static
-inline void goBackOne(collIterate *data) {
-# if 0
-    // somehow, it looks like we need to keep iterator synced up
-    // at all times, as above.
-    if(data->pos) {
-        data->pos--;
-    }
-    if(data->iterator) {
-        data->iterator->previous(data->iterator);
-    }
-#endif
-    if(data->iterator && (data->flags & UCOL_USE_ITERATOR)) {
-        data->iterator->previous(data->iterator);
-    }
-    if(data->pos) {
-        data->pos --;
-    }
-}
-
-/**
-* Inline function that gets a simple CE.
-* So what it does is that it will first check the expansion buffer. If the
-* expansion buffer is not empty, ie the end pointer to the expansion buffer
-* is different from the string pointer, we return the collation element at the
-* return pointer and decrement it.
-* For more complicated CEs it resorts to getComplicatedCE.
-* @param coll collator data
-* @param data collation iterator struct
-* @param status error status
-*/
-static
-inline uint32_t ucol_IGetPrevCE(const UCollator *coll, collIterate *data,
-                               UErrorCode *status)
-{
-    uint32_t result = (uint32_t)UCOL_NULLORDER;
-
-    if (data->offsetReturn != NULL) {
-        if (data->offsetRepeatCount > 0) {
-                data->offsetRepeatCount -= 1;
-        } else {
-            if (data->offsetReturn == data->offsetBuffer) {
-                data->offsetReturn = NULL;
-                data->offsetStore  = data->offsetBuffer;
-            } else {
-                data->offsetReturn -= 1;
-            }
-        }
-    }
-
-    if ((data->extendCEs && data->toReturn > data->extendCEs) ||
-            (!data->extendCEs && data->toReturn > data->CEs))
-    {
-        data->toReturn -= 1;
-        result = *(data->toReturn);
-        if (data->CEs == data->toReturn || data->extendCEs == data->toReturn) {
-            data->CEpos = data->toReturn;
-        }
-    }
-    else {
-        UChar ch = 0;
-
-        do {
-            /*
-            Loop handles case when incremental normalize switches to or from the
-            side buffer / original string, and we need to start again to get the
-            next character.
-            */
-            for (;;) {
-                if (data->flags & UCOL_ITER_HASLEN) {
-                    /*
-                    Normal path for strings when length is specified.
-                    Not in side buffer because it is always null terminated.
-                    */
-                    if (data->pos <= data->string) {
-                        /* End of the main source string */
-                        return UCOL_NO_MORE_CES;
-                    }
-                    data->pos --;
-                    ch = *data->pos;
-                }
-                // we are using an iterator to go back. Pray for us!
-                else if (data->flags & UCOL_USE_ITERATOR) {
-                  UChar32 iterCh = data->iterator->previous(data->iterator);
-                  if(iterCh == U_SENTINEL) {
-                    return UCOL_NO_MORE_CES;
-                  } else {
-                    ch = (UChar)iterCh;
-                  }
-                }
-                else {
-                    data->pos --;
-                    ch = *data->pos;
-                    /* we are in the side buffer. */
-                    if (ch == 0) {
-                        /*
-                        At the start of the normalize side buffer.
-                        Go back to string.
-                        Because pointer points to the last accessed character,
-                        hence we have to increment it by one here.
-                        */
-                        data->flags = data->origFlags;
-                        data->offsetRepeatValue = 0;
-
-                         if (data->fcdPosition == NULL) {
-                            data->pos = data->string;
-                            return UCOL_NO_MORE_CES;
-                        }
-                        else {
-                            data->pos   = data->fcdPosition + 1;
-                        }
-
-                       continue;
-                    }
-                }
-
-                if(data->flags&UCOL_HIRAGANA_Q) {
-                  if(ch>=0x3040 && ch<=0x309f) {
-                    data->flags |= UCOL_WAS_HIRAGANA;
-                  } else {
-                    data->flags &= ~UCOL_WAS_HIRAGANA;
-                  }
-                }
-
-                /*
-                * got a character to determine if there's fcd and/or normalization
-                * stuff to do.
-                * if the current character is not fcd.
-                * if current character is at the start of the string
-                * Trailing combining class == 0.
-                * Note if pos is in the writablebuffer, norm is always 0
-                */
-                if (ch < ZERO_CC_LIMIT_ ||
-                  // this should propel us out of the loop in the iterator case
-                    (data->flags & UCOL_ITER_NORM) == 0 ||
-                    (data->fcdPosition != NULL && data->fcdPosition <= data->pos)
-                    || data->string == data->pos) {
-                    break;
-                }
-
-                if (ch < NFC_ZERO_CC_BLOCK_LIMIT_) {
-                    /* if next character is FCD */
-                    if (data->pos == data->string) {
-                        /* First char of string is always OK for FCD check */
-                        break;
-                    }
-
-                    /* Not first char of string, do the FCD fast test */
-                    if (*(data->pos - 1) < NFC_ZERO_CC_BLOCK_LIMIT_) {
-                        break;
-                    }
-                }
-
-                /* Need a more complete FCD check and possible normalization. */
-                if (collPrevIterFCD(data)) {
-                    collPrevIterNormalize(data);
-                }
-
-                if ((data->flags & UCOL_ITER_INNORMBUF) == 0) {
-                    /*  No normalization. Go ahead and process the char. */
-                    break;
-                }
-
-                /*
-                Some normalization happened.
-                Next loop picks up a char from the normalization buffer.
-                */
-            }
-
-            /* attempt to handle contractions, after removal of the backwards
-            contraction
-            */
-            if (ucol_contractionEndCP(ch, coll) && !isAtStartPrevIterate(data)) {
-                result = ucol_prv_getSpecialPrevCE(coll, ch, UCOL_CONTRACTION, data, status);
-            } else {
-                if (ch <= 0xFF) {
-                    result = coll->latinOneMapping[ch];
-                }
-                else {
-                    // Always use UCA for [3400..9FFF], [AC00..D7AF]
-                    // **** [FA0E..FA2F] ?? ****
-                    if ((data->flags & UCOL_FORCE_HAN_IMPLICIT) != 0 &&
-                        (ch >= 0x3400 && ch <= 0xD7AF)) {
-                        if (ch > 0x9FFF && ch < 0xAC00) {
-                            // between the two target ranges; do normal lookup
-                            // **** this range is YI, Modifier tone letters, ****
-                            // **** Latin-D, Syloti Nagari, Phagas-pa.       ****
-                            // **** Latin-D might be tailored, so we need to ****
-                            // **** do the normal lookup for these guys.     ****
-                             result = UTRIE_GET32_FROM_LEAD(&coll->mapping, ch);
-                        } else {
-                            result = UCOL_NOT_FOUND;
-                        }
-                    } else {
-                        result = UTRIE_GET32_FROM_LEAD(&coll->mapping, ch);
-                    }
-                }
-                if (result > UCOL_NOT_FOUND) {
-                    result = ucol_prv_getSpecialPrevCE(coll, ch, result, data, status);
-                }
-                if (result == UCOL_NOT_FOUND) { // Not found in master list
-                    if (!isAtStartPrevIterate(data) &&
-                        ucol_contractionEndCP(ch, data->coll))
-                    {
-                        result = UCOL_CONTRACTION;
-                    } else {
-                        if(coll->UCA) {
-                            result = UTRIE_GET32_FROM_LEAD(&coll->UCA->mapping, ch);
-                        }
-                    }
-
-                    if (result > UCOL_NOT_FOUND) {
-                        if(coll->UCA) {
-                            result = ucol_prv_getSpecialPrevCE(coll->UCA, ch, result, data, status);
-                        }
-                    }
-                }
-            }
-        } while ( result == UCOL_IGNORABLE && ch >= UCOL_FIRST_HANGUL && ch <= UCOL_LAST_HANGUL );
-
-        if(result == UCOL_NOT_FOUND) {
-            result = getPrevImplicit(ch, data);
-        }
-    }
-
-    return result;
-}
-
-
-/*   ucol_getPrevCE, out-of-line version for use from other files.  */
-U_CFUNC uint32_t  U_EXPORT2
-ucol_getPrevCE(const UCollator *coll, collIterate *data,
-                        UErrorCode *status) {
-    return ucol_IGetPrevCE(coll, data, status);
-}
-
-
-/* this should be connected to special Jamo handling */
-U_CFUNC uint32_t  U_EXPORT2
-ucol_getFirstCE(const UCollator *coll, UChar u, UErrorCode *status) {
-    collIterate colIt;
-    IInit_collIterate(coll, &u, 1, &colIt, status);
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-    return ucol_IGetNextCE(coll, &colIt, status);
-}
-
-/**
-* Inserts the argument character into the end of the buffer pushing back the
-* null terminator.
-* @param data collIterate struct data
-* @param ch character to be appended
-* @return the position of the new addition
-*/
-static
-inline const UChar * insertBufferEnd(collIterate *data, UChar ch)
-{
-    int32_t oldLength = data->writableBuffer.length();
-    return data->writableBuffer.append(ch).getTerminatedBuffer() + oldLength;
-}
-
-/**
-* Inserts the argument string into the end of the buffer pushing back the
-* null terminator.
-* @param data collIterate struct data
-* @param string to be appended
-* @param length of the string to be appended
-* @return the position of the new addition
-*/
-static
-inline const UChar * insertBufferEnd(collIterate *data, const UChar *str, int32_t length)
-{
-    int32_t oldLength = data->writableBuffer.length();
-    return data->writableBuffer.append(str, length).getTerminatedBuffer() + oldLength;
-}
-
-/**
-* Special normalization function for contraction in the forwards iterator.
-* This normalization sequence will place the current character at source->pos
-* and its following normalized sequence into the buffer.
-* The fcd position, pos will be changed.
-* pos will now point to positions in the buffer.
-* Flags will be changed accordingly.
-* @param data collation iterator data
-*/
-static
-inline void normalizeNextContraction(collIterate *data)
-{
-    int32_t     strsize;
-    UErrorCode  status     = U_ZERO_ERROR;
-    /* because the pointer points to the next character */
-    const UChar *pStart    = data->pos - 1;
-    const UChar *pEnd;
-
-    if ((data->flags & UCOL_ITER_INNORMBUF) == 0) {
-        data->writableBuffer.setTo(*(pStart - 1));
-        strsize               = 1;
-    }
-    else {
-        strsize = data->writableBuffer.length();
-    }
-
-    pEnd = data->fcdPosition;
-
-    data->writableBuffer.append(
-        data->nfd->normalize(UnicodeString(FALSE, pStart, (int32_t)(pEnd - pStart)), status));
-    if(U_FAILURE(status)) {
-        return;
-    }
-
-    data->pos        = data->writableBuffer.getTerminatedBuffer() + strsize;
-    data->origFlags  = data->flags;
-    data->flags     |= UCOL_ITER_INNORMBUF;
-    data->flags     &= ~(UCOL_ITER_NORM | UCOL_ITER_HASLEN);
-}
-
-/**
-* Contraction character management function that returns the next character
-* for the forwards iterator.
-* Does nothing if the next character is in buffer and not the first character
-* in it.
-* Else it checks next character in data string to see if it is normalizable.
-* If it is not, the character is simply copied into the buffer, else
-* the whole normalized substring is copied into the buffer, including the
-* current character.
-* @param data collation element iterator data
-* @return next character
-*/
-static
-inline UChar getNextNormalizedChar(collIterate *data)
-{
-    UChar  nextch;
-    UChar  ch;
-    // Here we need to add the iterator code. One problem is the way
-    // end of string is handled. If we just return next char, it could
-    // be the sentinel. Most of the cases already check for this, but we
-    // need to be sure.
-    if ((data->flags & (UCOL_ITER_NORM | UCOL_ITER_INNORMBUF)) == 0 ) {
-         /* if no normalization and not in buffer. */
-      if(data->flags & UCOL_USE_ITERATOR) {
-         return (UChar)data->iterator->next(data->iterator);
-      } else {
-         return *(data->pos ++);
-      }
-    }
-
-    //if (data->flags & UCOL_ITER_NORM && data->flags & UCOL_USE_ITERATOR) {
-      //normalizeIterator(data);
-    //}
-
-    UBool  innormbuf = (UBool)(data->flags & UCOL_ITER_INNORMBUF);
-    if ((innormbuf && *data->pos != 0) ||
-        (data->fcdPosition != NULL && !innormbuf &&
-        data->pos < data->fcdPosition)) {
-        /*
-        if next character is in normalized buffer, no further normalization
-        is required
-        */
-        return *(data->pos ++);
-    }
-
-    if (data->flags & UCOL_ITER_HASLEN) {
-        /* in data string */
-        if (data->pos + 1 == data->endp) {
-            return *(data->pos ++);
-        }
-    }
-    else {
-        if (innormbuf) {
-          // inside the normalization buffer, but at the end
-          // (since we encountered zero). This means, in the
-          // case we're using char iterator, that we need to
-          // do another round of normalization.
-          //if(data->origFlags & UCOL_USE_ITERATOR) {
-            // we need to restore original flags,
-            // otherwise, we'll lose them
-            //data->flags = data->origFlags;
-            //normalizeIterator(data);
-            //return *(data->pos++);
-          //} else {
-            /*
-            in writable buffer, at this point fcdPosition can not be
-            pointing to the end of the data string. see contracting tag.
-            */
-          if(data->fcdPosition) {
-            if (*(data->fcdPosition + 1) == 0 ||
-                data->fcdPosition + 1 == data->endp) {
-                /* at the end of the string, dump it into the normalizer */
-                data->pos = insertBufferEnd(data, *(data->fcdPosition)) + 1;
-                // Check if data->pos received a null pointer
-                if (data->pos == NULL) {
-                    return (UChar)-1; // Return to indicate error.
-                }
-                return *(data->fcdPosition ++);
-            }
-            data->pos = data->fcdPosition;
-          } else if(data->origFlags & UCOL_USE_ITERATOR) {
-            // if we are here, we're using a normalizing iterator.
-            // we should just continue further.
-            data->flags = data->origFlags;
-            data->pos = NULL;
-            return (UChar)data->iterator->next(data->iterator);
-          }
-          //}
-        }
-        else {
-            if (*(data->pos + 1) == 0) {
-                return *(data->pos ++);
-            }
-        }
-    }
-
-    ch = *data->pos ++;
-    nextch = *data->pos;
-
-    /*
-    * if the current character is not fcd.
-    * Trailing combining class == 0.
-    */
-    if ((data->fcdPosition == NULL || data->fcdPosition < data->pos) &&
-        (nextch >= NFC_ZERO_CC_BLOCK_LIMIT_ ||
-         ch >= NFC_ZERO_CC_BLOCK_LIMIT_)) {
-            /*
-            Need a more complete FCD check and possible normalization.
-            normalize substring will be appended to buffer
-            */
-        if (collIterFCD(data)) {
-            normalizeNextContraction(data);
-            return *(data->pos ++);
-        }
-        else if (innormbuf) {
-            /* fcdposition shifted even when there's no normalization, if we
-            don't input the rest into this, we'll get the wrong position when
-            we reach the end of the writableBuffer */
-            int32_t length = (int32_t)(data->fcdPosition - data->pos + 1);
-            data->pos = insertBufferEnd(data, data->pos - 1, length);
-            // Check if data->pos received a null pointer
-            if (data->pos == NULL) {
-                return (UChar)-1; // Return to indicate error.
-            }
-            return *(data->pos ++);
-        }
-    }
-
-    if (innormbuf) {
-        /*
-        no normalization is to be done hence only one character will be
-        appended to the buffer.
-        */
-        data->pos = insertBufferEnd(data, ch) + 1;
-        // Check if data->pos received a null pointer
-        if (data->pos == NULL) {
-            return (UChar)-1; // Return to indicate error.
-        }
-    }
-
-    /* points back to the pos in string */
-    return ch;
-}
-
-
-
-/**
-* Function to copy the buffer into writableBuffer and sets the fcd position to
-* the correct position
-* @param source data string source
-* @param buffer character buffer
-*/
-static
-inline void setDiscontiguosAttribute(collIterate *source, const UnicodeString &buffer)
-{
-    /* okay confusing part here. to ensure that the skipped characters are
-    considered later, we need to place it in the appropriate position in the
-    normalization buffer and reassign the pos pointer. simple case if pos
-    reside in string, simply copy to normalization buffer and
-    fcdposition = pos, pos = start of normalization buffer. if pos in
-    normalization buffer, we'll insert the copy infront of pos and point pos
-    to the start of the normalization buffer. why am i doing these copies?
-    well, so that the whole chunk of codes in the getNextCE, ucol_prv_getSpecialCE does
-    not require any changes, which be really painful. */
-    if (source->flags & UCOL_ITER_INNORMBUF) {
-        int32_t replaceLength = source->pos - source->writableBuffer.getBuffer();
-        source->writableBuffer.replace(0, replaceLength, buffer);
-    }
-    else {
-        source->fcdPosition  = source->pos;
-        source->origFlags    = source->flags;
-        source->flags       |= UCOL_ITER_INNORMBUF;
-        source->flags       &= ~(UCOL_ITER_NORM | UCOL_ITER_HASLEN | UCOL_USE_ITERATOR);
-        source->writableBuffer = buffer;
-    }
-
-    source->pos = source->writableBuffer.getTerminatedBuffer();
-}
-
-/**
-* Function to get the discontiguos collation element within the source.
-* Note this function will set the position to the appropriate places.
-* @param coll current collator used
-* @param source data string source
-* @param constart index to the start character in the contraction table
-* @return discontiguos collation element offset
-*/
-static
-uint32_t getDiscontiguous(const UCollator *coll, collIterate *source,
-                                const UChar *constart)
-{
-    /* source->pos currently points to the second combining character after
-       the start character */
-          const UChar *temppos      = source->pos;
-          UnicodeString buffer;
-    const UChar   *tempconstart = constart;
-          uint8_t  tempflags    = source->flags;
-          UBool    multicontraction = FALSE;
-          collIterateState discState;
-
-          backupState(source, &discState);
-
-    buffer.setTo(peekCodePoint(source, -1));
-    for (;;) {
-        UChar    *UCharOffset;
-        UChar     schar,
-                  tchar;
-        uint32_t  result;
-
-        if (((source->flags & UCOL_ITER_HASLEN) && source->pos >= source->endp)
-            || (peekCodeUnit(source, 0) == 0  &&
-            //|| (*source->pos == 0  &&
-                ((source->flags & UCOL_ITER_INNORMBUF) == 0 ||
-                 source->fcdPosition == NULL ||
-                 source->fcdPosition == source->endp ||
-                 *(source->fcdPosition) == 0 ||
-                 u_getCombiningClass(*(source->fcdPosition)) == 0)) ||
-                 /* end of string in null terminated string or stopped by a
-                 null character, note fcd does not always point to a base
-                 character after the discontiguos change */
-                 u_getCombiningClass(peekCodePoint(source, 0)) == 0) {
-                 //u_getCombiningClass(*(source->pos)) == 0) {
-            //constart = (UChar *)coll->image + getContractOffset(CE);
-            if (multicontraction) {
-                source->pos    = temppos - 1;
-                setDiscontiguosAttribute(source, buffer);
-                return *(coll->contractionCEs +
-                                    (tempconstart - coll->contractionIndex));
-            }
-            constart = tempconstart;
-            break;
-        }
-
-        UCharOffset = (UChar *)(tempconstart + 1); /* skip the backward offset*/
-        schar = getNextNormalizedChar(source);
-
-        while (schar > (tchar = *UCharOffset)) {
-            UCharOffset++;
-        }
-
-        if (schar != tchar) {
-            /* not the correct codepoint. we stuff the current codepoint into
-            the discontiguos buffer and try the next character */
-            buffer.append(schar);
-            continue;
-        }
-        else {
-            if (u_getCombiningClass(schar) ==
-                u_getCombiningClass(peekCodePoint(source, -2))) {
-                buffer.append(schar);
-                continue;
-            }
-            result = *(coll->contractionCEs +
-                                      (UCharOffset - coll->contractionIndex));
-        }
-
-        if (result == UCOL_NOT_FOUND) {
-          break;
-        } else if (isContraction(result)) {
-            /* this is a multi-contraction*/
-            tempconstart = (UChar *)coll->image + getContractOffset(result);
-            if (*(coll->contractionCEs + (constart - coll->contractionIndex))
-                != UCOL_NOT_FOUND) {
-                multicontraction = TRUE;
-                temppos       = source->pos + 1;
-            }
-        } else {
-            setDiscontiguosAttribute(source, buffer);
-            return result;
-        }
-    }
-
-    /* no problems simply reverting just like that,
-    if we are in string before getting into this function, points back to
-    string hence no problem.
-    if we are in normalization buffer before getting into this function,
-    since we'll never use another normalization within this function, we
-    know that fcdposition points to a base character. the normalization buffer
-    never change, hence this revert works. */
-    loadState(source, &discState, TRUE);
-    goBackOne(source);
-
-    //source->pos   = temppos - 1;
-    source->flags = tempflags;
-    return *(coll->contractionCEs + (constart - coll->contractionIndex));
-}
-
-/* now uses Mark's getImplicitPrimary code */
-static
-inline uint32_t getImplicit(UChar32 cp, collIterate *collationSource) {
-    uint32_t r = uprv_uca_getImplicitPrimary(cp);
-    *(collationSource->CEpos++) = ((r & 0x0000FFFF)<<16) | 0x000000C0;
-    collationSource->offsetRepeatCount += 1;
-    return (r & UCOL_PRIMARYMASK) | 0x00000505; // This was 'order'
-}
-
-/**
-* Inserts the argument character into the front of the buffer replacing the
-* front null terminator.
-* @param data collation element iterator data
-* @param ch character to be appended
-*/
-static
-inline void insertBufferFront(collIterate *data, UChar ch)
-{
-    data->pos = data->writableBuffer.setCharAt(0, ch).insert(0, (UChar)0).getTerminatedBuffer() + 2;
-}
-
-/**
-* Special normalization function for contraction in the previous iterator.
-* This normalization sequence will place the current character at source->pos
-* and its following normalized sequence into the buffer.
-* The fcd position, pos will be changed.
-* pos will now point to positions in the buffer.
-* Flags will be changed accordingly.
-* @param data collation iterator data
-*/
-static
-inline void normalizePrevContraction(collIterate *data, UErrorCode *status)
-{
-    const UChar *pEnd = data->pos + 1;         /* End normalize + 1 */
-    const UChar *pStart;
-
-    UnicodeString endOfBuffer;
-    if (data->flags & UCOL_ITER_HASLEN) {
-        /*
-        normalization buffer not used yet, we'll pull down the next
-        character into the end of the buffer
-        */
-        endOfBuffer.setTo(*pEnd);
-    }
-    else {
-        endOfBuffer.setTo(data->writableBuffer, 1);  // after the leading NUL
-    }
-
-    if (data->fcdPosition == NULL) {
-        pStart = data->string;
-    }
-    else {
-        pStart = data->fcdPosition + 1;
-    }
-    int32_t normLen =
-        data->nfd->normalize(UnicodeString(FALSE, pStart, (int32_t)(pEnd - pStart)),
-                             data->writableBuffer,
-                             *status).
-        length();
-    if(U_FAILURE(*status)) {
-        return;
-    }
-    /*
-    this puts the null termination infront of the normalized string instead
-    of the end
-    */
-    data->pos =
-        data->writableBuffer.insert(0, (UChar)0).append(endOfBuffer).getTerminatedBuffer() +
-        1 + normLen;
-    data->origFlags  = data->flags;
-    data->flags     |= UCOL_ITER_INNORMBUF;
-    data->flags     &= ~(UCOL_ITER_NORM | UCOL_ITER_HASLEN);
-}
-
-/**
-* Contraction character management function that returns the previous character
-* for the backwards iterator.
-* Does nothing if the previous character is in buffer and not the first
-* character in it.
-* Else it checks previous character in data string to see if it is
-* normalizable.
-* If it is not, the character is simply copied into the buffer, else
-* the whole normalized substring is copied into the buffer, including the
-* current character.
-* @param data collation element iterator data
-* @return previous character
-*/
-static
-inline UChar getPrevNormalizedChar(collIterate *data, UErrorCode *status)
-{
-    UChar  prevch;
-    UChar  ch;
-    const UChar *start;
-    UBool  innormbuf = (UBool)(data->flags & UCOL_ITER_INNORMBUF);
-    if ((data->flags & (UCOL_ITER_NORM | UCOL_ITER_INNORMBUF)) == 0 ||
-        (innormbuf && *(data->pos - 1) != 0)) {
-        /*
-        if no normalization.
-        if previous character is in normalized buffer, no further normalization
-        is required
-        */
-      if(data->flags & UCOL_USE_ITERATOR) {
-        data->iterator->move(data->iterator, -1, UITER_CURRENT);
-        return (UChar)data->iterator->next(data->iterator);
-      } else {
-        return *(data->pos - 1);
-      }
-    }
-
-    start = data->pos;
-    if ((data->fcdPosition==NULL)||(data->flags & UCOL_ITER_HASLEN)) {
-        /* in data string */
-        if ((start - 1) == data->string) {
-            return *(start - 1);
-        }
-        start --;
-        ch     = *start;
-        prevch = *(start - 1);
-    }
-    else {
-        /*
-        in writable buffer, at this point fcdPosition can not be NULL.
-        see contracting tag.
-        */
-        if (data->fcdPosition == data->string) {
-            /* at the start of the string, just dump it into the normalizer */
-            insertBufferFront(data, *(data->fcdPosition));
-            data->fcdPosition = NULL;
-            return *(data->pos - 1);
-        }
-        start  = data->fcdPosition;
-        ch     = *start;
-        prevch = *(start - 1);
-    }
-    /*
-    * if the current character is not fcd.
-    * Trailing combining class == 0.
-    */
-    if (data->fcdPosition > start &&
-       (ch >= NFC_ZERO_CC_BLOCK_LIMIT_ || prevch >= NFC_ZERO_CC_BLOCK_LIMIT_))
-    {
-        /*
-        Need a more complete FCD check and possible normalization.
-        normalize substring will be appended to buffer
-        */
-        const UChar *backuppos = data->pos;
-        data->pos = start;
-        if (collPrevIterFCD(data)) {
-            normalizePrevContraction(data, status);
-            return *(data->pos - 1);
-        }
-        data->pos = backuppos;
-        data->fcdPosition ++;
-    }
-
-    if (innormbuf) {
-    /*
-    no normalization is to be done hence only one character will be
-    appended to the buffer.
-    */
-        insertBufferFront(data, ch);
-        data->fcdPosition --;
-    }
-
-    return ch;
-}
-
-/* This function handles the special CEs like contractions, expansions, surrogates, Thai */
-/* It is called by getNextCE */
-
-/* The following should be even */
-#define UCOL_MAX_DIGITS_FOR_NUMBER 254
-
-uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE, collIterate *source, UErrorCode *status) {
-    collIterateState entryState;
-    backupState(source, &entryState);
-    UChar32 cp = ch;
-
-    for (;;) {
-        // This loop will repeat only in the case of contractions, and only when a contraction
-        //   is found and the first CE resulting from that contraction is itself a special
-        //   (an expansion, for example.)  All other special CE types are fully handled the
-        //   first time through, and the loop exits.
-
-        const uint32_t *CEOffset = NULL;
-        switch(getCETag(CE)) {
-        case NOT_FOUND_TAG:
-            /* This one is not found, and we'll let somebody else bother about it... no more games */
-            return CE;
-        case SPEC_PROC_TAG:
-            {
-                // Special processing is getting a CE that is preceded by a certain prefix
-                // Currently this is only needed for optimizing Japanese length and iteration marks.
-                // When we encouter a special processing tag, we go backwards and try to see if
-                // we have a match.
-                // Contraction tables are used - so the whole process is not unlike contraction.
-                // prefix data is stored backwards in the table.
-                const UChar *UCharOffset;
-                UChar schar, tchar;
-                collIterateState prefixState;
-                backupState(source, &prefixState);
-                loadState(source, &entryState, TRUE);
-                goBackOne(source); // We want to look at the point where we entered - actually one
-                // before that...
-
-                for(;;) {
-                    // This loop will run once per source string character, for as long as we
-                    //  are matching a potential contraction sequence
-
-                    // First we position ourselves at the begining of contraction sequence
-                    const UChar *ContractionStart = UCharOffset = (UChar *)coll->image+getContractOffset(CE);
-                    if (collIter_bos(source)) {
-                        CE = *(coll->contractionCEs + (UCharOffset - coll->contractionIndex));
-                        break;
-                    }
-                    schar = getPrevNormalizedChar(source, status);
-                    goBackOne(source);
-
-                    while(schar > (tchar = *UCharOffset)) { /* since the contraction codepoints should be ordered, we skip all that are smaller */
-                        UCharOffset++;
-                    }
-
-                    if (schar == tchar) {
-                        // Found the source string char in the table.
-                        //  Pick up the corresponding CE from the table.
-                        CE = *(coll->contractionCEs +
-                            (UCharOffset - coll->contractionIndex));
-                    }
-                    else
-                    {
-                        // Source string char was not in the table.
-                        //   We have not found the prefix.
-                        CE = *(coll->contractionCEs +
-                            (ContractionStart - coll->contractionIndex));
-                    }
-
-                    if(!isPrefix(CE)) {
-                        // The source string char was in the contraction table, and the corresponding
-                        //   CE is not a prefix CE.  We found the prefix, break
-                        //   out of loop, this CE will end up being returned.  This is the normal
-                        //   way out of prefix handling when the source actually contained
-                        //   the prefix.
-                        break;
-                    }
-                }
-                if(CE != UCOL_NOT_FOUND) { // we found something and we can merilly continue
-                    loadState(source, &prefixState, TRUE);
-                    if(source->origFlags & UCOL_USE_ITERATOR) {
-                        source->flags = source->origFlags;
-                    }
-                } else { // prefix search was a failure, we have to backup all the way to the start
-                    loadState(source, &entryState, TRUE);
-                }
-                break;
-            }
-        case CONTRACTION_TAG:
-            {
-                /* This should handle contractions */
-                collIterateState state;
-                backupState(source, &state);
-                uint32_t firstCE = *(coll->contractionCEs + ((UChar *)coll->image+getContractOffset(CE) - coll->contractionIndex)); //UCOL_NOT_FOUND;
-                const UChar *UCharOffset;
-                UChar schar, tchar;
-
-                for (;;) {
-                    /* This loop will run once per source string character, for as long as we     */
-                    /*  are matching a potential contraction sequence                  */
-
-                    /* First we position ourselves at the begining of contraction sequence */
-                    const UChar *ContractionStart = UCharOffset = (UChar *)coll->image+getContractOffset(CE);
-
-                    if (collIter_eos(source)) {
-                        // Ran off the end of the source string.
-                        CE = *(coll->contractionCEs + (UCharOffset - coll->contractionIndex));
-                        // So we'll pick whatever we have at the point...
-                        if (CE == UCOL_NOT_FOUND) {
-                            // back up the source over all the chars we scanned going into this contraction.
-                            CE = firstCE;
-                            loadState(source, &state, TRUE);
-                            if(source->origFlags & UCOL_USE_ITERATOR) {
-                                source->flags = source->origFlags;
-                            }
-                        }
-                        break;
-                    }
-
-                    uint8_t maxCC = (uint8_t)(*(UCharOffset)&0xFF); /*get the discontiguos stuff */ /* skip the backward offset, see above */
-                    uint8_t allSame = (uint8_t)(*(UCharOffset++)>>8);
-
-                    schar = getNextNormalizedChar(source);
-                    while(schar > (tchar = *UCharOffset)) { /* since the contraction codepoints should be ordered, we skip all that are smaller */
-                        UCharOffset++;
-                    }
-
-                    if (schar == tchar) {
-                        // Found the source string char in the contraction table.
-                        //  Pick up the corresponding CE from the table.
-                        CE = *(coll->contractionCEs +
-                            (UCharOffset - coll->contractionIndex));
-                    }
-                    else
-                    {
-                        // Source string char was not in contraction table.
-                        //   Unless we have a discontiguous contraction, we have finished
-                        //   with this contraction.
-                        // in order to do the proper detection, we
-                        // need to see if we're dealing with a supplementary
-                        /* We test whether the next two char are surrogate pairs.
-                        * This test is done if the iterator is not NULL.
-                        * If there is no surrogate pair, the iterator
-                        * goes back one if needed. */
-                        UChar32 miss = schar;
-                        if (source->iterator) {
-                            UChar32 surrNextChar; /* the next char in the iteration to test */
-                            int32_t prevPos; /* holds the previous position before move forward of the source iterator */
-                            if(U16_IS_LEAD(schar) && source->iterator->hasNext(source->iterator)) {
-                                prevPos = source->iterator->index;
-                                surrNextChar = getNextNormalizedChar(source);
-                                if (U16_IS_TRAIL(surrNextChar)) {
-                                    miss = U16_GET_SUPPLEMENTARY(schar, surrNextChar);
-                                } else if (prevPos < source->iterator->index){
-                                    goBackOne(source);
-                                }
-                            }
-                        } else if (U16_IS_LEAD(schar)) {
-                            miss = U16_GET_SUPPLEMENTARY(schar, getNextNormalizedChar(source));
-                        }
-
-                        uint8_t sCC;
-                        if (miss < 0x300 ||
-                            maxCC == 0 ||
-                            (sCC = i_getCombiningClass(miss, coll)) == 0 ||
-                            sCC>maxCC ||
-                            (allSame != 0 && sCC == maxCC) ||
-                            collIter_eos(source))
-                        {
-                            //  Contraction can not be discontiguous.
-                            goBackOne(source);  // back up the source string by one,
-                            //  because  the character we just looked at was
-                            //  not part of the contraction.   */
-                            if(U_IS_SUPPLEMENTARY(miss)) {
-                                goBackOne(source);
-                            }
-                            CE = *(coll->contractionCEs +
-                                (ContractionStart - coll->contractionIndex));
-                        } else {
-                            //
-                            // Contraction is possibly discontiguous.
-                            //   Scan more of source string looking for a match
-                            //
-                            UChar tempchar;
-                            /* find the next character if schar is not a base character
-                            and we are not yet at the end of the string */
-                            tempchar = getNextNormalizedChar(source);
-                            // probably need another supplementary thingie here
-                            goBackOne(source);
-                            if (i_getCombiningClass(tempchar, coll) == 0) {
-                                goBackOne(source);
-                                if(U_IS_SUPPLEMENTARY(miss)) {
-                                    goBackOne(source);
-                                }
-                                /* Spit out the last char of the string, wasn't tasty enough */
-                                CE = *(coll->contractionCEs +
-                                    (ContractionStart - coll->contractionIndex));
-                            } else {
-                                CE = getDiscontiguous(coll, source, ContractionStart);
-                            }
-                        }
-                    } // else after if(schar == tchar)
-
-                    if(CE == UCOL_NOT_FOUND) {
-                        /* The Source string did not match the contraction that we were checking.  */
-                        /*  Back up the source position to undo the effects of having partially    */
-                        /*   scanned through what ultimately proved to not be a contraction.       */
-                        loadState(source, &state, TRUE);
-                        CE = firstCE;
-                        break;
-                    }
-
-                    if(!isContraction(CE)) {
-                        // The source string char was in the contraction table, and the corresponding
-                        //   CE is not a contraction CE.  We completed the contraction, break
-                        //   out of loop, this CE will end up being returned.  This is the normal
-                        //   way out of contraction handling when the source actually contained
-                        //   the contraction.
-                        break;
-                    }
-
-
-                    // The source string char was in the contraction table, and the corresponding
-                    //   CE is IS  a contraction CE.  We will continue looping to check the source
-                    //   string for the remaining chars in the contraction.
-                    uint32_t tempCE = *(coll->contractionCEs + (ContractionStart - coll->contractionIndex));
-                    if(tempCE != UCOL_NOT_FOUND) {
-                        // We have scanned a a section of source string for which there is a
-                        //  CE from the contraction table.  Remember the CE and scan position, so
-                        //  that we can return to this point if further scanning fails to
-                        //  match a longer contraction sequence.
-                        firstCE = tempCE;
-
-                        goBackOne(source);
-                        backupState(source, &state);
-                        getNextNormalizedChar(source);
-
-                        // Another way to do this is:
-                        //collIterateState tempState;
-                        //backupState(source, &tempState);
-                        //goBackOne(source);
-                        //backupState(source, &state);
-                        //loadState(source, &tempState, TRUE);
-
-                        // The problem is that for incomplete contractions we have to remember the previous
-                        // position. Before, the only thing I needed to do was state.pos--;
-                        // After iterator introduction and especially after introduction of normalizing
-                        // iterators, it became much more difficult to decrease the saved state.
-                        // I'm not yet sure which of the two methods above is faster.
-                    }
-                } // for(;;)
-                break;
-            } // case CONTRACTION_TAG:
-        case LONG_PRIMARY_TAG:
-            {
-                *(source->CEpos++) = ((CE & 0xFF)<<24)|UCOL_CONTINUATION_MARKER;
-                CE = ((CE & 0xFFFF00) << 8) | (UCOL_BYTE_COMMON << 8) | UCOL_BYTE_COMMON;
-                source->offsetRepeatCount += 1;
-                return CE;
-            }
-        case EXPANSION_TAG:
-            {
-                /* This should handle expansion. */
-                /* NOTE: we can encounter both continuations and expansions in an expansion! */
-                /* I have to decide where continuations are going to be dealt with */
-                uint32_t size;
-                uint32_t i;    /* general counter */
-
-                CEOffset = (uint32_t *)coll->image+getExpansionOffset(CE); /* find the offset to expansion table */
-                size = getExpansionCount(CE);
-                CE = *CEOffset++;
-              //source->offsetRepeatCount = -1;
-
-                if(size != 0) { /* if there are less than 16 elements in expansion, we don't terminate */
-                    for(i = 1; i<size; i++) {
-                        *(source->CEpos++) = *CEOffset++;
-                        source->offsetRepeatCount += 1;
-                    }
-                } else { /* else, we do */
-                    while(*CEOffset != 0) {
-                        *(source->CEpos++) = *CEOffset++;
-                        source->offsetRepeatCount += 1;
-                    }
-                }
-
-                return CE;
-            }
-        case DIGIT_TAG:
-            {
-                /*
-                We do a check to see if we want to collate digits as numbers; if so we generate
-                a custom collation key. Otherwise we pull out the value stored in the expansion table.
-                */
-                //uint32_t size;
-                uint32_t i;    /* general counter */
-
-                if (source->coll->numericCollation == UCOL_ON){
-                    collIterateState digitState = {0,0,0,0,0,0,0,0,0};
-                    UChar32 char32 = 0;
-                    int32_t digVal = 0;
-
-                    uint32_t digIndx = 0;
-                    uint32_t endIndex = 0;
-                    uint32_t trailingZeroIndex = 0;
-
-                    uint8_t collateVal = 0;
-
-                    UBool nonZeroValReached = FALSE;
-
-                    uint8_t numTempBuf[UCOL_MAX_DIGITS_FOR_NUMBER/2 + 3]; // I just need a temporary place to store my generated CEs.
-                    /*
-                         We parse the source string until we hit a char that's NOT a digit.
-                        Use this u_charDigitValue. This might be slow because we have to
-                        handle surrogates...
-                    */
-            /*
-                    if (U16_IS_LEAD(ch)){
-                      if (!collIter_eos(source)) {
-                        backupState(source, &digitState);
-                        UChar trail = getNextNormalizedChar(source);
-                        if(U16_IS_TRAIL(trail)) {
-                          char32 = U16_GET_SUPPLEMENTARY(ch, trail);
-                        } else {
-                          loadState(source, &digitState, TRUE);
-                          char32 = ch;
-                        }
-                      } else {
-                        char32 = ch;
-                      }
-                    } else {
-                      char32 = ch;
-                    }
-                    digVal = u_charDigitValue(char32);
-            */
-                    digVal = u_charDigitValue(cp); // if we have arrived here, we have
-                    // already processed possible supplementaries that trigered the digit tag -
-                    // all supplementaries are marked in the UCA.
-                    /*
-                        We  pad a zero in front of the first element anyways. This takes
-                        care of the (probably) most common case where people are sorting things followed
-                        by a single digit
-                    */
-                    digIndx++;
-                    for(;;){
-                        // Make sure we have enough space. No longer needed;
-                        // at this point digIndx now has a max value of UCOL_MAX_DIGITS_FOR_NUMBER
-                        // (it has been pre-incremented) so we just ensure that numTempBuf is big enough
-                        // (UCOL_MAX_DIGITS_FOR_NUMBER/2 + 3).
-
-                        // Skipping over leading zeroes.
-                        if (digVal != 0) {
-                            nonZeroValReached = TRUE;
-                        }
-                        if (nonZeroValReached) {
-                            /*
-                            We parse the digit string into base 100 numbers (this fits into a byte).
-                            We only add to the buffer in twos, thus if we are parsing an odd character,
-                            that serves as the 'tens' digit while the if we are parsing an even one, that
-                            is the 'ones' digit. We dumped the parsed base 100 value (collateVal) into
-                            a buffer. We multiply each collateVal by 2 (to give us room) and add 5 (to avoid
-                            overlapping magic CE byte values). The last byte we subtract 1 to ensure it is less
-                            than all the other bytes.
-                            */
-
-                            if (digIndx % 2 == 1){
-                                collateVal += (uint8_t)digVal;
-
-                                // We don't enter the low-order-digit case unless we've already seen
-                                // the high order, or for the first digit, which is always non-zero.
-                                if (collateVal != 0)
-                                    trailingZeroIndex = 0;
-
-                                numTempBuf[(digIndx/2) + 2] = collateVal*2 + 6;
-                                collateVal = 0;
-                            }
-                            else{
-                                // We drop the collation value into the buffer so if we need to do
-                                // a "front patch" we don't have to check to see if we're hitting the
-                                // last element.
-                                collateVal = (uint8_t)(digVal * 10);
-
-                                // Check for trailing zeroes.
-                                if (collateVal == 0)
-                                {
-                                    if (!trailingZeroIndex)
-                                        trailingZeroIndex = (digIndx/2) + 2;
-                                }
-                                else
-                                    trailingZeroIndex = 0;
-
-                                numTempBuf[(digIndx/2) + 2] = collateVal*2 + 6;
-                            }
-                            digIndx++;
-                        }
-
-                        // Get next character.
-                        if (!collIter_eos(source)){
-                            ch = getNextNormalizedChar(source);
-                            if (U16_IS_LEAD(ch)){
-                                if (!collIter_eos(source)) {
-                                    backupState(source, &digitState);
-                                    UChar trail = getNextNormalizedChar(source);
-                                    if(U16_IS_TRAIL(trail)) {
-                                        char32 = U16_GET_SUPPLEMENTARY(ch, trail);
-                                    } else {
-                                        loadState(source, &digitState, TRUE);
-                                        char32 = ch;
-                                    }
-                                }
-                            } else {
-                                char32 = ch;
-                            }
-
-                            if ((digVal = u_charDigitValue(char32)) == -1 || digIndx > UCOL_MAX_DIGITS_FOR_NUMBER){
-                                // Resetting position to point to the next unprocessed char. We
-                                // overshot it when doing our test/set for numbers.
-                                if (char32 > 0xFFFF) { // For surrogates.
-                                    loadState(source, &digitState, TRUE);
-                                    //goBackOne(source);
-                                }
-                                goBackOne(source);
-                                break;
-                            }
-                        } else {
-                            break;
-                        }
-                    }
-
-                    if (nonZeroValReached == FALSE){
-                        digIndx = 2;
-                        numTempBuf[2] = 6;
-                    }
-
-                    endIndex = trailingZeroIndex ? trailingZeroIndex : ((digIndx/2) + 2) ;
-                    if (digIndx % 2 != 0){
-                        /*
-                        We missed a value. Since digIndx isn't even, stuck too many values into the buffer (this is what
-                        we get for padding the first byte with a zero). "Front-patch" now by pushing all nybbles forward.
-                        Doing it this way ensures that at least 50% of the time (statistically speaking) we'll only be doing a
-                        single pass and optimizes for strings with single digits. I'm just assuming that's the more common case.
-                        */
-
-                        for(i = 2; i < endIndex; i++){
-                            numTempBuf[i] =     (((((numTempBuf[i] - 6)/2) % 10) * 10) +
-                                (((numTempBuf[i+1])-6)/2) / 10) * 2 + 6;
-                        }
-                        --digIndx;
-                    }
-
-                    // Subtract one off of the last byte.
-                    numTempBuf[endIndex-1] -= 1;
-
-                    /*
-                    We want to skip over the first two slots in the buffer. The first slot
-                    is reserved for the header byte UCOL_CODAN_PLACEHOLDER. The second slot is for the
-                    sign/exponent byte: 0x80 + (decimalPos/2) & 7f.
-                    */
-                    numTempBuf[0] = UCOL_CODAN_PLACEHOLDER;
-                    numTempBuf[1] = (uint8_t)(0x80 + ((digIndx/2) & 0x7F));
-
-                    // Now transfer the collation key to our collIterate struct.
-                    // The total size for our collation key is endIndx bumped up to the next largest even value divided by two.
-                    //size = ((endIndex+1) & ~1)/2;
-                    CE = (((numTempBuf[0] << 8) | numTempBuf[1]) << UCOL_PRIMARYORDERSHIFT) | //Primary weight
-                        (UCOL_BYTE_COMMON << UCOL_SECONDARYORDERSHIFT) | // Secondary weight
-                        UCOL_BYTE_COMMON; // Tertiary weight.
-                    i = 2; // Reset the index into the buffer.
-                    while(i < endIndex)
-                    {
-                        uint32_t primWeight = numTempBuf[i++] << 8;
-                        if ( i < endIndex)
-                            primWeight |= numTempBuf[i++];
-                        *(source->CEpos++) = (primWeight << UCOL_PRIMARYORDERSHIFT) | UCOL_CONTINUATION_MARKER;
-                    }
-
-                } else {
-                    // no numeric mode, we'll just switch to whatever we stashed and continue
-                    CEOffset = (uint32_t *)coll->image+getExpansionOffset(CE); /* find the offset to expansion table */
-                    CE = *CEOffset++;
-                    break;
-                }
-                return CE;
-            }
-            /* various implicits optimization */
-        case IMPLICIT_TAG:        /* everything that is not defined otherwise */
-            /* UCA is filled with these. Tailorings are NOT_FOUND */
-            return getImplicit(cp, source);
-        case CJK_IMPLICIT_TAG:    /* 0x3400-0x4DB5, 0x4E00-0x9FA5, 0xF900-0xFA2D*/
-            // TODO: remove CJK_IMPLICIT_TAG completely - handled by the getImplicit
-            return getImplicit(cp, source);
-        case HANGUL_SYLLABLE_TAG: /* AC00-D7AF*/
-            {
-                static const uint32_t
-                    SBase = 0xAC00, LBase = 0x1100, VBase = 0x1161, TBase = 0x11A7;
-                //const uint32_t LCount = 19;
-                static const uint32_t VCount = 21;
-                static const uint32_t TCount = 28;
-                //const uint32_t NCount = VCount * TCount;   // 588
-                //const uint32_t SCount = LCount * NCount;   // 11172
-                uint32_t L = ch - SBase;
-
-                // divide into pieces
-
-                uint32_t T = L % TCount; // we do it in this order since some compilers can do % and / in one operation
-                L /= TCount;
-                uint32_t V = L % VCount;
-                L /= VCount;
-
-                // offset them
-
-                L += LBase;
-                V += VBase;
-                T += TBase;
-
-                // return the first CE, but first put the rest into the expansion buffer
-                if (!source->coll->image->jamoSpecial) { // FAST PATH
-
-                    *(source->CEpos++) = UTRIE_GET32_FROM_LEAD(&coll->mapping, V);
-                    if (T != TBase) {
-                        *(source->CEpos++) = UTRIE_GET32_FROM_LEAD(&coll->mapping, T);
-                    }
-
-                    return UTRIE_GET32_FROM_LEAD(&coll->mapping, L);
-
-                } else { // Jamo is Special
-                    // Since Hanguls pass the FCD check, it is
-                    // guaranteed that we won't be in
-                    // the normalization buffer if something like this happens
-
-                    // However, if we are using a uchar iterator and normalization
-                    // is ON, the Hangul that lead us here is going to be in that
-                    // normalization buffer. Here we want to restore the uchar
-                    // iterator state and pull out of the normalization buffer
-                    if(source->iterator != NULL && source->flags & UCOL_ITER_INNORMBUF) {
-                        source->flags = source->origFlags; // restore the iterator
-                        source->pos = NULL;
-                    }
-
-                    // Move Jamos into normalization buffer
-                    UChar *buffer = source->writableBuffer.getBuffer(4);
-                    int32_t bufferLength;
-                    buffer[0] = (UChar)L;
-                    buffer[1] = (UChar)V;
-                    if (T != TBase) {
-                        buffer[2] = (UChar)T;
-                        bufferLength = 3;
-                    } else {
-                        bufferLength = 2;
-                    }
-                    source->writableBuffer.releaseBuffer(bufferLength);
-
-                    // Indicate where to continue in main input string after exhausting the writableBuffer
-                    source->fcdPosition       = source->pos;
-
-                    source->pos   = source->writableBuffer.getTerminatedBuffer();
-                    source->origFlags   = source->flags;
-                    source->flags       |= UCOL_ITER_INNORMBUF;
-                    source->flags       &= ~(UCOL_ITER_NORM | UCOL_ITER_HASLEN);
-
-                    return(UCOL_IGNORABLE);
-                }
-            }
-        case SURROGATE_TAG:
-            /* we encountered a leading surrogate. We shall get the CE by using the following code unit */
-            /* two things can happen here: next code point can be a trailing surrogate - we will use it */
-            /* to retrieve the CE, or it is not a trailing surrogate (or the string is done). In that case */
-            /* we treat it like an unassigned code point. */
-            {
-                UChar trail;
-                collIterateState state;
-                backupState(source, &state);
-                if (collIter_eos(source) || !(U16_IS_TRAIL((trail = getNextNormalizedChar(source))))) {
-                    // we chould have stepped one char forward and it might have turned that it
-                    // was not a trail surrogate. In that case, we have to backup.
-                    loadState(source, &state, TRUE);
-                    return UCOL_NOT_FOUND;
-                } else {
-                    /* TODO: CE contain the data from the previous CE + the mask. It should at least be unmasked */
-                    CE = UTRIE_GET32_FROM_OFFSET_TRAIL(&coll->mapping, CE&0xFFFFFF, trail);
-                    if(CE == UCOL_NOT_FOUND) { // there are tailored surrogates in this block, but not this one.
-                        // We need to backup
-                        loadState(source, &state, TRUE);
-                        return CE;
-                    }
-                    // calculate the supplementary code point value, if surrogate was not tailored
-                    cp = ((((uint32_t)ch)<<10UL)+(trail)-(((uint32_t)0xd800<<10UL)+0xdc00-0x10000));
-                }
-            }
-            break;
-        case LEAD_SURROGATE_TAG:  /* D800-DBFF*/
-            UChar nextChar;
-            if( source->flags & UCOL_USE_ITERATOR) {
-                if(U_IS_TRAIL(nextChar = (UChar)source->iterator->current(source->iterator))) {
-                    cp = U16_GET_SUPPLEMENTARY(ch, nextChar);
-                    source->iterator->next(source->iterator);
-                    return getImplicit(cp, source);
-                }
-            } else if((((source->flags & UCOL_ITER_HASLEN) == 0 ) || (source->pos<source->endp)) &&
-                      U_IS_TRAIL((nextChar=*source->pos))) {
-                cp = U16_GET_SUPPLEMENTARY(ch, nextChar);
-                source->pos++;
-                return getImplicit(cp, source);
-            }
-            return UCOL_NOT_FOUND;
-        case TRAIL_SURROGATE_TAG: /* DC00-DFFF*/
-            return UCOL_NOT_FOUND; /* broken surrogate sequence */
-        case CHARSET_TAG:
-            /* not yet implemented */
-            /* probably after 1.8 */
-            return UCOL_NOT_FOUND;
-        default:
-            *status = U_INTERNAL_PROGRAM_ERROR;
-            CE=0;
-            break;
-    }
-    if (CE <= UCOL_NOT_FOUND) break;
-  }
-  return CE;
-}
-
-
-/* now uses Mark's getImplicitPrimary code */
-static
-inline uint32_t getPrevImplicit(UChar32 cp, collIterate *collationSource) {
-    uint32_t r = uprv_uca_getImplicitPrimary(cp);
-
-    *(collationSource->CEpos++) = (r & UCOL_PRIMARYMASK) | 0x00000505;
-    collationSource->toReturn = collationSource->CEpos;
-
-    // **** doesn't work if using iterator ****
-    if (collationSource->flags & UCOL_ITER_INNORMBUF) {
-        collationSource->offsetRepeatCount = 1;
-    } else {
-        int32_t firstOffset = (int32_t)(collationSource->pos - collationSource->string);
-
-        UErrorCode errorCode = U_ZERO_ERROR;
-        collationSource->appendOffset(firstOffset, errorCode);
-        collationSource->appendOffset(firstOffset + 1, errorCode);
-
-        collationSource->offsetReturn = collationSource->offsetStore - 1;
-        *(collationSource->offsetBuffer) = firstOffset;
-        if (collationSource->offsetReturn == collationSource->offsetBuffer) {
-            collationSource->offsetStore = collationSource->offsetBuffer;
-        }
-    }
-
-    return ((r & 0x0000FFFF)<<16) | 0x000000C0;
-}
-
-/**
- * This function handles the special CEs like contractions, expansions,
- * surrogates, Thai.
- * It is called by both getPrevCE
- */
-uint32_t ucol_prv_getSpecialPrevCE(const UCollator *coll, UChar ch, uint32_t CE,
-                          collIterate *source,
-                          UErrorCode *status)
-{
-    const uint32_t *CEOffset    = NULL;
-          UChar    *UCharOffset = NULL;
-          UChar    schar;
-    const UChar    *constart    = NULL;
-          uint32_t size;
-          UChar    buffer[UCOL_MAX_BUFFER];
-          uint32_t *endCEBuffer;
-          UChar   *strbuffer;
-          int32_t noChars = 0;
-          int32_t CECount = 0;
-
-    for(;;)
-    {
-        /* the only ces that loops are thai and contractions */
-        switch (getCETag(CE))
-        {
-        case NOT_FOUND_TAG:  /* this tag always returns */
-            return CE;
-
-        case SPEC_PROC_TAG:
-            {
-                // Special processing is getting a CE that is preceded by a certain prefix
-                // Currently this is only needed for optimizing Japanese length and iteration marks.
-                // When we encouter a special processing tag, we go backwards and try to see if
-                // we have a match.
-                // Contraction tables are used - so the whole process is not unlike contraction.
-                // prefix data is stored backwards in the table.
-                const UChar *UCharOffset;
-                UChar schar, tchar;
-                collIterateState prefixState;
-                backupState(source, &prefixState);
-                for(;;) {
-                    // This loop will run once per source string character, for as long as we
-                    //  are matching a potential contraction sequence
-
-                    // First we position ourselves at the begining of contraction sequence
-                    const UChar *ContractionStart = UCharOffset = (UChar *)coll->image+getContractOffset(CE);
-
-                    if (collIter_bos(source)) {
-                        CE = *(coll->contractionCEs + (UCharOffset - coll->contractionIndex));
-                        break;
-                    }
-                    schar = getPrevNormalizedChar(source, status);
-                    goBackOne(source);
-
-                    while(schar > (tchar = *UCharOffset)) { /* since the contraction codepoints should be ordered, we skip all that are smaller */
-                        UCharOffset++;
-                    }
-
-                    if (schar == tchar) {
-                        // Found the source string char in the table.
-                        //  Pick up the corresponding CE from the table.
-                        CE = *(coll->contractionCEs +
-                            (UCharOffset - coll->contractionIndex));
-                    }
-                    else
-                    {
-                        // if there is a completely ignorable code point in the middle of
-                        // a prefix, we need to act as if it's not there
-                        // assumption: 'real' noncharacters (*fffe, *ffff, fdd0-fdef are set to zero)
-                        // lone surrogates cannot be set to zero as it would break other processing
-                        uint32_t isZeroCE = UTRIE_GET32_FROM_LEAD(&coll->mapping, schar);
-                        // it's easy for BMP code points
-                        if(isZeroCE == 0) {
-                            continue;
-                        } else if(U16_IS_SURROGATE(schar)) {
-                            // for supplementary code points, we have to check the next one
-                            // situations where we are going to ignore
-                            // 1. beginning of the string: schar is a lone surrogate
-                            // 2. schar is a lone surrogate
-                            // 3. schar is a trail surrogate in a valid surrogate sequence
-                            //    that is explicitly set to zero.
-                            if (!collIter_bos(source)) {
-                                UChar lead;
-                                if(!U16_IS_SURROGATE_LEAD(schar) && U16_IS_LEAD(lead = getPrevNormalizedChar(source, status))) {
-                                    isZeroCE = UTRIE_GET32_FROM_LEAD(&coll->mapping, lead);
-                                    if(isSpecial(isZeroCE) && getCETag(isZeroCE) == SURROGATE_TAG) {
-                                        uint32_t finalCE = UTRIE_GET32_FROM_OFFSET_TRAIL(&coll->mapping, isZeroCE&0xFFFFFF, schar);
-                                        if(finalCE == 0) {
-                                            // this is a real, assigned completely ignorable code point
-                                            goBackOne(source);
-                                            continue;
-                                        }
-                                    }
-                                } else {
-                                    // lone surrogate, treat like unassigned
-                                    return UCOL_NOT_FOUND;
-                                }
-                            } else {
-                                // lone surrogate at the beggining, treat like unassigned
-                                return UCOL_NOT_FOUND;
-                            }
-                        }
-                        // Source string char was not in the table.
-                        //   We have not found the prefix.
-                        CE = *(coll->contractionCEs +
-                            (ContractionStart - coll->contractionIndex));
-                    }
-
-                    if(!isPrefix(CE)) {
-                        // The source string char was in the contraction table, and the corresponding
-                        //   CE is not a prefix CE.  We found the prefix, break
-                        //   out of loop, this CE will end up being returned.  This is the normal
-                        //   way out of prefix handling when the source actually contained
-                        //   the prefix.
-                        break;
-                    }
-                }
-                loadState(source, &prefixState, TRUE);
-                break;
-            }
-
-        case CONTRACTION_TAG: {
-            /* to ensure that the backwards and forwards iteration matches, we
-            take the current region of most possible match and pass it through
-            the forward iteration. this will ensure that the obstinate problem of
-            overlapping contractions will not occur.
-            */
-            schar = peekCodeUnit(source, 0);
-            constart = (UChar *)coll->image + getContractOffset(CE);
-            if (isAtStartPrevIterate(source)
-                /* commented away contraction end checks after adding the checks
-                in getPrevCE  */) {
-                    /* start of string or this is not the end of any contraction */
-                    CE = *(coll->contractionCEs +
-                        (constart - coll->contractionIndex));
-                    break;
-            }
-            strbuffer = buffer;
-            UCharOffset = strbuffer + (UCOL_MAX_BUFFER - 1);
-            *(UCharOffset --) = 0;
-            noChars = 0;
-            // have to swap thai characters
-            while (ucol_unsafeCP(schar, coll)) {
-                *(UCharOffset) = schar;
-                noChars++;
-                UCharOffset --;
-                schar = getPrevNormalizedChar(source, status);
-                goBackOne(source);
-                // TODO: when we exhaust the contraction buffer,
-                // it needs to get reallocated. The problem is
-                // that the size depends on the string which is
-                // not iterated over. However, since we're travelling
-                // backwards, we already had to set the iterator at
-                // the end - so we might as well know where we are?
-                if (UCharOffset + 1 == buffer) {
-                    /* we have exhausted the buffer */
-                    int32_t newsize = 0;
-                    if(source->pos) { // actually dealing with a position
-                        newsize = (int32_t)(source->pos - source->string + 1);
-                    } else { // iterator
-                        newsize = 4 * UCOL_MAX_BUFFER;
-                    }
-                    strbuffer = (UChar *)uprv_malloc(sizeof(UChar) *
-                        (newsize + UCOL_MAX_BUFFER));
-                    /* test for NULL */
-                    if (strbuffer == NULL) {
-                        *status = U_MEMORY_ALLOCATION_ERROR;
-                        return UCOL_NO_MORE_CES;
-                    }
-                    UCharOffset = strbuffer + newsize;
-                    uprv_memcpy(UCharOffset, buffer,
-                        UCOL_MAX_BUFFER * sizeof(UChar));
-                    UCharOffset --;
-                }
-                if ((source->pos && (source->pos == source->string ||
-                    ((source->flags & UCOL_ITER_INNORMBUF) &&
-                    *(source->pos - 1) == 0 && source->fcdPosition == NULL)))
-                    || (source->iterator && !source->iterator->hasPrevious(source->iterator))) {
-                        break;
-                }
-            }
-            /* adds the initial base character to the string */
-            *(UCharOffset) = schar;
-            noChars++;
-
-            int32_t offsetBias;
-
-            // **** doesn't work if using iterator ****
-            if (source->flags & UCOL_ITER_INNORMBUF) {
-                offsetBias = -1;
-            } else {
-                offsetBias = (int32_t)(source->pos - source->string);
-            }
-
-            /* a new collIterate is used to simplify things, since using the current
-            collIterate will mean that the forward and backwards iteration will
-            share and change the same buffers. we don't want to get into that. */
-            collIterate temp;
-            int32_t rawOffset;
-
-            IInit_collIterate(coll, UCharOffset, noChars, &temp, status);
-            if(U_FAILURE(*status)) {
-                return (uint32_t)UCOL_NULLORDER;
-            }
-            temp.flags &= ~UCOL_ITER_NORM;
-            temp.flags |= source->flags & UCOL_FORCE_HAN_IMPLICIT;
-
-            rawOffset = (int32_t)(temp.pos - temp.string); // should always be zero?
-            CE = ucol_IGetNextCE(coll, &temp, status);
-
-            if (source->extendCEs) {
-                endCEBuffer = source->extendCEs + source->extendCEsSize;
-                CECount = (int32_t)((source->CEpos - source->extendCEs)/sizeof(uint32_t));
-            } else {
-                endCEBuffer = source->CEs + UCOL_EXPAND_CE_BUFFER_SIZE;
-                CECount = (int32_t)((source->CEpos - source->CEs)/sizeof(uint32_t));
-            }
-
-            while (CE != UCOL_NO_MORE_CES) {
-                *(source->CEpos ++) = CE;
-
-                if (offsetBias >= 0) {
-                    source->appendOffset(rawOffset + offsetBias, *status);
-                }
-
-                CECount++;
-                if (source->CEpos == endCEBuffer) {
-                    /* ran out of CE space, reallocate to new buffer.
-                    If reallocation fails, reset pointers and bail out,
-                    there's no guarantee of the right character position after
-                    this bail*/
-                    if (!increaseCEsCapacity(source)) {
-                        *status = U_MEMORY_ALLOCATION_ERROR;
-                        break;
-                    }
-
-                    endCEBuffer = source->extendCEs + source->extendCEsSize;
-                }
-
-                if ((temp.flags & UCOL_ITER_INNORMBUF) != 0) {
-                    rawOffset = (int32_t)(temp.fcdPosition - temp.string);
-                } else {
-                    rawOffset = (int32_t)(temp.pos - temp.string);
-                }
-
-                CE = ucol_IGetNextCE(coll, &temp, status);
-            }
-
-            if (strbuffer != buffer) {
-                uprv_free(strbuffer);
-            }
-            if (U_FAILURE(*status)) {
-                return (uint32_t)UCOL_NULLORDER;
-            }
-
-            if (source->offsetRepeatValue != 0) {
-                if (CECount > noChars) {
-                    source->offsetRepeatCount += temp.offsetRepeatCount;
-                } else {
-                    // **** does this really skip the right offsets? ****
-                    source->offsetReturn -= (noChars - CECount);
-                }
-            }
-
-            if (offsetBias >= 0) {
-                source->offsetReturn = source->offsetStore - 1;
-                if (source->offsetReturn == source->offsetBuffer) {
-                    source->offsetStore = source->offsetBuffer;
-                }
-            }
-
-            source->toReturn = source->CEpos - 1;
-            if (source->toReturn == source->CEs) {
-                source->CEpos = source->CEs;
-            }
-
-            return *(source->toReturn);
-        }
-        case LONG_PRIMARY_TAG:
-            {
-                *(source->CEpos++) = ((CE & 0xFFFF00) << 8) | (UCOL_BYTE_COMMON << 8) | UCOL_BYTE_COMMON;
-                *(source->CEpos++) = ((CE & 0xFF)<<24)|UCOL_CONTINUATION_MARKER;
-                source->toReturn = source->CEpos - 1;
-
-                if (source->flags & UCOL_ITER_INNORMBUF) {
-                    source->offsetRepeatCount = 1;
-                } else {
-                    int32_t firstOffset = (int32_t)(source->pos - source->string);
-
-                    source->appendOffset(firstOffset, *status);
-                    source->appendOffset(firstOffset + 1, *status);
-
-                    source->offsetReturn = source->offsetStore - 1;
-                    *(source->offsetBuffer) = firstOffset;
-                    if (source->offsetReturn == source->offsetBuffer) {
-                        source->offsetStore = source->offsetBuffer;
-                    }
-                }
-
-
-                return *(source->toReturn);
-            }
-
-        case EXPANSION_TAG: /* this tag always returns */
-            {
-            /*
-            This should handle expansion.
-            NOTE: we can encounter both continuations and expansions in an expansion!
-            I have to decide where continuations are going to be dealt with
-            */
-            int32_t firstOffset = (int32_t)(source->pos - source->string);
-
-            // **** doesn't work if using iterator ****
-            if (source->offsetReturn != NULL) {
-                if (! (source->flags & UCOL_ITER_INNORMBUF) && source->offsetReturn == source->offsetBuffer) {
-                    source->offsetStore = source->offsetBuffer;
-                }else {
-                  firstOffset = -1;
-                }
-            }
-
-            /* find the offset to expansion table */
-            CEOffset = (uint32_t *)coll->image + getExpansionOffset(CE);
-            size     = getExpansionCount(CE);
-            if (size != 0) {
-                /*
-                if there are less than 16 elements in expansion, we don't terminate
-                */
-                uint32_t count;
-
-                for (count = 0; count < size; count++) {
-                    *(source->CEpos ++) = *CEOffset++;
-
-                    if (firstOffset >= 0) {
-                        source->appendOffset(firstOffset + 1, *status);
-                    }
-                }
-            } else {
-                /* else, we do */
-                while (*CEOffset != 0) {
-                    *(source->CEpos ++) = *CEOffset ++;
-
-                    if (firstOffset >= 0) {
-                        source->appendOffset(firstOffset + 1, *status);
-                    }
-                }
-            }
-
-            if (firstOffset >= 0) {
-                source->offsetReturn = source->offsetStore - 1;
-                *(source->offsetBuffer) = firstOffset;
-                if (source->offsetReturn == source->offsetBuffer) {
-                    source->offsetStore = source->offsetBuffer;
-                }
-            } else {
-                source->offsetRepeatCount += size - 1;
-            }
-
-            source->toReturn = source->CEpos - 1;
-            // in case of one element expansion, we
-            // want to immediately return CEpos
-            if(source->toReturn == source->CEs) {
-                source->CEpos = source->CEs;
-            }
-
-            return *(source->toReturn);
-            }
-
-        case DIGIT_TAG:
-            {
-                /*
-                We do a check to see if we want to collate digits as numbers; if so we generate
-                a custom collation key. Otherwise we pull out the value stored in the expansion table.
-                */
-                uint32_t i;    /* general counter */
-
-                if (source->coll->numericCollation == UCOL_ON){
-                    uint32_t digIndx = 0;
-                    uint32_t endIndex = 0;
-                    uint32_t leadingZeroIndex = 0;
-                    uint32_t trailingZeroCount = 0;
-
-                    uint8_t collateVal = 0;
-
-                    UBool nonZeroValReached = FALSE;
-
-                    uint8_t numTempBuf[UCOL_MAX_DIGITS_FOR_NUMBER/2 + 2]; // I just need a temporary place to store my generated CEs.
-                    /*
-                    We parse the source string until we hit a char that's NOT a digit.
-                    Use this u_charDigitValue. This might be slow because we have to
-                    handle surrogates...
-                    */
-                    /*
-                    We need to break up the digit string into collection elements of UCOL_MAX_DIGITS_FOR_NUMBER or less,
-                    with any chunks smaller than that being on the right end of the digit string - i.e. the first collation
-                    element we process when going backward. To determine how long that chunk might be, we may need to make
-                    two passes through the loop that collects digits - one to see how long the string is (and how much is
-                    leading zeros) to determine the length of that right-hand chunk, and a second (if the whole string has
-                    more than UCOL_MAX_DIGITS_FOR_NUMBER non-leading-zero digits) to actually process that collation
-                    element chunk after resetting the state to the initialState at the right side of the digit string.
-                    */
-                    uint32_t ceLimit = 0;
-                    UChar initial_ch = ch;
-                    collIterateState initialState = {0,0,0,0,0,0,0,0,0};
-                    backupState(source, &initialState);
-
-                    for(;;) {
-                        collIterateState state = {0,0,0,0,0,0,0,0,0};
-                        UChar32 char32 = 0;
-                        int32_t digVal = 0;
-
-                        if (U16_IS_TRAIL (ch)) {
-                            if (!collIter_bos(source)){
-                                UChar lead = getPrevNormalizedChar(source, status);
-                                if(U16_IS_LEAD(lead)) {
-                                    char32 = U16_GET_SUPPLEMENTARY(lead,ch);
-                                    goBackOne(source);
-                                } else {
-                                    char32 = ch;
-                                }
-                            } else {
-                                char32 = ch;
-                            }
-                        } else {
-                            char32 = ch;
-                        }
-                        digVal = u_charDigitValue(char32);
-
-                        for(;;) {
-                            // Make sure we have enough space. No longer needed;
-                            // at this point the largest value of digIndx when we need to save data in numTempBuf
-                            // is UCOL_MAX_DIGITS_FOR_NUMBER-1 (digIndx is post-incremented) so we just ensure
-                            // that numTempBuf is big enough (UCOL_MAX_DIGITS_FOR_NUMBER/2 + 2).
-
-                            // Skip over trailing zeroes, and keep a count of them.
-                            if (digVal != 0)
-                                nonZeroValReached = TRUE;
-
-                            if (nonZeroValReached) {
-                                /*
-                                We parse the digit string into base 100 numbers (this fits into a byte).
-                                We only add to the buffer in twos, thus if we are parsing an odd character,
-                                that serves as the 'tens' digit while the if we are parsing an even one, that
-                                is the 'ones' digit. We dumped the parsed base 100 value (collateVal) into
-                                a buffer. We multiply each collateVal by 2 (to give us room) and add 5 (to avoid
-                                overlapping magic CE byte values). The last byte we subtract 1 to ensure it is less
-                                than all the other bytes.
-
-                                Since we're doing in this reverse we want to put the first digit encountered into the
-                                ones place and the second digit encountered into the tens place.
-                                */
-
-                                if ((digIndx + trailingZeroCount) % 2 == 1) {
-                                    // High-order digit case (tens place)
-                                    collateVal += (uint8_t)(digVal * 10);
-
-                                    // We cannot set leadingZeroIndex unless it has been set for the
-                                    // low-order digit. Therefore, all we can do for the high-order
-                                    // digit is turn it off, never on.
-                                    // The only time we will have a high digit without a low is for
-                                    // the very first non-zero digit, so no zero check is necessary.
-                                    if (collateVal != 0)
-                                        leadingZeroIndex = 0;
-
-                                    // The first pass through, digIndx may exceed the limit, but in that case
-                                    // we no longer care about numTempBuf contents since they will be discarded
-                                    if ( digIndx < UCOL_MAX_DIGITS_FOR_NUMBER ) {
-                                        numTempBuf[(digIndx/2) + 2] = collateVal*2 + 6;
-                                    }
-                                    collateVal = 0;
-                                } else {
-                                    // Low-order digit case (ones place)
-                                    collateVal = (uint8_t)digVal;
-
-                                    // Check for leading zeroes.
-                                    if (collateVal == 0) {
-                                        if (!leadingZeroIndex)
-                                            leadingZeroIndex = (digIndx/2) + 2;
-                                    } else
-                                        leadingZeroIndex = 0;
-
-                                    // No need to write to buffer; the case of a last odd digit
-                                    // is handled below.
-                                }
-                                ++digIndx;
-                            } else
-                                ++trailingZeroCount;
-
-                            if (!collIter_bos(source)) {
-                                ch = getPrevNormalizedChar(source, status);
-                                //goBackOne(source);
-                                if (U16_IS_TRAIL(ch)) {
-                                    backupState(source, &state);
-                                    if (!collIter_bos(source)) {
-                                        goBackOne(source);
-                                        UChar lead = getPrevNormalizedChar(source, status);
-
-                                        if(U16_IS_LEAD(lead)) {
-                                            char32 = U16_GET_SUPPLEMENTARY(lead,ch);
-                                        } else {
-                                            loadState(source, &state, FALSE);
-                                            char32 = ch;
-                                        }
-                                    }
-                                } else
-                                    char32 = ch;
-
-                                if ((digVal = u_charDigitValue(char32)) == -1 || (ceLimit > 0 && (digIndx + trailingZeroCount) >= ceLimit)) {
-                                    if (char32 > 0xFFFF) {// For surrogates.
-                                        loadState(source, &state, FALSE);
-                                    }
-                                    // Don't need to "reverse" the goBackOne call,
-                                    // as this points to the next position to process..
-                                    //if (char32 > 0xFFFF) // For surrogates.
-                                    //getNextNormalizedChar(source);
-                                    break;
-                                }
-
-                                goBackOne(source);
-                            }else
-                                break;
-                        }
-
-                        if (digIndx + trailingZeroCount <= UCOL_MAX_DIGITS_FOR_NUMBER) {
-                            // our collation element is not too big, go ahead and finish with it
-                            break;
-                        }
-                        // our digit string is too long for a collation element;
-                        // set the limit for it, reset the state and begin again
-                        ceLimit = (digIndx + trailingZeroCount) % UCOL_MAX_DIGITS_FOR_NUMBER;
-                        if ( ceLimit == 0 ) {
-                            ceLimit = UCOL_MAX_DIGITS_FOR_NUMBER;
-                        }
-                        ch = initial_ch;
-                        loadState(source, &initialState, FALSE);
-                        digIndx = endIndex = leadingZeroIndex = trailingZeroCount = 0;
-                        collateVal = 0;
-                        nonZeroValReached = FALSE;
-                    }
-
-                    if (! nonZeroValReached) {
-                        digIndx = 2;
-                        trailingZeroCount = 0;
-                        numTempBuf[2] = 6;
-                    }
-
-                    if ((digIndx + trailingZeroCount) % 2 != 0) {
-                        numTempBuf[((digIndx)/2) + 2] = collateVal*2 + 6;
-                        digIndx += 1;       // The implicit leading zero
-                    }
-                    if (trailingZeroCount % 2 != 0) {
-                        // We had to consume one trailing zero for the low digit
-                        // of the least significant byte
-                        digIndx += 1;       // The trailing zero not in the exponent
-                        trailingZeroCount -= 1;
-                    }
-
-                    endIndex = leadingZeroIndex ? leadingZeroIndex : ((digIndx/2) + 2) ;
-
-                    // Subtract one off of the last byte. Really the first byte here, but it's reversed...
-                    numTempBuf[2] -= 1;
-
-                    /*
-                    We want to skip over the first two slots in the buffer. The first slot
-                    is reserved for the header byte UCOL_CODAN_PLACEHOLDER. The second slot is for the
-                    sign/exponent byte: 0x80 + (decimalPos/2) & 7f.
-                    The exponent must be adjusted by the number of leading zeroes, and the number of
-                    trailing zeroes.
-                    */
-                    numTempBuf[0] = UCOL_CODAN_PLACEHOLDER;
-                    uint32_t exponent = (digIndx+trailingZeroCount)/2;
-                    if (leadingZeroIndex)
-                        exponent -= ((digIndx/2) + 2 - leadingZeroIndex);
-                    numTempBuf[1] = (uint8_t)(0x80 + (exponent & 0x7F));
-
-                    // Now transfer the collation key to our collIterate struct.
-                    // The total size for our collation key is half of endIndex, rounded up.
-                    int32_t size = (endIndex+1)/2;
-                    if(!ensureCEsCapacity(source, size)) {
-                        return (uint32_t)UCOL_NULLORDER;
-                    }
-                    *(source->CEpos++) = (((numTempBuf[0] << 8) | numTempBuf[1]) << UCOL_PRIMARYORDERSHIFT) | //Primary weight
-                        (UCOL_BYTE_COMMON << UCOL_SECONDARYORDERSHIFT) | // Secondary weight
-                        UCOL_BYTE_COMMON; // Tertiary weight.
-                    i = endIndex - 1; // Reset the index into the buffer.
-                    while(i >= 2) {
-                        uint32_t primWeight = numTempBuf[i--] << 8;
-                        if ( i >= 2)
-                            primWeight |= numTempBuf[i--];
-                        *(source->CEpos++) = (primWeight << UCOL_PRIMARYORDERSHIFT) | UCOL_CONTINUATION_MARKER;
-                    }
-
-                    source->toReturn = source->CEpos -1;
-                    return *(source->toReturn);
-                } else {
-                    CEOffset = (uint32_t *)coll->image + getExpansionOffset(CE);
-                    CE = *(CEOffset++);
-                    break;
-                }
-            }
-
-        case HANGUL_SYLLABLE_TAG: /* AC00-D7AF*/
-            {
-                static const uint32_t
-                    SBase = 0xAC00, LBase = 0x1100, VBase = 0x1161, TBase = 0x11A7;
-                //const uint32_t LCount = 19;
-                static const uint32_t VCount = 21;
-                static const uint32_t TCount = 28;
-                //const uint32_t NCount = VCount * TCount;   /* 588 */
-                //const uint32_t SCount = LCount * NCount;   /* 11172 */
-
-                uint32_t L = ch - SBase;
-                /*
-                divide into pieces.
-                we do it in this order since some compilers can do % and / in one
-                operation
-                */
-                uint32_t T = L % TCount;
-                L /= TCount;
-                uint32_t V = L % VCount;
-                L /= VCount;
-
-                /* offset them */
-                L += LBase;
-                V += VBase;
-                T += TBase;
-
-                int32_t firstOffset = (int32_t)(source->pos - source->string);
-                source->appendOffset(firstOffset, *status);
-
-                /*
-                 * return the first CE, but first put the rest into the expansion buffer
-                 */
-                if (!source->coll->image->jamoSpecial) {
-                    *(source->CEpos++) = UTRIE_GET32_FROM_LEAD(&coll->mapping, L);
-                    *(source->CEpos++) = UTRIE_GET32_FROM_LEAD(&coll->mapping, V);
-                    source->appendOffset(firstOffset + 1, *status);
-
-                    if (T != TBase) {
-                        *(source->CEpos++) = UTRIE_GET32_FROM_LEAD(&coll->mapping, T);
-                        source->appendOffset(firstOffset + 1, *status);
-                    }
-
-                    source->toReturn = source->CEpos - 1;
-
-                    source->offsetReturn = source->offsetStore - 1;
-                    if (source->offsetReturn == source->offsetBuffer) {
-                        source->offsetStore = source->offsetBuffer;
-                    }
-
-                    return *(source->toReturn);
-                } else {
-                    // Since Hanguls pass the FCD check, it is
-                    // guaranteed that we won't be in
-                    // the normalization buffer if something like this happens
-
-                    // Move Jamos into normalization buffer
-                    UChar *tempbuffer = source->writableBuffer.getBuffer(5);
-                    int32_t tempbufferLength, jamoOffset;
-                    tempbuffer[0] = 0;
-                    tempbuffer[1] = (UChar)L;
-                    tempbuffer[2] = (UChar)V;
-                    if (T != TBase) {
-                        tempbuffer[3] = (UChar)T;
-                        tempbufferLength = 4;
-                    } else {
-                        tempbufferLength = 3;
-                    }
-                    source->writableBuffer.releaseBuffer(tempbufferLength);
-
-                    // Indicate where to continue in main input string after exhausting the writableBuffer
-                    if (source->pos  == source->string) {
-                        jamoOffset = 0;
-                        source->fcdPosition = NULL;
-                    } else {
-                        jamoOffset = source->pos - source->string;
-                        source->fcdPosition       = source->pos-1;
-                    }
-                    
-                    // Append offsets for the additional chars
-                    // (not the 0, and not the L whose offsets match the original Hangul)
-                    int32_t jamoRemaining = tempbufferLength - 2;
-                    jamoOffset++; // appended offsets should match end of original Hangul
-                    while (jamoRemaining-- > 0) {
-                        source->appendOffset(jamoOffset, *status);
-                    }
-
-                    source->offsetRepeatValue = jamoOffset;
-
-                    source->offsetReturn = source->offsetStore - 1;
-                    if (source->offsetReturn == source->offsetBuffer) {
-                        source->offsetStore = source->offsetBuffer;
-                    }
-
-                    source->pos               = source->writableBuffer.getTerminatedBuffer() + tempbufferLength;
-                    source->origFlags         = source->flags;
-                    source->flags            |= UCOL_ITER_INNORMBUF;
-                    source->flags            &= ~(UCOL_ITER_NORM | UCOL_ITER_HASLEN);
-
-                    return(UCOL_IGNORABLE);
-                }
-            }
-
-        case IMPLICIT_TAG:        /* everything that is not defined otherwise */
-            return getPrevImplicit(ch, source);
-
-            // TODO: Remove CJK implicits as they are handled by the getImplicitPrimary function
-        case CJK_IMPLICIT_TAG:    /* 0x3400-0x4DB5, 0x4E00-0x9FA5, 0xF900-0xFA2D*/
-            return getPrevImplicit(ch, source);
-
-        case SURROGATE_TAG:  /* This is a surrogate pair */
-            /* essentially an engaged lead surrogate. */
-            /* if you have encountered it here, it means that a */
-            /* broken sequence was encountered and this is an error */
-            return UCOL_NOT_FOUND;
-
-        case LEAD_SURROGATE_TAG:  /* D800-DBFF*/
-            return UCOL_NOT_FOUND; /* broken surrogate sequence */
-
-        case TRAIL_SURROGATE_TAG: /* DC00-DFFF*/
-            {
-                UChar32 cp = 0;
-                UChar  prevChar;
-                const UChar *prev;
-                if (isAtStartPrevIterate(source)) {
-                    /* we are at the start of the string, wrong place to be at */
-                    return UCOL_NOT_FOUND;
-                }
-                if (source->pos != source->writableBuffer.getBuffer()) {
-                    prev     = source->pos - 1;
-                } else {
-                    prev     = source->fcdPosition;
-                }
-                prevChar = *prev;
-
-                /* Handles Han and Supplementary characters here.*/
-                if (U16_IS_LEAD(prevChar)) {
-                    cp = ((((uint32_t)prevChar)<<10UL)+(ch)-(((uint32_t)0xd800<<10UL)+0xdc00-0x10000));
-                    source->pos = prev;
-                } else {
-                    return UCOL_NOT_FOUND; /* like unassigned */
-                }
-
-                return getPrevImplicit(cp, source);
-            }
-
-            /* UCA is filled with these. Tailorings are NOT_FOUND */
-            /* not yet implemented */
-        case CHARSET_TAG:  /* this tag always returns */
-            /* probably after 1.8 */
-            return UCOL_NOT_FOUND;
-
-        default:           /* this tag always returns */
-            *status = U_INTERNAL_PROGRAM_ERROR;
-            CE=0;
-            break;
-        }
-
-        if (CE <= UCOL_NOT_FOUND) {
-            break;
-        }
-    }
-
-    return CE;
-}
-
-/* This should really be a macro                                                                      */
-/* This function is used to reverse parts of a buffer. We need this operation when doing continuation */
-/* secondaries in French                                                                              */
-/*
-void uprv_ucol_reverse_buffer(uint8_t *start, uint8_t *end) {
-  uint8_t temp;
-  while(start<end) {
-    temp = *start;
-    *start++ = *end;
-    *end-- = temp;
-  }
-}
-*/
-
-#define uprv_ucol_reverse_buffer(TYPE, start, end) { \
-  TYPE tempA; \
-while((start)<(end)) { \
-    tempA = *(start); \
-    *(start)++ = *(end); \
-    *(end)-- = tempA; \
-} \
-}
-
-/****************************************************************************/
-/* Following are the sortkey generation functions                           */
-/*                                                                          */
-/****************************************************************************/
-
-U_CAPI int32_t U_EXPORT2
-ucol_mergeSortkeys(const uint8_t *src1, int32_t src1Length,
-                   const uint8_t *src2, int32_t src2Length,
-                   uint8_t *dest, int32_t destCapacity) {
-    /* check arguments */
-    if( src1==NULL || src1Length<-1 || src1Length==0 || (src1Length>0 && src1[src1Length-1]!=0) ||
-        src2==NULL || src2Length<-1 || src2Length==0 || (src2Length>0 && src2[src2Length-1]!=0) ||
-        destCapacity<0 || (destCapacity>0 && dest==NULL)
-    ) {
-        /* error, attempt to write a zero byte and return 0 */
-        if(dest!=NULL && destCapacity>0) {
-            *dest=0;
-        }
-        return 0;
-    }
-
-    /* check lengths and capacity */
-    if(src1Length<0) {
-        src1Length=(int32_t)uprv_strlen((const char *)src1)+1;
-    }
-    if(src2Length<0) {
-        src2Length=(int32_t)uprv_strlen((const char *)src2)+1;
-    }
-
-    int32_t destLength=src1Length+src2Length;
-    if(destLength>destCapacity) {
-        /* the merged sort key does not fit into the destination */
-        return destLength;
-    }
-
-    /* merge the sort keys with the same number of levels */
-    uint8_t *p=dest;
-    for(;;) {
-        /* copy level from src1 not including 00 or 01 */
-        uint8_t b;
-        while((b=*src1)>=2) {
-            ++src1;
-            *p++=b;
-        }
-
-        /* add a 02 merge separator */
-        *p++=2;
-
-        /* copy level from src2 not including 00 or 01 */
-        while((b=*src2)>=2) {
-            ++src2;
-            *p++=b;
-        }
-
-        /* if both sort keys have another level, then add a 01 level separator and continue */
-        if(*src1==1 && *src2==1) {
-            ++src1;
-            ++src2;
-            *p++=1;
-        } else {
-            break;
-        }
-    }
-
-    /*
-     * here, at least one sort key is finished now, but the other one
-     * might have some contents left from containing more levels;
-     * that contents is just appended to the result
-     */
-    if(*src1!=0) {
-        /* src1 is not finished, therefore *src2==0, and src1 is appended */
-        src2=src1;
-    }
-    /* append src2, "the other, unfinished sort key" */
-    while((*p++=*src2++)!=0) {}
-
-    /* the actual length might be less than destLength if either sort key contained illegally embedded zero bytes */
-    return (int32_t)(p-dest);
-}
-
-U_NAMESPACE_BEGIN
-
-class SortKeyByteSink : public ByteSink {
-public:
-    SortKeyByteSink(char *dest, int32_t destCapacity)
-            : buffer_(dest), capacity_(destCapacity),
-              appended_(0) {
-        if (buffer_ == NULL) {
-            capacity_ = 0;
-        } else if(capacity_ < 0) {
-            buffer_ = NULL;
-            capacity_ = 0;
-        }
-    }
-    virtual ~SortKeyByteSink();
-
-    virtual void Append(const char *bytes, int32_t n);
-    void Append(uint32_t b) {
-        if (appended_ < capacity_ || Resize(1, appended_)) {
-            buffer_[appended_] = (char)b;
-        }
-        ++appended_;
-    }
-    void Append(uint32_t b1, uint32_t b2) {
-        int32_t a2 = appended_ + 2;
-        if (a2 <= capacity_ || Resize(2, appended_)) {
-            buffer_[appended_] = (char)b1;
-            buffer_[appended_ + 1] = (char)b2;
-        } else if(appended_ < capacity_) {
-            buffer_[appended_] = (char)b1;
-        }
-        appended_ = a2;
-    }
-    virtual char *GetAppendBuffer(int32_t min_capacity,
-                                  int32_t desired_capacity_hint,
-                                  char *scratch, int32_t scratch_capacity,
-                                  int32_t *result_capacity);
-    int32_t NumberOfBytesAppended() const { return appended_; }
-    /** @return FALSE if memory allocation failed */
-    UBool IsOk() const { return buffer_ != NULL; }
-
-protected:
-    virtual void AppendBeyondCapacity(const char *bytes, int32_t n, int32_t length) = 0;
-    virtual UBool Resize(int32_t appendCapacity, int32_t length) = 0;
-
-    void SetNotOk() {
-        buffer_ = NULL;
-        capacity_ = 0;
-    }
-
-    char *buffer_;
-    int32_t capacity_;
-    int32_t appended_;
-
-private:
-    SortKeyByteSink(const SortKeyByteSink &); // copy constructor not implemented
-    SortKeyByteSink &operator=(const SortKeyByteSink &); // assignment operator not implemented
-};
-
-SortKeyByteSink::~SortKeyByteSink() {}
-
-void
-SortKeyByteSink::Append(const char *bytes, int32_t n) {
-    if (n <= 0 || bytes == NULL) {
-        return;
-    }
-    int32_t length = appended_;
-    appended_ += n;
-    if ((buffer_ + length) == bytes) {
-        return;  // the caller used GetAppendBuffer() and wrote the bytes already
-    }
-    int32_t available = capacity_ - length;
-    if (n <= available) {
-        uprv_memcpy(buffer_ + length, bytes, n);
-    } else {
-        AppendBeyondCapacity(bytes, n, length);
-    }
-}
-
-char *
-SortKeyByteSink::GetAppendBuffer(int32_t min_capacity,
-                                 int32_t desired_capacity_hint,
-                                 char *scratch,
-                                 int32_t scratch_capacity,
-                                 int32_t *result_capacity) {
-    if (min_capacity < 1 || scratch_capacity < min_capacity) {
-        *result_capacity = 0;
-        return NULL;
-    }
-    int32_t available = capacity_ - appended_;
-    if (available >= min_capacity) {
-        *result_capacity = available;
-        return buffer_ + appended_;
-    } else if (Resize(desired_capacity_hint, appended_)) {
-        *result_capacity = capacity_ - appended_;
-        return buffer_ + appended_;
-    } else {
-        *result_capacity = scratch_capacity;
-        return scratch;
-    }
-}
-
-class FixedSortKeyByteSink : public SortKeyByteSink {
-public:
-    FixedSortKeyByteSink(char *dest, int32_t destCapacity)
-            : SortKeyByteSink(dest, destCapacity) {}
-    virtual ~FixedSortKeyByteSink();
-
-private:
-    virtual void AppendBeyondCapacity(const char *bytes, int32_t n, int32_t length);
-    virtual UBool Resize(int32_t appendCapacity, int32_t length);
-};
-
-FixedSortKeyByteSink::~FixedSortKeyByteSink() {}
-
-void
-FixedSortKeyByteSink::AppendBeyondCapacity(const char *bytes, int32_t /*n*/, int32_t length) {
-    // buffer_ != NULL && bytes != NULL && n > 0 && appended_ > capacity_
-    // Fill the buffer completely.
-    int32_t available = capacity_ - length;
-    if (available > 0) {
-        uprv_memcpy(buffer_ + length, bytes, available);
-    }
-}
-
-UBool
-FixedSortKeyByteSink::Resize(int32_t /*appendCapacity*/, int32_t /*length*/) {
-    return FALSE;
-}
-
-class CollationKeyByteSink : public SortKeyByteSink {
-public:
-    CollationKeyByteSink(CollationKey &key)
-            : SortKeyByteSink(reinterpret_cast<char *>(key.getBytes()), key.getCapacity()),
-              key_(key) {}
-    virtual ~CollationKeyByteSink();
-
-private:
-    virtual void AppendBeyondCapacity(const char *bytes, int32_t n, int32_t length);
-    virtual UBool Resize(int32_t appendCapacity, int32_t length);
-
-    CollationKey &key_;
-};
-
-CollationKeyByteSink::~CollationKeyByteSink() {}
-
-void
-CollationKeyByteSink::AppendBeyondCapacity(const char *bytes, int32_t n, int32_t length) {
-    // buffer_ != NULL && bytes != NULL && n > 0 && appended_ > capacity_
-    if (Resize(n, length)) {
-        uprv_memcpy(buffer_ + length, bytes, n);
-    }
-}
-
-UBool
-CollationKeyByteSink::Resize(int32_t appendCapacity, int32_t length) {
-    if (buffer_ == NULL) {
-        return FALSE;  // allocation failed before already
-    }
-    int32_t newCapacity = 2 * capacity_;
-    int32_t altCapacity = length + 2 * appendCapacity;
-    if (newCapacity < altCapacity) {
-        newCapacity = altCapacity;
-    }
-    if (newCapacity < 200) {
-        newCapacity = 200;
-    }
-    uint8_t *newBuffer = key_.reallocate(newCapacity, length);
-    if (newBuffer == NULL) {
-        SetNotOk();
-        return FALSE;
-    }
-    buffer_ = reinterpret_cast<char *>(newBuffer);
-    capacity_ = newCapacity;
-    return TRUE;
-}
-
-/**
- * uint8_t byte buffer, similar to CharString but simpler.
- */
-class SortKeyLevel : public UMemory {
-public:
-    SortKeyLevel() : len(0), ok(TRUE) {}
-    ~SortKeyLevel() {}
-
-    /** @return FALSE if memory allocation failed */
-    UBool isOk() const { return ok; }
-    UBool isEmpty() const { return len == 0; }
-    int32_t length() const { return len; }
-    const uint8_t *data() const { return buffer.getAlias(); }
-    uint8_t operator[](int32_t index) const { return buffer[index]; }
-
-    void appendByte(uint32_t b);
-
-    void appendTo(ByteSink &sink) const {
-        sink.Append(reinterpret_cast<const char *>(buffer.getAlias()), len);
-    }
-
-    uint8_t &lastByte() {
-        U_ASSERT(len > 0);
-        return buffer[len - 1];
-    }
-
-    uint8_t *getLastFewBytes(int32_t n) {
-        if (ok && len >= n) {
-            return buffer.getAlias() + len - n;
-        } else {
-            return NULL;
-        }
-    }
-
-private:
-    MaybeStackArray<uint8_t, 40> buffer;
-    int32_t len;
-    UBool ok;
-
-    UBool ensureCapacity(int32_t appendCapacity);
-
-    SortKeyLevel(const SortKeyLevel &other); // forbid copying of this class
-    SortKeyLevel &operator=(const SortKeyLevel &other); // forbid copying of this class
-};
-
-void SortKeyLevel::appendByte(uint32_t b) {
-    if(len < buffer.getCapacity() || ensureCapacity(1)) {
-        buffer[len++] = (uint8_t)b;
-    }
-}
-
-UBool SortKeyLevel::ensureCapacity(int32_t appendCapacity) {
-    if(!ok) {
-        return FALSE;
-    }
-    int32_t newCapacity = 2 * buffer.getCapacity();
-    int32_t altCapacity = len + 2 * appendCapacity;
-    if (newCapacity < altCapacity) {
-        newCapacity = altCapacity;
-    }
-    if (newCapacity < 200) {
-        newCapacity = 200;
-    }
-    if(buffer.resize(newCapacity, len)==NULL) {
-        return ok = FALSE;
-    }
-    return TRUE;
-}
-
-U_NAMESPACE_END
-
-/* sortkey API */
-U_CAPI int32_t U_EXPORT2
-ucol_getSortKey(const    UCollator    *coll,
-        const    UChar        *source,
-        int32_t        sourceLength,
-        uint8_t        *result,
-        int32_t        resultLength)
-{
-    UTRACE_ENTRY(UTRACE_UCOL_GET_SORTKEY);
-    if (UTRACE_LEVEL(UTRACE_VERBOSE)) {
-        UTRACE_DATA3(UTRACE_VERBOSE, "coll=%p, source string = %vh ", coll, source,
-            ((sourceLength==-1 && source!=NULL) ? u_strlen(source) : sourceLength));
-    }
-
-    if(coll->delegate != NULL) {
-      return ((const Collator*)coll->delegate)->getSortKey(source, sourceLength, result, resultLength);
-    }
-
-    UErrorCode status = U_ZERO_ERROR;
-    int32_t keySize   = 0;
-
-    if(source != NULL) {
-        // source == NULL is actually an error situation, but we would need to
-        // have an error code to return it. Until we introduce a new
-        // API, it stays like this
-
-        /* this uses the function pointer that is set in updateinternalstate */
-        /* currently, there are two funcs: */
-        /*ucol_calcSortKey(...);*/
-        /*ucol_calcSortKeySimpleTertiary(...);*/
-
-        uint8_t noDest[1] = { 0 };
-        if(result == NULL) {
-            // Distinguish pure preflighting from an allocation error.
-            result = noDest;
-            resultLength = 0;
-        }
-        FixedSortKeyByteSink sink(reinterpret_cast<char *>(result), resultLength);
-        coll->sortKeyGen(coll, source, sourceLength, sink, &status);
-        if(U_SUCCESS(status)) {
-            keySize = sink.NumberOfBytesAppended();
-        }
-    }
-    UTRACE_DATA2(UTRACE_VERBOSE, "Sort Key = %vb", result, keySize);
-    UTRACE_EXIT_STATUS(status);
-    return keySize;
-}
-
-U_CFUNC int32_t
-ucol_getCollationKey(const UCollator *coll,
-                     const UChar *source, int32_t sourceLength,
-                     CollationKey &key,
-                     UErrorCode &errorCode) {
-    CollationKeyByteSink sink(key);
-    coll->sortKeyGen(coll, source, sourceLength, sink, &errorCode);
-    return sink.NumberOfBytesAppended();
-}
-
-// Is this primary weight compressible?
-// Returns false for multi-lead-byte scripts (digits, Latin, Han, implicit).
-// TODO: This should use per-lead-byte flags from FractionalUCA.txt.
-static inline UBool
-isCompressible(const UCollator * /*coll*/, uint8_t primary1) {
-    return UCOL_BYTE_FIRST_NON_LATIN_PRIMARY <= primary1 && primary1 <= maxRegularPrimary;
-}
-
-static
-inline void doCaseShift(SortKeyLevel &cases, uint32_t &caseShift) {
-    if (caseShift  == 0) {
-        cases.appendByte(UCOL_CASE_BYTE_START);
-        caseShift = UCOL_CASE_SHIFT_START;
-    }
-}
-
-// Packs the secondary buffer when processing French locale.
-static void
-packFrench(const uint8_t *secondaries, int32_t secsize, SortKeyByteSink &result) {
-    secondaries += secsize;  // We read the secondary-level bytes back to front.
-    uint8_t secondary;
-    int32_t count2 = 0;
-    int32_t i = 0;
-    // we use i here since the key size already accounts for terminators, so we'll discard the increment
-    for(i = 0; i<secsize; i++) {
-        secondary = *(secondaries-i-1);
-        /* This is compression code. */
-        if (secondary == UCOL_COMMON2) {
-            ++count2;
-        } else {
-            if (count2 > 0) {
-                if (secondary > UCOL_COMMON2) { // not necessary for 4th level.
-                    while (count2 > UCOL_TOP_COUNT2) {
-                        result.Append(UCOL_COMMON_TOP2 - UCOL_TOP_COUNT2);
-                        count2 -= (uint32_t)UCOL_TOP_COUNT2;
-                    }
-                    result.Append(UCOL_COMMON_TOP2 - (count2-1));
-                } else {
-                    while (count2 > UCOL_BOT_COUNT2) {
-                        result.Append(UCOL_COMMON_BOT2 + UCOL_BOT_COUNT2);
-                        count2 -= (uint32_t)UCOL_BOT_COUNT2;
-                    }
-                    result.Append(UCOL_COMMON_BOT2 + (count2-1));
-                }
-                count2 = 0;
-            }
-            result.Append(secondary);
-        }
-    }
-    if (count2 > 0) {
-        while (count2 > UCOL_BOT_COUNT2) {
-            result.Append(UCOL_COMMON_BOT2 + UCOL_BOT_COUNT2);
-            count2 -= (uint32_t)UCOL_BOT_COUNT2;
-        }
-        result.Append(UCOL_COMMON_BOT2 + (count2-1));
-    }
-}
-
-#define DEFAULT_ERROR_SIZE_FOR_CALCSORTKEY 0
-
-/* This is the sortkey work horse function */
-U_CFUNC void U_CALLCONV
-ucol_calcSortKey(const    UCollator    *coll,
-        const    UChar        *source,
-        int32_t        sourceLength,
-        SortKeyByteSink &result,
-        UErrorCode *status)
-{
-    if(U_FAILURE(*status)) {
-        return;
-    }
-
-    SortKeyByteSink &primaries = result;
-    SortKeyLevel secondaries;
-    SortKeyLevel tertiaries;
-    SortKeyLevel cases;
-    SortKeyLevel quads;
-
-    UnicodeString normSource;
-
-    int32_t len = (sourceLength == -1 ? u_strlen(source) : sourceLength);
-
-    UColAttributeValue strength = coll->strength;
-
-    uint8_t compareSec   = (uint8_t)((strength >= UCOL_SECONDARY)?0:0xFF);
-    uint8_t compareTer   = (uint8_t)((strength >= UCOL_TERTIARY)?0:0xFF);
-    uint8_t compareQuad  = (uint8_t)((strength >= UCOL_QUATERNARY)?0:0xFF);
-    UBool  compareIdent = (strength == UCOL_IDENTICAL);
-    UBool  doCase = (coll->caseLevel == UCOL_ON);
-    UBool  isFrenchSec = (coll->frenchCollation == UCOL_ON) && (compareSec == 0);
-    UBool  shifted = (coll->alternateHandling == UCOL_SHIFTED);
-    //UBool  qShifted = shifted && (compareQuad == 0);
-    UBool  doHiragana = (coll->hiraganaQ == UCOL_ON) && (compareQuad == 0);
-
-    uint32_t variableTopValue = coll->variableTopValue;
-    // TODO: UCOL_COMMON_BOT4 should be a function of qShifted. If we have no
-    // qShifted, we don't need to set UCOL_COMMON_BOT4 so high.
-    uint8_t UCOL_COMMON_BOT4 = (uint8_t)((coll->variableTopValue>>8)+1);
-    uint8_t UCOL_HIRAGANA_QUAD = 0;
-    if(doHiragana) {
-        UCOL_HIRAGANA_QUAD=UCOL_COMMON_BOT4++;
-        /* allocate one more space for hiragana, value for hiragana */
-    }
-    uint8_t UCOL_BOT_COUNT4 = (uint8_t)(0xFF - UCOL_COMMON_BOT4);
-
-    /* support for special features like caselevel and funky secondaries */
-    int32_t lastSecondaryLength = 0;
-    uint32_t caseShift = 0;
-
-    /* If we need to normalize, we'll do it all at once at the beginning! */
-    const Normalizer2 *norm2;
-    if(compareIdent) {
-        norm2 = Normalizer2Factory::getNFDInstance(*status);
-    } else if(coll->normalizationMode != UCOL_OFF) {
-        norm2 = Normalizer2Factory::getFCDInstance(*status);
-    } else {
-        norm2 = NULL;
-    }
-    if(norm2 != NULL) {
-        normSource.setTo(FALSE, source, len);
-        int32_t qcYesLength = norm2->spanQuickCheckYes(normSource, *status);
-        if(qcYesLength != len) {
-            UnicodeString unnormalized = normSource.tempSubString(qcYesLength);
-            normSource.truncate(qcYesLength);
-            norm2->normalizeSecondAndAppend(normSource, unnormalized, *status);
-            source = normSource.getBuffer();
-            len = normSource.length();
-        }
-    }
-    collIterate s;
-    IInit_collIterate(coll, source, len, &s, status);
-    if(U_FAILURE(*status)) {
-        return;
-    }
-    s.flags &= ~UCOL_ITER_NORM;  // source passed the FCD test or else was normalized.
-
-    uint32_t order = 0;
-
-    uint8_t primary1 = 0;
-    uint8_t primary2 = 0;
-    uint8_t secondary = 0;
-    uint8_t tertiary = 0;
-    uint8_t caseSwitch = coll->caseSwitch;
-    uint8_t tertiaryMask = coll->tertiaryMask;
-    int8_t tertiaryAddition = coll->tertiaryAddition;
-    uint8_t tertiaryTop = coll->tertiaryTop;
-    uint8_t tertiaryBottom = coll->tertiaryBottom;
-    uint8_t tertiaryCommon = coll->tertiaryCommon;
-    uint8_t caseBits = 0;
-
-    UBool wasShifted = FALSE;
-    UBool notIsContinuation = FALSE;
-
-    uint32_t count2 = 0, count3 = 0, count4 = 0;
-    uint8_t leadPrimary = 0;
-
-    for(;;) {
-        order = ucol_IGetNextCE(coll, &s, status);
-        if(order == UCOL_NO_MORE_CES) {
-            break;
-        }
-
-        if(order == 0) {
-            continue;
-        }
-
-        notIsContinuation = !isContinuation(order);
-
-        if(notIsContinuation) {
-            tertiary = (uint8_t)(order & UCOL_BYTE_SIZE_MASK);
-        } else {
-            tertiary = (uint8_t)((order & UCOL_REMOVE_CONTINUATION));
-        }
-
-        secondary = (uint8_t)((order >>= 8) & UCOL_BYTE_SIZE_MASK);
-        primary2 = (uint8_t)((order >>= 8) & UCOL_BYTE_SIZE_MASK);
-        primary1 = (uint8_t)(order >> 8);
-
-        uint8_t originalPrimary1 = primary1;
-        if(notIsContinuation && coll->leadBytePermutationTable != NULL) {
-            primary1 = coll->leadBytePermutationTable[primary1];
-        }
-
-        if((shifted && ((notIsContinuation && order <= variableTopValue && primary1 > 0)
-                        || (!notIsContinuation && wasShifted)))
-            || (wasShifted && primary1 == 0)) /* amendment to the UCA says that primary ignorables */
-        {
-            /* and other ignorables should be removed if following a shifted code point */
-            if(primary1 == 0) { /* if we were shifted and we got an ignorable code point */
-                /* we should just completely ignore it */
-                continue;
-            }
-            if(compareQuad == 0) {
-                if(count4 > 0) {
-                    while (count4 > UCOL_BOT_COUNT4) {
-                        quads.appendByte(UCOL_COMMON_BOT4 + UCOL_BOT_COUNT4);
-                        count4 -= UCOL_BOT_COUNT4;
-                    }
-                    quads.appendByte(UCOL_COMMON_BOT4 + (count4-1));
-                    count4 = 0;
-                }
-                /* We are dealing with a variable and we're treating them as shifted */
-                /* This is a shifted ignorable */
-                if(primary1 != 0) { /* we need to check this since we could be in continuation */
-                    quads.appendByte(primary1);
-                }
-                if(primary2 != 0) {
-                    quads.appendByte(primary2);
-                }
-            }
-            wasShifted = TRUE;
-        } else {
-            wasShifted = FALSE;
-            /* Note: This code assumes that the table is well built i.e. not having 0 bytes where they are not supposed to be. */
-            /* Usually, we'll have non-zero primary1 & primary2, except in cases of a-z and friends, when primary2 will   */
-            /* regular and simple sortkey calc */
-            if(primary1 != UCOL_IGNORABLE) {
-                if(notIsContinuation) {
-                    if(leadPrimary == primary1) {
-                        primaries.Append(primary2);
-                    } else {
-                        if(leadPrimary != 0) {
-                            primaries.Append((primary1 > leadPrimary) ? UCOL_BYTE_UNSHIFTED_MAX : UCOL_BYTE_UNSHIFTED_MIN);
-                        }
-                        if(primary2 == UCOL_IGNORABLE) {
-                            /* one byter, not compressed */
-                            primaries.Append(primary1);
-                            leadPrimary = 0;
-                        } else if(isCompressible(coll, originalPrimary1)) {
-                            /* compress */
-                            primaries.Append(leadPrimary = primary1, primary2);
-                        } else {
-                            leadPrimary = 0;
-                            primaries.Append(primary1, primary2);
-                        }
-                    }
-                } else { /* we are in continuation, so we're gonna add primary to the key don't care about compression */
-                    if(primary2 == UCOL_IGNORABLE) {
-                        primaries.Append(primary1);
-                    } else {
-                        primaries.Append(primary1, primary2);
-                    }
-                }
-            }
-
-            if(secondary > compareSec) {
-                if(!isFrenchSec) {
-                    /* This is compression code. */
-                    if (secondary == UCOL_COMMON2 && notIsContinuation) {
-                        ++count2;
-                    } else {
-                        if (count2 > 0) {
-                            if (secondary > UCOL_COMMON2) { // not necessary for 4th level.
-                                while (count2 > UCOL_TOP_COUNT2) {
-                                    secondaries.appendByte(UCOL_COMMON_TOP2 - UCOL_TOP_COUNT2);
-                                    count2 -= (uint32_t)UCOL_TOP_COUNT2;
-                                }
-                                secondaries.appendByte(UCOL_COMMON_TOP2 - (count2-1));
-                            } else {
-                                while (count2 > UCOL_BOT_COUNT2) {
-                                    secondaries.appendByte(UCOL_COMMON_BOT2 + UCOL_BOT_COUNT2);
-                                    count2 -= (uint32_t)UCOL_BOT_COUNT2;
-                                }
-                                secondaries.appendByte(UCOL_COMMON_BOT2 + (count2-1));
-                            }
-                            count2 = 0;
-                        }
-                        secondaries.appendByte(secondary);
-                    }
-                } else {
-                    /* Do the special handling for French secondaries */
-                    /* We need to get continuation elements and do intermediate restore */
-                    /* abc1c2c3de with french secondaries need to be edc1c2c3ba NOT edc3c2c1ba */
-                    if(notIsContinuation) {
-                        if (lastSecondaryLength > 1) {
-                            uint8_t *frenchStartPtr = secondaries.getLastFewBytes(lastSecondaryLength);
-                            if (frenchStartPtr != NULL) {
-                                /* reverse secondaries from frenchStartPtr up to frenchEndPtr */
-                                uint8_t *frenchEndPtr = frenchStartPtr + lastSecondaryLength - 1;
-                                uprv_ucol_reverse_buffer(uint8_t, frenchStartPtr, frenchEndPtr);
-                            }
-                        }
-                        lastSecondaryLength = 1;
-                    } else {
-                        ++lastSecondaryLength;
-                    }
-                    secondaries.appendByte(secondary);
-                }
-            }
-
-            if(doCase && (primary1 > 0 || strength >= UCOL_SECONDARY)) {
-                // do the case level if we need to do it. We don't want to calculate
-                // case level for primary ignorables if we have only primary strength and case level
-                // otherwise we would break well formedness of CEs
-                doCaseShift(cases, caseShift);
-                if(notIsContinuation) {
-                    caseBits = (uint8_t)(tertiary & 0xC0);
-
-                    if(tertiary != 0) {
-                        if(coll->caseFirst == UCOL_UPPER_FIRST) {
-                            if((caseBits & 0xC0) == 0) {
-                                cases.lastByte() |= 1 << (--caseShift);
-                            } else {
-                                cases.lastByte() |= 0 << (--caseShift);
-                                /* second bit */
-                                doCaseShift(cases, caseShift);
-                                cases.lastByte() |= ((caseBits>>6)&1) << (--caseShift);
-                            }
-                        } else {
-                            if((caseBits & 0xC0) == 0) {
-                                cases.lastByte() |= 0 << (--caseShift);
-                            } else {
-                                cases.lastByte() |= 1 << (--caseShift);
-                                /* second bit */
-                                doCaseShift(cases, caseShift);
-                                cases.lastByte() |= ((caseBits>>7)&1) << (--caseShift);
-                            }
-                        }
-                    }
-                }
-            } else {
-                if(notIsContinuation) {
-                    tertiary ^= caseSwitch;
-                }
-            }
-
-            tertiary &= tertiaryMask;
-            if(tertiary > compareTer) {
-                /* This is compression code. */
-                /* sequence size check is included in the if clause */
-                if (tertiary == tertiaryCommon && notIsContinuation) {
-                    ++count3;
-                } else {
-                    if(tertiary > tertiaryCommon && tertiaryCommon == UCOL_COMMON3_NORMAL) {
-                        tertiary += tertiaryAddition;
-                    } else if(tertiary <= tertiaryCommon && tertiaryCommon == UCOL_COMMON3_UPPERFIRST) {
-                        tertiary -= tertiaryAddition;
-                    }
-                    if (count3 > 0) {
-                        if ((tertiary > tertiaryCommon)) {
-                            while (count3 > coll->tertiaryTopCount) {
-                                tertiaries.appendByte(tertiaryTop - coll->tertiaryTopCount);
-                                count3 -= (uint32_t)coll->tertiaryTopCount;
-                            }
-                            tertiaries.appendByte(tertiaryTop - (count3-1));
-                        } else {
-                            while (count3 > coll->tertiaryBottomCount) {
-                                tertiaries.appendByte(tertiaryBottom + coll->tertiaryBottomCount);
-                                count3 -= (uint32_t)coll->tertiaryBottomCount;
-                            }
-                            tertiaries.appendByte(tertiaryBottom + (count3-1));
-                        }
-                        count3 = 0;
-                    }
-                    tertiaries.appendByte(tertiary);
-                }
-            }
-
-            if(/*qShifted*/(compareQuad==0)  && notIsContinuation) {
-                if(s.flags & UCOL_WAS_HIRAGANA) { // This was Hiragana and we need to note it
-                    if(count4>0) { // Close this part
-                        while (count4 > UCOL_BOT_COUNT4) {
-                            quads.appendByte(UCOL_COMMON_BOT4 + UCOL_BOT_COUNT4);
-                            count4 -= UCOL_BOT_COUNT4;
-                        }
-                        quads.appendByte(UCOL_COMMON_BOT4 + (count4-1));
-                        count4 = 0;
-                    }
-                    quads.appendByte(UCOL_HIRAGANA_QUAD); // Add the Hiragana
-                } else { // This wasn't Hiragana, so we can continue adding stuff
-                    count4++;
-                }
-            }
-        }
-    }
-
-    /* Here, we are generally done with processing */
-    /* bailing out would not be too productive */
-
-    UBool ok = TRUE;
-    if(U_SUCCESS(*status)) {
-        /* we have done all the CE's, now let's put them together to form a key */
-        if(compareSec == 0) {
-            if (count2 > 0) {
-                while (count2 > UCOL_BOT_COUNT2) {
-                    secondaries.appendByte(UCOL_COMMON_BOT2 + UCOL_BOT_COUNT2);
-                    count2 -= (uint32_t)UCOL_BOT_COUNT2;
-                }
-                secondaries.appendByte(UCOL_COMMON_BOT2 + (count2-1));
-            }
-            result.Append(UCOL_LEVELTERMINATOR);
-            if(!secondaries.isOk()) {
-                ok = FALSE;
-            } else if(!isFrenchSec) {
-                secondaries.appendTo(result);
-            } else {
-                // If there are any unresolved continuation secondaries,
-                // reverse them here so that we can reverse the whole secondary thing.
-                if (lastSecondaryLength > 1) {
-                    uint8_t *frenchStartPtr = secondaries.getLastFewBytes(lastSecondaryLength);
-                    if (frenchStartPtr != NULL) {
-                        /* reverse secondaries from frenchStartPtr up to frenchEndPtr */
-                        uint8_t *frenchEndPtr = frenchStartPtr + lastSecondaryLength - 1;
-                        uprv_ucol_reverse_buffer(uint8_t, frenchStartPtr, frenchEndPtr);
-                    }
-                }
-                packFrench(secondaries.data(), secondaries.length(), result);
-            }
-        }
-
-        if(doCase) {
-            ok &= cases.isOk();
-            result.Append(UCOL_LEVELTERMINATOR);
-            cases.appendTo(result);
-        }
-
-        if(compareTer == 0) {
-            if (count3 > 0) {
-                if (coll->tertiaryCommon != UCOL_COMMON_BOT3) {
-                    while (count3 >= coll->tertiaryTopCount) {
-                        tertiaries.appendByte(tertiaryTop - coll->tertiaryTopCount);
-                        count3 -= (uint32_t)coll->tertiaryTopCount;
-                    }
-                    tertiaries.appendByte(tertiaryTop - count3);
-                } else {
-                    while (count3 > coll->tertiaryBottomCount) {
-                        tertiaries.appendByte(tertiaryBottom + coll->tertiaryBottomCount);
-                        count3 -= (uint32_t)coll->tertiaryBottomCount;
-                    }
-                    tertiaries.appendByte(tertiaryBottom + (count3-1));
-                }
-            }
-            ok &= tertiaries.isOk();
-            result.Append(UCOL_LEVELTERMINATOR);
-            tertiaries.appendTo(result);
-
-            if(compareQuad == 0/*qShifted == TRUE*/) {
-                if(count4 > 0) {
-                    while (count4 > UCOL_BOT_COUNT4) {
-                        quads.appendByte(UCOL_COMMON_BOT4 + UCOL_BOT_COUNT4);
-                        count4 -= UCOL_BOT_COUNT4;
-                    }
-                    quads.appendByte(UCOL_COMMON_BOT4 + (count4-1));
-                }
-                ok &= quads.isOk();
-                result.Append(UCOL_LEVELTERMINATOR);
-                quads.appendTo(result);
-            }
-
-            if(compareIdent) {
-                result.Append(UCOL_LEVELTERMINATOR);
-                u_writeIdenticalLevelRun(s.string, len, result);
-            }
-        }
-        result.Append(0);
-    }
-
-    /* To avoid memory leak, free the offset buffer if necessary. */
-    ucol_freeOffsetBuffer(&s);
-
-    ok &= result.IsOk();
-    if(!ok && U_SUCCESS(*status)) { *status = U_MEMORY_ALLOCATION_ERROR; }
-}
-
-
-U_CFUNC void U_CALLCONV
-ucol_calcSortKeySimpleTertiary(const    UCollator    *coll,
-        const    UChar        *source,
-        int32_t        sourceLength,
-        SortKeyByteSink &result,
-        UErrorCode *status)
-{
-    U_ALIGN_CODE(16);
-
-    if(U_FAILURE(*status)) {
-        return;
-    }
-
-    SortKeyByteSink &primaries = result;
-    SortKeyLevel secondaries;
-    SortKeyLevel tertiaries;
-
-    UnicodeString normSource;
-
-    int32_t len =  sourceLength;
-
-    /* If we need to normalize, we'll do it all at once at the beginning! */
-    if(coll->normalizationMode != UCOL_OFF) {
-        normSource.setTo(len < 0, source, len);
-        const Normalizer2 *norm2 = Normalizer2Factory::getFCDInstance(*status);
-        int32_t qcYesLength = norm2->spanQuickCheckYes(normSource, *status);
-        if(qcYesLength != normSource.length()) {
-            UnicodeString unnormalized = normSource.tempSubString(qcYesLength);
-            normSource.truncate(qcYesLength);
-            norm2->normalizeSecondAndAppend(normSource, unnormalized, *status);
-            source = normSource.getBuffer();
-            len = normSource.length();
-        }
-    }
-    collIterate s;
-    IInit_collIterate(coll, (UChar *)source, len, &s, status);
-    if(U_FAILURE(*status)) {
-        return;
-    }
-    s.flags &= ~UCOL_ITER_NORM;  // source passed the FCD test or else was normalized.
-
-    uint32_t order = 0;
-
-    uint8_t primary1 = 0;
-    uint8_t primary2 = 0;
-    uint8_t secondary = 0;
-    uint8_t tertiary = 0;
-    uint8_t caseSwitch = coll->caseSwitch;
-    uint8_t tertiaryMask = coll->tertiaryMask;
-    int8_t tertiaryAddition = coll->tertiaryAddition;
-    uint8_t tertiaryTop = coll->tertiaryTop;
-    uint8_t tertiaryBottom = coll->tertiaryBottom;
-    uint8_t tertiaryCommon = coll->tertiaryCommon;
-
-    UBool notIsContinuation = FALSE;
-
-    uint32_t count2 = 0, count3 = 0;
-    uint8_t leadPrimary = 0;
-
-    for(;;) {
-        order = ucol_IGetNextCE(coll, &s, status);
-
-        if(order == 0) {
-            continue;
-        }
-
-        if(order == UCOL_NO_MORE_CES) {
-            break;
-        }
-
-        notIsContinuation = !isContinuation(order);
-
-        if(notIsContinuation) {
-            tertiary = (uint8_t)((order & tertiaryMask));
-        } else {
-            tertiary = (uint8_t)((order & UCOL_REMOVE_CONTINUATION));
-        }
-
-        secondary = (uint8_t)((order >>= 8) & UCOL_BYTE_SIZE_MASK);
-        primary2 = (uint8_t)((order >>= 8) & UCOL_BYTE_SIZE_MASK);
-        primary1 = (uint8_t)(order >> 8);
-
-        uint8_t originalPrimary1 = primary1;
-        if (coll->leadBytePermutationTable != NULL && notIsContinuation) {
-            primary1 = coll->leadBytePermutationTable[primary1];
-        }
-
-        /* Note: This code assumes that the table is well built i.e. not having 0 bytes where they are not supposed to be. */
-        /* Usually, we'll have non-zero primary1 & primary2, except in cases of a-z and friends, when primary2 will   */
-        /* be zero with non zero primary1. primary3 is different than 0 only for long primaries - see above.               */
-        /* regular and simple sortkey calc */
-        if(primary1 != UCOL_IGNORABLE) {
-            if(notIsContinuation) {
-                if(leadPrimary == primary1) {
-                    primaries.Append(primary2);
-                } else {
-                    if(leadPrimary != 0) {
-                        primaries.Append((primary1 > leadPrimary) ? UCOL_BYTE_UNSHIFTED_MAX : UCOL_BYTE_UNSHIFTED_MIN);
-                    }
-                    if(primary2 == UCOL_IGNORABLE) {
-                        /* one byter, not compressed */
-                        primaries.Append(primary1);
-                        leadPrimary = 0;
-                    } else if(isCompressible(coll, originalPrimary1)) {
-                        /* compress */
-                        primaries.Append(leadPrimary = primary1, primary2);
-                    } else {
-                        leadPrimary = 0;
-                        primaries.Append(primary1, primary2);
-                    }
-                }
-            } else { /* we are in continuation, so we're gonna add primary to the key don't care about compression */
-                if(primary2 == UCOL_IGNORABLE) {
-                    primaries.Append(primary1);
-                } else {
-                    primaries.Append(primary1, primary2);
-                }
-            }
-        }
-
-        if(secondary > 0) { /* I think that != 0 test should be != IGNORABLE */
-            /* This is compression code. */
-            if (secondary == UCOL_COMMON2 && notIsContinuation) {
-                ++count2;
-            } else {
-                if (count2 > 0) {
-                    if (secondary > UCOL_COMMON2) { // not necessary for 4th level.
-                        while (count2 > UCOL_TOP_COUNT2) {
-                            secondaries.appendByte(UCOL_COMMON_TOP2 - UCOL_TOP_COUNT2);
-                            count2 -= (uint32_t)UCOL_TOP_COUNT2;
-                        }
-                        secondaries.appendByte(UCOL_COMMON_TOP2 - (count2-1));
-                    } else {
-                        while (count2 > UCOL_BOT_COUNT2) {
-                            secondaries.appendByte(UCOL_COMMON_BOT2 + UCOL_BOT_COUNT2);
-                            count2 -= (uint32_t)UCOL_BOT_COUNT2;
-                        }
-                        secondaries.appendByte(UCOL_COMMON_BOT2 + (count2-1));
-                    }
-                    count2 = 0;
-                }
-                secondaries.appendByte(secondary);
-            }
-        }
-
-        if(notIsContinuation) {
-            tertiary ^= caseSwitch;
-        }
-
-        if(tertiary > 0) {
-            /* This is compression code. */
-            /* sequence size check is included in the if clause */
-            if (tertiary == tertiaryCommon && notIsContinuation) {
-                ++count3;
-            } else {
-                if(tertiary > tertiaryCommon && tertiaryCommon == UCOL_COMMON3_NORMAL) {
-                    tertiary += tertiaryAddition;
-                } else if (tertiary <= tertiaryCommon && tertiaryCommon == UCOL_COMMON3_UPPERFIRST) {
-                    tertiary -= tertiaryAddition;
-                }
-                if (count3 > 0) {
-                    if ((tertiary > tertiaryCommon)) {
-                        while (count3 > coll->tertiaryTopCount) {
-                            tertiaries.appendByte(tertiaryTop - coll->tertiaryTopCount);
-                            count3 -= (uint32_t)coll->tertiaryTopCount;
-                        }
-                        tertiaries.appendByte(tertiaryTop - (count3-1));
-                    } else {
-                        while (count3 > coll->tertiaryBottomCount) {
-                            tertiaries.appendByte(tertiaryBottom + coll->tertiaryBottomCount);
-                            count3 -= (uint32_t)coll->tertiaryBottomCount;
-                        }
-                        tertiaries.appendByte(tertiaryBottom + (count3-1));
-                    }
-                    count3 = 0;
-                }
-                tertiaries.appendByte(tertiary);
-            }
-        }
-    }
-
-    UBool ok = TRUE;
-    if(U_SUCCESS(*status)) {
-        /* we have done all the CE's, now let's put them together to form a key */
-        if (count2 > 0) {
-            while (count2 > UCOL_BOT_COUNT2) {
-                secondaries.appendByte(UCOL_COMMON_BOT2 + UCOL_BOT_COUNT2);
-                count2 -= (uint32_t)UCOL_BOT_COUNT2;
-            }
-            secondaries.appendByte(UCOL_COMMON_BOT2 + (count2-1));
-        }
-        ok &= secondaries.isOk();
-        result.Append(UCOL_LEVELTERMINATOR);
-        secondaries.appendTo(result);
-
-        if (count3 > 0) {
-            if (coll->tertiaryCommon != UCOL_COMMON3_NORMAL) {
-                while (count3 >= coll->tertiaryTopCount) {
-                    tertiaries.appendByte(tertiaryTop - coll->tertiaryTopCount);
-                    count3 -= (uint32_t)coll->tertiaryTopCount;
-                }
-                tertiaries.appendByte(tertiaryTop - count3);
-            } else {
-                while (count3 > coll->tertiaryBottomCount) {
-                    tertiaries.appendByte(tertiaryBottom + coll->tertiaryBottomCount);
-                    count3 -= (uint32_t)coll->tertiaryBottomCount;
-                }
-                tertiaries.appendByte(tertiaryBottom + (count3-1));
-            }
-        }
-        ok &= tertiaries.isOk();
-        result.Append(UCOL_LEVELTERMINATOR);
-        tertiaries.appendTo(result);
-
-        result.Append(0);
-    }
-
-    /* To avoid memory leak, free the offset buffer if necessary. */
-    ucol_freeOffsetBuffer(&s);
-
-    ok &= result.IsOk();
-    if(!ok && U_SUCCESS(*status)) { *status = U_MEMORY_ALLOCATION_ERROR; }
-}
-
-static inline
-UBool isShiftedCE(uint32_t CE, uint32_t LVT, UBool *wasShifted) {
-    UBool notIsContinuation = !isContinuation(CE);
-    uint8_t primary1 = (uint8_t)((CE >> 24) & 0xFF);
-    if((LVT && ((notIsContinuation && (CE & 0xFFFF0000)<= LVT && primary1 > 0)
-               || (!notIsContinuation && *wasShifted)))
-        || (*wasShifted && primary1 == 0)) /* amendment to the UCA says that primary ignorables */
-    {
-        // The stuff below should probably be in the sortkey code... maybe not...
-        if(primary1 != 0) { /* if we were shifted and we got an ignorable code point */
-            /* we should just completely ignore it */
-            *wasShifted = TRUE;
-            //continue;
-        }
-        //*wasShifted = TRUE;
-        return TRUE;
-    } else {
-        *wasShifted = FALSE;
-        return FALSE;
-    }
-}
-static inline
-void terminatePSKLevel(int32_t level, int32_t maxLevel, int32_t &i, uint8_t *dest) {
-    if(level < maxLevel) {
-        dest[i++] = UCOL_LEVELTERMINATOR;
-    } else {
-        dest[i++] = 0;
-    }
-}
-
-/** enumeration of level identifiers for partial sort key generation */
-enum {
-  UCOL_PSK_PRIMARY = 0,
-    UCOL_PSK_SECONDARY = 1,
-    UCOL_PSK_CASE = 2,
-    UCOL_PSK_TERTIARY = 3,
-    UCOL_PSK_QUATERNARY = 4,
-    UCOL_PSK_QUIN = 5,      /** This is an extra level, not used - but we have three bits to blow */
-    UCOL_PSK_IDENTICAL = 6,
-    UCOL_PSK_NULL = 7,      /** level for the end of sort key. Will just produce zeros */
-    UCOL_PSK_LIMIT
-};
-
-/** collation state enum. *_SHIFT value is how much to shift right
- *  to get the state piece to the right. *_MASK value should be
- *  ANDed with the shifted state. This data is stored in state[1]
- *  field.
- */
-enum {
-    UCOL_PSK_LEVEL_SHIFT = 0,      /** level identificator. stores an enum value from above */
-    UCOL_PSK_LEVEL_MASK = 7,       /** three bits */
-    UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_SHIFT = 3, /** number of bytes of primary or quaternary already written */
-    UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_MASK = 1,
-    /** can be only 0 or 1, since we get up to two bytes from primary or quaternary
-     *  This field is also used to denote that the French secondary level is finished
-     */
-    UCOL_PSK_WAS_SHIFTED_SHIFT = 4,/** was the last value shifted */
-    UCOL_PSK_WAS_SHIFTED_MASK = 1, /** can be 0 or 1 (Boolean) */
-    UCOL_PSK_USED_FRENCH_SHIFT = 5,/** how many French bytes have we already written */
-    UCOL_PSK_USED_FRENCH_MASK = 3, /** up to 4 bytes. See comment just below */
-    /** When we do French we need to reverse secondary values. However, continuations
-     *  need to stay the same. So if you had abc1c2c3de, you need to have edc1c2c3ba
-     */
-    UCOL_PSK_BOCSU_BYTES_SHIFT = 7,
-    UCOL_PSK_BOCSU_BYTES_MASK = 3,
-    UCOL_PSK_CONSUMED_CES_SHIFT = 9,
-    UCOL_PSK_CONSUMED_CES_MASK = 0x7FFFF
-};
-
-// macro calculating the number of expansion CEs available
-#define uprv_numAvailableExpCEs(s) (s).CEpos - (s).toReturn
-
-
-/** main sortkey part procedure. On the first call,
- *  you should pass in a collator, an iterator, empty state
- *  state[0] == state[1] == 0, a buffer to hold results
- *  number of bytes you need and an error code pointer.
- *  Make sure your buffer is big enough to hold the wanted
- *  number of sortkey bytes. I don't check.
- *  The only meaningful status you can get back is
- *  U_BUFFER_OVERFLOW_ERROR, which basically means that you
- *  have been dealt a raw deal and that you probably won't
- *  be able to use partial sortkey generation for this
- *  particular combination of string and collator. This
- *  is highly unlikely, but you should still check the error code.
- *  Any other status means that you're not in a sane situation
- *  anymore. After the first call, preserve state values and
- *  use them on subsequent calls to obtain more bytes of a sortkey.
- *  Use until the number of bytes written is smaller than the requested
- *  number of bytes. Generated sortkey is not compatible with the
- *  one generated by ucol_getSortKey, as we don't do any compression.
- *  However, levels are still terminated by a 1 (one) and the sortkey
- *  is terminated by a 0 (zero). Identical level is the same as in the
- *  regular sortkey - internal bocu-1 implementation is used.
- *  For curious, although you cannot do much about this, here is
- *  the structure of state words.
- *  state[0] - iterator state. Depends on the iterator implementation,
- *             but allows the iterator to continue where it stopped in
- *             the last iteration.
- *  state[1] - collation processing state. Here is the distribution
- *             of the bits:
- *   0, 1, 2 - level of the sortkey - primary, secondary, case, tertiary
- *             quaternary, quin (we don't use this one), identical and
- *             null (producing only zeroes - first one to terminate the
- *             sortkey and subsequent to fill the buffer).
- *   3       - byte count. Number of bytes written on the primary level.
- *   4       - was shifted. Whether the previous iteration finished in the
- *             shifted state.
- *   5, 6    - French continuation bytes written. See the comment in the enum
- *   7,8     - Bocsu bytes used. Number of bytes from a bocu sequence on
- *             the identical level.
- *   9..31   - CEs consumed. Number of getCE or next32 operations performed
- *             since thes last successful update of the iterator state.
- */
-U_CAPI int32_t U_EXPORT2
-ucol_nextSortKeyPart(const UCollator *coll,
-                     UCharIterator *iter,
-                     uint32_t state[2],
-                     uint8_t *dest, int32_t count,
-                     UErrorCode *status)
-{
-    /* error checking */
-    if(status==NULL || U_FAILURE(*status)) {
-        return 0;
-    }
-    UTRACE_ENTRY(UTRACE_UCOL_NEXTSORTKEYPART);
-    if( coll==NULL || iter==NULL ||
-        state==NULL ||
-        count<0 || (count>0 && dest==NULL)
-    ) {
-        *status=U_ILLEGAL_ARGUMENT_ERROR;
-        UTRACE_EXIT_STATUS(status);
-        return 0;
-    }
-
-    UTRACE_DATA6(UTRACE_VERBOSE, "coll=%p, iter=%p, state=%d %d, dest=%p, count=%d",
-                  coll, iter, state[0], state[1], dest, count);
-
-    if(count==0) {
-        /* nothing to do */
-        UTRACE_EXIT_VALUE(0);
-        return 0;
-    }
-    /** Setting up situation according to the state we got from the previous iteration */
-    // The state of the iterator from the previous invocation
-    uint32_t iterState = state[0];
-    // Has the last iteration ended in the shifted state
-    UBool wasShifted = ((state[1] >> UCOL_PSK_WAS_SHIFTED_SHIFT) & UCOL_PSK_WAS_SHIFTED_MASK)?TRUE:FALSE;
-    // What is the current level of the sortkey?
-    int32_t level= (state[1] >> UCOL_PSK_LEVEL_SHIFT) & UCOL_PSK_LEVEL_MASK;
-    // Have we written only one byte from a two byte primary in the previous iteration?
-    // Also on secondary level - have we finished with the French secondary?
-    int32_t byteCountOrFrenchDone = (state[1] >> UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_SHIFT) & UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_MASK;
-    // number of bytes in the continuation buffer for French
-    int32_t usedFrench = (state[1] >> UCOL_PSK_USED_FRENCH_SHIFT) & UCOL_PSK_USED_FRENCH_MASK;
-    // Number of bytes already written from a bocsu sequence. Since
-    // the longes bocsu sequence is 4 long, this can be up to 3.
-    int32_t bocsuBytesUsed = (state[1] >> UCOL_PSK_BOCSU_BYTES_SHIFT) & UCOL_PSK_BOCSU_BYTES_MASK;
-    // Number of elements that need to be consumed in this iteration because
-    // the iterator returned UITER_NO_STATE at the end of the last iteration,
-    // so we had to save the last valid state.
-    int32_t cces = (state[1] >> UCOL_PSK_CONSUMED_CES_SHIFT) & UCOL_PSK_CONSUMED_CES_MASK;
-
-    /** values that depend on the collator attributes */
-    // strength of the collator.
-    int32_t strength = ucol_getAttribute(coll, UCOL_STRENGTH, status);
-    // maximal level of the partial sortkey. Need to take whether case level is done
-    int32_t maxLevel = 0;
-    if(strength < UCOL_TERTIARY) {
-        if(ucol_getAttribute(coll, UCOL_CASE_LEVEL, status) == UCOL_ON) {
-            maxLevel = UCOL_PSK_CASE;
-        } else {
-            maxLevel = strength;
-        }
-    } else {
-        if(strength == UCOL_TERTIARY) {
-            maxLevel = UCOL_PSK_TERTIARY;
-        } else if(strength == UCOL_QUATERNARY) {
-            maxLevel = UCOL_PSK_QUATERNARY;
-        } else { // identical
-            maxLevel = UCOL_IDENTICAL;
-        }
-    }
-    // value for the quaternary level if Hiragana is encountered. Used for JIS X 4061 collation
-    uint8_t UCOL_HIRAGANA_QUAD =
-      (ucol_getAttribute(coll, UCOL_HIRAGANA_QUATERNARY_MODE, status) == UCOL_ON)?0xFE:0xFF;
-    // Boundary value that decides whether a CE is shifted or not
-    uint32_t LVT = (coll->alternateHandling == UCOL_SHIFTED)?(coll->variableTopValue<<16):0;
-    // Are we doing French collation?
-    UBool doingFrench = (ucol_getAttribute(coll, UCOL_FRENCH_COLLATION, status) == UCOL_ON);
-
-    /** initializing the collation state */
-    UBool notIsContinuation = FALSE;
-    uint32_t CE = UCOL_NO_MORE_CES;
-
-    collIterate s;
-    IInit_collIterate(coll, NULL, -1, &s, status);
-    if(U_FAILURE(*status)) {
-        UTRACE_EXIT_STATUS(*status);
-        return 0;
-    }
-    s.iterator = iter;
-    s.flags |= UCOL_USE_ITERATOR;
-    // This variable tells us whether we have produced some other levels in this iteration
-    // before we moved to the identical level. In that case, we need to switch the
-    // type of the iterator.
-    UBool doingIdenticalFromStart = FALSE;
-    // Normalizing iterator
-    // The division for the array length may truncate the array size to
-    // a little less than UNORM_ITER_SIZE, but that size is dimensioned too high
-    // for all platforms anyway.
-    UAlignedMemory stackNormIter[UNORM_ITER_SIZE/sizeof(UAlignedMemory)];
-    UNormIterator *normIter = NULL;
-    // If the normalization is turned on for the collator and we are below identical level
-    // we will use a FCD normalizing iterator
-    if(ucol_getAttribute(coll, UCOL_NORMALIZATION_MODE, status) == UCOL_ON && level < UCOL_PSK_IDENTICAL) {
-        normIter = unorm_openIter(stackNormIter, sizeof(stackNormIter), status);
-        s.iterator = unorm_setIter(normIter, iter, UNORM_FCD, status);
-        s.flags &= ~UCOL_ITER_NORM;
-        if(U_FAILURE(*status)) {
-            UTRACE_EXIT_STATUS(*status);
-            return 0;
-        }
-    } else if(level == UCOL_PSK_IDENTICAL) {
-        // for identical level, we need a NFD iterator. We need to instantiate it here, since we
-        // will be updating the state - and this cannot be done on an ordinary iterator.
-        normIter = unorm_openIter(stackNormIter, sizeof(stackNormIter), status);
-        s.iterator = unorm_setIter(normIter, iter, UNORM_NFD, status);
-        s.flags &= ~UCOL_ITER_NORM;
-        if(U_FAILURE(*status)) {
-            UTRACE_EXIT_STATUS(*status);
-            return 0;
-        }
-        doingIdenticalFromStart = TRUE;
-    }
-
-    // This is the tentative new state of the iterator. The problem
-    // is that the iterator might return an undefined state, in
-    // which case we should save the last valid state and increase
-    // the iterator skip value.
-    uint32_t newState = 0;
-
-    // First, we set the iterator to the last valid position
-    // from the last iteration. This was saved in state[0].
-    if(iterState == 0) {
-        /* initial state */
-        if(level == UCOL_PSK_SECONDARY && doingFrench && !byteCountOrFrenchDone) {
-            s.iterator->move(s.iterator, 0, UITER_LIMIT);
-        } else {
-            s.iterator->move(s.iterator, 0, UITER_START);
-        }
-    } else {
-        /* reset to previous state */
-        s.iterator->setState(s.iterator, iterState, status);
-        if(U_FAILURE(*status)) {
-            UTRACE_EXIT_STATUS(*status);
-            return 0;
-        }
-    }
-
-
-
-    // This variable tells us whether we can attempt to update the state
-    // of iterator. Situations where we don't want to update iterator state
-    // are the existence of expansion CEs that are not yet processed, and
-    // finishing the case level without enough space in the buffer to insert
-    // a level terminator.
-    UBool canUpdateState = TRUE;
-
-    // Consume all the CEs that were consumed at the end of the previous
-    // iteration without updating the iterator state. On identical level,
-    // consume the code points.
-    int32_t counter = cces;
-    if(level < UCOL_PSK_IDENTICAL) {
-        while(counter-->0) {
-            // If we're doing French and we are on the secondary level,
-            // we go backwards.
-            if(level == UCOL_PSK_SECONDARY && doingFrench) {
-                CE = ucol_IGetPrevCE(coll, &s, status);
-            } else {
-                CE = ucol_IGetNextCE(coll, &s, status);
-            }
-            if(CE==UCOL_NO_MORE_CES) {
-                /* should not happen */
-                *status=U_INTERNAL_PROGRAM_ERROR;
-                UTRACE_EXIT_STATUS(*status);
-                return 0;
-            }
-            if(uprv_numAvailableExpCEs(s)) {
-                canUpdateState = FALSE;
-            }
-        }
-    } else {
-        while(counter-->0) {
-            uiter_next32(s.iterator);
-        }
-    }
-
-    // French secondary needs to know whether the iterator state of zero came from previous level OR
-    // from a new invocation...
-    UBool wasDoingPrimary = FALSE;
-    // destination buffer byte counter. When this guy
-    // gets to count, we're done with the iteration
-    int32_t i = 0;
-    // used to count the zero bytes written after we
-    // have finished with the sort key
-    int32_t j = 0;
-
-
-    // Hm.... I think we're ready to plunge in. Basic story is as following:
-    // we have a fall through case based on level. This is used for initial
-    // positioning on iteration start. Every level processor contains a
-    // for(;;) which will be broken when we exhaust all the CEs. Other
-    // way to exit is a goto saveState, which happens when we have filled
-    // out our buffer.
-    switch(level) {
-    case UCOL_PSK_PRIMARY:
-        wasDoingPrimary = TRUE;
-        for(;;) {
-            if(i==count) {
-                goto saveState;
-            }
-            // We should save the state only if we
-            // are sure that we are done with the
-            // previous iterator state
-            if(canUpdateState && byteCountOrFrenchDone == 0) {
-                newState = s.iterator->getState(s.iterator);
-                if(newState != UITER_NO_STATE) {
-                    iterState = newState;
-                    cces = 0;
-                }
-            }
-            CE = ucol_IGetNextCE(coll, &s, status);
-            cces++;
-            if(CE==UCOL_NO_MORE_CES) {
-                // Add the level separator
-                terminatePSKLevel(level, maxLevel, i, dest);
-                byteCountOrFrenchDone=0;
-                // Restart the iteration an move to the
-                // second level
-                s.iterator->move(s.iterator, 0, UITER_START);
-                cces = 0;
-                level = UCOL_PSK_SECONDARY;
-                break;
-            }
-            if(!isContinuation(CE)){
-                if(coll->leadBytePermutationTable != NULL){
-                    CE = (coll->leadBytePermutationTable[CE>>24] << 24) | (CE & 0x00FFFFFF);
-                }
-            }
-            if(!isShiftedCE(CE, LVT, &wasShifted)) {
-                CE >>= UCOL_PRIMARYORDERSHIFT; /* get primary */
-                if(CE != 0) {
-                    if(byteCountOrFrenchDone == 0) {
-                        // get the second byte of primary
-                        dest[i++]=(uint8_t)(CE >> 8);
-                    } else {
-                        byteCountOrFrenchDone = 0;
-                    }
-                    if((CE &=0xff)!=0) {
-                        if(i==count) {
-                            /* overflow */
-                            byteCountOrFrenchDone = 1;
-                            cces--;
-                            goto saveState;
-                        }
-                        dest[i++]=(uint8_t)CE;
-                    }
-                }
-            }
-            if(uprv_numAvailableExpCEs(s)) {
-                canUpdateState = FALSE;
-            } else {
-                canUpdateState = TRUE;
-            }
-        }
-        /* fall through to next level */
-    case UCOL_PSK_SECONDARY:
-        if(strength >= UCOL_SECONDARY) {
-            if(!doingFrench) {
-                for(;;) {
-                    if(i == count) {
-                        goto saveState;
-                    }
-                    // We should save the state only if we
-                    // are sure that we are done with the
-                    // previous iterator state
-                    if(canUpdateState) {
-                        newState = s.iterator->getState(s.iterator);
-                        if(newState != UITER_NO_STATE) {
-                            iterState = newState;
-                            cces = 0;
-                        }
-                    }
-                    CE = ucol_IGetNextCE(coll, &s, status);
-                    cces++;
-                    if(CE==UCOL_NO_MORE_CES) {
-                        // Add the level separator
-                        terminatePSKLevel(level, maxLevel, i, dest);
-                        byteCountOrFrenchDone = 0;
-                        // Restart the iteration an move to the
-                        // second level
-                        s.iterator->move(s.iterator, 0, UITER_START);
-                        cces = 0;
-                        level = UCOL_PSK_CASE;
-                        break;
-                    }
-                    if(!isShiftedCE(CE, LVT, &wasShifted)) {
-                        CE >>= 8; /* get secondary */
-                        if(CE != 0) {
-                            dest[i++]=(uint8_t)CE;
-                        }
-                    }
-                    if(uprv_numAvailableExpCEs(s)) {
-                        canUpdateState = FALSE;
-                    } else {
-                        canUpdateState = TRUE;
-                    }
-                }
-            } else { // French secondary processing
-                uint8_t frenchBuff[UCOL_MAX_BUFFER];
-                int32_t frenchIndex = 0;
-                // Here we are going backwards.
-                // If the iterator is at the beggining, it should be
-                // moved to end.
-                if(wasDoingPrimary) {
-                    s.iterator->move(s.iterator, 0, UITER_LIMIT);
-                    cces = 0;
-                }
-                for(;;) {
-                    if(i == count) {
-                        goto saveState;
-                    }
-                    if(canUpdateState) {
-                        newState = s.iterator->getState(s.iterator);
-                        if(newState != UITER_NO_STATE) {
-                            iterState = newState;
-                            cces = 0;
-                        }
-                    }
-                    CE = ucol_IGetPrevCE(coll, &s, status);
-                    cces++;
-                    if(CE==UCOL_NO_MORE_CES) {
-                        // Add the level separator
-                        terminatePSKLevel(level, maxLevel, i, dest);
-                        byteCountOrFrenchDone = 0;
-                        // Restart the iteration an move to the next level
-                        s.iterator->move(s.iterator, 0, UITER_START);
-                        level = UCOL_PSK_CASE;
-                        break;
-                    }
-                    if(isContinuation(CE)) { // if it's a continuation, we want to save it and
-                        // reverse when we get a first non-continuation CE.
-                        CE >>= 8;
-                        frenchBuff[frenchIndex++] = (uint8_t)CE;
-                    } else if(!isShiftedCE(CE, LVT, &wasShifted)) {
-                        CE >>= 8; /* get secondary */
-                        if(!frenchIndex) {
-                            if(CE != 0) {
-                                dest[i++]=(uint8_t)CE;
-                            }
-                        } else {
-                            frenchBuff[frenchIndex++] = (uint8_t)CE;
-                            frenchIndex -= usedFrench;
-                            usedFrench = 0;
-                            while(i < count && frenchIndex) {
-                                dest[i++] = frenchBuff[--frenchIndex];
-                                usedFrench++;
-                            }
-                        }
-                    }
-                    if(uprv_numAvailableExpCEs(s)) {
-                        canUpdateState = FALSE;
-                    } else {
-                        canUpdateState = TRUE;
-                    }
-                }
-            }
-        } else {
-            level = UCOL_PSK_CASE;
-        }
-        /* fall through to next level */
-    case UCOL_PSK_CASE:
-        if(ucol_getAttribute(coll, UCOL_CASE_LEVEL, status) == UCOL_ON) {
-            uint32_t caseShift = UCOL_CASE_SHIFT_START;
-            uint8_t caseByte = UCOL_CASE_BYTE_START;
-            uint8_t caseBits = 0;
-
-            for(;;) {
-                U_ASSERT(caseShift <= UCOL_CASE_SHIFT_START);
-                if(i == count) {
-                    goto saveState;
-                }
-                // We should save the state only if we
-                // are sure that we are done with the
-                // previous iterator state
-                if(canUpdateState) {
-                    newState = s.iterator->getState(s.iterator);
-                    if(newState != UITER_NO_STATE) {
-                        iterState = newState;
-                        cces = 0;
-                    }
-                }
-                CE = ucol_IGetNextCE(coll, &s, status);
-                cces++;
-                if(CE==UCOL_NO_MORE_CES) {
-                    // On the case level we might have an unfinished
-                    // case byte. Add one if it's started.
-                    if(caseShift != UCOL_CASE_SHIFT_START) {
-                        dest[i++] = caseByte;
-                    }
-                    cces = 0;
-                    // We have finished processing CEs on this level.
-                    // However, we don't know if we have enough space
-                    // to add a case level terminator.
-                    if(i < count) {
-                        // Add the level separator
-                        terminatePSKLevel(level, maxLevel, i, dest);
-                        // Restart the iteration and move to the
-                        // next level
-                        s.iterator->move(s.iterator, 0, UITER_START);
-                        level = UCOL_PSK_TERTIARY;
-                    } else {
-                        canUpdateState = FALSE;
-                    }
-                    break;
-                }
-
-                if(!isShiftedCE(CE, LVT, &wasShifted)) {
-                    if(!isContinuation(CE) && ((CE & UCOL_PRIMARYMASK) != 0 || strength > UCOL_PRIMARY)) {
-                        // do the case level if we need to do it. We don't want to calculate
-                        // case level for primary ignorables if we have only primary strength and case level
-                        // otherwise we would break well formedness of CEs
-                        CE = (uint8_t)(CE & UCOL_BYTE_SIZE_MASK);
-                        caseBits = (uint8_t)(CE & 0xC0);
-                        // this copies the case level logic from the
-                        // sort key generation code
-                        if(CE != 0) {
-                            if (caseShift == 0) {
-                                dest[i++] = caseByte;
-                                caseShift = UCOL_CASE_SHIFT_START;
-                                caseByte = UCOL_CASE_BYTE_START;
-                            }
-                            if(coll->caseFirst == UCOL_UPPER_FIRST) {
-                                if((caseBits & 0xC0) == 0) {
-                                    caseByte |= 1 << (--caseShift);
-                                } else {
-                                    caseByte |= 0 << (--caseShift);
-                                    /* second bit */
-                                    if(caseShift == 0) {
-                                        dest[i++] = caseByte;
-                                        caseShift = UCOL_CASE_SHIFT_START;
-                                        caseByte = UCOL_CASE_BYTE_START;
-                                    }
-                                    caseByte |= ((caseBits>>6)&1) << (--caseShift);
-                                }
-                            } else {
-                                if((caseBits & 0xC0) == 0) {
-                                    caseByte |= 0 << (--caseShift);
-                                } else {
-                                    caseByte |= 1 << (--caseShift);
-                                    /* second bit */
-                                    if(caseShift == 0) {
-                                        dest[i++] = caseByte;
-                                        caseShift = UCOL_CASE_SHIFT_START;
-                                        caseByte = UCOL_CASE_BYTE_START;
-                                    }
-                                    caseByte |= ((caseBits>>7)&1) << (--caseShift);
-                                }
-                            }
-                        }
-
-                    }
-                }
-                // Not sure this is correct for the case level - revisit
-                if(uprv_numAvailableExpCEs(s)) {
-                    canUpdateState = FALSE;
-                } else {
-                    canUpdateState = TRUE;
-                }
-            }
-        } else {
-            level = UCOL_PSK_TERTIARY;
-        }
-        /* fall through to next level */
-    case UCOL_PSK_TERTIARY:
-        if(strength >= UCOL_TERTIARY) {
-            for(;;) {
-                if(i == count) {
-                    goto saveState;
-                }
-                // We should save the state only if we
-                // are sure that we are done with the
-                // previous iterator state
-                if(canUpdateState) {
-                    newState = s.iterator->getState(s.iterator);
-                    if(newState != UITER_NO_STATE) {
-                        iterState = newState;
-                        cces = 0;
-                    }
-                }
-                CE = ucol_IGetNextCE(coll, &s, status);
-                cces++;
-                if(CE==UCOL_NO_MORE_CES) {
-                    // Add the level separator
-                    terminatePSKLevel(level, maxLevel, i, dest);
-                    byteCountOrFrenchDone = 0;
-                    // Restart the iteration an move to the
-                    // second level
-                    s.iterator->move(s.iterator, 0, UITER_START);
-                    cces = 0;
-                    level = UCOL_PSK_QUATERNARY;
-                    break;
-                }
-                if(!isShiftedCE(CE, LVT, &wasShifted)) {
-                    notIsContinuation = !isContinuation(CE);
-
-                    if(notIsContinuation) {
-                        CE = (uint8_t)(CE & UCOL_BYTE_SIZE_MASK);
-                        CE ^= coll->caseSwitch;
-                        CE &= coll->tertiaryMask;
-                    } else {
-                        CE = (uint8_t)((CE & UCOL_REMOVE_CONTINUATION));
-                    }
-
-                    if(CE != 0) {
-                        dest[i++]=(uint8_t)CE;
-                    }
-                }
-                if(uprv_numAvailableExpCEs(s)) {
-                    canUpdateState = FALSE;
-                } else {
-                    canUpdateState = TRUE;
-                }
-            }
-        } else {
-            // if we're not doing tertiary
-            // skip to the end
-            level = UCOL_PSK_NULL;
-        }
-        /* fall through to next level */
-    case UCOL_PSK_QUATERNARY:
-        if(strength >= UCOL_QUATERNARY) {
-            for(;;) {
-                if(i == count) {
-                    goto saveState;
-                }
-                // We should save the state only if we
-                // are sure that we are done with the
-                // previous iterator state
-                if(canUpdateState) {
-                    newState = s.iterator->getState(s.iterator);
-                    if(newState != UITER_NO_STATE) {
-                        iterState = newState;
-                        cces = 0;
-                    }
-                }
-                CE = ucol_IGetNextCE(coll, &s, status);
-                cces++;
-                if(CE==UCOL_NO_MORE_CES) {
-                    // Add the level separator
-                    terminatePSKLevel(level, maxLevel, i, dest);
-                    //dest[i++] = UCOL_LEVELTERMINATOR;
-                    byteCountOrFrenchDone = 0;
-                    // Restart the iteration an move to the
-                    // second level
-                    s.iterator->move(s.iterator, 0, UITER_START);
-                    cces = 0;
-                    level = UCOL_PSK_QUIN;
-                    break;
-                }
-                if(CE==0)
-                    continue;
-                if(isShiftedCE(CE, LVT, &wasShifted)) {
-                    CE >>= 16; /* get primary */
-                    if(CE != 0) {
-                        if(byteCountOrFrenchDone == 0) {
-                            dest[i++]=(uint8_t)(CE >> 8);
-                        } else {
-                            byteCountOrFrenchDone = 0;
-                        }
-                        if((CE &=0xff)!=0) {
-                            if(i==count) {
-                                /* overflow */
-                                byteCountOrFrenchDone = 1;
-                                goto saveState;
-                            }
-                            dest[i++]=(uint8_t)CE;
-                        }
-                    }
-                } else {
-                    notIsContinuation = !isContinuation(CE);
-                    if(notIsContinuation) {
-                        if(s.flags & UCOL_WAS_HIRAGANA) { // This was Hiragana and we need to note it
-                            dest[i++] = UCOL_HIRAGANA_QUAD;
-                        } else {
-                            dest[i++] = 0xFF;
-                        }
-                    }
-                }
-                if(uprv_numAvailableExpCEs(s)) {
-                    canUpdateState = FALSE;
-                } else {
-                    canUpdateState = TRUE;
-                }
-            }
-        } else {
-            // if we're not doing quaternary
-            // skip to the end
-            level = UCOL_PSK_NULL;
-        }
-        /* fall through to next level */
-    case UCOL_PSK_QUIN:
-        level = UCOL_PSK_IDENTICAL;
-        /* fall through to next level */
-    case UCOL_PSK_IDENTICAL:
-        if(strength >= UCOL_IDENTICAL) {
-            UChar32 first, second;
-            int32_t bocsuBytesWritten = 0;
-            // We always need to do identical on
-            // the NFD form of the string.
-            if(normIter == NULL) {
-                // we arrived from the level below and
-                // normalization was not turned on.
-                // therefore, we need to make a fresh NFD iterator
-                normIter = unorm_openIter(stackNormIter, sizeof(stackNormIter), status);
-                s.iterator = unorm_setIter(normIter, iter, UNORM_NFD, status);
-            } else if(!doingIdenticalFromStart) {
-                // there is an iterator, but we did some other levels.
-                // therefore, we have a FCD iterator - need to make
-                // a NFD one.
-                // normIter being at the beginning does not guarantee
-                // that the underlying iterator is at the beginning
-                iter->move(iter, 0, UITER_START);
-                s.iterator = unorm_setIter(normIter, iter, UNORM_NFD, status);
-            }
-            // At this point we have a NFD iterator that is positioned
-            // in the right place
-            if(U_FAILURE(*status)) {
-                UTRACE_EXIT_STATUS(*status);
-                return 0;
-            }
-            first = uiter_previous32(s.iterator);
-            // maybe we're at the start of the string
-            if(first == U_SENTINEL) {
-                first = 0;
-            } else {
-                uiter_next32(s.iterator);
-            }
-
-            j = 0;
-            for(;;) {
-                if(i == count) {
-                    if(j+1 < bocsuBytesWritten) {
-                        bocsuBytesUsed = j+1;
-                    }
-                    goto saveState;
-                }
-
-                // On identical level, we will always save
-                // the state if we reach this point, since
-                // we don't depend on getNextCE for content
-                // all the content is in our buffer and we
-                // already either stored the full buffer OR
-                // otherwise we won't arrive here.
-                newState = s.iterator->getState(s.iterator);
-                if(newState != UITER_NO_STATE) {
-                    iterState = newState;
-                    cces = 0;
-                }
-
-                uint8_t buff[4];
-                second = uiter_next32(s.iterator);
-                cces++;
-
-                // end condition for identical level
-                if(second == U_SENTINEL) {
-                    terminatePSKLevel(level, maxLevel, i, dest);
-                    level = UCOL_PSK_NULL;
-                    break;
-                }
-                bocsuBytesWritten = u_writeIdenticalLevelRunTwoChars(first, second, buff);
-                first = second;
-
-                j = 0;
-                if(bocsuBytesUsed != 0) {
-                    while(bocsuBytesUsed-->0) {
-                        j++;
-                    }
-                }
-
-                while(i < count && j < bocsuBytesWritten) {
-                    dest[i++] = buff[j++];
-                }
-            }
-
-        } else {
-            level = UCOL_PSK_NULL;
-        }
-        /* fall through to next level */
-    case UCOL_PSK_NULL:
-        j = i;
-        while(j<count) {
-            dest[j++]=0;
-        }
-        break;
-    default:
-        *status = U_INTERNAL_PROGRAM_ERROR;
-        UTRACE_EXIT_STATUS(*status);
-        return 0;
-    }
-
-saveState:
-    // Now we need to return stuff. First we want to see whether we have
-    // done everything for the current state of iterator.
-    if(byteCountOrFrenchDone
-        || canUpdateState == FALSE
-        || (newState = s.iterator->getState(s.iterator)) == UITER_NO_STATE)
-    {
-        // Any of above mean that the previous transaction
-        // wasn't finished and that we should store the
-        // previous iterator state.
-        state[0] = iterState;
-    } else {
-        // The transaction is complete. We will continue in the next iteration.
-        state[0] = s.iterator->getState(s.iterator);
-        cces = 0;
-    }
-    // Store the number of bocsu bytes written.
-    if((bocsuBytesUsed & UCOL_PSK_BOCSU_BYTES_MASK) != bocsuBytesUsed) {
-        *status = U_INDEX_OUTOFBOUNDS_ERROR;
-    }
-    state[1] = (bocsuBytesUsed & UCOL_PSK_BOCSU_BYTES_MASK) << UCOL_PSK_BOCSU_BYTES_SHIFT;
-
-    // Next we put in the level of comparison
-    state[1] |= ((level & UCOL_PSK_LEVEL_MASK) << UCOL_PSK_LEVEL_SHIFT);
-
-    // If we are doing French, we need to store whether we have just finished the French level
-    if(level == UCOL_PSK_SECONDARY && doingFrench) {
-        state[1] |= (((int32_t)(state[0] == 0) & UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_MASK) << UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_SHIFT);
-    } else {
-        state[1] |= ((byteCountOrFrenchDone & UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_MASK) << UCOL_PSK_BYTE_COUNT_OR_FRENCH_DONE_SHIFT);
-    }
-
-    // Was the latest CE shifted
-    if(wasShifted) {
-        state[1] |= 1 << UCOL_PSK_WAS_SHIFTED_SHIFT;
-    }
-    // Check for cces overflow
-    if((cces & UCOL_PSK_CONSUMED_CES_MASK) != cces) {
-        *status = U_INDEX_OUTOFBOUNDS_ERROR;
-    }
-    // Store cces
-    state[1] |= ((cces & UCOL_PSK_CONSUMED_CES_MASK) << UCOL_PSK_CONSUMED_CES_SHIFT);
-
-    // Check for French overflow
-    if((usedFrench & UCOL_PSK_USED_FRENCH_MASK) != usedFrench) {
-        *status = U_INDEX_OUTOFBOUNDS_ERROR;
-    }
-    // Store number of bytes written in the French secondary continuation sequence
-    state[1] |= ((usedFrench & UCOL_PSK_USED_FRENCH_MASK) << UCOL_PSK_USED_FRENCH_SHIFT);
-
-
-    // If we have used normalizing iterator, get rid of it
-    if(normIter != NULL) {
-        unorm_closeIter(normIter);
-    }
-
-    /* To avoid memory leak, free the offset buffer if necessary. */
-    ucol_freeOffsetBuffer(&s);
-    
-    // Return number of meaningful sortkey bytes.
-    UTRACE_DATA4(UTRACE_VERBOSE, "dest = %vb, state=%d %d",
-                  dest,i, state[0], state[1]);
-    UTRACE_EXIT_VALUE(i);
-    return i;
-}
-
-/**
- * Produce a bound for a given sortkey and a number of levels.
- */
-U_CAPI int32_t U_EXPORT2
-ucol_getBound(const uint8_t       *source,
-        int32_t             sourceLength,
-        UColBoundMode       boundType,
-        uint32_t            noOfLevels,
-        uint8_t             *result,
-        int32_t             resultLength,
-        UErrorCode          *status)
-{
-    // consistency checks
-    if(status == NULL || U_FAILURE(*status)) {
-        return 0;
-    }
-    if(source == NULL) {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        return 0;
-    }
-
-    int32_t sourceIndex = 0;
-    // Scan the string until we skip enough of the key OR reach the end of the key
-    do {
-        sourceIndex++;
-        if(source[sourceIndex] == UCOL_LEVELTERMINATOR) {
-            noOfLevels--;
-        }
-    } while (noOfLevels > 0
-        && (source[sourceIndex] != 0 || sourceIndex < sourceLength));
-
-    if((source[sourceIndex] == 0 || sourceIndex == sourceLength)
-        && noOfLevels > 0) {
-            *status = U_SORT_KEY_TOO_SHORT_WARNING;
-    }
-
-
-    // READ ME: this code assumes that the values for boundType
-    // enum will not changes. They are set so that the enum value
-    // corresponds to the number of extra bytes each bound type
-    // needs.
-    if(result != NULL && resultLength >= sourceIndex+boundType) {
-        uprv_memcpy(result, source, sourceIndex);
-        switch(boundType) {
-            // Lower bound just gets terminated. No extra bytes
-        case UCOL_BOUND_LOWER: // = 0
-            break;
-            // Upper bound needs one extra byte
-        case UCOL_BOUND_UPPER: // = 1
-            result[sourceIndex++] = 2;
-            break;
-            // Upper long bound needs two extra bytes
-        case UCOL_BOUND_UPPER_LONG: // = 2
-            result[sourceIndex++] = 0xFF;
-            result[sourceIndex++] = 0xFF;
-            break;
-        default:
-            *status = U_ILLEGAL_ARGUMENT_ERROR;
-            return 0;
-        }
-        result[sourceIndex++] = 0;
-
-        return sourceIndex;
-    } else {
-        return sourceIndex+boundType+1;
-    }
-}
-
-/****************************************************************************/
-/* Following are the functions that deal with the properties of a collator  */
-/* there are new APIs and some compatibility APIs                           */
-/****************************************************************************/
-
-static inline void
-ucol_addLatinOneEntry(UCollator *coll, UChar ch, uint32_t CE,
-                    int32_t *primShift, int32_t *secShift, int32_t *terShift)
-{
-    uint8_t primary1 = 0, primary2 = 0, secondary = 0, tertiary = 0;
-    UBool reverseSecondary = FALSE;
-    UBool continuation = isContinuation(CE);
-    if(!continuation) {
-        tertiary = (uint8_t)((CE & coll->tertiaryMask));
-        tertiary ^= coll->caseSwitch;
-        reverseSecondary = TRUE;
-    } else {
-        tertiary = (uint8_t)((CE & UCOL_REMOVE_CONTINUATION));
-        tertiary &= UCOL_REMOVE_CASE;
-        reverseSecondary = FALSE;
-    }
-
-    secondary = (uint8_t)((CE >>= 8) & UCOL_BYTE_SIZE_MASK);
-    primary2 = (uint8_t)((CE >>= 8) & UCOL_BYTE_SIZE_MASK);
-    primary1 = (uint8_t)(CE >> 8);
-
-    if(primary1 != 0) {
-        if (coll->leadBytePermutationTable != NULL && !continuation) {
-            primary1 = coll->leadBytePermutationTable[primary1];
-        }
-
-        coll->latinOneCEs[ch] |= (primary1 << *primShift);
-        *primShift -= 8;
-    }
-    if(primary2 != 0) {
-        if(*primShift < 0) {
-            coll->latinOneCEs[ch] = UCOL_BAIL_OUT_CE;
-            coll->latinOneCEs[coll->latinOneTableLen+ch] = UCOL_BAIL_OUT_CE;
-            coll->latinOneCEs[2*coll->latinOneTableLen+ch] = UCOL_BAIL_OUT_CE;
-            return;
-        }
-        coll->latinOneCEs[ch] |= (primary2 << *primShift);
-        *primShift -= 8;
-    }
-    if(secondary != 0) {
-        if(reverseSecondary && coll->frenchCollation == UCOL_ON) { // reverse secondary
-            coll->latinOneCEs[coll->latinOneTableLen+ch] >>= 8; // make space for secondary
-            coll->latinOneCEs[coll->latinOneTableLen+ch] |= (secondary << 24);
-        } else { // normal case
-            coll->latinOneCEs[coll->latinOneTableLen+ch] |= (secondary << *secShift);
-        }
-        *secShift -= 8;
-    }
-    if(tertiary != 0) {
-        coll->latinOneCEs[2*coll->latinOneTableLen+ch] |= (tertiary << *terShift);
-        *terShift -= 8;
-    }
-}
-
-static inline UBool
-ucol_resizeLatinOneTable(UCollator *coll, int32_t size, UErrorCode *status) {
-    uint32_t *newTable = (uint32_t *)uprv_malloc(size*sizeof(uint32_t)*3);
-    if(newTable == NULL) {
-      *status = U_MEMORY_ALLOCATION_ERROR;
-      coll->latinOneFailed = TRUE;
-      return FALSE;
-    }
-    int32_t sizeToCopy = ((size<coll->latinOneTableLen)?size:coll->latinOneTableLen)*sizeof(uint32_t);
-    uprv_memset(newTable, 0, size*sizeof(uint32_t)*3);
-    uprv_memcpy(newTable, coll->latinOneCEs, sizeToCopy);
-    uprv_memcpy(newTable+size, coll->latinOneCEs+coll->latinOneTableLen, sizeToCopy);
-    uprv_memcpy(newTable+2*size, coll->latinOneCEs+2*coll->latinOneTableLen, sizeToCopy);
-    coll->latinOneTableLen = size;
-    uprv_free(coll->latinOneCEs);
-    coll->latinOneCEs = newTable;
-    return TRUE;
-}
-
-static UBool
-ucol_setUpLatinOne(UCollator *coll, UErrorCode *status) {
-    UBool result = TRUE;
-    if(coll->latinOneCEs == NULL) {
-        coll->latinOneCEs = (uint32_t *)uprv_malloc(sizeof(uint32_t)*UCOL_LATINONETABLELEN*3);
-        if(coll->latinOneCEs == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return FALSE;
-        }
-        coll->latinOneTableLen = UCOL_LATINONETABLELEN;
-    }
-    UChar ch = 0;
-    UCollationElements *it = ucol_openElements(coll, &ch, 1, status);
-    // Check for null pointer 
-    if (U_FAILURE(*status)) {
-        ucol_closeElements(it);
-        return FALSE;
-    }
-    uprv_memset(coll->latinOneCEs, 0, sizeof(uint32_t)*coll->latinOneTableLen*3);
-
-    int32_t primShift = 24, secShift = 24, terShift = 24;
-    uint32_t CE = 0;
-    int32_t contractionOffset = UCOL_ENDOFLATINONERANGE+1;
-
-    // TODO: make safe if you get more than you wanted...
-    for(ch = 0; ch <= UCOL_ENDOFLATINONERANGE; ch++) {
-        primShift = 24; secShift = 24; terShift = 24;
-        if(ch < 0x100) {
-            CE = coll->latinOneMapping[ch];
-        } else {
-            CE = UTRIE_GET32_FROM_LEAD(&coll->mapping, ch);
-            if(CE == UCOL_NOT_FOUND && coll->UCA) {
-                CE = UTRIE_GET32_FROM_LEAD(&coll->UCA->mapping, ch);
-            }
-        }
-        if(CE < UCOL_NOT_FOUND) {
-            ucol_addLatinOneEntry(coll, ch, CE, &primShift, &secShift, &terShift);
-        } else {
-            switch (getCETag(CE)) {
-            case EXPANSION_TAG:
-            case DIGIT_TAG:
-                ucol_setText(it, &ch, 1, status);
-                while((int32_t)(CE = ucol_next(it, status)) != UCOL_NULLORDER) {
-                    if(primShift < 0 || secShift < 0 || terShift < 0) {
-                        coll->latinOneCEs[ch] = UCOL_BAIL_OUT_CE;
-                        coll->latinOneCEs[coll->latinOneTableLen+ch] = UCOL_BAIL_OUT_CE;
-                        coll->latinOneCEs[2*coll->latinOneTableLen+ch] = UCOL_BAIL_OUT_CE;
-                        break;
-                    }
-                    ucol_addLatinOneEntry(coll, ch, CE, &primShift, &secShift, &terShift);
-                }
-                break;
-            case CONTRACTION_TAG:
-                // here is the trick
-                // F2 is contraction. We do something very similar to contractions
-                // but have two indices, one in the real contraction table and the
-                // other to where we stuffed things. This hopes that we don't have
-                // many contractions (this should work for latin-1 tables).
-                {
-                    if((CE & 0x00FFF000) != 0) {
-                        *status = U_UNSUPPORTED_ERROR;
-                        goto cleanup_after_failure;
-                    }
-
-                    const UChar *UCharOffset = (UChar *)coll->image+getContractOffset(CE);
-
-                    CE |= (contractionOffset & 0xFFF) << 12; // insert the offset in latin-1 table
-
-                    coll->latinOneCEs[ch] = CE;
-                    coll->latinOneCEs[coll->latinOneTableLen+ch] = CE;
-                    coll->latinOneCEs[2*coll->latinOneTableLen+ch] = CE;
-
-                    // We're going to jump into contraction table, pick the elements
-                    // and use them
-                    do {
-                        CE = *(coll->contractionCEs +
-                            (UCharOffset - coll->contractionIndex));
-                        if(CE > UCOL_NOT_FOUND && getCETag(CE) == EXPANSION_TAG) {
-                            uint32_t size;
-                            uint32_t i;    /* general counter */
-                            uint32_t *CEOffset = (uint32_t *)coll->image+getExpansionOffset(CE); /* find the offset to expansion table */
-                            size = getExpansionCount(CE);
-                            //CE = *CEOffset++;
-                            if(size != 0) { /* if there are less than 16 elements in expansion, we don't terminate */
-                                for(i = 0; i<size; i++) {
-                                    if(primShift < 0 || secShift < 0 || terShift < 0) {
-                                        coll->latinOneCEs[(UChar)contractionOffset] = UCOL_BAIL_OUT_CE;
-                                        coll->latinOneCEs[coll->latinOneTableLen+(UChar)contractionOffset] = UCOL_BAIL_OUT_CE;
-                                        coll->latinOneCEs[2*coll->latinOneTableLen+(UChar)contractionOffset] = UCOL_BAIL_OUT_CE;
-                                        break;
-                                    }
-                                    ucol_addLatinOneEntry(coll, (UChar)contractionOffset, *CEOffset++, &primShift, &secShift, &terShift);
-                                }
-                            } else { /* else, we do */
-                                while(*CEOffset != 0) {
-                                    if(primShift < 0 || secShift < 0 || terShift < 0) {
-                                        coll->latinOneCEs[(UChar)contractionOffset] = UCOL_BAIL_OUT_CE;
-                                        coll->latinOneCEs[coll->latinOneTableLen+(UChar)contractionOffset] = UCOL_BAIL_OUT_CE;
-                                        coll->latinOneCEs[2*coll->latinOneTableLen+(UChar)contractionOffset] = UCOL_BAIL_OUT_CE;
-                                        break;
-                                    }
-                                    ucol_addLatinOneEntry(coll, (UChar)contractionOffset, *CEOffset++, &primShift, &secShift, &terShift);
-                                }
-                            }
-                            contractionOffset++;
-                        } else if(CE < UCOL_NOT_FOUND) {
-                            ucol_addLatinOneEntry(coll, (UChar)contractionOffset++, CE, &primShift, &secShift, &terShift);
-                        } else {
-                            coll->latinOneCEs[(UChar)contractionOffset] = UCOL_BAIL_OUT_CE;
-                            coll->latinOneCEs[coll->latinOneTableLen+(UChar)contractionOffset] = UCOL_BAIL_OUT_CE;
-                            coll->latinOneCEs[2*coll->latinOneTableLen+(UChar)contractionOffset] = UCOL_BAIL_OUT_CE;
-                            contractionOffset++;
-                        }
-                        UCharOffset++;
-                        primShift = 24; secShift = 24; terShift = 24;
-                        if(contractionOffset == coll->latinOneTableLen) { // we need to reallocate
-                            if(!ucol_resizeLatinOneTable(coll, 2*coll->latinOneTableLen, status)) {
-                                goto cleanup_after_failure;
-                            }
-                        }
-                    } while(*UCharOffset != 0xFFFF);
-                }
-                break;;
-            case SPEC_PROC_TAG:
-                {
-                    // 0xB7 is a precontext character defined in UCA5.1, a special
-                    // handle is implemeted in order to save LatinOne table for
-                    // most locales.
-                    if (ch==0xb7) {
-                        ucol_addLatinOneEntry(coll, ch, CE, &primShift, &secShift, &terShift);
-                    }
-                    else {
-                        goto cleanup_after_failure;
-                    }
-                }
-                break;
-            default:
-                goto cleanup_after_failure;
-            }
-        }
-    }
-    // compact table
-    if(contractionOffset < coll->latinOneTableLen) {
-        if(!ucol_resizeLatinOneTable(coll, contractionOffset, status)) {
-            goto cleanup_after_failure;
-        }
-    }
-    ucol_closeElements(it);
-    return result;
-
-cleanup_after_failure:
-    // status should already be set before arriving here.
-    coll->latinOneFailed = TRUE;
-    ucol_closeElements(it);
-    return FALSE;
-}
-
-void ucol_updateInternalState(UCollator *coll, UErrorCode *status) {
-    if(U_SUCCESS(*status)) {
-        if(coll->caseFirst == UCOL_UPPER_FIRST) {
-            coll->caseSwitch = UCOL_CASE_SWITCH;
-        } else {
-            coll->caseSwitch = UCOL_NO_CASE_SWITCH;
-        }
-
-        if(coll->caseLevel == UCOL_ON || coll->caseFirst == UCOL_OFF) {
-            coll->tertiaryMask = UCOL_REMOVE_CASE;
-            coll->tertiaryCommon = UCOL_COMMON3_NORMAL;
-            coll->tertiaryAddition = (int8_t)UCOL_FLAG_BIT_MASK_CASE_SW_OFF; /* Should be 0x80 */
-            coll->tertiaryTop = UCOL_COMMON_TOP3_CASE_SW_OFF;
-            coll->tertiaryBottom = UCOL_COMMON_BOT3;
-        } else {
-            coll->tertiaryMask = UCOL_KEEP_CASE;
-            coll->tertiaryAddition = UCOL_FLAG_BIT_MASK_CASE_SW_ON;
-            if(coll->caseFirst == UCOL_UPPER_FIRST) {
-                coll->tertiaryCommon = UCOL_COMMON3_UPPERFIRST;
-                coll->tertiaryTop = UCOL_COMMON_TOP3_CASE_SW_UPPER;
-                coll->tertiaryBottom = UCOL_COMMON_BOTTOM3_CASE_SW_UPPER;
-            } else {
-                coll->tertiaryCommon = UCOL_COMMON3_NORMAL;
-                coll->tertiaryTop = UCOL_COMMON_TOP3_CASE_SW_LOWER;
-                coll->tertiaryBottom = UCOL_COMMON_BOTTOM3_CASE_SW_LOWER;
-            }
-        }
-
-        /* Set the compression values */
-        uint8_t tertiaryTotal = (uint8_t)(coll->tertiaryTop - coll->tertiaryBottom - 1);
-        coll->tertiaryTopCount = (uint8_t)(UCOL_PROPORTION3*tertiaryTotal); /* we multilply double with int, but need only int */
-        coll->tertiaryBottomCount = (uint8_t)(tertiaryTotal - coll->tertiaryTopCount);
-
-        if(coll->caseLevel == UCOL_OFF && coll->strength == UCOL_TERTIARY
-            && coll->frenchCollation == UCOL_OFF && coll->alternateHandling == UCOL_NON_IGNORABLE)
-        {
-            coll->sortKeyGen = ucol_calcSortKeySimpleTertiary;
-        } else {
-            coll->sortKeyGen = ucol_calcSortKey;
-        }
-        if(coll->caseLevel == UCOL_OFF && coll->strength <= UCOL_TERTIARY && coll->numericCollation == UCOL_OFF
-            && coll->alternateHandling == UCOL_NON_IGNORABLE && !coll->latinOneFailed)
-        {
-            if(coll->latinOneCEs == NULL || coll->latinOneRegenTable) {
-                if(ucol_setUpLatinOne(coll, status)) { // if we succeed in building latin1 table, we'll use it
-                    //fprintf(stderr, "F");
-                    coll->latinOneUse = TRUE;
-                } else {
-                    coll->latinOneUse = FALSE;
-                }
-                if(*status == U_UNSUPPORTED_ERROR) {
-                    *status = U_ZERO_ERROR;
-                }
-            } else { // latin1Table exists and it doesn't need to be regenerated, just use it
-                coll->latinOneUse = TRUE;
-            }
-        } else {
-            coll->latinOneUse = FALSE;
-        }
-    }
-}
-
-U_CAPI uint32_t  U_EXPORT2
-ucol_setVariableTop(UCollator *coll, const UChar *varTop, int32_t len, UErrorCode *status) {
-    if(U_FAILURE(*status) || coll == NULL) {
-        return 0;
-    }
-    if(len == -1) {
-        len = u_strlen(varTop);
-    }
-    if(len == 0) {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        return 0;
-    }
-
-    if(coll->delegate!=NULL) {
-      return ((Collator*)coll->delegate)->setVariableTop(varTop, len, *status);
-    }
-
-
-    collIterate s;
-    IInit_collIterate(coll, varTop, len, &s, status);
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-
-    uint32_t CE = ucol_IGetNextCE(coll, &s, status);
-
-    /* here we check if we have consumed all characters */
-    /* you can put in either one character or a contraction */
-    /* you shouldn't put more... */
-    if(s.pos != s.endp || CE == UCOL_NO_MORE_CES) {
-        *status = U_CE_NOT_FOUND_ERROR;
-        return 0;
-    }
-
-    uint32_t nextCE = ucol_IGetNextCE(coll, &s, status);
-
-    if(isContinuation(nextCE) && (nextCE & UCOL_PRIMARYMASK) != 0) {
-        *status = U_PRIMARY_TOO_LONG_ERROR;
-        return 0;
-    }
-    if(coll->variableTopValue != (CE & UCOL_PRIMARYMASK)>>16) {
-        coll->variableTopValueisDefault = FALSE;
-        coll->variableTopValue = (CE & UCOL_PRIMARYMASK)>>16;
-    }
-    
-    /* To avoid memory leak, free the offset buffer if necessary. */
-    ucol_freeOffsetBuffer(&s);
-
-    return CE & UCOL_PRIMARYMASK;
-}
-
-U_CAPI uint32_t U_EXPORT2 ucol_getVariableTop(const UCollator *coll, UErrorCode *status) {
-    if(U_FAILURE(*status) || coll == NULL) {
-        return 0;
-    }
-    if(coll->delegate!=NULL) {
-      return ((const Collator*)coll->delegate)->getVariableTop(*status);
-    }
-    return coll->variableTopValue<<16;
-}
-
-U_CAPI void  U_EXPORT2
-ucol_restoreVariableTop(UCollator *coll, const uint32_t varTop, UErrorCode *status) {
-    if(U_FAILURE(*status) || coll == NULL) {
-        return;
-    }
-
-    if(coll->variableTopValue != (varTop & UCOL_PRIMARYMASK)>>16) {
-        coll->variableTopValueisDefault = FALSE;
-        coll->variableTopValue = (varTop & UCOL_PRIMARYMASK)>>16;
-    }
-}
-/* Attribute setter API */
-U_CAPI void  U_EXPORT2
-ucol_setAttribute(UCollator *coll, UColAttribute attr, UColAttributeValue value, UErrorCode *status) {
-    if(U_FAILURE(*status) || coll == NULL) {
-      return;
-    }
-
-    if(coll->delegate != NULL) {
-      ((Collator*)coll->delegate)->setAttribute(attr,value,*status);
-      return;
-    }
-
-    UColAttributeValue oldFrench = coll->frenchCollation;
-    UColAttributeValue oldCaseFirst = coll->caseFirst;
-    switch(attr) {
-    case UCOL_NUMERIC_COLLATION: /* sort substrings of digits as numbers */
-        if(value == UCOL_ON) {
-            coll->numericCollation = UCOL_ON;
-            coll->numericCollationisDefault = FALSE;
-        } else if (value == UCOL_OFF) {
-            coll->numericCollation = UCOL_OFF;
-            coll->numericCollationisDefault = FALSE;
-        } else if (value == UCOL_DEFAULT) {
-            coll->numericCollationisDefault = TRUE;
-            coll->numericCollation = (UColAttributeValue)coll->options->numericCollation;
-        } else {
-            *status = U_ILLEGAL_ARGUMENT_ERROR;
-        }
-        break;
-    case UCOL_HIRAGANA_QUATERNARY_MODE: /* special quaternary values for Hiragana */
-        if(value == UCOL_ON || value == UCOL_OFF || value == UCOL_DEFAULT) {
-            // This attribute is an implementation detail of the CLDR Japanese tailoring.
-            // The implementation might change to use a different mechanism
-            // to achieve the same Japanese sort order.
-            // Since ICU 50, this attribute is not settable any more via API functions.
-        } else {
-            *status = U_ILLEGAL_ARGUMENT_ERROR;
-        }
-        break;
-    case UCOL_FRENCH_COLLATION: /* attribute for direction of secondary weights*/
-        if(value == UCOL_ON) {
-            coll->frenchCollation = UCOL_ON;
-            coll->frenchCollationisDefault = FALSE;
-        } else if (value == UCOL_OFF) {
-            coll->frenchCollation = UCOL_OFF;
-            coll->frenchCollationisDefault = FALSE;
-        } else if (value == UCOL_DEFAULT) {
-            coll->frenchCollationisDefault = TRUE;
-            coll->frenchCollation = (UColAttributeValue)coll->options->frenchCollation;
-        } else {
-            *status = U_ILLEGAL_ARGUMENT_ERROR  ;
-        }
-        break;
-    case UCOL_ALTERNATE_HANDLING: /* attribute for handling variable elements*/
-        if(value == UCOL_SHIFTED) {
-            coll->alternateHandling = UCOL_SHIFTED;
-            coll->alternateHandlingisDefault = FALSE;
-        } else if (value == UCOL_NON_IGNORABLE) {
-            coll->alternateHandling = UCOL_NON_IGNORABLE;
-            coll->alternateHandlingisDefault = FALSE;
-        } else if (value == UCOL_DEFAULT) {
-            coll->alternateHandlingisDefault = TRUE;
-            coll->alternateHandling = (UColAttributeValue)coll->options->alternateHandling ;
-        } else {
-            *status = U_ILLEGAL_ARGUMENT_ERROR  ;
-        }
-        break;
-    case UCOL_CASE_FIRST: /* who goes first, lower case or uppercase */
-        if(value == UCOL_LOWER_FIRST) {
-            coll->caseFirst = UCOL_LOWER_FIRST;
-            coll->caseFirstisDefault = FALSE;
-        } else if (value == UCOL_UPPER_FIRST) {
-            coll->caseFirst = UCOL_UPPER_FIRST;
-            coll->caseFirstisDefault = FALSE;
-        } else if (value == UCOL_OFF) {
-            coll->caseFirst = UCOL_OFF;
-            coll->caseFirstisDefault = FALSE;
-        } else if (value == UCOL_DEFAULT) {
-            coll->caseFirst = (UColAttributeValue)coll->options->caseFirst;
-            coll->caseFirstisDefault = TRUE;
-        } else {
-            *status = U_ILLEGAL_ARGUMENT_ERROR  ;
-        }
-        break;
-    case UCOL_CASE_LEVEL: /* do we have an extra case level */
-        if(value == UCOL_ON) {
-            coll->caseLevel = UCOL_ON;
-            coll->caseLevelisDefault = FALSE;
-        } else if (value == UCOL_OFF) {
-            coll->caseLevel = UCOL_OFF;
-            coll->caseLevelisDefault = FALSE;
-        } else if (value == UCOL_DEFAULT) {
-            coll->caseLevel = (UColAttributeValue)coll->options->caseLevel;
-            coll->caseLevelisDefault = TRUE;
-        } else {
-            *status = U_ILLEGAL_ARGUMENT_ERROR  ;
-        }
-        break;
-    case UCOL_NORMALIZATION_MODE: /* attribute for normalization */
-        if(value == UCOL_ON) {
-            coll->normalizationMode = UCOL_ON;
-            coll->normalizationModeisDefault = FALSE;
-            initializeFCD(status);
-        } else if (value == UCOL_OFF) {
-            coll->normalizationMode = UCOL_OFF;
-            coll->normalizationModeisDefault = FALSE;
-        } else if (value == UCOL_DEFAULT) {
-            coll->normalizationModeisDefault = TRUE;
-            coll->normalizationMode = (UColAttributeValue)coll->options->normalizationMode;
-            if(coll->normalizationMode == UCOL_ON) {
-                initializeFCD(status);
-            }
-        } else {
-            *status = U_ILLEGAL_ARGUMENT_ERROR  ;
-        }
-        break;
-    case UCOL_STRENGTH:         /* attribute for strength */
-        if (value == UCOL_DEFAULT) {
-            coll->strengthisDefault = TRUE;
-            coll->strength = (UColAttributeValue)coll->options->strength;
-        } else if (value <= UCOL_IDENTICAL) {
-            coll->strengthisDefault = FALSE;
-            coll->strength = value;
-        } else {
-            *status = U_ILLEGAL_ARGUMENT_ERROR  ;
-        }
-        break;
-    case UCOL_ATTRIBUTE_COUNT:
-    default:
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        break;
-    }
-    if(oldFrench != coll->frenchCollation || oldCaseFirst != coll->caseFirst) {
-        coll->latinOneRegenTable = TRUE;
-    } else {
-        coll->latinOneRegenTable = FALSE;
-    }
-    ucol_updateInternalState(coll, status);
-}
-
-U_CAPI UColAttributeValue  U_EXPORT2
-ucol_getAttribute(const UCollator *coll, UColAttribute attr, UErrorCode *status) {
-    if(U_FAILURE(*status) || coll == NULL) {
-      return UCOL_DEFAULT;
-    }
-
-    if(coll->delegate != NULL) {
-      return ((Collator*)coll->delegate)->getAttribute(attr,*status);
-    }
-
-    switch(attr) {
-    case UCOL_NUMERIC_COLLATION:
-      return coll->numericCollation;
-    case UCOL_HIRAGANA_QUATERNARY_MODE:
-      return coll->hiraganaQ;
-    case UCOL_FRENCH_COLLATION: /* attribute for direction of secondary weights*/
-        return coll->frenchCollation;
-    case UCOL_ALTERNATE_HANDLING: /* attribute for handling variable elements*/
-        return coll->alternateHandling;
-    case UCOL_CASE_FIRST: /* who goes first, lower case or uppercase */
-        return coll->caseFirst;
-    case UCOL_CASE_LEVEL: /* do we have an extra case level */
-        return coll->caseLevel;
-    case UCOL_NORMALIZATION_MODE: /* attribute for normalization */
-        return coll->normalizationMode;
-    case UCOL_STRENGTH:         /* attribute for strength */
-        return coll->strength;
-    case UCOL_ATTRIBUTE_COUNT:
-    default:
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        break;
-    }
-    return UCOL_DEFAULT;
-}
-
-U_CAPI void U_EXPORT2
-ucol_setStrength(    UCollator                *coll,
-            UCollationStrength        strength)
-{
-    UErrorCode status = U_ZERO_ERROR;
-    ucol_setAttribute(coll, UCOL_STRENGTH, strength, &status);
-}
-
-U_CAPI UCollationStrength U_EXPORT2
-ucol_getStrength(const UCollator *coll)
-{
-    UErrorCode status = U_ZERO_ERROR;
-    return ucol_getAttribute(coll, UCOL_STRENGTH, &status);
-}
-
-U_CAPI int32_t U_EXPORT2 
-ucol_getReorderCodes(const UCollator *coll,
-                    int32_t *dest,
-                    int32_t destCapacity,
-                    UErrorCode *status) {
-    if (U_FAILURE(*status)) {
-        return 0;
-    }
-
-    if(coll->delegate!=NULL) {
-      return ((const Collator*)coll->delegate)->getReorderCodes(dest, destCapacity, *status);
-    }
-
-    if (destCapacity < 0 || (destCapacity > 0 && dest == NULL)) {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        return 0;
-    }
-
-#ifdef UCOL_DEBUG
-    printf("coll->reorderCodesLength = %d\n", coll->reorderCodesLength);
-    printf("coll->defaultReorderCodesLength = %d\n", coll->defaultReorderCodesLength);
-#endif
-
-    if (coll->reorderCodesLength > destCapacity) {
-        *status = U_BUFFER_OVERFLOW_ERROR;
-        return coll->reorderCodesLength;
-    }
-    for (int32_t i = 0; i < coll->reorderCodesLength; i++) {
-        dest[i] = coll->reorderCodes[i];
-    }
-    return coll->reorderCodesLength;
-}
-
-U_CAPI void U_EXPORT2 
-ucol_setReorderCodes(UCollator* coll,
-                    const int32_t* reorderCodes,
-                    int32_t reorderCodesLength,
-                    UErrorCode *status) {
-    if (U_FAILURE(*status)) {
-        return;
-    }
-
-    if (reorderCodesLength < 0 || (reorderCodesLength > 0 && reorderCodes == NULL)) {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        return;
-    }
-
-    if(coll->delegate!=NULL) {
-      ((Collator*)coll->delegate)->setReorderCodes(reorderCodes, reorderCodesLength, *status);
-      return;
-    }
-    
-    if (coll->reorderCodes != NULL && coll->freeReorderCodesOnClose == TRUE) {
-        uprv_free(coll->reorderCodes);
-    }
-    coll->reorderCodes = NULL;
-    coll->freeReorderCodesOnClose = FALSE;
-    coll->reorderCodesLength = 0;
-    if (reorderCodesLength == 0) {
-        if (coll->leadBytePermutationTable != NULL && coll->freeLeadBytePermutationTableOnClose == TRUE) {
-            uprv_free(coll->leadBytePermutationTable);
+        /* copy level from src2 not including 00 or 01 */
+        while((b=*src2)>=2) {
+            ++src2;
+            *p++=b;
         }
-        coll->leadBytePermutationTable = NULL;
-        coll->freeLeadBytePermutationTableOnClose = FALSE;
-        return;
-    }
-    coll->reorderCodes = (int32_t*) uprv_malloc(reorderCodesLength * sizeof(int32_t));
-    if (coll->reorderCodes == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return;
-    }
-    coll->freeReorderCodesOnClose = TRUE;
-    for (int32_t i = 0; i < reorderCodesLength; i++) {
-        coll->reorderCodes[i] = reorderCodes[i];
-    }
-    coll->reorderCodesLength = reorderCodesLength;
-    ucol_buildPermutationTable(coll, status);
-}
-
-U_CAPI int32_t U_EXPORT2 
-ucol_getEquivalentReorderCodes(int32_t reorderCode,
-                    int32_t* dest,
-                    int32_t destCapacity,
-                    UErrorCode *pErrorCode) {
-    bool equivalentCodesSet[USCRIPT_CODE_LIMIT];
-    uint16_t leadBytes[256];
-    int leadBytesCount;
-    int leadByteIndex;
-    int16_t reorderCodesForLeadByte[USCRIPT_CODE_LIMIT];
-    int reorderCodesForLeadByteCount;
-    int reorderCodeIndex;
-    
-    int32_t equivalentCodesCount = 0;
-    int setIndex;
-    
-    if (U_FAILURE(*pErrorCode)) {
-        return 0;
-    }
-
-    if (destCapacity < 0 || (destCapacity > 0 && dest == NULL)) {
-        *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
-        return 0;
-    }
 
-    uprv_memset(equivalentCodesSet, 0, USCRIPT_CODE_LIMIT * sizeof(bool));
-
-    const UCollator* uca = ucol_initUCA(pErrorCode);
-    if (U_FAILURE(*pErrorCode)) {
-       return 0;
-    }
-    leadBytesCount = ucol_getLeadBytesForReorderCode(uca, reorderCode, leadBytes, 256);
-    for (leadByteIndex = 0; leadByteIndex < leadBytesCount; leadByteIndex++) {
-        reorderCodesForLeadByteCount = ucol_getReorderCodesForLeadByte(
-            uca, leadBytes[leadByteIndex], reorderCodesForLeadByte, USCRIPT_CODE_LIMIT);
-        for (reorderCodeIndex = 0; reorderCodeIndex < reorderCodesForLeadByteCount; reorderCodeIndex++) {
-            equivalentCodesSet[reorderCodesForLeadByte[reorderCodeIndex]] = true;
-        }
-    }
-    
-    for (setIndex = 0; setIndex < USCRIPT_CODE_LIMIT; setIndex++) {
-        if (equivalentCodesSet[setIndex] == true) {
-            equivalentCodesCount++;
+        /* if both sort keys have another level, then add a 01 level separator and continue */
+        if(*src1==1 && *src2==1) {
+            ++src1;
+            ++src2;
+            *p++=1;
+        } else {
+            break;
         }
     }
-    
-    if (destCapacity == 0) {
-        return equivalentCodesCount;
-    }
-    
-    equivalentCodesCount = 0;
-    for (setIndex = 0; setIndex < USCRIPT_CODE_LIMIT; setIndex++) {
-        if (equivalentCodesSet[setIndex] == true) {
-            dest[equivalentCodesCount++] = setIndex;
-            if (equivalentCodesCount >= destCapacity) {
-                break;
-            }
-        }        
-    }
-    return equivalentCodesCount;
-}
-
-
-/****************************************************************************/
-/* Following are misc functions                                             */
-/* there are new APIs and some compatibility APIs                           */
-/****************************************************************************/
-
-U_CAPI void U_EXPORT2
-ucol_getVersion(const UCollator* coll,
-                UVersionInfo versionInfo)
-{
-    if(coll->delegate!=NULL) {
-      ((const Collator*)coll->delegate)->getVersion(versionInfo);
-      return;
-    }
-    /* RunTime version  */
-    uint8_t rtVersion = UCOL_RUNTIME_VERSION;
-    /* Builder version*/
-    uint8_t bdVersion = coll->image->version[0];
 
-    /* Charset Version. Need to get the version from cnv files
-     * makeconv should populate cnv files with version and
-     * an api has to be provided in ucnv.h to obtain this version
+    /*
+     * here, at least one sort key is finished now, but the other one
+     * might have some contents left from containing more levels;
+     * that contents is just appended to the result
      */
-    uint8_t csVersion = 0;
-
-    /* combine the version info */
-    uint16_t cmbVersion = (uint16_t)((rtVersion<<11) | (bdVersion<<6) | (csVersion));
-
-    /* Tailoring rules */
-    versionInfo[0] = (uint8_t)(cmbVersion>>8);
-    versionInfo[1] = (uint8_t)cmbVersion;
-    versionInfo[2] = coll->image->version[1];
-    if(coll->UCA) {
-        /* Include the minor number when getting the UCA version. (major & 1f) << 3 | (minor & 7) */
-        versionInfo[3] = (coll->UCA->image->UCAVersion[0] & 0x1f) << 3 | (coll->UCA->image->UCAVersion[1] & 0x07);
-    } else {
-        versionInfo[3] = 0;
-    }
-}
-
-
-/* This internal API checks whether a character is tailored or not */
-U_CAPI UBool  U_EXPORT2
-ucol_isTailored(const UCollator *coll, const UChar u, UErrorCode *status) {
-    if(U_FAILURE(*status) || coll == NULL || coll == coll->UCA) {
-        return FALSE;
-    }
-
-    uint32_t CE = UCOL_NOT_FOUND;
-    const UChar *ContractionStart = NULL;
-    if(u < 0x100) { /* latin-1 */
-        CE = coll->latinOneMapping[u];
-        if(coll->UCA && CE == coll->UCA->latinOneMapping[u]) {
-            return FALSE;
-        }
-    } else { /* regular */
-        CE = UTRIE_GET32_FROM_LEAD(&coll->mapping, u);
-    }
-
-    if(isContraction(CE)) {
-        ContractionStart = (UChar *)coll->image+getContractOffset(CE);
-        CE = *(coll->contractionCEs + (ContractionStart- coll->contractionIndex));
+    if(*src1!=0) {
+        /* src1 is not finished, therefore *src2==0, and src1 is appended */
+        src2=src1;
     }
+    /* append src2, "the other, unfinished sort key" */
+    while((*p++=*src2++)!=0) {}
 
-    return (UBool)(CE != UCOL_NOT_FOUND);
+    /* the actual length might be less than destLength if either sort key contained illegally embedded zero bytes */
+    return (int32_t)(p-dest);
 }
 
-
-/****************************************************************************/
-/* Following are the string compare functions                               */
-/*                                                                          */
-/****************************************************************************/
-
-
-/*  ucol_checkIdent    internal function.  Does byte level string compare.   */
-/*                     Used by strcoll if strength == identical and strings  */
-/*                     are otherwise equal.                                  */
-/*                                                                           */
-/*                     Comparison must be done on NFD normalized strings.    */
-/*                     FCD is not good enough.                               */
-
-static
-UCollationResult    ucol_checkIdent(collIterate *sColl, collIterate *tColl, UBool normalize, UErrorCode *status)
+U_CAPI int32_t U_EXPORT2
+ucol_getSortKey(const    UCollator    *coll,
+        const    UChar        *source,
+        int32_t        sourceLength,
+        uint8_t        *result,
+        int32_t        resultLength)
 {
-    // When we arrive here, we can have normal strings or UCharIterators. Currently they are both
-    // of same type, but that doesn't really mean that it will stay that way.
-    int32_t            comparison;
-
-    if (sColl->flags & UCOL_USE_ITERATOR) {
-        // The division for the array length may truncate the array size to
-        // a little less than UNORM_ITER_SIZE, but that size is dimensioned too high
-        // for all platforms anyway.
-        UAlignedMemory stackNormIter1[UNORM_ITER_SIZE/sizeof(UAlignedMemory)];
-        UAlignedMemory stackNormIter2[UNORM_ITER_SIZE/sizeof(UAlignedMemory)];
-        UNormIterator *sNIt = NULL, *tNIt = NULL;
-        sNIt = unorm_openIter(stackNormIter1, sizeof(stackNormIter1), status);
-        tNIt = unorm_openIter(stackNormIter2, sizeof(stackNormIter2), status);
-        sColl->iterator->move(sColl->iterator, 0, UITER_START);
-        tColl->iterator->move(tColl->iterator, 0, UITER_START);
-        UCharIterator *sIt = unorm_setIter(sNIt, sColl->iterator, UNORM_NFD, status);
-        UCharIterator *tIt = unorm_setIter(tNIt, tColl->iterator, UNORM_NFD, status);
-        comparison = u_strCompareIter(sIt, tIt, TRUE);
-        unorm_closeIter(sNIt);
-        unorm_closeIter(tNIt);
-    } else {
-        int32_t sLen      = (sColl->flags & UCOL_ITER_HASLEN) ? (int32_t)(sColl->endp - sColl->string) : -1;
-        const UChar *sBuf = sColl->string;
-        int32_t tLen      = (tColl->flags & UCOL_ITER_HASLEN) ? (int32_t)(tColl->endp - tColl->string) : -1;
-        const UChar *tBuf = tColl->string;
-
-        if (normalize) {
-            *status = U_ZERO_ERROR;
-            // Note: We could use Normalizer::compare() or similar, but for short strings
-            // which may not be in FCD it might be faster to just NFD them.
-            // Note: spanQuickCheckYes() + normalizeSecondAndAppend() rather than
-            // NFD'ing immediately might be faster for long strings,
-            // but string comparison is usually done on relatively short strings.
-            sColl->nfd->normalize(UnicodeString((sColl->flags & UCOL_ITER_HASLEN) == 0, sBuf, sLen),
-                                  sColl->writableBuffer,
-                                  *status);
-            tColl->nfd->normalize(UnicodeString((tColl->flags & UCOL_ITER_HASLEN) == 0, tBuf, tLen),
-                                  tColl->writableBuffer,
-                                  *status);
-            if(U_FAILURE(*status)) {
-                return UCOL_LESS;
-            }
-            comparison = sColl->writableBuffer.compareCodePointOrder(tColl->writableBuffer);
-        } else {
-            comparison = u_strCompare(sBuf, sLen, tBuf, tLen, TRUE);
-        }
-    }
-
-    if (comparison < 0) {
-        return UCOL_LESS;
-    } else if (comparison == 0) {
-        return UCOL_EQUAL;
-    } else /* comparison > 0 */ {
-        return UCOL_GREATER;
+    UTRACE_ENTRY(UTRACE_UCOL_GET_SORTKEY);
+    if (UTRACE_LEVEL(UTRACE_VERBOSE)) {
+        UTRACE_DATA3(UTRACE_VERBOSE, "coll=%p, source string = %vh ", coll, source,
+            ((sourceLength==-1 && source!=NULL) ? u_strlen(source) : sourceLength));
     }
-}
-
-/*  CEBuf - A struct and some inline functions to handle the saving    */
-/*          of CEs in a buffer within ucol_strcoll                     */
-
-#define UCOL_CEBUF_SIZE 512
-typedef struct ucol_CEBuf {
-    uint32_t    *buf;
-    uint32_t    *endp;
-    uint32_t    *pos;
-    uint32_t     localArray[UCOL_CEBUF_SIZE];
-} ucol_CEBuf;
-
 
-static
-inline void UCOL_INIT_CEBUF(ucol_CEBuf *b) {
-    (b)->buf = (b)->pos = (b)->localArray;
-    (b)->endp = (b)->buf + UCOL_CEBUF_SIZE;
-}
-
-static
-void ucol_CEBuf_Expand(ucol_CEBuf *b, collIterate *ci, UErrorCode *status) {
-    uint32_t  oldSize;
-    uint32_t  newSize;
-    uint32_t  *newBuf;
-
-    ci->flags |= UCOL_ITER_ALLOCATED;
-    oldSize = (uint32_t)(b->pos - b->buf);
-    newSize = oldSize * 2;
-    newBuf = (uint32_t *)uprv_malloc(newSize * sizeof(uint32_t));
-    if(newBuf == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-    }
-    else {
-        uprv_memcpy(newBuf, b->buf, oldSize * sizeof(uint32_t));
-        if (b->buf != b->localArray) {
-            uprv_free(b->buf);
-        }
-        b->buf = newBuf;
-        b->endp = b->buf + newSize;
-        b->pos  = b->buf + oldSize;
-    }
-}
+    int32_t keySize = Collator::fromUCollator(coll)->
+            getSortKey(source, sourceLength, result, resultLength);
 
-static
-inline void UCOL_CEBUF_PUT(ucol_CEBuf *b, uint32_t ce, collIterate *ci, UErrorCode *status) {
-    if (b->pos == b->endp) {
-        ucol_CEBuf_Expand(b, ci, status);
-    }
-    if (U_SUCCESS(*status)) {
-        *(b)->pos++ = ce;
-    }
+    UTRACE_DATA2(UTRACE_VERBOSE, "Sort Key = %vb", result, keySize);
+    UTRACE_EXIT_VALUE(keySize);
+    return keySize;
 }
 
-/* This is a trick string compare function that goes in and uses sortkeys to compare */
-/* It is used when compare gets in trouble and needs to bail out                     */
-static UCollationResult ucol_compareUsingSortKeys(collIterate *sColl,
-                                                  collIterate *tColl,
-                                                  UErrorCode *status)
+U_CAPI int32_t U_EXPORT2
+ucol_nextSortKeyPart(const UCollator *coll,
+                     UCharIterator *iter,
+                     uint32_t state[2],
+                     uint8_t *dest, int32_t count,
+                     UErrorCode *status)
 {
-    uint8_t sourceKey[UCOL_MAX_BUFFER], targetKey[UCOL_MAX_BUFFER];
-    uint8_t *sourceKeyP = sourceKey;
-    uint8_t *targetKeyP = targetKey;
-    int32_t sourceKeyLen = UCOL_MAX_BUFFER, targetKeyLen = UCOL_MAX_BUFFER;
-    const UCollator *coll = sColl->coll;
-    const UChar *source = NULL;
-    const UChar *target = NULL;
-    int32_t result = UCOL_EQUAL;
-    UnicodeString sourceString, targetString;
-    int32_t sourceLength;
-    int32_t targetLength;
-
-    if(sColl->flags & UCOL_USE_ITERATOR) {
-        sColl->iterator->move(sColl->iterator, 0, UITER_START);
-        tColl->iterator->move(tColl->iterator, 0, UITER_START);
-        UChar32 c;
-        while((c=sColl->iterator->next(sColl->iterator))>=0) {
-            sourceString.append((UChar)c);
-        }
-        while((c=tColl->iterator->next(tColl->iterator))>=0) {
-            targetString.append((UChar)c);
-        }
-        source = sourceString.getBuffer();
-        sourceLength = sourceString.length();
-        target = targetString.getBuffer();
-        targetLength = targetString.length();
-    } else { // no iterators
-        sourceLength = (sColl->flags&UCOL_ITER_HASLEN)?(int32_t)(sColl->endp-sColl->string):-1;
-        targetLength = (tColl->flags&UCOL_ITER_HASLEN)?(int32_t)(tColl->endp-tColl->string):-1;
-        source = sColl->string;
-        target = tColl->string;
-    }
-
-
-
-    sourceKeyLen = ucol_getSortKey(coll, source, sourceLength, sourceKeyP, sourceKeyLen);
-    if(sourceKeyLen > UCOL_MAX_BUFFER) {
-        sourceKeyP = (uint8_t*)uprv_malloc(sourceKeyLen*sizeof(uint8_t));
-        if(sourceKeyP == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            goto cleanup_and_do_compare;
-        }
-        sourceKeyLen = ucol_getSortKey(coll, source, sourceLength, sourceKeyP, sourceKeyLen);
-    }
-
-    targetKeyLen = ucol_getSortKey(coll, target, targetLength, targetKeyP, targetKeyLen);
-    if(targetKeyLen > UCOL_MAX_BUFFER) {
-        targetKeyP = (uint8_t*)uprv_malloc(targetKeyLen*sizeof(uint8_t));
-        if(targetKeyP == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            goto cleanup_and_do_compare;
-        }
-        targetKeyLen = ucol_getSortKey(coll, target, targetLength, targetKeyP, targetKeyLen);
-    }
-
-    result = uprv_strcmp((const char*)sourceKeyP, (const char*)targetKeyP);
-
-cleanup_and_do_compare:
-    if(sourceKeyP != NULL && sourceKeyP != sourceKey) {
-        uprv_free(sourceKeyP);
+    /* error checking */
+    if(status==NULL || U_FAILURE(*status)) {
+        return 0;
     }
+    UTRACE_ENTRY(UTRACE_UCOL_NEXTSORTKEYPART);
+    UTRACE_DATA6(UTRACE_VERBOSE, "coll=%p, iter=%p, state=%d %d, dest=%p, count=%d",
+                  coll, iter, state[0], state[1], dest, count);
 
-    if(targetKeyP != NULL && targetKeyP != targetKey) {
-        uprv_free(targetKeyP);
-    }
+    int32_t i = Collator::fromUCollator(coll)->
+            internalNextSortKeyPart(iter, state, dest, count, *status);
 
-    if(result<0) {
-        return UCOL_LESS;
-    } else if(result>0) {
-        return UCOL_GREATER;
-    } else {
-        return UCOL_EQUAL;
-    }
+    // Return number of meaningful sortkey bytes.
+    UTRACE_DATA4(UTRACE_VERBOSE, "dest = %vb, state=%d %d",
+                  dest,i, state[0], state[1]);
+    UTRACE_EXIT_VALUE_STATUS(i, *status);
+    return i;
 }
 
-
-static UCollationResult
-ucol_strcollRegular(collIterate *sColl, collIterate *tColl, UErrorCode *status)
+/**
+ * Produce a bound for a given sortkey and a number of levels.
+ */
+U_CAPI int32_t U_EXPORT2
+ucol_getBound(const uint8_t       *source,
+        int32_t             sourceLength,
+        UColBoundMode       boundType,
+        uint32_t            noOfLevels,
+        uint8_t             *result,
+        int32_t             resultLength,
+        UErrorCode          *status)
 {
-    U_ALIGN_CODE(16);
-
-    const UCollator *coll = sColl->coll;
-
-
-    // setting up the collator parameters
-    UColAttributeValue strength = coll->strength;
-    UBool initialCheckSecTer = (strength  >= UCOL_SECONDARY);
-
-    UBool checkSecTer = initialCheckSecTer;
-    UBool checkTertiary = (strength  >= UCOL_TERTIARY);
-    UBool checkQuad = (strength  >= UCOL_QUATERNARY);
-    UBool checkIdent = (strength == UCOL_IDENTICAL);
-    UBool checkCase = (coll->caseLevel == UCOL_ON);
-    UBool isFrenchSec = (coll->frenchCollation == UCOL_ON) && checkSecTer;
-    UBool shifted = (coll->alternateHandling == UCOL_SHIFTED);
-    UBool qShifted = shifted && checkQuad;
-    UBool doHiragana = (coll->hiraganaQ == UCOL_ON) && checkQuad;
-
-    if(doHiragana && shifted) {
-        return (ucol_compareUsingSortKeys(sColl, tColl, status));
-    }
-    uint8_t caseSwitch = coll->caseSwitch;
-    uint8_t tertiaryMask = coll->tertiaryMask;
-
-    // This is the lowest primary value that will not be ignored if shifted
-    uint32_t LVT = (shifted)?(coll->variableTopValue<<16):0;
-
-    UCollationResult result = UCOL_EQUAL;
-    UCollationResult hirResult = UCOL_EQUAL;
-
-    // Preparing the CE buffers. They will be filled during the primary phase
-    ucol_CEBuf   sCEs;
-    ucol_CEBuf   tCEs;
-    UCOL_INIT_CEBUF(&sCEs);
-    UCOL_INIT_CEBUF(&tCEs);
-
-    uint32_t secS = 0, secT = 0;
-    uint32_t sOrder=0, tOrder=0;
-
-    // Non shifted primary processing is quite simple
-    if(!shifted) {
-        for(;;) {
-            // We fetch CEs until we hit a non ignorable primary or end.
-            uint32_t sPrimary;
-            do {
-                // We get the next CE
-                sOrder = ucol_IGetNextCE(coll, sColl, status);
-                // Stuff it in the buffer
-                UCOL_CEBUF_PUT(&sCEs, sOrder, sColl, status);
-                // And keep just the primary part.
-                sPrimary = sOrder & UCOL_PRIMARYMASK;
-            } while(sPrimary == 0);
-
-            // see the comments on the above block
-            uint32_t tPrimary;
-            do {
-                tOrder = ucol_IGetNextCE(coll, tColl, status);
-                UCOL_CEBUF_PUT(&tCEs, tOrder, tColl, status);
-                tPrimary = tOrder & UCOL_PRIMARYMASK;
-            } while(tPrimary == 0);
-
-            // if both primaries are the same
-            if(sPrimary == tPrimary) {
-                // and there are no more CEs, we advance to the next level
-                if(sPrimary == UCOL_NO_MORE_CES_PRIMARY) {
-                    break;
-                }
-                if(doHiragana && hirResult == UCOL_EQUAL) {
-                    if((sColl->flags & UCOL_WAS_HIRAGANA) != (tColl->flags & UCOL_WAS_HIRAGANA)) {
-                        hirResult = ((sColl->flags & UCOL_WAS_HIRAGANA) > (tColl->flags & UCOL_WAS_HIRAGANA))
-                            ? UCOL_LESS:UCOL_GREATER;
-                    }
-                }
-            } else {
-                // only need to check one for continuation
-                // if one is then the other must be or the preceding CE would be a prefix of the other
-                if (coll->leadBytePermutationTable != NULL && !isContinuation(sOrder)) {
-                    sPrimary = (coll->leadBytePermutationTable[sPrimary>>24] << 24) | (sPrimary & 0x00FFFFFF);
-                    tPrimary = (coll->leadBytePermutationTable[tPrimary>>24] << 24) | (tPrimary & 0x00FFFFFF);
-                }
-                // if two primaries are different, we are done
-                result = (sPrimary < tPrimary) ?  UCOL_LESS: UCOL_GREATER;
-                goto commonReturn;
-            }
-        } // no primary difference... do the rest from the buffers
-    } else { // shifted - do a slightly more complicated processing :)
-        for(;;) {
-            UBool sInShifted = FALSE;
-            UBool tInShifted = FALSE;
-            // This version of code can be refactored. However, it seems easier to understand this way.
-            // Source loop. Same as the target loop.
-            for(;;) {
-                sOrder = ucol_IGetNextCE(coll, sColl, status);
-                if(sOrder == UCOL_NO_MORE_CES) {
-                    UCOL_CEBUF_PUT(&sCEs, sOrder, sColl, status);
-                    break;
-                } else if(sOrder == 0 || (sInShifted && (sOrder & UCOL_PRIMARYMASK) == 0)) {
-                    /* UCA amendment - ignore ignorables that follow shifted code points */
-                    continue;
-                } else if(isContinuation(sOrder)) {
-                    if((sOrder & UCOL_PRIMARYMASK) > 0) { /* There is primary value */
-                        if(sInShifted) {
-                            sOrder = (sOrder & UCOL_PRIMARYMASK) | 0xC0; /* preserve interesting continuation */
-                            UCOL_CEBUF_PUT(&sCEs, sOrder, sColl, status);
-                            continue;
-                        } else {
-                            UCOL_CEBUF_PUT(&sCEs, sOrder, sColl, status);
-                            break;
-                        }
-                    } else { /* Just lower level values */
-                        if(sInShifted) {
-                            continue;
-                        } else {
-                            UCOL_CEBUF_PUT(&sCEs, sOrder, sColl, status);
-                            continue;
-                        }
-                    }
-                } else { /* regular */
-                    if(coll->leadBytePermutationTable != NULL){
-                        sOrder = (coll->leadBytePermutationTable[sOrder>>24] << 24) | (sOrder & 0x00FFFFFF);
-                    }
-                    if((sOrder & UCOL_PRIMARYMASK) > LVT) {
-                        UCOL_CEBUF_PUT(&sCEs, sOrder, sColl, status);
-                        break;
-                    } else {
-                        if((sOrder & UCOL_PRIMARYMASK) > 0) {
-                            sInShifted = TRUE;
-                            sOrder &= UCOL_PRIMARYMASK;
-                            UCOL_CEBUF_PUT(&sCEs, sOrder, sColl, status);
-                            continue;
-                        } else {
-                            UCOL_CEBUF_PUT(&sCEs, sOrder, sColl, status);
-                            sInShifted = FALSE;
-                            continue;
-                        }
-                    }
-                }
-            }
-            sOrder &= UCOL_PRIMARYMASK;
-            sInShifted = FALSE;
-
-            for(;;) {
-                tOrder = ucol_IGetNextCE(coll, tColl, status);
-                if(tOrder == UCOL_NO_MORE_CES) {
-                    UCOL_CEBUF_PUT(&tCEs, tOrder, tColl, status);
-                    break;
-                } else if(tOrder == 0 || (tInShifted && (tOrder & UCOL_PRIMARYMASK) == 0)) {
-                    /* UCA amendment - ignore ignorables that follow shifted code points */
-                    continue;
-                } else if(isContinuation(tOrder)) {
-                    if((tOrder & UCOL_PRIMARYMASK) > 0) { /* There is primary value */
-                        if(tInShifted) {
-                            tOrder = (tOrder & UCOL_PRIMARYMASK) | 0xC0; /* preserve interesting continuation */
-                            UCOL_CEBUF_PUT(&tCEs, tOrder, tColl, status);
-                            continue;
-                        } else {
-                            UCOL_CEBUF_PUT(&tCEs, tOrder, tColl, status);
-                            break;
-                        }
-                    } else { /* Just lower level values */
-                        if(tInShifted) {
-                            continue;
-                        } else {
-                            UCOL_CEBUF_PUT(&tCEs, tOrder, tColl, status);
-                            continue;
-                        }
-                    }
-                } else { /* regular */
-                    if(coll->leadBytePermutationTable != NULL){
-                        tOrder = (coll->leadBytePermutationTable[tOrder>>24] << 24) | (tOrder & 0x00FFFFFF);
-                    }
-                    if((tOrder & UCOL_PRIMARYMASK) > LVT) {
-                        UCOL_CEBUF_PUT(&tCEs, tOrder, tColl, status);
-                        break;
-                    } else {
-                        if((tOrder & UCOL_PRIMARYMASK) > 0) {
-                            tInShifted = TRUE;
-                            tOrder &= UCOL_PRIMARYMASK;
-                            UCOL_CEBUF_PUT(&tCEs, tOrder, tColl, status);
-                            continue;
-                        } else {
-                            UCOL_CEBUF_PUT(&tCEs, tOrder, tColl, status);
-                            tInShifted = FALSE;
-                            continue;
-                        }
-                    }
-                }
-            }
-            tOrder &= UCOL_PRIMARYMASK;
-            tInShifted = FALSE;
-
-            if(sOrder == tOrder) {
-                /*
-                if(doHiragana && hirResult == UCOL_EQUAL) {
-                if((sColl.flags & UCOL_WAS_HIRAGANA) != (tColl.flags & UCOL_WAS_HIRAGANA)) {
-                hirResult = ((sColl.flags & UCOL_WAS_HIRAGANA) > (tColl.flags & UCOL_WAS_HIRAGANA))
-                ? UCOL_LESS:UCOL_GREATER;
-                }
-                }
-                */
-                if(sOrder == UCOL_NO_MORE_CES_PRIMARY) {
-                    break;
-                } else {
-                    sOrder = 0;
-                    tOrder = 0;
-                    continue;
-                }
-            } else {
-                result = (sOrder < tOrder) ? UCOL_LESS : UCOL_GREATER;
-                goto commonReturn;
-            }
-        } /* no primary difference... do the rest from the buffers */
-    }
-
-    /* now, we're gonna reexamine collected CEs */
-    uint32_t    *sCE;
-    uint32_t    *tCE;
-
-    /* This is the secondary level of comparison */
-    if(checkSecTer) {
-        if(!isFrenchSec) { /* normal */
-            sCE = sCEs.buf;
-            tCE = tCEs.buf;
-            for(;;) {
-                while (secS == 0) {
-                    secS = *(sCE++) & UCOL_SECONDARYMASK;
-                }
-
-                while(secT == 0) {
-                    secT = *(tCE++) & UCOL_SECONDARYMASK;
-                }
-
-                if(secS == secT) {
-                    if(secS == UCOL_NO_MORE_CES_SECONDARY) {
-                        break;
-                    } else {
-                        secS = 0; secT = 0;
-                        continue;
-                    }
-                } else {
-                    result = (secS < secT) ? UCOL_LESS : UCOL_GREATER;
-                    goto commonReturn;
-                }
-            }
-        } else { /* do the French */
-            uint32_t *sCESave = NULL;
-            uint32_t *tCESave = NULL;
-            sCE = sCEs.pos-2; /* this could also be sCEs-- if needs to be optimized */
-            tCE = tCEs.pos-2;
-            for(;;) {
-                while (secS == 0 && sCE >= sCEs.buf) {
-                    if(sCESave == NULL) {
-                        secS = *(sCE--);
-                        if(isContinuation(secS)) {
-                            while(isContinuation(secS = *(sCE--)))
-                                ;
-                            /* after this, secS has the start of continuation, and sCEs points before that */
-                            sCESave = sCE; /* we save it, so that we know where to come back AND that we need to go forward */
-                            sCE+=2;  /* need to point to the first continuation CP */
-                            /* However, now you can just continue doing stuff */
-                        }
-                    } else {
-                        secS = *(sCE++);
-                        if(!isContinuation(secS)) { /* This means we have finished with this cont */
-                            sCE = sCESave;            /* reset the pointer to before continuation */
-                            sCESave = NULL;
-                            secS = 0;  /* Fetch a fresh CE before the continuation sequence. */
-                            continue;
-                        }
-                    }
-                    secS &= UCOL_SECONDARYMASK; /* remove the continuation bit */
-                }
-
-                while(secT == 0 && tCE >= tCEs.buf) {
-                    if(tCESave == NULL) {
-                        secT = *(tCE--);
-                        if(isContinuation(secT)) {
-                            while(isContinuation(secT = *(tCE--)))
-                                ;
-                            /* after this, secS has the start of continuation, and sCEs points before that */
-                            tCESave = tCE; /* we save it, so that we know where to come back AND that we need to go forward */
-                            tCE+=2;  /* need to point to the first continuation CP */
-                            /* However, now you can just continue doing stuff */
-                        }
-                    } else {
-                        secT = *(tCE++);
-                        if(!isContinuation(secT)) { /* This means we have finished with this cont */
-                            tCE = tCESave;          /* reset the pointer to before continuation */
-                            tCESave = NULL;
-                            secT = 0;  /* Fetch a fresh CE before the continuation sequence. */
-                            continue;
-                        }
-                    }
-                    secT &= UCOL_SECONDARYMASK; /* remove the continuation bit */
-                }
-
-                if(secS == secT) {
-                    if(secS == UCOL_NO_MORE_CES_SECONDARY || (sCE < sCEs.buf && tCE < tCEs.buf)) {
-                        break;
-                    } else {
-                        secS = 0; secT = 0;
-                        continue;
-                    }
-                } else {
-                    result = (secS < secT) ? UCOL_LESS : UCOL_GREATER;
-                    goto commonReturn;
-                }
-            }
-        }
-    }
-
-    /* doing the case bit */
-    if(checkCase) {
-        sCE = sCEs.buf;
-        tCE = tCEs.buf;
-        for(;;) {
-            while((secS & UCOL_REMOVE_CASE) == 0) {
-                if(!isContinuation(*sCE++)) {
-                    secS =*(sCE-1);
-                    if(((secS & UCOL_PRIMARYMASK) != 0) || strength > UCOL_PRIMARY) {
-                        // primary ignorables should not be considered on the case level when the strength is primary
-                        // otherwise, the CEs stop being well-formed
-                        secS &= UCOL_TERT_CASE_MASK;
-                        secS ^= caseSwitch;
-                    } else {
-                        secS = 0;
-                    }
-                } else {
-                    secS = 0;
-                }
-            }
-
-            while((secT & UCOL_REMOVE_CASE) == 0) {
-                if(!isContinuation(*tCE++)) {
-                    secT = *(tCE-1);
-                    if(((secT & UCOL_PRIMARYMASK) != 0) || strength > UCOL_PRIMARY) {
-                        // primary ignorables should not be considered on the case level when the strength is primary
-                        // otherwise, the CEs stop being well-formed
-                        secT &= UCOL_TERT_CASE_MASK;
-                        secT ^= caseSwitch;
-                    } else {
-                        secT = 0;
-                    }
-                } else {
-                    secT = 0;
-                }
-            }
-
-            if((secS & UCOL_CASE_BIT_MASK) < (secT & UCOL_CASE_BIT_MASK)) {
-                result = UCOL_LESS;
-                goto commonReturn;
-            } else if((secS & UCOL_CASE_BIT_MASK) > (secT & UCOL_CASE_BIT_MASK)) {
-                result = UCOL_GREATER;
-                goto commonReturn;
-            }
-
-            if((secS & UCOL_REMOVE_CASE) == UCOL_NO_MORE_CES_TERTIARY || (secT & UCOL_REMOVE_CASE) == UCOL_NO_MORE_CES_TERTIARY ) {
-                break;
-            } else {
-                secS = 0;
-                secT = 0;
-            }
-        }
-    }
-
-    /* Tertiary level */
-    if(checkTertiary) {
-        secS = 0;
-        secT = 0;
-        sCE = sCEs.buf;
-        tCE = tCEs.buf;
-        for(;;) {
-            while((secS & UCOL_REMOVE_CASE) == 0) {
-                sOrder = *sCE++;
-                secS = sOrder & tertiaryMask;
-                if(!isContinuation(sOrder)) {
-                    secS ^= caseSwitch;
-                } else {
-                    secS &= UCOL_REMOVE_CASE;
-                }
-            }
-
-            while((secT & UCOL_REMOVE_CASE)  == 0) {
-                tOrder = *tCE++;
-                secT = tOrder & tertiaryMask;
-                if(!isContinuation(tOrder)) {
-                    secT ^= caseSwitch;
-                } else {
-                    secT &= UCOL_REMOVE_CASE;
-                }
-            }
-
-            if(secS == secT) {
-                if((secS & UCOL_REMOVE_CASE) == 1) {
-                    break;
-                } else {
-                    secS = 0; secT = 0;
-                    continue;
-                }
-            } else {
-                result = (secS < secT) ? UCOL_LESS : UCOL_GREATER;
-                goto commonReturn;
-            }
-        }
-    }
-
-
-    if(qShifted /*checkQuad*/) {
-        UBool sInShifted = TRUE;
-        UBool tInShifted = TRUE;
-        secS = 0;
-        secT = 0;
-        sCE = sCEs.buf;
-        tCE = tCEs.buf;
-        for(;;) {
-            while((secS == 0 && secS != UCOL_NO_MORE_CES) || (isContinuation(secS) && !sInShifted)) {
-                secS = *(sCE++);
-                if(isContinuation(secS)) {
-                    if(!sInShifted) {
-                        continue;
-                    }
-                } else if(secS > LVT || (secS & UCOL_PRIMARYMASK) == 0) { /* non continuation */
-                    secS = UCOL_PRIMARYMASK;
-                    sInShifted = FALSE;
-                } else {
-                    sInShifted = TRUE;
-                }
-            }
-            secS &= UCOL_PRIMARYMASK;
-
-
-            while((secT == 0 && secT != UCOL_NO_MORE_CES) || (isContinuation(secT) && !tInShifted)) {
-                secT = *(tCE++);
-                if(isContinuation(secT)) {
-                    if(!tInShifted) {
-                        continue;
-                    }
-                } else if(secT > LVT || (secT & UCOL_PRIMARYMASK) == 0) {
-                    secT = UCOL_PRIMARYMASK;
-                    tInShifted = FALSE;
-                } else {
-                    tInShifted = TRUE;
-                }
-            }
-            secT &= UCOL_PRIMARYMASK;
-
-            if(secS == secT) {
-                if(secS == UCOL_NO_MORE_CES_PRIMARY) {
-                    break;
-                } else {
-                    secS = 0; secT = 0;
-                    continue;
-                }
-            } else {
-                result = (secS < secT) ? UCOL_LESS : UCOL_GREATER;
-                goto commonReturn;
-            }
-        }
-    } else if(doHiragana && hirResult != UCOL_EQUAL) {
-        // If we're fine on quaternaries, we might be different
-        // on Hiragana. This, however, might fail us in shifted.
-        result = hirResult;
-        goto commonReturn;
+    // consistency checks
+    if(status == NULL || U_FAILURE(*status)) {
+        return 0;
     }
-
-    /*  For IDENTICAL comparisons, we use a bitwise character comparison */
-    /*  as a tiebreaker if all else is equal.                                */
-    /*  Getting here  should be quite rare - strings are not identical -     */
-    /*     that is checked first, but compared == through all other checks.  */
-    if(checkIdent)
-    {
-        //result = ucol_checkIdent(&sColl, &tColl, coll->normalizationMode == UCOL_ON);
-        result = ucol_checkIdent(sColl, tColl, TRUE, status);
+    if(source == NULL) {
+        *status = U_ILLEGAL_ARGUMENT_ERROR;
+        return 0;
     }
 
-commonReturn:
-    if ((sColl->flags | tColl->flags) & UCOL_ITER_ALLOCATED) {
-        if (sCEs.buf != sCEs.localArray ) {
-            uprv_free(sCEs.buf);
-        }
-        if (tCEs.buf != tCEs.localArray ) {
-            uprv_free(tCEs.buf);
+    int32_t sourceIndex = 0;
+    // Scan the string until we skip enough of the key OR reach the end of the key
+    do {
+        sourceIndex++;
+        if(source[sourceIndex] == Collation::LEVEL_SEPARATOR_BYTE) {
+            noOfLevels--;
         }
-    }
-
-    return result;
-}
+    } while (noOfLevels > 0
+        && (source[sourceIndex] != 0 || sourceIndex < sourceLength));
 
-static UCollationResult
-ucol_strcollRegular(const UCollator *coll,
-                    const UChar *source, int32_t sourceLength,
-                    const UChar *target, int32_t targetLength,
-                    UErrorCode *status) {
-    collIterate sColl, tColl;
-    // Preparing the context objects for iterating over strings
-    IInit_collIterate(coll, source, sourceLength, &sColl, status);
-    IInit_collIterate(coll, target, targetLength, &tColl, status);
-    if(U_FAILURE(*status)) {
-        return UCOL_LESS;
+    if((source[sourceIndex] == 0 || sourceIndex == sourceLength)
+        && noOfLevels > 0) {
+            *status = U_SORT_KEY_TOO_SHORT_WARNING;
     }
-    return ucol_strcollRegular(&sColl, &tColl, status);
-}
-
-static inline uint32_t
-ucol_getLatinOneContraction(const UCollator *coll, int32_t strength,
-                          uint32_t CE, const UChar *s, int32_t *index, int32_t len)
-{
-    const UChar *UCharOffset = (UChar *)coll->image+getContractOffset(CE&0xFFF);
-    int32_t latinOneOffset = (CE & 0x00FFF000) >> 12;
-    int32_t offset = 1;
-    UChar schar = 0, tchar = 0;
-
-    for(;;) {
-        if(len == -1) {
-            if(s[*index] == 0) { // end of string
-                return(coll->latinOneCEs[strength*coll->latinOneTableLen+latinOneOffset]);
-            } else {
-                schar = s[*index];
-            }
-        } else {
-            if(*index == len) {
-                return(coll->latinOneCEs[strength*coll->latinOneTableLen+latinOneOffset]);
-            } else {
-                schar = s[*index];
-            }
-        }
 
-        while(schar > (tchar = *(UCharOffset+offset))) { /* since the contraction codepoints should be ordered, we skip all that are smaller */
-            offset++;
-        }
 
-        if (schar == tchar) {
-            (*index)++;
-            return(coll->latinOneCEs[strength*coll->latinOneTableLen+latinOneOffset+offset]);
+    // READ ME: this code assumes that the values for boundType
+    // enum will not changes. They are set so that the enum value
+    // corresponds to the number of extra bytes each bound type
+    // needs.
+    if(result != NULL && resultLength >= sourceIndex+boundType) {
+        uprv_memcpy(result, source, sourceIndex);
+        switch(boundType) {
+            // Lower bound just gets terminated. No extra bytes
+        case UCOL_BOUND_LOWER: // = 0
+            break;
+            // Upper bound needs one extra byte
+        case UCOL_BOUND_UPPER: // = 1
+            result[sourceIndex++] = 2;
+            break;
+            // Upper long bound needs two extra bytes
+        case UCOL_BOUND_UPPER_LONG: // = 2
+            result[sourceIndex++] = 0xFF;
+            result[sourceIndex++] = 0xFF;
+            break;
+        default:
+            *status = U_ILLEGAL_ARGUMENT_ERROR;
+            return 0;
         }
-        else
-        {
-            if(schar & 0xFF00 /*> UCOL_ENDOFLATIN1RANGE*/) {
-                return UCOL_BAIL_OUT_CE;
-            }
-            // skip completely ignorables
-            uint32_t isZeroCE = UTRIE_GET32_FROM_LEAD(&coll->mapping, schar);
-            if(isZeroCE == 0) { // we have to ignore completely ignorables
-                (*index)++;
-                continue;
-            }
+        result[sourceIndex++] = 0;
 
-            return(coll->latinOneCEs[strength*coll->latinOneTableLen+latinOneOffset]);
-        }
+        return sourceIndex;
+    } else {
+        return sourceIndex+boundType+1;
     }
 }
 
+U_CAPI void U_EXPORT2
+ucol_setMaxVariable(UCollator *coll, UColReorderCode group, UErrorCode *pErrorCode) {
+    if(U_FAILURE(*pErrorCode)) { return; }
+    Collator::fromUCollator(coll)->setMaxVariable(group, *pErrorCode);
+}
 
-/**
- * This is a fast strcoll, geared towards text in Latin-1.
- * It supports contractions of size two, French secondaries
- * and case switching. You can use it with strengths primary
- * to tertiary. It does not support shifted and case level.
- * It relies on the table build by setupLatin1Table. If it
- * doesn't understand something, it will go to the regular
- * strcoll.
- */
-static UCollationResult
-ucol_strcollUseLatin1( const UCollator    *coll,
-              const UChar        *source,
-              int32_t            sLen,
-              const UChar        *target,
-              int32_t            tLen,
-              UErrorCode *status)
-{
-    U_ALIGN_CODE(16);
-    int32_t strength = coll->strength;
-
-    int32_t sIndex = 0, tIndex = 0;
-    UChar sChar = 0, tChar = 0;
-    uint32_t sOrder=0, tOrder=0;
-
-    UBool endOfSource = FALSE;
-
-    uint32_t *elements = coll->latinOneCEs;
-
-    UBool haveContractions = FALSE; // if we have contractions in our string
-                                    // we cannot do French secondary
-
-    // Do the primary level
-    for(;;) {
-        while(sOrder==0) { // this loop skips primary ignorables
-            // sOrder=getNextlatinOneCE(source);
-            if(sLen==-1) {   // handling zero terminated strings
-                sChar=source[sIndex++];
-                if(sChar==0) {
-                    endOfSource = TRUE;
-                    break;
-                }
-            } else {        // handling strings with known length
-                if(sIndex==sLen) {
-                    endOfSource = TRUE;
-                    break;
-                }
-                sChar=source[sIndex++];
-            }
-            if(sChar&0xFF00) { // if we encounter non-latin-1, we bail out (sChar > 0xFF, but this is faster on win32)
-                //fprintf(stderr, "R");
-                return ucol_strcollRegular(coll, source, sLen, target, tLen, status);
-            }
-            sOrder = elements[sChar];
-            if(sOrder >= UCOL_NOT_FOUND) { // if we got a special
-                // specials can basically be either contractions or bail-out signs. If we get anything
-                // else, we'll bail out anywasy
-                if(getCETag(sOrder) == CONTRACTION_TAG) {
-                    sOrder = ucol_getLatinOneContraction(coll, UCOL_PRIMARY, sOrder, source, &sIndex, sLen);
-                    haveContractions = TRUE; // if there are contractions, we cannot do French secondary
-                    // However, if there are contractions in the table, but we always use just one char,
-                    // we might be able to do French. This should be checked out.
-                }
-                if(sOrder >= UCOL_NOT_FOUND /*== UCOL_BAIL_OUT_CE*/) {
-                    //fprintf(stderr, "S");
-                    return ucol_strcollRegular(coll, source, sLen, target, tLen, status);
-                }
-            }
-        }
-
-        while(tOrder==0) {  // this loop skips primary ignorables
-            // tOrder=getNextlatinOneCE(target);
-            if(tLen==-1) {    // handling zero terminated strings
-                tChar=target[tIndex++];
-                if(tChar==0) {
-                    if(endOfSource) { // this is different than source loop,
-                        // as we already know that source loop is done here,
-                        // so we can either finish the primary loop if both
-                        // strings are done or anounce the result if only
-                        // target is done. Same below.
-                        goto endOfPrimLoop;
-                    } else {
-                        return UCOL_GREATER;
-                    }
-                }
-            } else {          // handling strings with known length
-                if(tIndex==tLen) {
-                    if(endOfSource) {
-                        goto endOfPrimLoop;
-                    } else {
-                        return UCOL_GREATER;
-                    }
-                }
-                tChar=target[tIndex++];
-            }
-            if(tChar&0xFF00) { // if we encounter non-latin-1, we bail out (sChar > 0xFF, but this is faster on win32)
-                //fprintf(stderr, "R");
-                return ucol_strcollRegular(coll, source, sLen, target, tLen, status);
-            }
-            tOrder = elements[tChar];
-            if(tOrder >= UCOL_NOT_FOUND) {
-                // Handling specials, see the comments for source
-                if(getCETag(tOrder) == CONTRACTION_TAG) {
-                    tOrder = ucol_getLatinOneContraction(coll, UCOL_PRIMARY, tOrder, target, &tIndex, tLen);
-                    haveContractions = TRUE;
-                }
-                if(tOrder >= UCOL_NOT_FOUND /*== UCOL_BAIL_OUT_CE*/) {
-                    //fprintf(stderr, "S");
-                    return ucol_strcollRegular(coll, source, sLen, target, tLen, status);
-                }
-            }
-        }
-        if(endOfSource) { // source is finished, but target is not, say the result.
-            return UCOL_LESS;
-        }
-
-        if(sOrder == tOrder) { // if we have same CEs, we continue the loop
-            sOrder = 0; tOrder = 0;
-            continue;
-        } else {
-            // compare current top bytes
-            if(((sOrder^tOrder)&0xFF000000)!=0) {
-                // top bytes differ, return difference
-                if(sOrder < tOrder) {
-                    return UCOL_LESS;
-                } else if(sOrder > tOrder) {
-                    return UCOL_GREATER;
-                }
-                // instead of return (int32_t)(sOrder>>24)-(int32_t)(tOrder>>24);
-                // since we must return enum value
-            }
+U_CAPI UColReorderCode U_EXPORT2
+ucol_getMaxVariable(const UCollator *coll) {
+    return Collator::fromUCollator(coll)->getMaxVariable();
+}
 
-            // top bytes match, continue with following bytes
-            sOrder<<=8;
-            tOrder<<=8;
-        }
+U_CAPI uint32_t  U_EXPORT2
+ucol_setVariableTop(UCollator *coll, const UChar *varTop, int32_t len, UErrorCode *status) {
+    if(U_FAILURE(*status) || coll == NULL) {
+        return 0;
     }
+    return Collator::fromUCollator(coll)->setVariableTop(varTop, len, *status);
+}
 
-endOfPrimLoop:
-    // after primary loop, we definitely know the sizes of strings,
-    // so we set it and use simpler loop for secondaries and tertiaries
-    sLen = sIndex; tLen = tIndex;
-    if(strength >= UCOL_SECONDARY) {
-        // adjust the table beggining
-        elements += coll->latinOneTableLen;
-        endOfSource = FALSE;
-
-        if(coll->frenchCollation == UCOL_OFF) { // non French
-            // This loop is a simplified copy of primary loop
-            // at this point we know that whole strings are latin-1, so we don't
-            // check for that. We also know that we only have contractions as
-            // specials.
-            sIndex = 0; tIndex = 0;
-            for(;;) {
-                while(sOrder==0) {
-                    if(sIndex==sLen) {
-                        endOfSource = TRUE;
-                        break;
-                    }
-                    sChar=source[sIndex++];
-                    sOrder = elements[sChar];
-                    if(sOrder > UCOL_NOT_FOUND) {
-                        sOrder = ucol_getLatinOneContraction(coll, UCOL_SECONDARY, sOrder, source, &sIndex, sLen);
-                    }
-                }
-
-                while(tOrder==0) {
-                    if(tIndex==tLen) {
-                        if(endOfSource) {
-                            goto endOfSecLoop;
-                        } else {
-                            return UCOL_GREATER;
-                        }
-                    }
-                    tChar=target[tIndex++];
-                    tOrder = elements[tChar];
-                    if(tOrder > UCOL_NOT_FOUND) {
-                        tOrder = ucol_getLatinOneContraction(coll, UCOL_SECONDARY, tOrder, target, &tIndex, tLen);
-                    }
-                }
-                if(endOfSource) {
-                    return UCOL_LESS;
-                }
-
-                if(sOrder == tOrder) {
-                    sOrder = 0; tOrder = 0;
-                    continue;
-                } else {
-                    // see primary loop for comments on this
-                    if(((sOrder^tOrder)&0xFF000000)!=0) {
-                        if(sOrder < tOrder) {
-                            return UCOL_LESS;
-                        } else if(sOrder > tOrder) {
-                            return UCOL_GREATER;
-                        }
-                    }
-                    sOrder<<=8;
-                    tOrder<<=8;
-                }
-            }
-        } else { // French
-            if(haveContractions) { // if we have contractions, we have to bail out
-                // since we don't really know how to handle them here
-                return ucol_strcollRegular(coll, source, sLen, target, tLen, status);
-            }
-            // For French, we go backwards
-            sIndex = sLen; tIndex = tLen;
-            for(;;) {
-                while(sOrder==0) {
-                    if(sIndex==0) {
-                        endOfSource = TRUE;
-                        break;
-                    }
-                    sChar=source[--sIndex];
-                    sOrder = elements[sChar];
-                    // don't even look for contractions
-                }
-
-                while(tOrder==0) {
-                    if(tIndex==0) {
-                        if(endOfSource) {
-                            goto endOfSecLoop;
-                        } else {
-                            return UCOL_GREATER;
-                        }
-                    }
-                    tChar=target[--tIndex];
-                    tOrder = elements[tChar];
-                    // don't even look for contractions
-                }
-                if(endOfSource) {
-                    return UCOL_LESS;
-                }
-
-                if(sOrder == tOrder) {
-                    sOrder = 0; tOrder = 0;
-                    continue;
-                } else {
-                    // see the primary loop for comments
-                    if(((sOrder^tOrder)&0xFF000000)!=0) {
-                        if(sOrder < tOrder) {
-                            return UCOL_LESS;
-                        } else if(sOrder > tOrder) {
-                            return UCOL_GREATER;
-                        }
-                    }
-                    sOrder<<=8;
-                    tOrder<<=8;
-                }
-            }
-        }
+U_CAPI uint32_t U_EXPORT2 ucol_getVariableTop(const UCollator *coll, UErrorCode *status) {
+    if(U_FAILURE(*status) || coll == NULL) {
+        return 0;
     }
+    return Collator::fromUCollator(coll)->getVariableTop(*status);
+}
 
-endOfSecLoop:
-    if(strength >= UCOL_TERTIARY) {
-        // tertiary loop is the same as secondary (except no French)
-        elements += coll->latinOneTableLen;
-        sIndex = 0; tIndex = 0;
-        endOfSource = FALSE;
-        for(;;) {
-            while(sOrder==0) {
-                if(sIndex==sLen) {
-                    endOfSource = TRUE;
-                    break;
-                }
-                sChar=source[sIndex++];
-                sOrder = elements[sChar];
-                if(sOrder > UCOL_NOT_FOUND) {
-                    sOrder = ucol_getLatinOneContraction(coll, UCOL_TERTIARY, sOrder, source, &sIndex, sLen);
-                }
-            }
-            while(tOrder==0) {
-                if(tIndex==tLen) {
-                    if(endOfSource) {
-                        return UCOL_EQUAL; // if both strings are at the end, they are equal
-                    } else {
-                        return UCOL_GREATER;
-                    }
-                }
-                tChar=target[tIndex++];
-                tOrder = elements[tChar];
-                if(tOrder > UCOL_NOT_FOUND) {
-                    tOrder = ucol_getLatinOneContraction(coll, UCOL_TERTIARY, tOrder, target, &tIndex, tLen);
-                }
-            }
-            if(endOfSource) {
-                return UCOL_LESS;
-            }
-            if(sOrder == tOrder) {
-                sOrder = 0; tOrder = 0;
-                continue;
-            } else {
-                if(((sOrder^tOrder)&0xff000000)!=0) {
-                    if(sOrder < tOrder) {
-                        return UCOL_LESS;
-                    } else if(sOrder > tOrder) {
-                        return UCOL_GREATER;
-                    }
-                }
-                sOrder<<=8;
-                tOrder<<=8;
-            }
-        }
+U_CAPI void  U_EXPORT2
+ucol_restoreVariableTop(UCollator *coll, const uint32_t varTop, UErrorCode *status) {
+    if(U_FAILURE(*status) || coll == NULL) {
+        return;
     }
-    return UCOL_EQUAL;
+    Collator::fromUCollator(coll)->setVariableTop(varTop, *status);
 }
 
-/*
-  Note: ucol_strcollUTF8 supports null terminated input. Calculating length of
-  null terminated input string takes extra amount of CPU cycles.
-*/
-static UCollationResult
-ucol_strcollRegularUTF8(
-                    const UCollator *coll,
-                    const char      *source,
-                    int32_t         sourceLength,
-                    const char      *target,
-                    int32_t         targetLength,
-                    UErrorCode      *status)
-{
-    UCharIterator src;
-    UCharIterator tgt;
-
-    uiter_setUTF8(&src, source, sourceLength);
-    uiter_setUTF8(&tgt, target, targetLength);
-
-    // Preparing the context objects for iterating over strings
-    collIterate sColl, tColl;
-    IInit_collIterate(coll, NULL, -1, &sColl, status);
-    IInit_collIterate(coll, NULL, -1, &tColl, status);
-    if(U_FAILURE(*status)) {
-        UTRACE_EXIT_VALUE_STATUS(UCOL_EQUAL, *status)
-        return UCOL_EQUAL;
+U_CAPI void  U_EXPORT2
+ucol_setAttribute(UCollator *coll, UColAttribute attr, UColAttributeValue value, UErrorCode *status) {
+    if(U_FAILURE(*status) || coll == NULL) {
+      return;
     }
-    // The division for the array length may truncate the array size to
-    // a little less than UNORM_ITER_SIZE, but that size is dimensioned too high
-    // for all platforms anyway.
-    UAlignedMemory stackNormIter1[UNORM_ITER_SIZE/sizeof(UAlignedMemory)];
-    UAlignedMemory stackNormIter2[UNORM_ITER_SIZE/sizeof(UAlignedMemory)];
-    UNormIterator *sNormIter = NULL, *tNormIter = NULL;
 
-    sColl.iterator = &src;
-    sColl.flags |= UCOL_USE_ITERATOR;
-    tColl.flags |= UCOL_USE_ITERATOR;
-    tColl.iterator = &tgt;
-
-    if(ucol_getAttribute(coll, UCOL_NORMALIZATION_MODE, status) == UCOL_ON) {
-        sNormIter = unorm_openIter(stackNormIter1, sizeof(stackNormIter1), status);
-        sColl.iterator = unorm_setIter(sNormIter, &src, UNORM_FCD, status);
-        sColl.flags &= ~UCOL_ITER_NORM;
+    Collator::fromUCollator(coll)->setAttribute(attr, value, *status);
+}
 
-        tNormIter = unorm_openIter(stackNormIter2, sizeof(stackNormIter2), status);
-        tColl.iterator = unorm_setIter(tNormIter, &tgt, UNORM_FCD, status);
-        tColl.flags &= ~UCOL_ITER_NORM;
+U_CAPI UColAttributeValue  U_EXPORT2
+ucol_getAttribute(const UCollator *coll, UColAttribute attr, UErrorCode *status) {
+    if(U_FAILURE(*status) || coll == NULL) {
+      return UCOL_DEFAULT;
     }
 
-    return ucol_strcollRegular(&sColl, &tColl, status);
+    return Collator::fromUCollator(coll)->getAttribute(attr, *status);
 }
 
-static inline uint32_t
-ucol_getLatinOneContractionUTF8(const UCollator *coll, int32_t strength,
-                          uint32_t CE, const char *s, int32_t *index, int32_t len)
+U_CAPI void U_EXPORT2
+ucol_setStrength(    UCollator                *coll,
+            UCollationStrength        strength)
 {
-    const UChar *UCharOffset = (UChar *)coll->image+getContractOffset(CE&0xFFF);
-    int32_t latinOneOffset = (CE & 0x00FFF000) >> 12;
-    int32_t offset = 1;
-    UChar32 schar = 0, tchar = 0;
-
-    for(;;) {
-        if (*index == len) {
-            return(coll->latinOneCEs[strength*coll->latinOneTableLen+latinOneOffset]);
-        }
-        U8_GET_OR_FFFD((const uint8_t*)s, 0, *index, len, schar);
-        if (len < 0 && schar == 0) {
-            return(coll->latinOneCEs[strength*coll->latinOneTableLen+latinOneOffset]);
-        }
-
-        while(schar > (tchar = *(UCharOffset+offset))) { /* since the contraction codepoints should be ordered, we skip all that are smaller */
-            offset++;
-        }
-
-        if (schar == tchar) {
-            U8_FWD_1(s, *index, len);
-            return(coll->latinOneCEs[strength*coll->latinOneTableLen+latinOneOffset+offset]);
-        }
-        else
-        {
-            if(schar & 0xFF00 /*> UCOL_ENDOFLATIN1RANGE*/) {
-                return UCOL_BAIL_OUT_CE;
-            }
-            // skip completely ignorables
-            uint32_t isZeroCE = UTRIE_GET32_FROM_LEAD(&coll->mapping, schar);
-            if(isZeroCE == 0) { // we have to ignore completely ignorables
-                U8_FWD_1(s, *index, len);
-                continue;
-            }
-
-            return(coll->latinOneCEs[strength*coll->latinOneTableLen+latinOneOffset]);
-        }
-    }
+    UErrorCode status = U_ZERO_ERROR;
+    ucol_setAttribute(coll, UCOL_STRENGTH, strength, &status);
 }
 
-static inline UCollationResult
-ucol_strcollUseLatin1UTF8(
-                const UCollator *coll,
-                const char      *source,
-                int32_t         sLen,
-                const char      *target,
-                int32_t         tLen,
-                UErrorCode      *status)
+U_CAPI UCollationStrength U_EXPORT2
+ucol_getStrength(const UCollator *coll)
 {
-    U_ALIGN_CODE(16);
-    int32_t strength = coll->strength;
-
-    int32_t sIndex = 0, tIndex = 0;
-    UChar32 sChar = 0, tChar = 0;
-    uint32_t sOrder=0, tOrder=0;
-
-    UBool endOfSource = FALSE;
-
-    uint32_t *elements = coll->latinOneCEs;
-
-    UBool haveContractions = FALSE; // if we have contractions in our string
-                                    // we cannot do French secondary
-
-    // Do the primary level
-    for(;;) {
-        while(sOrder==0) { // this loop skips primary ignorables
-            // sOrder=getNextlatinOneCE(source);
-            if (sIndex == sLen) {
-                endOfSource = TRUE;
-                break;
-            }
-            U8_NEXT_OR_FFFD(source, sIndex, sLen ,sChar);
-            if (sLen < 0 && sChar == 0) {
-                endOfSource = TRUE;
-                sLen = sIndex;
-                break;
-            }
-            if(sChar&0xFFFFFF00) { // if we encounter non-latin-1, we bail out (sChar > 0xFF, but this is faster on win32)
-                //fprintf(stderr, "R");
-                return ucol_strcollRegularUTF8(coll, source, sLen, target, tLen, status);
-            }
-            sOrder = elements[sChar];
-            if(sOrder >= UCOL_NOT_FOUND) { // if we got a special
-                // specials can basically be either contractions or bail-out signs. If we get anything
-                // else, we'll bail out anywasy
-                if(getCETag(sOrder) == CONTRACTION_TAG) {
-                    sOrder = ucol_getLatinOneContractionUTF8(coll, UCOL_PRIMARY, sOrder, source, &sIndex, sLen);
-                    haveContractions = TRUE; // if there are contractions, we cannot do French secondary
-                    // However, if there are contractions in the table, but we always use just one char,
-                    // we might be able to do French. This should be checked out.
-                }
-                if(sOrder >= UCOL_NOT_FOUND /*== UCOL_BAIL_OUT_CE*/) {
-                    //fprintf(stderr, "S");
-                    return ucol_strcollRegularUTF8(coll, source, sLen, target, tLen, status);
-                }
-            }
-        }
-
-        while(tOrder==0) {  // this loop skips primary ignorables
-            // tOrder=getNextlatinOneCE(target);
-            if (tIndex == tLen) {
-                if(endOfSource) {
-                    goto endOfPrimLoopU8;
-                } else {
-                    return UCOL_GREATER;
-                }
-            }
-            U8_NEXT_OR_FFFD(target, tIndex, tLen, tChar);
-            if (tLen < 0 && tChar == 0) {
-                if(endOfSource) {
-                    tLen = tIndex;
-                    goto endOfPrimLoopU8;
-                } else {
-                    return UCOL_GREATER;
-                }
-            }
-            if(tChar&0xFFFFFF00) { // if we encounter non-latin-1, we bail out (sChar > 0xFF, but this is faster on win32)
-                //fprintf(stderr, "R");
-                return ucol_strcollRegularUTF8(coll, source, sLen, target, tLen, status);
-            }
-            tOrder = elements[tChar];
-            if(tOrder >= UCOL_NOT_FOUND) {
-                // Handling specials, see the comments for source
-                if(getCETag(tOrder) == CONTRACTION_TAG) {
-                    tOrder = ucol_getLatinOneContractionUTF8(coll, UCOL_PRIMARY, tOrder, target, &tIndex, tLen);
-                    haveContractions = TRUE;
-                }
-                if(tOrder >= UCOL_NOT_FOUND /*== UCOL_BAIL_OUT_CE*/) {
-                    //fprintf(stderr, "S");
-                    return ucol_strcollRegularUTF8(coll, source, sLen, target, tLen, status);
-                }
-            }
-        }
-        if(endOfSource) { // source is finished, but target is not, say the result.
-            return UCOL_LESS;
-        }
-
-        if(sOrder == tOrder) { // if we have same CEs, we continue the loop
-            sOrder = 0; tOrder = 0;
-            continue;
-        } else {
-            // compare current top bytes
-            if(((sOrder^tOrder)&0xFF000000)!=0) {
-                // top bytes differ, return difference
-                if(sOrder < tOrder) {
-                    return UCOL_LESS;
-                } else if(sOrder > tOrder) {
-                    return UCOL_GREATER;
-                }
-                // instead of return (int32_t)(sOrder>>24)-(int32_t)(tOrder>>24);
-                // since we must return enum value
-            }
+    UErrorCode status = U_ZERO_ERROR;
+    return ucol_getAttribute(coll, UCOL_STRENGTH, &status);
+}
 
-            // top bytes match, continue with following bytes
-            sOrder<<=8;
-            tOrder<<=8;
-        }
+U_CAPI int32_t U_EXPORT2 
+ucol_getReorderCodes(const UCollator *coll,
+                    int32_t *dest,
+                    int32_t destCapacity,
+                    UErrorCode *status) {
+    if (U_FAILURE(*status)) {
+        return 0;
     }
 
-endOfPrimLoopU8:
-    // after primary loop, we definitely know the sizes of strings,
-    // so we set it and use simpler loop for secondaries and tertiaries
-    sLen = sIndex; tLen = tIndex;
-    if(strength >= UCOL_SECONDARY) {
-        // adjust the table beggining
-        elements += coll->latinOneTableLen;
-        endOfSource = FALSE;
-
-        if(coll->frenchCollation == UCOL_OFF) { // non French
-            // This loop is a simplified copy of primary loop
-            // at this point we know that whole strings are latin-1, so we don't
-            // check for that. We also know that we only have contractions as
-            // specials.
-            sIndex = 0; tIndex = 0;
-            for(;;) {
-                while(sOrder==0) {
-                    if(sIndex==sLen) {
-                        endOfSource = TRUE;
-                        break;
-                    }
-                    U_ASSERT(sLen >= 0);
-                    U8_NEXT_OR_FFFD(source, sIndex, sLen, sChar);
-                    U_ASSERT(sChar >= 0 && sChar <= 0xFF);
-                    sOrder = elements[sChar];
-                    if(sOrder > UCOL_NOT_FOUND) {
-                        sOrder = ucol_getLatinOneContractionUTF8(coll, UCOL_SECONDARY, sOrder, source, &sIndex, sLen);
-                    }
-                }
-
-                while(tOrder==0) {
-                    if(tIndex==tLen) {
-                        if(endOfSource) {
-                            goto endOfSecLoopU8;
-                        } else {
-                            return UCOL_GREATER;
-                        }
-                    }
-                    U_ASSERT(tLen >= 0);
-                    U8_NEXT_OR_FFFD(target, tIndex, tLen, tChar);
-                    U_ASSERT(tChar >= 0 && tChar <= 0xFF);
-                    tOrder = elements[tChar];
-                    if(tOrder > UCOL_NOT_FOUND) {
-                        tOrder = ucol_getLatinOneContractionUTF8(coll, UCOL_SECONDARY, tOrder, target, &tIndex, tLen);
-                    }
-                }
-                if(endOfSource) {
-                    return UCOL_LESS;
-                }
+    return Collator::fromUCollator(coll)->getReorderCodes(dest, destCapacity, *status);
+}
 
-                if(sOrder == tOrder) {
-                    sOrder = 0; tOrder = 0;
-                    continue;
-                } else {
-                    // see primary loop for comments on this
-                    if(((sOrder^tOrder)&0xFF000000)!=0) {
-                        if(sOrder < tOrder) {
-                            return UCOL_LESS;
-                        } else if(sOrder > tOrder) {
-                            return UCOL_GREATER;
-                        }
-                    }
-                    sOrder<<=8;
-                    tOrder<<=8;
-                }
-            }
-        } else { // French
-            if(haveContractions) { // if we have contractions, we have to bail out
-                // since we don't really know how to handle them here
-                return ucol_strcollRegularUTF8(coll, source, sLen, target, tLen, status);
-            }
-            // For French, we go backwards
-            sIndex = sLen; tIndex = tLen;
-            for(;;) {
-                while(sOrder==0) {
-                    if(sIndex==0) {
-                        endOfSource = TRUE;
-                        break;
-                    }
-                    U8_PREV_OR_FFFD(source, 0, sIndex, sChar);
-                    U_ASSERT(sChar >= 0 && sChar <= 0xFF);
-                    sOrder = elements[sChar];
-                    // don't even look for contractions
-                }
+U_CAPI void U_EXPORT2 
+ucol_setReorderCodes(UCollator* coll,
+                    const int32_t* reorderCodes,
+                    int32_t reorderCodesLength,
+                    UErrorCode *status) {
+    if (U_FAILURE(*status)) {
+        return;
+    }
 
-                while(tOrder==0) {
-                    if(tIndex==0) {
-                        if(endOfSource) {
-                            goto endOfSecLoopU8;
-                        } else {
-                            return UCOL_GREATER;
-                        }
-                    }
-                    U8_PREV_OR_FFFD(target, 0, tIndex, tChar);
-                    U_ASSERT(tChar >= 0 && tChar <= 0xFF);
-                    tOrder = elements[tChar];
-                    // don't even look for contractions
-                }
-                if(endOfSource) {
-                    return UCOL_LESS;
-                }
+    Collator::fromUCollator(coll)->setReorderCodes(reorderCodes, reorderCodesLength, *status);
+}
 
-                if(sOrder == tOrder) {
-                    sOrder = 0; tOrder = 0;
-                    continue;
-                } else {
-                    // see the primary loop for comments
-                    if(((sOrder^tOrder)&0xFF000000)!=0) {
-                        if(sOrder < tOrder) {
-                            return UCOL_LESS;
-                        } else if(sOrder > tOrder) {
-                            return UCOL_GREATER;
-                        }
-                    }
-                    sOrder<<=8;
-                    tOrder<<=8;
-                }
-            }
-        }
-    }
+U_CAPI int32_t U_EXPORT2 
+ucol_getEquivalentReorderCodes(int32_t reorderCode,
+                    int32_t* dest,
+                    int32_t destCapacity,
+                    UErrorCode *pErrorCode) {
+    return Collator::getEquivalentReorderCodes(reorderCode, dest, destCapacity, *pErrorCode);
+}
 
-endOfSecLoopU8:
-    if(strength >= UCOL_TERTIARY) {
-        // tertiary loop is the same as secondary (except no French)
-        elements += coll->latinOneTableLen;
-        sIndex = 0; tIndex = 0;
-        endOfSource = FALSE;
-        for(;;) {
-            while(sOrder==0) {
-                if(sIndex==sLen) {
-                    endOfSource = TRUE;
-                    break;
-                }
-                U_ASSERT(sLen >= 0);
-                U8_NEXT_OR_FFFD(source, sIndex, sLen, sChar);
-                U_ASSERT(sChar >= 0 && sChar <= 0xFF);
-                sOrder = elements[sChar];
-                if(sOrder > UCOL_NOT_FOUND) {
-                    sOrder = ucol_getLatinOneContractionUTF8(coll, UCOL_TERTIARY, sOrder, source, &sIndex, sLen);
-                }
-            }
-            while(tOrder==0) {
-                if(tIndex==tLen) {
-                    if(endOfSource) {
-                        return UCOL_EQUAL; // if both strings are at the end, they are equal
-                    } else {
-                        return UCOL_GREATER;
-                    }
-                }
-                U_ASSERT(tLen >= 0);
-                U8_NEXT_OR_FFFD(target, tIndex, tLen, tChar);
-                U_ASSERT(tChar >= 0 && tChar <= 0xFF);
-                tOrder = elements[tChar];
-                if(tOrder > UCOL_NOT_FOUND) {
-                    tOrder = ucol_getLatinOneContractionUTF8(coll, UCOL_TERTIARY, tOrder, target, &tIndex, tLen);
-                }
-            }
-            if(endOfSource) {
-                return UCOL_LESS;
-            }
-            if(sOrder == tOrder) {
-                sOrder = 0; tOrder = 0;
-                continue;
-            } else {
-                if(((sOrder^tOrder)&0xff000000)!=0) {
-                    if(sOrder < tOrder) {
-                        return UCOL_LESS;
-                    } else if(sOrder > tOrder) {
-                        return UCOL_GREATER;
-                    }
-                }
-                sOrder<<=8;
-                tOrder<<=8;
-            }
-        }
-    }
-    return UCOL_EQUAL;
+U_CAPI void U_EXPORT2
+ucol_getVersion(const UCollator* coll,
+                UVersionInfo versionInfo)
+{
+    Collator::fromUCollator(coll)->getVersion(versionInfo);
 }
 
 U_CAPI UCollationResult U_EXPORT2
@@ -8366,94 +418,15 @@ ucol_strcollIter( const UCollator    *coll,
     UTRACE_ENTRY(UTRACE_UCOL_STRCOLLITER);
     UTRACE_DATA3(UTRACE_VERBOSE, "coll=%p, sIter=%p, tIter=%p", coll, sIter, tIter);
 
-    if (sIter == tIter) {
-        UTRACE_EXIT_VALUE_STATUS(UCOL_EQUAL, *status)
-        return UCOL_EQUAL;
-    }
     if(sIter == NULL || tIter == NULL || coll == NULL) {
         *status = U_ILLEGAL_ARGUMENT_ERROR;
-        UTRACE_EXIT_VALUE_STATUS(UCOL_EQUAL, *status)
-        return UCOL_EQUAL;
-    }
-
-    UCollationResult result = UCOL_EQUAL;
-
-    // Preparing the context objects for iterating over strings
-    collIterate sColl, tColl;
-    IInit_collIterate(coll, NULL, -1, &sColl, status);
-    IInit_collIterate(coll, NULL, -1, &tColl, status);
-    if(U_FAILURE(*status)) {
-        UTRACE_EXIT_VALUE_STATUS(UCOL_EQUAL, *status)
+        UTRACE_EXIT_VALUE_STATUS(UCOL_EQUAL, *status);
         return UCOL_EQUAL;
     }
-    // The division for the array length may truncate the array size to
-    // a little less than UNORM_ITER_SIZE, but that size is dimensioned too high
-    // for all platforms anyway.
-    UAlignedMemory stackNormIter1[UNORM_ITER_SIZE/sizeof(UAlignedMemory)];
-    UAlignedMemory stackNormIter2[UNORM_ITER_SIZE/sizeof(UAlignedMemory)];
-    UNormIterator *sNormIter = NULL, *tNormIter = NULL;
-
-    sColl.iterator = sIter;
-    sColl.flags |= UCOL_USE_ITERATOR;
-    tColl.flags |= UCOL_USE_ITERATOR;
-    tColl.iterator = tIter;
-
-    if(ucol_getAttribute(coll, UCOL_NORMALIZATION_MODE, status) == UCOL_ON) {
-        sNormIter = unorm_openIter(stackNormIter1, sizeof(stackNormIter1), status);
-        sColl.iterator = unorm_setIter(sNormIter, sIter, UNORM_FCD, status);
-        sColl.flags &= ~UCOL_ITER_NORM;
-
-        tNormIter = unorm_openIter(stackNormIter2, sizeof(stackNormIter2), status);
-        tColl.iterator = unorm_setIter(tNormIter, tIter, UNORM_FCD, status);
-        tColl.flags &= ~UCOL_ITER_NORM;
-    }
-
-    UChar32 sChar = U_SENTINEL, tChar = U_SENTINEL;
-
-    while((sChar = sColl.iterator->next(sColl.iterator)) ==
-        (tChar = tColl.iterator->next(tColl.iterator))) {
-            if(sChar == U_SENTINEL) {
-                result = UCOL_EQUAL;
-                goto end_compare;
-            }
-    }
-
-    if(sChar == U_SENTINEL) {
-        tChar = tColl.iterator->previous(tColl.iterator);
-    }
-
-    if(tChar == U_SENTINEL) {
-        sChar = sColl.iterator->previous(sColl.iterator);
-    }
-
-    sChar = sColl.iterator->previous(sColl.iterator);
-    tChar = tColl.iterator->previous(tColl.iterator);
-
-    if (ucol_unsafeCP((UChar)sChar, coll) || ucol_unsafeCP((UChar)tChar, coll))
-    {
-        // We are stopped in the middle of a contraction.
-        // Scan backwards through the == part of the string looking for the start of the contraction.
-        //   It doesn't matter which string we scan, since they are the same in this region.
-        do
-        {
-            sChar = sColl.iterator->previous(sColl.iterator);
-            tChar = tColl.iterator->previous(tColl.iterator);
-        }
-        while (sChar != U_SENTINEL && ucol_unsafeCP((UChar)sChar, coll));
-    }
-
-
-    if(U_SUCCESS(*status)) {
-        result = ucol_strcollRegular(&sColl, &tColl, status);
-    }
 
-end_compare:
-    if(sNormIter || tNormIter) {
-        unorm_closeIter(sNormIter);
-        unorm_closeIter(tNormIter);
-    }
+    UCollationResult result = Collator::fromUCollator(coll)->compare(*sIter, *tIter, *status);
 
-    UTRACE_EXIT_VALUE_STATUS(result, *status)
+    UTRACE_EXIT_VALUE_STATUS(result, *status);
     return result;
 }
 
@@ -8477,115 +450,10 @@ ucol_strcoll( const UCollator    *coll,
         UTRACE_DATA2(UTRACE_VERBOSE, "target string = %vh ", target, targetLength);
     }
 
-    if((source == NULL && sourceLength != 0) || (target == NULL && targetLength != 0)) {
-        // do not crash, but return. Should have
-        // status argument to return error.
-        UTRACE_EXIT_VALUE(UCOL_EQUAL);
-        return UCOL_EQUAL;
-    }
-
-    /* Quick check if source and target are same strings. */
-    /* They should either both be NULL terminated or the explicit length should be set on both. */
-    if (source==target && sourceLength==targetLength) {
-        UTRACE_EXIT_VALUE(UCOL_EQUAL);
-        return UCOL_EQUAL;
-    }
-
-    if(coll->delegate != NULL) {
-      UErrorCode status = U_ZERO_ERROR;
-      return ((const Collator*)coll->delegate)->compare(source,sourceLength,target,targetLength, status);
-    }
-
-    /* Scan the strings.  Find:                                                             */
-    /*    The length of any leading portion that is equal                                   */
-    /*    Whether they are exactly equal.  (in which case we just return)                   */
-    const UChar    *pSrc    = source;
-    const UChar    *pTarg   = target;
-    int32_t        equalLength;
-
-    if (sourceLength == -1 && targetLength == -1) {
-        // Both strings are null terminated.
-        //    Scan through any leading equal portion.
-        while (*pSrc == *pTarg && *pSrc != 0) {
-            pSrc++;
-            pTarg++;
-        }
-        if (*pSrc == 0 && *pTarg == 0) {
-            UTRACE_EXIT_VALUE(UCOL_EQUAL);
-            return UCOL_EQUAL;
-        }
-        equalLength = (int32_t)(pSrc - source);
-    }
-    else
-    {
-        // One or both strings has an explicit length.
-        const UChar    *pSrcEnd = source + sourceLength;
-        const UChar    *pTargEnd = target + targetLength;
-
-        // Scan while the strings are bitwise ==, or until one is exhausted.
-        for (;;) {
-            if (pSrc == pSrcEnd || pTarg == pTargEnd) {
-                break;
-            }
-            if ((*pSrc == 0 && sourceLength == -1) || (*pTarg == 0 && targetLength == -1)) {
-                break;
-            }
-            if (*pSrc != *pTarg) {
-                break;
-            }
-            pSrc++;
-            pTarg++;
-        }
-        equalLength = (int32_t)(pSrc - source);
-
-        // If we made it all the way through both strings, we are done.  They are ==
-        if ((pSrc ==pSrcEnd  || (pSrcEnd <pSrc  && *pSrc==0))  &&   /* At end of src string, however it was specified. */
-            (pTarg==pTargEnd || (pTargEnd<pTarg && *pTarg==0)))     /* and also at end of dest string                  */
-        {
-            UTRACE_EXIT_VALUE(UCOL_EQUAL);
-            return UCOL_EQUAL;
-        }
-    }
-    if (equalLength > 0) {
-        /* There is an identical portion at the beginning of the two strings.        */
-        /*   If the identical portion ends within a contraction or a comibining      */
-        /*   character sequence, back up to the start of that sequence.              */
-        
-        // These values should already be set by the code above.
-        //pSrc  = source + equalLength;        /* point to the first differing chars   */
-        //pTarg = target + equalLength;
-        if ((pSrc  != source+sourceLength && ucol_unsafeCP(*pSrc, coll)) ||
-            (pTarg != target+targetLength && ucol_unsafeCP(*pTarg, coll)))
-        {
-            // We are stopped in the middle of a contraction.
-            // Scan backwards through the == part of the string looking for the start of the contraction.
-            //   It doesn't matter which string we scan, since they are the same in this region.
-            do
-            {
-                equalLength--;
-                pSrc--;
-            }
-            while (equalLength>0 && ucol_unsafeCP(*pSrc, coll));
-        }
-
-        source += equalLength;
-        target += equalLength;
-        if (sourceLength > 0) {
-            sourceLength -= equalLength;
-        }
-        if (targetLength > 0) {
-            targetLength -= equalLength;
-        }
-    }
-
     UErrorCode status = U_ZERO_ERROR;
-    UCollationResult returnVal;
-    if(!coll->latinOneUse || (sourceLength > 0 && *source&0xff00) || (targetLength > 0 && *target&0xff00)) {
-        returnVal = ucol_strcollRegular(coll, source, sourceLength, target, targetLength, &status);
-    } else {
-        returnVal = ucol_strcollUseLatin1(coll, source, sourceLength, target, targetLength, &status);
-    }
-    UTRACE_EXIT_VALUE(returnVal);
+    UCollationResult returnVal = Collator::fromUCollator(coll)->
+            compare(source, sourceLength, target, targetLength, status);
+    UTRACE_EXIT_VALUE_STATUS(returnVal, status);
     return returnVal;
 }
 
@@ -8613,151 +481,8 @@ ucol_strcollUTF8(
         return UCOL_EQUAL;
     }
 
-    if((source == NULL && sourceLength != 0) || (target == NULL && targetLength != 0)) {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        UTRACE_EXIT_VALUE_STATUS(UCOL_EQUAL, *status);
-        return UCOL_EQUAL;
-    }
-
-    /* Quick check if source and target are same strings. */
-    /* They should either both be NULL terminated or the explicit length should be set on both. */
-    if (source==target && sourceLength==targetLength) {
-        UTRACE_EXIT_VALUE_STATUS(UCOL_EQUAL, *status);
-        return UCOL_EQUAL;
-    }
-
-    if(coll->delegate != NULL) {
-        return ((const Collator*)coll->delegate)->compareUTF8(
-            StringPiece(source, (sourceLength < 0) ? uprv_strlen(source) : sourceLength),
-            StringPiece(target, (targetLength < 0) ? uprv_strlen(target) : targetLength),
-            *status);
-    }
-
-    /* Scan the strings.  Find:                                                             */
-    /*    The length of any leading portion that is equal                                   */
-    /*    Whether they are exactly equal.  (in which case we just return)                   */
-    const char  *pSrc = source;
-    const char  *pTarg = target;
-    UBool       bSrcLimit = FALSE;
-    UBool       bTargLimit = FALSE;
-
-    if (sourceLength == -1 && targetLength == -1) {
-        // Both strings are null terminated.
-        //    Scan through any leading equal portion.
-        while (*pSrc == *pTarg && *pSrc != 0) {
-            pSrc++;
-            pTarg++;
-        }
-        if (*pSrc == 0 && *pTarg == 0) {
-            UTRACE_EXIT_VALUE_STATUS(UCOL_EQUAL, *status);
-            return UCOL_EQUAL;
-        }
-        bSrcLimit = (*pSrc == 0);
-        bTargLimit = (*pTarg == 0);
-    }
-    else
-    {
-        // One or both strings has an explicit length.
-        const char *pSrcEnd = source + sourceLength;
-        const char *pTargEnd = target + targetLength;
-
-        // Scan while the strings are bitwise ==, or until one is exhausted.
-        for (;;) {
-            if (pSrc == pSrcEnd || pTarg == pTargEnd) {
-                break;
-            }
-            if ((*pSrc == 0 && sourceLength == -1) || (*pTarg == 0 && targetLength == -1)) {
-                break;
-            }
-            if (*pSrc != *pTarg) {
-                break;
-            }
-            pSrc++;
-            pTarg++;
-        }
-        bSrcLimit = (pSrc ==pSrcEnd  || (pSrcEnd <pSrc  && *pSrc==0));
-        bTargLimit = (pTarg==pTargEnd || (pTargEnd<pTarg && *pTarg==0));
-
-        // If we made it all the way through both strings, we are done.  They are ==
-        if (bSrcLimit &&    /* At end of src string, however it was specified. */
-            bTargLimit)     /* and also at end of dest string                  */
-        {
-            UTRACE_EXIT_VALUE_STATUS(UCOL_EQUAL, *status);
-            return UCOL_EQUAL;
-        }
-    }
-
-    U_ASSERT(!(bSrcLimit && bTargLimit));
-
-    int32_t    equalLength = pSrc - source;
-    UBool       bSawNonLatin1 = FALSE;
-
-    if (equalLength > 0) {
-        // Align position to the start of UTF-8 code point.
-        if (bTargLimit) {
-            U8_SET_CP_START((const uint8_t*)source, 0, equalLength);
-        } else {
-            U8_SET_CP_START((const uint8_t*)target, 0, equalLength);
-        }
-        pSrc = source + equalLength;
-        pTarg = target + equalLength;
-    }
-
-    if (equalLength > 0) {
-        /* There is an identical portion at the beginning of the two strings.        */
-        /*   If the identical portion ends within a contraction or a comibining      */
-        /*   character sequence, back up to the start of that sequence.              */
-        UBool bUnsafeCP = FALSE;
-        UChar32 uc32 = -1;
-
-        if (!bSrcLimit) {
-            U8_GET_OR_FFFD((const uint8_t*)source, 0, equalLength, sourceLength, uc32);
-            if (uc32 >= 0x10000 || ucol_unsafeCP((UChar)uc32, coll)) {
-                bUnsafeCP = TRUE;
-            }
-            bSawNonLatin1 |= (uc32 > 0xff);
-        }
-        if (!bTargLimit) {
-            U8_GET_OR_FFFD((const uint8_t*)target, 0, equalLength, targetLength, uc32);
-            if (uc32 >= 0x10000 || ucol_unsafeCP((UChar)uc32, coll)) {
-                bUnsafeCP = TRUE;
-            }
-            bSawNonLatin1 |= (uc32 > 0xff);
-        }
-
-        if (bUnsafeCP) {
-            while (equalLength > 0) {
-                // We are stopped in the middle of a contraction.
-                // Scan backwards through the == part of the string looking for the start of the contraction.
-                //   It doesn't matter which string we scan, since they are the same in this region.
-                U8_PREV_OR_FFFD((uint8_t*)source, 0, equalLength, uc32);
-                bSawNonLatin1 |= (uc32 > 0xff);
-                if (uc32 < 0x10000 && !ucol_unsafeCP((UChar)uc32, coll)) {
-                    break;
-                }
-            }
-        }
-        source += equalLength;
-        target += equalLength;
-        if (sourceLength > 0) {
-            sourceLength -= equalLength;
-        }
-        if (targetLength > 0) {
-            targetLength -= equalLength;
-        }
-    } else {
-        // Lead byte of Latin 1 character is 0x00 - 0xC3
-        bSawNonLatin1 = (source && (sourceLength != 0) && (uint8_t)*source > 0xc3);
-        bSawNonLatin1 |= (target && (targetLength != 0) && (uint8_t)*target > 0xc3);
-    }
-
-    UCollationResult returnVal;
-
-    if(!coll->latinOneUse || bSawNonLatin1) {
-        returnVal = ucol_strcollRegularUTF8(coll, source, sourceLength, target, targetLength, status);
-    } else {
-        returnVal = ucol_strcollUseLatin1UTF8(coll, source, sourceLength, target, targetLength, status);
-    }
+    UCollationResult returnVal = Collator::fromUCollator(coll)->internalCompareUTF8(
+            source, sourceLength, target, targetLength, *status);
     UTRACE_EXIT_VALUE_STATUS(returnVal, *status);
     return returnVal;
 }
@@ -8801,9 +526,97 @@ ucol_equal(        const    UCollator        *coll,
 
 U_CAPI void U_EXPORT2
 ucol_getUCAVersion(const UCollator* coll, UVersionInfo info) {
-    if(coll && coll->UCA) {
-        uprv_memcpy(info, coll->UCA->image->UCAVersion, sizeof(UVersionInfo));
+    const Collator *c = Collator::fromUCollator(coll);
+    if(c != NULL) {
+        UVersionInfo v;
+        c->getVersion(v);
+        // Note: This is tied to how the current implementation encodes the UCA version
+        // in the overall getVersion().
+        // Alternatively, we could load the root collator and get at lower-level data from there.
+        // Either way, it will reflect the input collator's UCA version only
+        // if it is a known implementation.
+        // It would be cleaner to make this a virtual Collator method.
+        info[0] = v[1] >> 3;
+        info[1] = v[1] & 7;
+        info[2] = v[2] >> 6;
+        info[3] = 0;
+    }
+}
+
+U_CAPI const UChar * U_EXPORT2
+ucol_getRules(const UCollator *coll, int32_t *length) {
+    const RuleBasedCollator *rbc = RuleBasedCollator::rbcFromUCollator(coll);
+    // OK to crash if coll==NULL: We do not want to check "this" pointers.
+    if(rbc != NULL || coll == NULL) {
+        const UnicodeString &rules = rbc->getRules();
+        U_ASSERT(rules.getBuffer()[rules.length()] == 0);
+        *length = rules.length();
+        return rules.getBuffer();
+    }
+    static const UChar _NUL = 0;
+    *length = 0;
+    return &_NUL;
+}
+
+U_CAPI int32_t U_EXPORT2
+ucol_getRulesEx(const UCollator *coll, UColRuleOption delta, UChar *buffer, int32_t bufferLen) {
+    UnicodeString rules;
+    const RuleBasedCollator *rbc = RuleBasedCollator::rbcFromUCollator(coll);
+    if(rbc != NULL || coll == NULL) {
+        rbc->getRules(delta, rules);
+    }
+    if(buffer != NULL && bufferLen > 0) {
+        UErrorCode errorCode = U_ZERO_ERROR;
+        return rules.extract(buffer, bufferLen, errorCode);
+    } else {
+        return rules.length();
+    }
+}
+
+U_CAPI const char * U_EXPORT2
+ucol_getLocale(const UCollator *coll, ULocDataLocaleType type, UErrorCode *status) {
+    return ucol_getLocaleByType(coll, type, status);
+}
+
+U_CAPI const char * U_EXPORT2
+ucol_getLocaleByType(const UCollator *coll, ULocDataLocaleType type, UErrorCode *status) {
+    if(U_FAILURE(*status)) {
+        return NULL;
     }
+    UTRACE_ENTRY(UTRACE_UCOL_GETLOCALE);
+    UTRACE_DATA1(UTRACE_INFO, "coll=%p", coll);
+
+    const char *result;
+    const RuleBasedCollator *rbc = RuleBasedCollator::rbcFromUCollator(coll);
+    if(rbc == NULL && coll != NULL) {
+        *status = U_UNSUPPORTED_ERROR;
+        result = NULL;
+    } else {
+        result = rbc->internalGetLocaleID(type, *status);
+    }
+
+    UTRACE_DATA1(UTRACE_INFO, "result = %s", result);
+    UTRACE_EXIT_STATUS(*status);
+    return result;
+}
+
+U_CAPI USet * U_EXPORT2
+ucol_getTailoredSet(const UCollator *coll, UErrorCode *status) {
+    if(U_FAILURE(*status)) {
+        return NULL;
+    }
+    UnicodeSet *set = Collator::fromUCollator(coll)->getTailoredSet(*status);
+    if(U_FAILURE(*status)) {
+        delete set;
+        return NULL;
+    }
+    return set->toUSet();
+}
+
+U_CAPI UBool U_EXPORT2
+ucol_equals(const UCollator *source, const UCollator *target) {
+    return source == target ||
+        (*Collator::fromUCollator(source)) == (*Collator::fromUCollator(target));
 }
 
 #endif /* #if !UCONFIG_NO_COLLATION */
diff --git a/icu4c/source/i18n/ucol_bld.cpp b/icu4c/source/i18n/ucol_bld.cpp
deleted file mode 100644 (file)
index 822ef8c..0000000
+++ /dev/null
@@ -1,1410 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 2001-2013, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  ucol_bld.cpp
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created 02/22/2001
-*   created by: Vladimir Weinstein
-*
-* This module builds a collator based on the rule set.
-*
-*/
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION
-
-#include "unicode/ucoleitr.h"
-#include "unicode/udata.h"
-#include "unicode/uchar.h"
-#include "unicode/uniset.h"
-#include "unicode/uscript.h"
-#include "unicode/ustring.h"
-#include "unicode/utf16.h"
-#include "normalizer2impl.h"
-#include "uassert.h"
-#include "ucol_bld.h"
-#include "ucol_elm.h"
-#include "ucol_cnt.h"
-#include "ucln_in.h"
-#include "umutex.h"
-#include "cmemory.h"
-#include "cstring.h"
-
-#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
-
-static const InverseUCATableHeader* _staticInvUCA = NULL;
-static UDataMemory* invUCA_DATA_MEM = NULL;
-static icu::UInitOnce gStaticInvUCAInitOnce = U_INITONCE_INITIALIZER;
-
-U_CDECL_BEGIN
-static UBool U_CALLCONV
-isAcceptableInvUCA(void * /*context*/,
-                   const char * /*type*/, const char * /*name*/,
-                   const UDataInfo *pInfo)
-{
-    /* context, type & name are intentionally not used */
-    if( pInfo->size>=20 &&
-        pInfo->isBigEndian==U_IS_BIG_ENDIAN &&
-        pInfo->charsetFamily==U_CHARSET_FAMILY &&
-        pInfo->dataFormat[0]==INVUCA_DATA_FORMAT_0 &&   /* dataFormat="InvC" */
-        pInfo->dataFormat[1]==INVUCA_DATA_FORMAT_1 &&
-        pInfo->dataFormat[2]==INVUCA_DATA_FORMAT_2 &&
-        pInfo->dataFormat[3]==INVUCA_DATA_FORMAT_3 &&
-        pInfo->formatVersion[0]==INVUCA_FORMAT_VERSION_0 &&
-        pInfo->formatVersion[1]>=INVUCA_FORMAT_VERSION_1 //&&
-        //pInfo->formatVersion[1]==INVUCA_FORMAT_VERSION_1 &&
-        //pInfo->formatVersion[2]==INVUCA_FORMAT_VERSION_2 &&
-        //pInfo->formatVersion[3]==INVUCA_FORMAT_VERSION_3 &&
-        )
-    {
-        // TODO: Check that the invuca data version (pInfo->dataVersion)
-        // matches the ucadata version.
-        return TRUE;
-    } else {
-        return FALSE;
-    }
-}
-U_CDECL_END
-
-/*
-* Takes two CEs (lead and continuation) and
-* compares them as CEs should be compared:
-* primary vs. primary, secondary vs. secondary
-* tertiary vs. tertiary
-*/
-static int32_t compareCEs(uint32_t source0, uint32_t source1, uint32_t target0, uint32_t target1) {
-    uint32_t s1 = source0, s2, t1 = target0, t2;
-    if(isContinuation(source1)) {
-        s2 = source1;
-    } else {
-        s2 = 0;
-    }
-    if(isContinuation(target1)) {
-        t2 = target1;
-    } else {
-        t2 = 0;
-    }
-
-    uint32_t s = 0, t = 0;
-    if(s1 == t1 && s2 == t2) {
-        return 0;
-    }
-    s = (s1 & 0xFFFF0000)|((s2 & 0xFFFF0000)>>16);
-    t = (t1 & 0xFFFF0000)|((t2 & 0xFFFF0000)>>16);
-    if(s < t) {
-        return -1;
-    } else if(s > t) {
-        return 1;
-    } else {
-        s = (s1 & 0x0000FF00) | (s2 & 0x0000FF00)>>8;
-        t = (t1 & 0x0000FF00) | (t2 & 0x0000FF00)>>8;
-        if(s < t) {
-            return -1;
-        } else if(s > t) {
-            return 1;
-        } else {
-            s = (s1 & 0x000000FF)<<8 | (s2 & 0x000000FF);
-            t = (t1 & 0x000000FF)<<8 | (t2 & 0x000000FF);
-            if(s < t) {
-                return -1;
-            } else {
-                return 1;
-            }
-        }
-    }
-}
-
-static
-int32_t ucol_inv_findCE(const UColTokenParser *src, uint32_t CE, uint32_t SecondCE) {
-    uint32_t bottom = 0, top = src->invUCA->tableSize;
-    uint32_t i = 0;
-    uint32_t first = 0, second = 0;
-    uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table);
-    int32_t res = 0;
-
-    while(bottom < top-1) {
-        i = (top+bottom)/2;
-        first = *(CETable+3*i);
-        second = *(CETable+3*i+1);
-        res = compareCEs(first, second, CE, SecondCE);
-        if(res > 0) {
-            top = i;
-        } else if(res < 0) {
-            bottom = i;
-        } else {
-            break;
-        }
-    }
-
-    /* weiv:                                                  */
-    /* in searching for elements, I have removed the failure  */
-    /* The reason for this is that the builder does not rely  */
-    /* on search mechanism telling it that it didn't find an  */
-    /* element. However, indirect positioning relies on being */
-    /* able to find the elements around any CE, even if it is */
-    /* not defined in the UCA. */
-    return i;
-    /*
-    if((first == CE && second == SecondCE)) {
-    return i;
-    } else {
-    return -1;
-    }
-    */
-}
-
-static const uint32_t strengthMask[UCOL_CE_STRENGTH_LIMIT] = {
-    0xFFFF0000,
-    0xFFFFFF00,
-    0xFFFFFFFF
-};
-
-U_CAPI int32_t U_EXPORT2 ucol_inv_getNextCE(const UColTokenParser *src,
-                                            uint32_t CE, uint32_t contCE,
-                                            uint32_t *nextCE, uint32_t *nextContCE,
-                                            uint32_t strength)
-{
-    uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table);
-    int32_t iCE;
-
-    iCE = ucol_inv_findCE(src, CE, contCE);
-
-    if(iCE<0) {
-        *nextCE = UCOL_NOT_FOUND;
-        return -1;
-    }
-
-    CE &= strengthMask[strength];
-    contCE &= strengthMask[strength];
-
-    *nextCE = CE;
-    *nextContCE = contCE;
-
-    while((*nextCE  & strengthMask[strength]) == CE
-        && (*nextContCE  & strengthMask[strength]) == contCE)
-    {
-        *nextCE = (*(CETable+3*(++iCE)));
-        *nextContCE = (*(CETable+3*(iCE)+1));
-    }
-
-    return iCE;
-}
-
-U_CFUNC int32_t U_EXPORT2 ucol_inv_getPrevCE(const UColTokenParser *src,
-                                            uint32_t CE, uint32_t contCE,
-                                            uint32_t *prevCE, uint32_t *prevContCE,
-                                            uint32_t strength)
-{
-    uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table);
-    int32_t iCE;
-
-    iCE = ucol_inv_findCE(src, CE, contCE);
-
-    if(iCE<0) {
-        *prevCE = UCOL_NOT_FOUND;
-        return -1;
-    }
-
-    CE &= strengthMask[strength];
-    contCE &= strengthMask[strength];
-
-    *prevCE = CE;
-    *prevContCE = contCE;
-
-    while((*prevCE  & strengthMask[strength]) == CE
-        && (*prevContCE  & strengthMask[strength])== contCE
-        && iCE > 0) /* this condition should prevent falling off the edge of the world */
-    {
-        /* here, we end up in a singularity - zero */
-        *prevCE = (*(CETable+3*(--iCE)));
-        *prevContCE = (*(CETable+3*(iCE)+1));
-    }
-
-    return iCE;
-}
-
-U_CFUNC uint32_t U_EXPORT2 ucol_getCEStrengthDifference(uint32_t CE, uint32_t contCE,
-                                                       uint32_t prevCE, uint32_t prevContCE)
-{
-    if(prevCE == CE && prevContCE == contCE) {
-        return UCOL_IDENTICAL;
-    }
-    if((prevCE & strengthMask[UCOL_PRIMARY]) != (CE & strengthMask[UCOL_PRIMARY])
-        || (prevContCE & strengthMask[UCOL_PRIMARY]) != (contCE & strengthMask[UCOL_PRIMARY]))
-    {
-        return UCOL_PRIMARY;
-    }
-    if((prevCE & strengthMask[UCOL_SECONDARY]) != (CE & strengthMask[UCOL_SECONDARY])
-        || (prevContCE & strengthMask[UCOL_SECONDARY]) != (contCE & strengthMask[UCOL_SECONDARY]))
-    {
-        return UCOL_SECONDARY;
-    }
-    return UCOL_TERTIARY;
-}
-
-
-/*static
-inline int32_t ucol_inv_getPrevious(UColTokenParser *src, UColTokListHeader *lh, uint32_t strength) {
-
-    uint32_t CE = lh->baseCE;
-    uint32_t SecondCE = lh->baseContCE;
-
-    uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table);
-    uint32_t previousCE, previousContCE;
-    int32_t iCE;
-
-    iCE = ucol_inv_findCE(src, CE, SecondCE);
-
-    if(iCE<0) {
-        return -1;
-    }
-
-    CE &= strengthMask[strength];
-    SecondCE &= strengthMask[strength];
-
-    previousCE = CE;
-    previousContCE = SecondCE;
-
-    while((previousCE  & strengthMask[strength]) == CE && (previousContCE  & strengthMask[strength])== SecondCE) {
-        previousCE = (*(CETable+3*(--iCE)));
-        previousContCE = (*(CETable+3*(iCE)+1));
-    }
-    lh->previousCE = previousCE;
-    lh->previousContCE = previousContCE;
-
-    return iCE;
-}*/
-
-static
-inline int32_t ucol_inv_getNext(UColTokenParser *src, UColTokListHeader *lh, uint32_t strength) {
-    uint32_t CE = lh->baseCE;
-    uint32_t SecondCE = lh->baseContCE;
-
-    uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table);
-    uint32_t nextCE, nextContCE;
-    int32_t iCE;
-
-    iCE = ucol_inv_findCE(src, CE, SecondCE);
-
-    if(iCE<0) {
-        return -1;
-    }
-
-    CE &= strengthMask[strength];
-    SecondCE &= strengthMask[strength];
-
-    nextCE = CE;
-    nextContCE = SecondCE;
-
-    while((nextCE  & strengthMask[strength]) == CE
-        && (nextContCE  & strengthMask[strength]) == SecondCE)
-    {
-        nextCE = (*(CETable+3*(++iCE)));
-        nextContCE = (*(CETable+3*(iCE)+1));
-    }
-
-    lh->nextCE = nextCE;
-    lh->nextContCE = nextContCE;
-
-    return iCE;
-}
-
-static void ucol_inv_getGapPositions(UColTokenParser *src, UColTokListHeader *lh, UErrorCode *status) {
-    /* reset all the gaps */
-    int32_t i = 0;
-    uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table);
-    uint32_t st = 0;
-    uint32_t t1, t2;
-    int32_t pos;
-
-    UColToken *tok = lh->first;
-    uint32_t tokStrength = tok->strength;
-
-    for(i = 0; i<3; i++) {
-        lh->gapsHi[3*i] = 0;
-        lh->gapsHi[3*i+1] = 0;
-        lh->gapsHi[3*i+2] = 0;
-        lh->gapsLo[3*i] = 0;
-        lh->gapsLo[3*i+1] = 0;
-        lh->gapsLo[3*i+2] = 0;
-        lh->numStr[i] = 0;
-        lh->fStrToken[i] = NULL;
-        lh->lStrToken[i] = NULL;
-        lh->pos[i] = -1;
-    }
-
-    UCAConstants *consts = (UCAConstants *)((uint8_t *)src->UCA->image + src->UCA->image->UCAConsts);
-
-    if((lh->baseCE & 0xFF000000)>= (consts->UCA_PRIMARY_IMPLICIT_MIN<<24) && (lh->baseCE & 0xFF000000) <= (consts->UCA_PRIMARY_IMPLICIT_MAX<<24) ) { /* implicits - */
-        //if(lh->baseCE >= PRIMARY_IMPLICIT_MIN && lh->baseCE < PRIMARY_IMPLICIT_MAX ) { /* implicits - */
-        lh->pos[0] = 0;
-        t1 = lh->baseCE;
-        t2 = lh->baseContCE & UCOL_REMOVE_CONTINUATION;
-        lh->gapsLo[0] = (t1 & UCOL_PRIMARYMASK) | (t2 & UCOL_PRIMARYMASK) >> 16;
-        lh->gapsLo[1] = (t1 & UCOL_SECONDARYMASK) << 16 | (t2 & UCOL_SECONDARYMASK) << 8;
-        lh->gapsLo[2] = (UCOL_TERTIARYORDER(t1)) << 24 | (UCOL_TERTIARYORDER(t2)) << 16;
-        uint32_t primaryCE = (t1 & UCOL_PRIMARYMASK) | ((t2 & UCOL_PRIMARYMASK) >> 16);
-        primaryCE = uprv_uca_getImplicitFromRaw(uprv_uca_getRawFromImplicit(primaryCE)+1);
-
-        t1 = (primaryCE & UCOL_PRIMARYMASK) | 0x0505;
-        t2 = (primaryCE << 16) & UCOL_PRIMARYMASK; // | UCOL_CONTINUATION_MARKER;
-
-        lh->gapsHi[0] = (t1 & UCOL_PRIMARYMASK) | (t2 & UCOL_PRIMARYMASK) >> 16;
-        lh->gapsHi[1] = (t1 & UCOL_SECONDARYMASK) << 16 | (t2 & UCOL_SECONDARYMASK) << 8;
-        lh->gapsHi[2] = (UCOL_TERTIARYORDER(t1)) << 24 | (UCOL_TERTIARYORDER(t2)) << 16;
-    } else if(lh->indirect == TRUE && lh->nextCE != 0) {
-        //} else if(lh->baseCE == UCOL_RESET_TOP_VALUE && lh->baseContCE == 0) {
-        lh->pos[0] = 0;
-        t1 = lh->baseCE;
-        t2 = lh->baseContCE&UCOL_REMOVE_CONTINUATION;
-        lh->gapsLo[0] = (t1 & UCOL_PRIMARYMASK) | (t2 & UCOL_PRIMARYMASK) >> 16;
-        lh->gapsLo[1] = (t1 & UCOL_SECONDARYMASK) << 16 | (t2 & UCOL_SECONDARYMASK) << 8;
-        lh->gapsLo[2] = (UCOL_TERTIARYORDER(t1)) << 24 | (UCOL_TERTIARYORDER(t2)) << 16;
-        t1 = lh->nextCE;
-        t2 = lh->nextContCE&UCOL_REMOVE_CONTINUATION;
-        lh->gapsHi[0] = (t1 & UCOL_PRIMARYMASK) | (t2 & UCOL_PRIMARYMASK) >> 16;
-        lh->gapsHi[1] = (t1 & UCOL_SECONDARYMASK) << 16 | (t2 & UCOL_SECONDARYMASK) << 8;
-        lh->gapsHi[2] = (UCOL_TERTIARYORDER(t1)) << 24 | (UCOL_TERTIARYORDER(t2)) << 16;
-    } else {
-        for(;;) {
-            if(tokStrength < UCOL_CE_STRENGTH_LIMIT) {
-                if((lh->pos[tokStrength] = ucol_inv_getNext(src, lh, tokStrength)) >= 0) {
-                    lh->fStrToken[tokStrength] = tok;
-                } else { /* The CE must be implicit, since it's not in the table */
-                    /* Error */
-                    *status = U_INTERNAL_PROGRAM_ERROR;
-                }
-            }
-
-            while(tok != NULL && tok->strength >= tokStrength) {
-                if(tokStrength < UCOL_CE_STRENGTH_LIMIT) {
-                    lh->lStrToken[tokStrength] = tok;
-                }
-                tok = tok->next;
-            }
-            if(tokStrength < UCOL_CE_STRENGTH_LIMIT-1) {
-                /* check if previous interval is the same and merge the intervals if it is so */
-                if(lh->pos[tokStrength] == lh->pos[tokStrength+1]) {
-                    lh->fStrToken[tokStrength] = lh->fStrToken[tokStrength+1];
-                    lh->fStrToken[tokStrength+1] = NULL;
-                    lh->lStrToken[tokStrength+1] = NULL;
-                    lh->pos[tokStrength+1] = -1;
-                }
-            }
-            if(tok != NULL) {
-                tokStrength = tok->strength;
-            } else {
-                break;
-            }
-        }
-        for(st = 0; st < 3; st++) {
-            if((pos = lh->pos[st]) >= 0) {
-                t1 = *(CETable+3*(pos));
-                t2 = *(CETable+3*(pos)+1);
-                lh->gapsHi[3*st] = (t1 & UCOL_PRIMARYMASK) | (t2 & UCOL_PRIMARYMASK) >> 16;
-                lh->gapsHi[3*st+1] = (t1 & UCOL_SECONDARYMASK) << 16 | (t2 & UCOL_SECONDARYMASK) << 8;
-                //lh->gapsHi[3*st+2] = (UCOL_TERTIARYORDER(t1)) << 24 | (UCOL_TERTIARYORDER(t2)) << 16;
-                lh->gapsHi[3*st+2] = (t1&0x3f) << 24 | (t2&0x3f) << 16;
-                //pos--;
-                //t1 = *(CETable+3*(pos));
-                //t2 = *(CETable+3*(pos)+1);
-                t1 = lh->baseCE;
-                t2 = lh->baseContCE;
-                lh->gapsLo[3*st] = (t1 & UCOL_PRIMARYMASK) | (t2 & UCOL_PRIMARYMASK) >> 16;
-                lh->gapsLo[3*st+1] = (t1 & UCOL_SECONDARYMASK) << 16 | (t2 & UCOL_SECONDARYMASK) << 8;
-                lh->gapsLo[3*st+2] = (t1&0x3f) << 24 | (t2&0x3f) << 16;
-            }
-        }
-    }
-}
-
-
-#define ucol_countBytes(value, noOfBytes)   \
-{                               \
-    uint32_t mask = 0xFFFFFFFF;   \
-    (noOfBytes) = 0;              \
-    while(mask != 0) {            \
-    if(((value) & mask) != 0) { \
-    (noOfBytes)++;            \
-    }                           \
-    mask >>= 8;                 \
-    }                             \
-}
-
-static uint32_t ucol_getNextGenerated(ucolCEGenerator *g, UErrorCode *status) {
-    if(U_SUCCESS(*status)) {
-        g->current = ucol_nextWeight(g->ranges, &g->noOfRanges);
-    }
-    return g->current;
-}
-
-static uint32_t ucol_getSimpleCEGenerator(ucolCEGenerator *g, UColToken *tok, uint32_t strength, UErrorCode *status) {
-    /* TODO: rename to enum names */
-    uint32_t high, low, count=1;
-    uint32_t maxByte = (strength == UCOL_TERTIARY)?0x3F:0xFF;
-
-    if(strength == UCOL_SECONDARY) {
-        low = UCOL_COMMON_TOP2<<24;
-        high = 0xFFFFFFFF;
-        count = 0xFF - UCOL_COMMON_TOP2;
-    } else {
-        low = UCOL_BYTE_COMMON << 24; //0x05000000;
-        high = 0x40000000;
-        count = 0x40 - UCOL_BYTE_COMMON;
-    }
-
-    if(tok->next != NULL && tok->next->strength == strength) {
-        count = tok->next->toInsert;
-    }
-
-    g->noOfRanges = ucol_allocWeights(low, high, count, maxByte, g->ranges);
-    g->current = UCOL_BYTE_COMMON<<24;
-
-    if(g->noOfRanges == 0) {
-        *status = U_INTERNAL_PROGRAM_ERROR;
-    }
-    return g->current;
-}
-
-static uint32_t ucol_getCEGenerator(ucolCEGenerator *g, uint32_t* lows, uint32_t* highs, UColToken *tok, uint32_t fStrength, UErrorCode *status) {
-    uint32_t strength = tok->strength;
-    uint32_t low = lows[fStrength*3+strength];
-    uint32_t high = highs[fStrength*3+strength];
-    uint32_t maxByte = 0;
-    if(strength == UCOL_TERTIARY) {
-        maxByte = 0x3F;
-    } else if(strength == UCOL_PRIMARY) {
-        maxByte = 0xFE;
-    } else {
-        maxByte = 0xFF;
-    }
-
-    uint32_t count = tok->toInsert;
-
-    if(low >= high && strength > UCOL_PRIMARY) {
-        int32_t s = strength;
-        for(;;) {
-            s--;
-            if(lows[fStrength*3+s] != highs[fStrength*3+s]) {
-                if(strength == UCOL_SECONDARY) {
-                    if (low < UCOL_COMMON_TOP2<<24 ) {
-                       // Override if low range is less than UCOL_COMMON_TOP2.
-                       low = UCOL_COMMON_TOP2<<24;
-                    }
-                    high = 0xFFFFFFFF;
-                } else {
-                    // Override if low range is less than UCOL_COMMON_BOT3.
-                   if ( low < UCOL_COMMON_BOT3<<24 ) {
-                        low = UCOL_COMMON_BOT3<<24;
-                   }
-                    high = 0x40000000;
-                }
-                break;
-            }
-            if(s<0) {
-                *status = U_INTERNAL_PROGRAM_ERROR;
-                return 0;
-            }
-        }
-    }
-
-    if(low < 0x02000000) {
-        // We must not use CE weight byte 02, so we set it as the minimum lower bound.
-        // See http://site.icu-project.org/design/collation/bytes
-        low = 0x02000000;
-    }
-
-    if(strength == UCOL_SECONDARY) { /* similar as simple */
-        if(low >= (UCOL_COMMON_BOT2<<24) && low < (uint32_t)(UCOL_COMMON_TOP2<<24)) {
-            low = UCOL_COMMON_TOP2<<24;
-        }
-        if(high > (UCOL_COMMON_BOT2<<24) && high < (uint32_t)(UCOL_COMMON_TOP2<<24)) {
-            high = UCOL_COMMON_TOP2<<24;
-        }
-        if(low < (UCOL_COMMON_BOT2<<24)) {
-            g->noOfRanges = ucol_allocWeights(UCOL_BYTE_UNSHIFTED_MIN<<24, high, count, maxByte, g->ranges);
-            g->current = ucol_nextWeight(g->ranges, &g->noOfRanges);
-            //g->current = UCOL_COMMON_BOT2<<24;
-            return g->current;
-        }
-    }
-
-    g->noOfRanges = ucol_allocWeights(low, high, count, maxByte, g->ranges);
-    if(g->noOfRanges == 0) {
-        *status = U_INTERNAL_PROGRAM_ERROR;
-    }
-    g->current = ucol_nextWeight(g->ranges, &g->noOfRanges);
-    return g->current;
-}
-
-static
-uint32_t u_toLargeKana(const UChar *source, const uint32_t sourceLen, UChar *resBuf, const uint32_t resLen, UErrorCode *status) {
-    uint32_t i = 0;
-    UChar c;
-
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-
-    if(sourceLen > resLen) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return 0;
-    }
-
-    for(i = 0; i < sourceLen; i++) {
-        c = source[i];
-        if(0x3041 <= c && c <= 0x30FA) { /* Kana range */
-            switch(c - 0x3000) {
-            case 0x41: case 0x43: case 0x45: case 0x47: case 0x49: case 0x63: case 0x83: case 0x85: case 0x8E:
-            case 0xA1: case 0xA3: case 0xA5: case 0xA7: case 0xA9: case 0xC3: case 0xE3: case 0xE5: case 0xEE:
-                c++;
-                break;
-            case 0xF5:
-                c = 0x30AB;
-                break;
-            case 0xF6:
-                c = 0x30B1;
-                break;
-            }
-        }
-        resBuf[i] = c;
-    }
-    return sourceLen;
-}
-
-static
-uint32_t u_toSmallKana(const UChar *source, const uint32_t sourceLen, UChar *resBuf, const uint32_t resLen, UErrorCode *status) {
-    uint32_t i = 0;
-    UChar c;
-
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-
-    if(sourceLen > resLen) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return 0;
-    }
-
-    for(i = 0; i < sourceLen; i++) {
-        c = source[i];
-        if(0x3041 <= c && c <= 0x30FA) { /* Kana range */
-            switch(c - 0x3000) {
-            case 0x42: case 0x44: case 0x46: case 0x48: case 0x4A: case 0x64: case 0x84: case 0x86: case 0x8F:
-            case 0xA2: case 0xA4: case 0xA6: case 0xA8: case 0xAA: case 0xC4: case 0xE4: case 0xE6: case 0xEF:
-                c--;
-                break;
-            case 0xAB:
-                c = 0x30F5;
-                break;
-            case 0xB1:
-                c = 0x30F6;
-                break;
-            }
-        }
-        resBuf[i] = c;
-    }
-    return sourceLen;
-}
-
-U_NAMESPACE_BEGIN
-
-static
-uint8_t ucol_uprv_getCaseBits(const UCollator *UCA, const UChar *src, uint32_t len, UErrorCode *status) {
-    uint32_t i = 0;
-    UChar n[128];
-    uint32_t nLen = 0;
-    uint32_t uCount = 0, lCount = 0;
-
-    collIterate s;
-    uint32_t order = 0;
-
-    if(U_FAILURE(*status)) {
-        return UCOL_LOWER_CASE;
-    }
-
-    nLen = unorm_normalize(src, len, UNORM_NFKD, 0, n, 128, status);
-    if(U_SUCCESS(*status)) {
-        for(i = 0; i < nLen; i++) {
-            uprv_init_collIterate(UCA, &n[i], 1, &s, status);
-            order = ucol_getNextCE(UCA, &s, status);
-            if(isContinuation(order)) {
-                *status = U_INTERNAL_PROGRAM_ERROR;
-                return UCOL_LOWER_CASE;
-            }
-            if((order&UCOL_CASE_BIT_MASK)== UCOL_UPPER_CASE) {
-                uCount++;
-            } else {
-                if(u_islower(n[i])) {
-                    lCount++;
-                } else if(U_SUCCESS(*status)) {
-                    UChar sk[1], lk[1];
-                    u_toSmallKana(&n[i], 1, sk, 1, status);
-                    u_toLargeKana(&n[i], 1, lk, 1, status);
-                    if(sk[0] == n[i] && lk[0] != n[i]) {
-                        lCount++;
-                    }
-                }
-            }
-        }
-    }
-
-    if(uCount != 0 && lCount != 0) {
-        return UCOL_MIXED_CASE;
-    } else if(uCount != 0) {
-        return UCOL_UPPER_CASE;
-    } else {
-        return UCOL_LOWER_CASE;
-    }
-}
-
-
-U_CFUNC void ucol_doCE(UColTokenParser *src, uint32_t *CEparts, UColToken *tok, UErrorCode *status) {
-    /* this one makes the table and stuff */
-    uint32_t noOfBytes[3];
-    uint32_t i;
-
-    for(i = 0; i<3; i++) {
-        ucol_countBytes(CEparts[i], noOfBytes[i]);
-    }
-
-    /* Here we have to pack CEs from parts */
-
-    uint32_t CEi = 0;
-    uint32_t value = 0;
-
-    while(2*CEi<noOfBytes[0] || CEi<noOfBytes[1] || CEi<noOfBytes[2]) {
-        if(CEi > 0) {
-            value = UCOL_CONTINUATION_MARKER; /* Continuation marker */
-        } else {
-            value = 0;
-        }
-
-        if(2*CEi<noOfBytes[0]) {
-            value |= ((CEparts[0]>>(32-16*(CEi+1))) & 0xFFFF) << 16;
-        }
-        if(CEi<noOfBytes[1]) {
-            value |= ((CEparts[1]>>(32-8*(CEi+1))) & 0xFF) << 8;
-        }
-        if(CEi<noOfBytes[2]) {
-            value |= ((CEparts[2]>>(32-8*(CEi+1))) & 0x3F);
-        }
-        tok->CEs[CEi] = value;
-        CEi++;
-    }
-    if(CEi == 0) { /* totally ignorable */
-        tok->noOfCEs = 1;
-        tok->CEs[0] = 0;
-    } else { /* there is at least something */
-        tok->noOfCEs = CEi;
-    }
-
-
-    // we want to set case bits here and now, not later.
-    // Case bits handling
-    if(tok->CEs[0] != 0) { // case bits should be set only for non-ignorables
-        tok->CEs[0] &= 0xFFFFFF3F; // Clean the case bits field
-        int32_t cSize = (tok->source & 0xFF000000) >> 24;
-        UChar *cPoints = (tok->source & 0x00FFFFFF) + src->source;
-
-        if(cSize > 1) {
-            // Do it manually
-            tok->CEs[0] |= ucol_uprv_getCaseBits(src->UCA, cPoints, cSize, status);
-        } else {
-            // Copy it from the UCA
-            uint32_t caseCE = ucol_getFirstCE(src->UCA, cPoints[0], status);
-            tok->CEs[0] |= (caseCE & 0xC0);
-        }
-    }
-
-#if UCOL_DEBUG==2
-    fprintf(stderr, "%04X str: %i, [%08X, %08X, %08X]: tok: ", tok->debugSource, tok->strength, CEparts[0] >> (32-8*noOfBytes[0]), CEparts[1] >> (32-8*noOfBytes[1]), CEparts[2]>> (32-8*noOfBytes[2]));
-    for(i = 0; i<tok->noOfCEs; i++) {
-        fprintf(stderr, "%08X ", tok->CEs[i]);
-    }
-    fprintf(stderr, "\n");
-#endif
-}
-
-U_CFUNC void ucol_initBuffers(UColTokenParser *src, UColTokListHeader *lh, UErrorCode *status) {
-    ucolCEGenerator Gens[UCOL_CE_STRENGTH_LIMIT];
-    uint32_t CEparts[UCOL_CE_STRENGTH_LIMIT];
-
-    UColToken *tok = lh->last;
-    uint32_t t[UCOL_STRENGTH_LIMIT];
-
-    uprv_memset(t, 0, UCOL_STRENGTH_LIMIT*sizeof(uint32_t));
-
-    /* must initialize ranges to avoid memory check warnings */
-    for (int i = 0; i < UCOL_CE_STRENGTH_LIMIT; i++) {
-        uprv_memset(Gens[i].ranges, 0, sizeof(Gens[i].ranges));
-    }
-
-    tok->toInsert = 1;
-    t[tok->strength] = 1;
-
-    while(tok->previous != NULL) {
-        if(tok->previous->strength < tok->strength) { /* going up */
-            t[tok->strength] = 0;
-            t[tok->previous->strength]++;
-        } else if(tok->previous->strength > tok->strength) { /* going down */
-            t[tok->previous->strength] = 1;
-        } else {
-            t[tok->strength]++;
-        }
-        tok=tok->previous;
-        tok->toInsert = t[tok->strength];
-    }
-
-    tok->toInsert = t[tok->strength];
-    ucol_inv_getGapPositions(src, lh, status);
-
-#if UCOL_DEBUG
-    fprintf(stderr, "BaseCE: %08X %08X\n", lh->baseCE, lh->baseContCE);
-    int32_t j = 2;
-    for(j = 2; j >= 0; j--) {
-        fprintf(stderr, "gapsLo[%i] [%08X %08X %08X]\n", j, lh->gapsLo[j*3], lh->gapsLo[j*3+1], lh->gapsLo[j*3+2]);
-        fprintf(stderr, "gapsHi[%i] [%08X %08X %08X]\n", j, lh->gapsHi[j*3], lh->gapsHi[j*3+1], lh->gapsHi[j*3+2]);
-    }
-    tok=&lh->first[UCOL_TOK_POLARITY_POSITIVE];
-
-    do {
-        fprintf(stderr,"%i", tok->strength);
-        tok = tok->next;
-    } while(tok != NULL);
-    fprintf(stderr, "\n");
-
-    tok=&lh->first[UCOL_TOK_POLARITY_POSITIVE];
-
-    do {
-        fprintf(stderr,"%i", tok->toInsert);
-        tok = tok->next;
-    } while(tok != NULL);
-#endif
-
-    tok = lh->first;
-    uint32_t fStrength = UCOL_IDENTICAL;
-    uint32_t initStrength = UCOL_IDENTICAL;
-
-
-    CEparts[UCOL_PRIMARY] = (lh->baseCE & UCOL_PRIMARYMASK) | (lh->baseContCE & UCOL_PRIMARYMASK) >> 16;
-    CEparts[UCOL_SECONDARY] = (lh->baseCE & UCOL_SECONDARYMASK) << 16 | (lh->baseContCE & UCOL_SECONDARYMASK) << 8;
-    CEparts[UCOL_TERTIARY] = (UCOL_TERTIARYORDER(lh->baseCE)) << 24 | (UCOL_TERTIARYORDER(lh->baseContCE)) << 16;
-
-    while (tok != NULL && U_SUCCESS(*status)) {
-        fStrength = tok->strength;
-        if(fStrength < initStrength) {
-            initStrength = fStrength;
-            if(lh->pos[fStrength] == -1) {
-                while(lh->pos[fStrength] == -1 && fStrength > 0) {
-                    fStrength--;
-                }
-                if(lh->pos[fStrength] == -1) {
-                    *status = U_INTERNAL_PROGRAM_ERROR;
-                    return;
-                }
-            }
-            if(initStrength == UCOL_TERTIARY) { /* starting with tertiary */
-                CEparts[UCOL_PRIMARY] = lh->gapsLo[fStrength*3];
-                CEparts[UCOL_SECONDARY] = lh->gapsLo[fStrength*3+1];
-                /*CEparts[UCOL_TERTIARY] = ucol_getCEGenerator(&Gens[2], lh->gapsLo[fStrength*3+2], lh->gapsHi[fStrength*3+2], tok, UCOL_TERTIARY); */
-                CEparts[UCOL_TERTIARY] = ucol_getCEGenerator(&Gens[UCOL_TERTIARY], lh->gapsLo, lh->gapsHi, tok, fStrength, status);
-            } else if(initStrength == UCOL_SECONDARY) { /* secondaries */
-                CEparts[UCOL_PRIMARY] = lh->gapsLo[fStrength*3];
-                /*CEparts[1] = ucol_getCEGenerator(&Gens[1], lh->gapsLo[fStrength*3+1], lh->gapsHi[fStrength*3+1], tok, 1);*/
-                CEparts[UCOL_SECONDARY] = ucol_getCEGenerator(&Gens[UCOL_SECONDARY], lh->gapsLo, lh->gapsHi, tok, fStrength,  status);
-                CEparts[UCOL_TERTIARY] = ucol_getSimpleCEGenerator(&Gens[UCOL_TERTIARY], tok, UCOL_TERTIARY, status);
-            } else { /* primaries */
-                /*CEparts[UCOL_PRIMARY] = ucol_getCEGenerator(&Gens[0], lh->gapsLo[0], lh->gapsHi[0], tok, UCOL_PRIMARY);*/
-                CEparts[UCOL_PRIMARY] = ucol_getCEGenerator(&Gens[UCOL_PRIMARY], lh->gapsLo, lh->gapsHi, tok, fStrength,  status);
-                CEparts[UCOL_SECONDARY] = ucol_getSimpleCEGenerator(&Gens[UCOL_SECONDARY], tok, UCOL_SECONDARY, status);
-                CEparts[UCOL_TERTIARY] = ucol_getSimpleCEGenerator(&Gens[UCOL_TERTIARY], tok, UCOL_TERTIARY, status);
-            }
-        } else {
-            if(tok->strength == UCOL_TERTIARY) {
-                CEparts[UCOL_TERTIARY] = ucol_getNextGenerated(&Gens[UCOL_TERTIARY], status);
-            } else if(tok->strength == UCOL_SECONDARY) {
-                CEparts[UCOL_SECONDARY] = ucol_getNextGenerated(&Gens[UCOL_SECONDARY], status);
-                CEparts[UCOL_TERTIARY] = ucol_getSimpleCEGenerator(&Gens[UCOL_TERTIARY], tok, UCOL_TERTIARY, status);
-            } else if(tok->strength == UCOL_PRIMARY) {
-                CEparts[UCOL_PRIMARY] = ucol_getNextGenerated(&Gens[UCOL_PRIMARY], status);
-                CEparts[UCOL_SECONDARY] = ucol_getSimpleCEGenerator(&Gens[UCOL_SECONDARY], tok, UCOL_SECONDARY, status);
-                CEparts[UCOL_TERTIARY] = ucol_getSimpleCEGenerator(&Gens[UCOL_TERTIARY], tok, UCOL_TERTIARY, status);
-            }
-        }
-        ucol_doCE(src, CEparts, tok, status);
-        tok = tok->next;
-    }
-}
-
-U_CFUNC void ucol_createElements(UColTokenParser *src, tempUCATable *t, UColTokListHeader *lh, UErrorCode *status) {
-    UCAElements el;
-    UColToken *tok = lh->first;
-    UColToken *expt = NULL;
-    uint32_t i = 0, j = 0;
-    const Normalizer2Impl *nfcImpl = Normalizer2Factory::getNFCImpl(*status);
-
-    while(tok != NULL && U_SUCCESS(*status)) {
-        /* first, check if there are any expansions */
-        /* if there are expansions, we need to do a little bit more processing */
-        /* since parts of expansion can be tailored, while others are not */
-        if(tok->expansion != 0) {
-            uint32_t len = tok->expansion >> 24;
-            uint32_t currentSequenceLen = len;
-            uint32_t expOffset = tok->expansion & 0x00FFFFFF;
-            //uint32_t exp = currentSequenceLen | expOffset;
-            UColToken exp;
-            exp.source = currentSequenceLen | expOffset;
-            exp.rulesToParseHdl = &(src->source);
-
-            while(len > 0) {
-                currentSequenceLen = len;
-                while(currentSequenceLen > 0) {
-                    exp.source = (currentSequenceLen << 24) | expOffset;
-                    if((expt = (UColToken *)uhash_get(src->tailored, &exp)) != NULL && expt->strength != UCOL_TOK_RESET) { /* expansion is tailored */
-                        uint32_t noOfCEsToCopy = expt->noOfCEs;
-                        for(j = 0; j<noOfCEsToCopy; j++) {
-                            tok->expCEs[tok->noOfExpCEs + j] = expt->CEs[j];
-                        }
-                        tok->noOfExpCEs += noOfCEsToCopy;
-                        // Smart people never try to add codepoints and CEs.
-                        // For some odd reason, it won't work.
-                        expOffset += currentSequenceLen; //noOfCEsToCopy;
-                        len -= currentSequenceLen; //noOfCEsToCopy;
-                        break;
-                    } else {
-                        currentSequenceLen--;
-                    }
-                }
-                if(currentSequenceLen == 0) { /* couldn't find any tailored subsequence */
-                    /* will have to get one from UCA */
-                    /* first, get the UChars from the rules */
-                    /* then pick CEs out until there is no more and stuff them into expansion */
-                    collIterate s;
-                    uint32_t order = 0;
-                    uprv_init_collIterate(src->UCA, expOffset + src->source, 1, &s, status);
-
-                    for(;;) {
-                        order = ucol_getNextCE(src->UCA, &s, status);
-                        if(order == UCOL_NO_MORE_CES) {
-                            break;
-                        }
-                        tok->expCEs[tok->noOfExpCEs++] = order;
-                    }
-                    expOffset++;
-                    len--;
-                }
-            }
-        } else {
-            tok->noOfExpCEs = 0;
-        }
-
-        /* set the ucaelement with obtained values */
-        el.noOfCEs = tok->noOfCEs + tok->noOfExpCEs;
-        /* copy CEs */
-        for(i = 0; i<tok->noOfCEs; i++) {
-            el.CEs[i] = tok->CEs[i];
-        }
-        for(i = 0; i<tok->noOfExpCEs; i++) {
-            el.CEs[i+tok->noOfCEs] = tok->expCEs[i];
-        }
-
-        /* copy UChars */
-        // We kept prefix and source kind of together, as it is a kind of a contraction.
-        // However, now we have to slice the prefix off the main thing -
-        el.prefix = el.prefixChars;
-        el.cPoints = el.uchars;
-        if(tok->prefix != 0) { // we will just copy the prefix here, and adjust accordingly in the
-            // addPrefix function in ucol_elm. The reason is that we need to add both composed AND
-            // decomposed elements to the unsaf table.
-            el.prefixSize = tok->prefix>>24;
-            uprv_memcpy(el.prefix, src->source + (tok->prefix & 0x00FFFFFF), el.prefixSize*sizeof(UChar));
-
-            el.cSize = (tok->source >> 24)-(tok->prefix>>24);
-            uprv_memcpy(el.uchars, (tok->source & 0x00FFFFFF)+(tok->prefix>>24) + src->source, el.cSize*sizeof(UChar));
-        } else {
-            el.prefixSize = 0;
-            *el.prefix = 0;
-
-            el.cSize = (tok->source >> 24);
-            uprv_memcpy(el.uchars, (tok->source & 0x00FFFFFF) + src->source, el.cSize*sizeof(UChar));
-        }
-        if(src->UCA != NULL) {
-            for(i = 0; i<el.cSize; i++) {
-                if(UCOL_ISJAMO(el.cPoints[i])) {
-                    t->image->jamoSpecial = TRUE;
-                }
-            }
-            if (!src->buildCCTabFlag && el.cSize > 0) {
-                // Check the trailing canonical combining class (tccc) of the last character.
-                const UChar *s = el.cPoints + el.cSize;
-                uint16_t fcd = nfcImpl->previousFCD16(el.cPoints, s);
-                if ((fcd & 0xff) != 0) {
-                    src->buildCCTabFlag = TRUE;
-                }
-            }
-        }
-
-        /* and then, add it */
-#if UCOL_DEBUG==2
-        fprintf(stderr, "Adding: %04X with %08X\n", el.cPoints[0], el.CEs[0]);
-#endif
-        uprv_uca_addAnElement(t, &el, status);
-
-#if UCOL_DEBUG_DUPLICATES
-        if(*status != U_ZERO_ERROR) {
-            fprintf(stderr, "replaced CE for %04X with CE for %04X\n", el.cPoints[0], tok->debugSource);
-            *status = U_ZERO_ERROR;
-        }
-#endif
-
-        tok = tok->next;
-    }
-}
-
-U_CDECL_BEGIN
-static UBool U_CALLCONV
-_processUCACompleteIgnorables(const void *context, UChar32 start, UChar32 limit, uint32_t value) {
-    UErrorCode status = U_ZERO_ERROR;
-    tempUCATable *t = (tempUCATable *)context;
-    if(value == 0) {
-        while(start < limit) {
-            uint32_t CE = utrie_get32(t->mapping, start, NULL);
-            if(CE == UCOL_NOT_FOUND) {
-                UCAElements el;
-                el.isThai = FALSE;
-                el.prefixSize = 0;
-                el.prefixChars[0] = 0;
-                el.prefix = el.prefixChars;
-                el.cPoints = el.uchars;
-
-                el.cSize = 0;
-                U16_APPEND_UNSAFE(el.uchars, el.cSize, start);
-
-                el.noOfCEs = 1;
-                el.CEs[0] = 0;
-                uprv_uca_addAnElement(t, &el, &status);
-
-            }
-            start++;
-        }
-    }
-    if(U_FAILURE(status)) {
-        return FALSE;
-    } else {
-        return TRUE;
-    }
-}
-U_CDECL_END
-
-static void
-ucol_uprv_bld_copyRangeFromUCA(UColTokenParser *src, tempUCATable *t,
-                               UChar32 start, UChar32 end,
-                               UErrorCode *status)
-{
-    //UChar decomp[256];
-    uint32_t CE = UCOL_NOT_FOUND;
-    UChar32 u = 0;
-    UCAElements el;
-    el.isThai = FALSE;
-    el.prefixSize = 0;
-    el.prefixChars[0] = 0;
-    collIterate colIt;
-
-    if(U_SUCCESS(*status)) {
-        for(u = start; u<=end; u++) {
-            if((CE = utrie_get32(t->mapping, u, NULL)) == UCOL_NOT_FOUND
-                /* this test is for contractions that are missing the starting element. */
-                || ((isCntTableElement(CE)) &&
-                (uprv_cnttab_getCE(t->contractions, CE, 0, status) == UCOL_NOT_FOUND))
-                )
-            {
-                el.cSize = 0;
-                U16_APPEND_UNSAFE(el.uchars, el.cSize, u);
-                //decomp[0] = (UChar)u;
-                //el.uchars[0] = (UChar)u;
-                el.cPoints = el.uchars;
-                //el.cSize = 1;
-                el.noOfCEs = 0;
-                el.prefix = el.prefixChars;
-                el.prefixSize = 0;
-                //uprv_init_collIterate(src->UCA, decomp, 1, &colIt);
-                // We actually want to check whether this element is a special
-                // If it is an implicit element (hangul, CJK - we want to copy the
-                // special, not the resolved CEs) - for hangul, copying resolved
-                // would just make things the same (there is an expansion and it
-                // takes approximately the same amount of time to resolve as
-                // falling back to the UCA).
-                /*
-                UTRIE_GET32(src->UCA->mapping, u, CE);
-                tag = getCETag(CE);
-                if(tag == HANGUL_SYLLABLE_TAG || tag == CJK_IMPLICIT_TAG
-                || tag == IMPLICIT_TAG || tag == TRAIL_SURROGATE_TAG
-                || tag == LEAD_SURROGATE_TAG) {
-                el.CEs[el.noOfCEs++] = CE;
-                } else {
-                */
-                // It turns out that it does not make sense to keep implicits
-                // unresolved. The cost of resolving them is big enough so that
-                // it doesn't make any difference whether we have to go to the UCA
-                // or not.
-                {
-                    uprv_init_collIterate(src->UCA, el.uchars, el.cSize, &colIt, status);
-                    while(CE != UCOL_NO_MORE_CES) {
-                        CE = ucol_getNextCE(src->UCA, &colIt, status);
-                        if(CE != UCOL_NO_MORE_CES) {
-                            el.CEs[el.noOfCEs++] = CE;
-                        }
-                    }
-                }
-                uprv_uca_addAnElement(t, &el, status);
-            }
-        }
-    }
-}
-
-U_NAMESPACE_END
-
-U_CFUNC UCATableHeader *
-ucol_assembleTailoringTable(UColTokenParser *src, UErrorCode *status) {
-    U_NAMESPACE_USE
-
-    uint32_t i = 0;
-    if(U_FAILURE(*status)) {
-        return NULL;
-    }
-    /*
-    2.  Eliminate the negative lists by doing the following for each non-null negative list:
-    o   if previousCE(baseCE, strongestN) != some ListHeader X's baseCE,
-    create new ListHeader X
-    o   reverse the list, add to the end of X's positive list. Reset the strength of the
-    first item you add, based on the stronger strength levels of the two lists.
-    */
-    /*
-    3.  For each ListHeader with a non-null positive list:
-    */
-    /*
-    o   Find all character strings with CEs between the baseCE and the
-    next/previous CE, at the strength of the first token. Add these to the
-    tailoring.
-    ? That is, if UCA has ...  x <<< X << x' <<< X' < y ..., and the
-    tailoring has & x < z...
-    ? Then we change the tailoring to & x  <<< X << x' <<< X' < z ...
-    */
-    /* It is possible that this part should be done even while constructing list */
-    /* The problem is that it is unknown what is going to be the strongest weight */
-    /* So we might as well do it here */
-
-    /*
-    o   Allocate CEs for each token in the list, based on the total number N of the
-    largest level difference, and the gap G between baseCE and nextCE at that
-    level. The relation * between the last item and nextCE is the same as the
-    strongest strength.
-    o   Example: baseCE < a << b <<< q << c < d < e * nextCE(X,1)
-    ? There are 3 primary items: a, d, e. Fit them into the primary gap.
-    Then fit b and c into the secondary gap between a and d, then fit q
-    into the tertiary gap between b and c.
-
-    o   Example: baseCE << b <<< q << c * nextCE(X,2)
-    ? There are 2 secondary items: b, c. Fit them into the secondary gap.
-    Then fit q into the tertiary gap between b and c.
-    o   When incrementing primary values, we will not cross high byte
-    boundaries except where there is only a single-byte primary. That is to
-    ensure that the script reordering will continue to work.
-    */
-    UCATableHeader *image = (UCATableHeader *)uprv_malloc(sizeof(UCATableHeader));
-    /* test for NULL */
-    if (image == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return NULL;
-    }
-    uprv_memcpy(image, src->UCA->image, sizeof(UCATableHeader));
-
-    for(i = 0; i<src->resultLen; i++) {
-        /* now we need to generate the CEs */
-        /* We stuff the initial value in the buffers, and increase the appropriate buffer */
-        /* According to strength                                                          */
-        if(U_SUCCESS(*status)) {
-            if(src->lh[i].first) { // if there are any elements
-                // due to the way parser works, subsequent tailorings
-                // may remove all the elements from a sequence, therefore
-                // leaving an empty tailoring sequence.
-                ucol_initBuffers(src, &src->lh[i], status);
-            }
-        }
-        if(U_FAILURE(*status)) {
-            uprv_free(image);
-            return NULL;
-        }
-    }
-
-    if(src->varTop != NULL) { /* stuff the variable top value */
-        src->opts->variableTopValue = (*(src->varTop->CEs))>>16;
-        /* remove it from the list */
-        if(src->varTop->listHeader->first == src->varTop) { /* first in list */
-            src->varTop->listHeader->first = src->varTop->next;
-        }
-        if(src->varTop->listHeader->last == src->varTop) { /* first in list */
-            src->varTop->listHeader->last = src->varTop->previous;
-        }
-        if(src->varTop->next != NULL) {
-            src->varTop->next->previous = src->varTop->previous;
-        }
-        if(src->varTop->previous != NULL) {
-            src->varTop->previous->next = src->varTop->next;
-        }
-    }
-
-
-    tempUCATable *t = uprv_uca_initTempTable(image, src->opts, src->UCA, NOT_FOUND_TAG, NOT_FOUND_TAG, status);
-    if(U_FAILURE(*status)) {
-        uprv_free(image);
-        return NULL;
-    }
-
-
-    /* After this, we have assigned CE values to all regular CEs      */
-    /* now we will go through list once more and resolve expansions,  */
-    /* make UCAElements structs and add them to table                 */
-    for(i = 0; i<src->resultLen; i++) {
-        /* now we need to generate the CEs */
-        /* We stuff the initial value in the buffers, and increase the appropriate buffer */
-        /* According to strength                                                          */
-        if(U_SUCCESS(*status)) {
-            ucol_createElements(src, t, &src->lh[i], status);
-        }
-    }
-
-    UCAElements el;
-    el.isThai = FALSE;
-    el.prefixSize = 0;
-    el.prefixChars[0] = 0;
-
-    /* add latin-1 stuff */
-    ucol_uprv_bld_copyRangeFromUCA(src, t, 0, 0xFF, status);
-
-    /* add stuff for copying */
-    if(src->copySet != NULL) {
-        int32_t i = 0;
-        UnicodeSet *set = (UnicodeSet *)src->copySet;
-        for(i = 0; i < set->getRangeCount(); i++) {
-            ucol_uprv_bld_copyRangeFromUCA(src, t, set->getRangeStart(i), set->getRangeEnd(i), status);
-        }
-    }
-
-    if(U_SUCCESS(*status)) {
-        /* copy contractions from the UCA - this is felt mostly for cyrillic*/
-
-        uint32_t tailoredCE = UCOL_NOT_FOUND;
-        UChar *conts = (UChar *)((uint8_t *)src->UCA->image + src->UCA->image->contractionUCACombos);
-        int32_t maxUCAContractionLength = src->UCA->image->contractionUCACombosWidth;
-        UCollationElements *ucaEl = ucol_openElements(src->UCA, NULL, 0, status);
-        // Check for null pointer
-        if (ucaEl == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return NULL;
-        }
-        while(*conts != 0) {
-            // A continuation is NUL-terminated and NUL-padded
-            // except if it has the maximum length.
-            int32_t contractionLength = maxUCAContractionLength;
-            while(contractionLength > 0 && conts[contractionLength - 1] == 0) {
-                --contractionLength;
-            }
-            UChar32 first;
-            int32_t firstLength = 0;
-            U16_NEXT(conts, firstLength, contractionLength, first);
-            tailoredCE = utrie_get32(t->mapping, first, NULL);
-            if(tailoredCE != UCOL_NOT_FOUND) {
-                UBool needToAdd = TRUE;
-                if(isCntTableElement(tailoredCE)) {
-                    if(uprv_cnttab_isTailored(t->contractions, tailoredCE, conts+firstLength, status) == TRUE) {
-                        needToAdd = FALSE;
-                    }
-                }
-                if (!needToAdd && isPrefix(tailoredCE) && *(conts+1)==0) {
-                    UCAElements elm;
-                    elm.cPoints = el.uchars;
-                    elm.noOfCEs = 0;
-                    elm.uchars[0] = *conts;
-                    elm.uchars[1] = 0;
-                    elm.cSize = 1;
-                    elm.prefixChars[0] = *(conts+2);
-                    elm.isThai = FALSE;
-                    elm.prefix = elm.prefixChars;
-                    elm.prefixSize = 1;
-                    UCAElements *prefixEnt=(UCAElements *)uhash_get(t->prefixLookup, &elm);
-                    if ((prefixEnt==NULL) || *(prefixEnt->prefix)!=*(conts+2)) {
-                        needToAdd = TRUE;
-                    }
-                }
-                if(src->removeSet != NULL && uset_contains(src->removeSet, first)) {
-                    needToAdd = FALSE;
-                }
-
-                if(needToAdd == TRUE) { // we need to add if this contraction is not tailored.
-                    if (*(conts+1) != 0) {  // contractions
-                        el.prefix = el.prefixChars;
-                        el.prefixSize = 0;
-                        el.cPoints = el.uchars;
-                        el.noOfCEs = 0;
-                        u_memcpy(el.uchars, conts, contractionLength);
-                        el.cSize = contractionLength;
-                        ucol_setText(ucaEl, el.uchars, el.cSize, status);
-                    }
-                    else { // pre-context character
-                        UChar str[4] = { 0 };
-                        int32_t len=0;
-                        int32_t preKeyLen=0;
-                        
-                        el.cPoints = el.uchars;
-                        el.noOfCEs = 0;
-                        el.uchars[0] = *conts;
-                        el.uchars[1] = 0;
-                        el.cSize = 1;
-                        el.prefixChars[0] = *(conts+2);
-                        el.prefix = el.prefixChars;
-                        el.prefixSize = 1;
-                        if (el.prefixChars[0]!=0) {
-                            // get CE of prefix character first
-                            str[0]=el.prefixChars[0];
-                            str[1]=0;
-                            ucol_setText(ucaEl, str, 1, status);
-                            while ((int32_t)(el.CEs[el.noOfCEs] = ucol_next(ucaEl, status))
-                                    != UCOL_NULLORDER) {
-                                preKeyLen++;  // count number of keys for prefix character
-                            }
-                            str[len++] = el.prefixChars[0];
-                        }
-
-                        str[len++] = el.uchars[0];
-                        str[len]=0;
-                        ucol_setText(ucaEl, str, len, status);
-                        // Skip the keys for prefix character, then copy the rest to el.
-                        while ((preKeyLen-->0) && 
-                               (int32_t)(el.CEs[el.noOfCEs] = ucol_next(ucaEl, status)) != UCOL_NULLORDER) {
-                            continue;
-                        }
-                           
-                    }
-                    while ((int32_t)(el.CEs[el.noOfCEs] = ucol_next(ucaEl, status)) != UCOL_NULLORDER) {
-                        el.noOfCEs++;
-                    }
-                    uprv_uca_addAnElement(t, &el, status);
-                }
-
-            } else if(src->removeSet != NULL && uset_contains(src->removeSet, first)) {
-                ucol_uprv_bld_copyRangeFromUCA(src, t, first, first, status);
-            }
-            conts+=maxUCAContractionLength;
-        }
-        ucol_closeElements(ucaEl);
-    }
-
-    // Add completely ignorable elements
-    utrie_enum(&t->UCA->mapping, NULL, _processUCACompleteIgnorables, t);
-
-    // add tailoring characters related canonical closures
-    uprv_uca_canonicalClosure(t, src, NULL, status);
-
-    /* still need to produce compatibility closure */
-
-    UCATableHeader *myData = uprv_uca_assembleTable(t, status);
-
-    uprv_uca_closeTempTable(t);
-    uprv_free(image);
-
-    return myData;
-}
-
-U_CDECL_BEGIN
-static UBool U_CALLCONV
-ucol_bld_cleanup(void)
-{
-    udata_close(invUCA_DATA_MEM);
-    invUCA_DATA_MEM = NULL;
-    _staticInvUCA = NULL;
-    gStaticInvUCAInitOnce.reset();
-    return TRUE;
-}
-U_CDECL_END
-
-static void U_CALLCONV initInverseUCA(UErrorCode &status) {
-    U_ASSERT(invUCA_DATA_MEM == NULL);
-    U_ASSERT(_staticInvUCA == NULL);
-    ucln_i18n_registerCleanup(UCLN_I18N_UCOL_BLD, ucol_bld_cleanup);
-    InverseUCATableHeader *newInvUCA = NULL;
-    UDataMemory *result = udata_openChoice(U_ICUDATA_COLL, INVC_DATA_TYPE, INVC_DATA_NAME, isAcceptableInvUCA, NULL, &status);
-
-    if(U_FAILURE(status)) {
-        if (result) {
-            udata_close(result);
-        }
-        // This is not needed, as we are talking about
-        // memory we got from UData
-        //uprv_free(newInvUCA);
-        return;
-    }
-
-    if(result != NULL) { /* It looks like sometimes we can fail to find the data file */
-        newInvUCA = (InverseUCATableHeader *)udata_getMemory(result);
-        UCollator *UCA = ucol_initUCA(&status);
-        // UCA versions of UCA and inverse UCA should match
-        if(uprv_memcmp(newInvUCA->UCAVersion, UCA->image->UCAVersion, sizeof(UVersionInfo)) != 0) {
-            status = U_INVALID_FORMAT_ERROR;
-            udata_close(result);
-            return;
-        }
-
-        invUCA_DATA_MEM = result;
-        _staticInvUCA = newInvUCA;
-    }
-}
-
-
-U_CAPI const InverseUCATableHeader * U_EXPORT2
-ucol_initInverseUCA(UErrorCode *status)
-{
-    umtx_initOnce(gStaticInvUCAInitOnce, &initInverseUCA, *status);
-    return _staticInvUCA;
-}
-
-/* This is the data that is used for non-script reordering codes. These _must_ be kept
- * in order that they are to be applied as defaults and in synch with the UColReorderCode enum.
- */
-static const char * const ReorderingTokenNames[] = {
-    "SPACE",
-    "PUNCT",
-    "SYMBOL",
-    "CURRENCY",
-    "DIGIT"
-};
-
-static void toUpper(const char* src, char* dst, uint32_t length) {
-   for (uint32_t i = 0; *src != '\0' && i < length - 1; ++src, ++dst, ++i) {
-       *dst = uprv_toupper(*src);
-   }
-   *dst = '\0';
-}
-
-U_INTERNAL int32_t U_EXPORT2 
-ucol_findReorderingEntry(const char* name) {
-    char buffer[32];
-    toUpper(name, buffer, 32);
-    for (uint32_t entry = 0; entry < LENGTHOF(ReorderingTokenNames); entry++) {
-        if (uprv_strcmp(buffer, ReorderingTokenNames[entry]) == 0) {
-            return entry + UCOL_REORDER_CODE_FIRST;
-        }
-    }
-    return USCRIPT_INVALID_CODE;
-}
-
-#endif /* #if !UCONFIG_NO_COLLATION */
diff --git a/icu4c/source/i18n/ucol_bld.h b/icu4c/source/i18n/ucol_bld.h
deleted file mode 100644 (file)
index e722c6c..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 2001-2010, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  ucol_tok.cpp
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created 02/22/2001
-*   created by: Vladimir Weinstein
-*
-* This module builds a collator based on the rule set.
-* 
-*/
-
-#ifndef UCOL_BLD_H
-#define UCOL_BLD_H
-
-#ifdef UCOL_DEBUG
-#include <stdio.h>
-#include <stdlib.h>
-#endif
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION
-/*#if !UCONFIG_NO_COLLATION_BUILDER*/
-
-#include "ucol_imp.h"
-#include "ucol_tok.h"
-#include "ucol_wgt.h"
-
-U_CFUNC
-UCATableHeader *ucol_assembleTailoringTable(UColTokenParser *src, UErrorCode *status);
-
-typedef struct {
-  WeightRange ranges[7];
-  int32_t noOfRanges;
-  uint32_t byteSize; uint32_t start; uint32_t limit;
-  int32_t maxCount;
-  int32_t count;
-  uint32_t current;
-  uint32_t fLow; /*forbidden Low */
-  uint32_t fHigh; /*forbidden High */
-} ucolCEGenerator;
-
-U_CFUNC uint32_t U_EXPORT2 ucol_getCEStrengthDifference(uint32_t CE, uint32_t contCE, 
-                                            uint32_t prevCE, uint32_t prevContCE);
-
-U_INTERNAL int32_t U_EXPORT2 ucol_findReorderingEntry(const char* name);
-
-/*#endif*/ /* #if !UCONFIG_NO_COLLATION_BUILDER */
-#endif /* #if !UCONFIG_NO_COLLATION */
-
-#endif
diff --git a/icu4c/source/i18n/ucol_cnt.cpp b/icu4c/source/i18n/ucol_cnt.cpp
deleted file mode 100644 (file)
index 7c274b7..0000000
+++ /dev/null
@@ -1,587 +0,0 @@
-/*
- *******************************************************************************
- *
- *   Copyright (C) 2001-2008, International Business Machines
- *   Corporation and others.  All Rights Reserved.
- *
- *******************************************************************************
- *   file name:  ucol_cnt.cpp
- *   encoding:   US-ASCII
- *   tab size:   8 (not used)
- *   indentation:4
- *
- *   created 02/22/2001
- *   created by: Vladimir Weinstein
- *
- * This module maintains a contraction table structure in expanded form
- * and provides means to flatten this structure
- * 
- */
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION
-
-#include "unicode/uchar.h"
-#include "ucol_cnt.h"
-#include "cmemory.h"
-
-static void uprv_growTable(ContractionTable *tbl, UErrorCode *status) {
-    if(tbl->position == tbl->size) {
-        uint32_t *newData = (uint32_t *)uprv_realloc(tbl->CEs, 2*tbl->size*sizeof(uint32_t));
-        if(newData == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        UChar *newCPs = (UChar *)uprv_realloc(tbl->codePoints, 2*tbl->size*sizeof(UChar));
-        if(newCPs == NULL) {
-            uprv_free(newData);
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        tbl->CEs = newData;
-        tbl->codePoints = newCPs;
-        tbl->size *= 2;
-    }
-}
-
-U_CAPI CntTable*  U_EXPORT2
-/*uprv_cnttab_open(CompactEIntArray *mapping, UErrorCode *status) {*/
-uprv_cnttab_open(UNewTrie *mapping, UErrorCode *status) {
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-    CntTable *tbl = (CntTable *)uprv_malloc(sizeof(CntTable));
-    if(tbl == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return NULL;
-    }
-    tbl->mapping = mapping;
-    tbl->elements = (ContractionTable **)uprv_malloc(INIT_EXP_TABLE_SIZE*sizeof(ContractionTable *));
-    if(tbl->elements == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        uprv_free(tbl);
-        return NULL;
-    }
-    tbl->capacity = INIT_EXP_TABLE_SIZE;
-    uprv_memset(tbl->elements, 0, INIT_EXP_TABLE_SIZE*sizeof(ContractionTable *));
-    tbl->size = 0;
-    tbl->position = 0;
-    tbl->CEs = NULL;
-    tbl->codePoints = NULL;
-    tbl->offsets = NULL;
-    tbl->currentTag = NOT_FOUND_TAG;
-    return tbl;
-}
-
-static ContractionTable *addATableElement(CntTable *table, uint32_t *key, UErrorCode *status) {
-    ContractionTable *el = (ContractionTable *)uprv_malloc(sizeof(ContractionTable));
-    if(el == NULL) {
-        goto outOfMemory;
-    }
-    el->CEs = (uint32_t *)uprv_malloc(INIT_EXP_TABLE_SIZE*sizeof(uint32_t));
-    if(el->CEs == NULL) {
-        goto outOfMemory;
-    }
-
-    el->codePoints = (UChar *)uprv_malloc(INIT_EXP_TABLE_SIZE*sizeof(UChar));
-    if(el->codePoints == NULL) {
-        uprv_free(el->CEs);
-        goto outOfMemory;
-    }
-
-    el->position = 0;
-    el->size = INIT_EXP_TABLE_SIZE;
-    uprv_memset(el->CEs, 0, INIT_EXP_TABLE_SIZE*sizeof(uint32_t));
-    uprv_memset(el->codePoints, 0, INIT_EXP_TABLE_SIZE*sizeof(UChar));
-
-    table->elements[table->size] = el;
-
-    //uhash_put(table->elements, (void *)table->size, el, status);
-
-    *key = table->size++;
-
-    if(table->size == table->capacity) {
-        ContractionTable **newElements = (ContractionTable **)uprv_malloc(table->capacity*2*sizeof(ContractionTable *));
-        // do realloc
-        /*        table->elements = (ContractionTable **)realloc(table->elements, table->capacity*2*sizeof(ContractionTable *));*/
-        if(newElements == NULL) {
-            uprv_free(el->codePoints);
-            uprv_free(el->CEs);
-            goto outOfMemory;
-        }
-        ContractionTable **oldElements = table->elements;
-        uprv_memcpy(newElements, oldElements, table->capacity*sizeof(ContractionTable *));
-        uprv_memset(newElements+table->capacity, 0, table->capacity*sizeof(ContractionTable *));
-        table->capacity *= 2;
-        table->elements = newElements;
-        uprv_free(oldElements);
-    }
-
-    return el;
-
-outOfMemory:
-    *status = U_MEMORY_ALLOCATION_ERROR;
-    if (el) uprv_free(el);
-    return NULL;
-}
-
-U_CAPI int32_t  U_EXPORT2
-uprv_cnttab_constructTable(CntTable *table, uint32_t mainOffset, UErrorCode *status) {
-    int32_t i = 0, j = 0;
-    if(U_FAILURE(*status) || table->size == 0) {
-        return 0;
-    }
-
-    table->position = 0;
-
-    if(table->offsets != NULL) {
-        uprv_free(table->offsets);
-    }
-    table->offsets = (int32_t *)uprv_malloc(table->size*sizeof(int32_t));
-    if(table->offsets == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return 0;
-    }
-
-
-    /* See how much memory we need */
-    for(i = 0; i<table->size; i++) {
-        table->offsets[i] = table->position+mainOffset;
-        table->position += table->elements[i]->position;
-    }
-
-    /* Allocate it */
-    if(table->CEs != NULL) {
-        uprv_free(table->CEs);
-    }
-    table->CEs = (uint32_t *)uprv_malloc(table->position*sizeof(uint32_t));
-    if(table->CEs == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        uprv_free(table->offsets);
-        table->offsets = NULL;
-        return 0;
-    }
-    uprv_memset(table->CEs, '?', table->position*sizeof(uint32_t));
-
-    if(table->codePoints != NULL) {
-        uprv_free(table->codePoints);
-    }
-    table->codePoints = (UChar *)uprv_malloc(table->position*sizeof(UChar));
-    if(table->codePoints == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        uprv_free(table->offsets);
-        table->offsets = NULL;
-        uprv_free(table->CEs);
-        table->CEs = NULL;
-        return 0;
-    }
-    uprv_memset(table->codePoints, '?', table->position*sizeof(UChar));
-
-    /* Now stuff the things in*/
-
-    UChar *cpPointer = table->codePoints;
-    uint32_t *CEPointer = table->CEs;
-    for(i = 0; i<table->size; i++) {
-        int32_t size = table->elements[i]->position;
-        uint8_t ccMax = 0, ccMin = 255, cc = 0;
-        for(j = 1; j<size; j++) {
-            cc = u_getCombiningClass(table->elements[i]->codePoints[j]);
-            if(cc>ccMax) {
-                ccMax = cc;
-            }
-            if(cc<ccMin) {
-                ccMin = cc;
-            }
-            *(cpPointer+j) = table->elements[i]->codePoints[j];
-        }
-        *cpPointer = ((ccMin==ccMax)?1:0 << 8) | ccMax;
-
-        uprv_memcpy(CEPointer, table->elements[i]->CEs, size*sizeof(uint32_t));
-        for(j = 0; j<size; j++) {
-            if(isCntTableElement(*(CEPointer+j))) {
-                *(CEPointer+j) = constructContractCE(getCETag(*(CEPointer+j)), table->offsets[getContractOffset(*(CEPointer+j))]);
-            }
-        }
-        cpPointer += size;
-        CEPointer += size;
-    }
-
-    // TODO: this one apparently updates the contraction CEs to point to a real address (relative to the 
-    // start of the flat file). However, what is done below is just wrong and it affects building of 
-    // tailorings that have constructions in a bad way. At least, one should enumerate the trie. Also,
-    // keeping a list of code points that are contractions might be smart, although I'm not sure if it's
-    // feasible.
-    uint32_t CE;
-    for(i = 0; i<=0x10FFFF; i++) {
-        /*CE = ucmpe32_get(table->mapping, i);*/
-        CE = utrie_get32(table->mapping, i, NULL);
-        if(isCntTableElement(CE)) {
-            CE = constructContractCE(getCETag(CE), table->offsets[getContractOffset(CE)]);
-            /*ucmpe32_set(table->mapping, i, CE);*/
-            utrie_set32(table->mapping, i, CE);
-        }
-    }
-
-
-    return table->position;
-}
-
-static ContractionTable *uprv_cnttab_cloneContraction(ContractionTable *t, UErrorCode *status) {
-    ContractionTable *r = (ContractionTable *)uprv_malloc(sizeof(ContractionTable));
-    if(r == NULL) {
-        goto outOfMemory;
-    }
-
-    r->position = t->position;
-    r->size = t->size;
-
-    r->codePoints = (UChar *)uprv_malloc(sizeof(UChar)*t->size);
-    if(r->codePoints == NULL) {
-        goto outOfMemory;
-    }
-    r->CEs = (uint32_t *)uprv_malloc(sizeof(uint32_t)*t->size);
-    if(r->CEs == NULL) {
-        uprv_free(r->codePoints);
-        goto outOfMemory;
-    }
-    uprv_memcpy(r->codePoints, t->codePoints, sizeof(UChar)*t->size);
-    uprv_memcpy(r->CEs, t->CEs, sizeof(uint32_t)*t->size);
-
-    return r;
-
-outOfMemory:
-    *status = U_MEMORY_ALLOCATION_ERROR;
-    if (r) uprv_free(r);
-    return NULL;
-}
-
-U_CAPI CntTable* U_EXPORT2
-uprv_cnttab_clone(CntTable *t, UErrorCode *status) {
-    if(U_FAILURE(*status)) {
-        return NULL;
-    }
-    int32_t i = 0;
-    CntTable *r = (CntTable *)uprv_malloc(sizeof(CntTable));
-    /* test for NULL */
-    if (r == NULL) {
-        goto outOfMemory;
-    }
-    r->position = t->position;
-    r->size = t->size;
-    r->capacity = t->capacity;
-
-    r->mapping = t->mapping;
-
-    r->elements = (ContractionTable **)uprv_malloc(t->capacity*sizeof(ContractionTable *));
-    /* test for NULL */
-    if (r->elements == NULL) {
-        goto outOfMemory;
-    }
-    //uprv_memcpy(r->elements, t->elements, t->capacity*sizeof(ContractionTable *));
-
-    for(i = 0; i<t->size; i++) {
-        r->elements[i] = uprv_cnttab_cloneContraction(t->elements[i], status);
-    }
-
-    if(t->CEs != NULL) {
-        r->CEs = (uint32_t *)uprv_malloc(t->position*sizeof(uint32_t));
-        /* test for NULL */
-        if (r->CEs == NULL) {
-            uprv_free(r->elements);
-            goto outOfMemory;
-        }
-        uprv_memcpy(r->CEs, t->CEs, t->position*sizeof(uint32_t));
-    } else {
-        r->CEs = NULL;
-    }
-
-    if(t->codePoints != NULL) {
-        r->codePoints = (UChar *)uprv_malloc(t->position*sizeof(UChar));
-        /* test for NULL */
-        if (r->codePoints == NULL) {
-            uprv_free(r->CEs);
-            uprv_free(r->elements);
-            goto outOfMemory;
-        }
-        uprv_memcpy(r->codePoints, t->codePoints, t->position*sizeof(UChar));
-    } else {
-        r->codePoints = NULL;
-    }
-
-    if(t->offsets != NULL) {
-        r->offsets = (int32_t *)uprv_malloc(t->size*sizeof(int32_t));
-        /* test for NULL */
-        if (r->offsets == NULL) {
-            uprv_free(r->codePoints);
-            uprv_free(r->CEs);
-            uprv_free(r->elements);
-            goto outOfMemory;
-        }
-        uprv_memcpy(r->offsets, t->offsets, t->size*sizeof(int32_t));
-    } else {
-        r->offsets = NULL;
-    }
-
-    return r;
-
-outOfMemory:
-    *status = U_MEMORY_ALLOCATION_ERROR;
-    if (r) uprv_free(r);
-    return NULL;
-}
-
-U_CAPI void  U_EXPORT2
-uprv_cnttab_close(CntTable *table) {
-    int32_t i = 0;
-    for(i = 0; i<table->size; i++) {
-        uprv_free(table->elements[i]->CEs);
-        uprv_free(table->elements[i]->codePoints);
-        uprv_free(table->elements[i]);
-    }
-    uprv_free(table->elements);
-    uprv_free(table->CEs);
-    uprv_free(table->offsets);
-    uprv_free(table->codePoints);
-    uprv_free(table);
-}
-
-/* this is for adding non contractions */
-U_CAPI uint32_t  U_EXPORT2
-uprv_cnttab_changeLastCE(CntTable *table, uint32_t element, uint32_t value, UErrorCode *status) {
-    element &= 0xFFFFFF;
-
-    ContractionTable *tbl = NULL;
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-
-    if((element == 0xFFFFFF) || (tbl = table->elements[element]) == NULL) {
-        return 0;
-    }
-
-    tbl->CEs[tbl->position-1] = value;
-
-    return(constructContractCE(table->currentTag, element));
-}
-
-
-/* inserts a part of contraction sequence in table. Sequences behind the offset are moved back. If element is non existent, it creates on. Returns element handle */
-U_CAPI uint32_t  U_EXPORT2
-uprv_cnttab_insertContraction(CntTable *table, uint32_t element, UChar codePoint, uint32_t value, UErrorCode *status) {
-
-    ContractionTable *tbl = NULL;
-
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-    element &= 0xFFFFFF;
-
-    if((element == 0xFFFFFF) || (tbl = table->elements[element]) == NULL) {
-        tbl = addATableElement(table, &element, status);
-        if (U_FAILURE(*status)) {
-            return 0;
-        }
-    }
-
-    uprv_growTable(tbl, status);
-
-    uint32_t offset = 0;
-
-
-    while(tbl->codePoints[offset] < codePoint && offset<tbl->position) {
-        offset++;
-    }
-
-    uint32_t i = tbl->position;
-    for(i = tbl->position; i > offset; i--) {
-        tbl->CEs[i] = tbl->CEs[i-1];
-        tbl->codePoints[i] = tbl->codePoints[i-1];
-    }
-
-    tbl->CEs[offset] = value;
-    tbl->codePoints[offset] = codePoint;
-
-    tbl->position++;
-
-    return(constructContractCE(table->currentTag, element));
-}
-
-
-/* adds more contractions in table. If element is non existant, it creates on. Returns element handle */
-U_CAPI uint32_t  U_EXPORT2
-uprv_cnttab_addContraction(CntTable *table, uint32_t element, UChar codePoint, uint32_t value, UErrorCode *status) {
-
-    element &= 0xFFFFFF;
-
-    ContractionTable *tbl = NULL;
-
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-
-    if((element == 0xFFFFFF) || (tbl = table->elements[element]) == NULL) {
-        tbl = addATableElement(table, &element, status);
-        if (U_FAILURE(*status)) {
-            return 0;
-        }
-    } 
-
-    uprv_growTable(tbl, status);
-
-    tbl->CEs[tbl->position] = value;
-    tbl->codePoints[tbl->position] = codePoint;
-
-    tbl->position++;
-
-    return(constructContractCE(table->currentTag, element));
-}
-
-/* sets a part of contraction sequence in table. If element is non existant, it creates on. Returns element handle */
-U_CAPI uint32_t  U_EXPORT2
-uprv_cnttab_setContraction(CntTable *table, uint32_t element, uint32_t offset, UChar codePoint, uint32_t value, UErrorCode *status) {
-
-    element &= 0xFFFFFF;
-    ContractionTable *tbl = NULL;
-
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-
-    if((element == 0xFFFFFF) || (tbl = table->elements[element]) == NULL) {
-        tbl = addATableElement(table, &element, status);
-        if (U_FAILURE(*status)) {
-            return 0;
-        }
-        
-    }
-
-    if(offset >= tbl->size) {
-        *status = U_INDEX_OUTOFBOUNDS_ERROR;
-        return 0;
-    }
-    tbl->CEs[offset] = value;
-    tbl->codePoints[offset] = codePoint;
-
-    //return(offset);
-    return(constructContractCE(table->currentTag, element));
-}
-
-static ContractionTable *_cnttab_getContractionTable(CntTable *table, uint32_t element) {
-    element &= 0xFFFFFF;
-    ContractionTable *tbl = NULL;
-
-    if(element != 0xFFFFFF) {
-        tbl = table->elements[element]; /* This could also return NULL */
-    }
-    return tbl;
-}
-
-static int32_t _cnttab_findCP(ContractionTable *tbl, UChar codePoint) {
-    uint32_t position = 0;
-    if(tbl == NULL) {
-        return -1;
-    }
-
-    while(codePoint > tbl->codePoints[position]) {
-        position++;
-        if(position > tbl->position) {
-            return -1;
-        }
-    }
-    if (codePoint == tbl->codePoints[position]) {
-        return position;
-    } else {
-        return -1;
-    }
-}
-
-static uint32_t _cnttab_getCE(ContractionTable *tbl, int32_t position) {
-    if(tbl == NULL) {
-        return UCOL_NOT_FOUND;
-    }
-    if((uint32_t)position > tbl->position || position == -1) {
-        return UCOL_NOT_FOUND;
-    } else {
-        return tbl->CEs[position];
-    }
-}
-
-U_CAPI int32_t  U_EXPORT2
-uprv_cnttab_findCP(CntTable *table, uint32_t element, UChar codePoint, UErrorCode *status) {
-
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-
-    return _cnttab_findCP(_cnttab_getContractionTable(table, element), codePoint);
-}
-
-U_CAPI uint32_t  U_EXPORT2
-uprv_cnttab_getCE(CntTable *table, uint32_t element, uint32_t position, UErrorCode *status) {
-    if(U_FAILURE(*status)) {
-        return UCOL_NOT_FOUND;
-    }
-
-    return(_cnttab_getCE(_cnttab_getContractionTable(table, element), position));
-}
-
-U_CAPI uint32_t  U_EXPORT2
-uprv_cnttab_findCE(CntTable *table, uint32_t element, UChar codePoint, UErrorCode *status) {
-    if(U_FAILURE(*status)) {
-        return UCOL_NOT_FOUND;
-    }
-    ContractionTable *tbl = _cnttab_getContractionTable(table, element);
-    return _cnttab_getCE(tbl, _cnttab_findCP(tbl, codePoint));
-}
-
-U_CAPI UBool  U_EXPORT2
-uprv_cnttab_isTailored(CntTable *table, uint32_t element, UChar *ztString, UErrorCode *status) {
-    if(U_FAILURE(*status)) {
-        return FALSE;
-    }
-
-    while(*(ztString)!=0) {
-        element = uprv_cnttab_findCE(table, element, *(ztString), status);
-        if(element == UCOL_NOT_FOUND) {
-            return FALSE;
-        }
-        if(!isCntTableElement(element)) {
-            return TRUE;
-        }
-        ztString++;
-    }
-    return (UBool)(uprv_cnttab_getCE(table, element, 0, status) != UCOL_NOT_FOUND);
-}
-
-U_CAPI uint32_t  U_EXPORT2
-uprv_cnttab_changeContraction(CntTable *table, uint32_t element, UChar codePoint, uint32_t newCE, UErrorCode *status) {
-
-    element &= 0xFFFFFF;
-    ContractionTable *tbl = NULL;
-
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-
-    if((element == 0xFFFFFF) || (tbl = table->elements[element]) == NULL) {
-        return 0;
-    }
-
-    uint32_t position = 0;
-
-    while(codePoint > tbl->codePoints[position]) {
-        position++;
-        if(position > tbl->position) {
-            return UCOL_NOT_FOUND;
-        }
-    }
-    if (codePoint == tbl->codePoints[position]) {
-        tbl->CEs[position] = newCE;
-        return element;
-    } else {
-        return UCOL_NOT_FOUND;
-    }
-}
-
-#endif /* #if !UCONFIG_NO_COLLATION */
diff --git a/icu4c/source/i18n/ucol_cnt.h b/icu4c/source/i18n/ucol_cnt.h
deleted file mode 100644 (file)
index f6dfcd7..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 2001-2008, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  ucol_tok.cpp
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created 02/22/2001
-*   created by: Vladimir Weinstein
-*
-* This module maintains a contraction table structure in expanded form
-* and provides means to flatten this structure
-* 
-*/
-
-#ifndef UCOL_CNTTABLE_H
-#define UCOL_CNTTABLE_H
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION
-
-#include "utrie.h"
-#include "ucol_imp.h"
-
-U_CDECL_BEGIN
-
-#define UPRV_CNTTAB_NEWELEMENT 0xFFFFFF
-
-#define isCntTableElement(CE) (isSpecial((CE)) && \
-((getCETag((CE)) == CONTRACTION_TAG)||(getCETag((CE)) == SPEC_PROC_TAG)))
-
-typedef struct ContractionTable ContractionTable;
-struct ContractionTable {
-    UChar *codePoints;
-    uint32_t *CEs;
-    uint32_t position;
-    uint32_t size;
-};
-
-struct CntTable {
-    ContractionTable **elements;
-    /*CompactEIntArray *mapping;*/
-    UNewTrie *mapping;
-    UChar *codePoints;
-    uint32_t *CEs;
-    int32_t *offsets;
-    int32_t position;
-    int32_t size;
-    int32_t capacity;
-    UColCETags currentTag;
-};
-
-U_CAPI CntTable* U_EXPORT2 
-/*uprv_cnttab_open(CompactEIntArray *mapping, UErrorCode *status);*/
-uprv_cnttab_open(UNewTrie *mapping, UErrorCode *status);
-U_CAPI CntTable* U_EXPORT2 
-uprv_cnttab_clone(CntTable *table, UErrorCode *status);
-U_CAPI void U_EXPORT2 
-uprv_cnttab_close(CntTable *table);
-
-/* construct the table for output */
-U_CAPI int32_t U_EXPORT2 
-uprv_cnttab_constructTable(CntTable *table, uint32_t mainOffset, UErrorCode *status); 
-/* adds more contractions in table. If element is non existant, it creates on. Returns element handle */
-U_CAPI uint32_t U_EXPORT2 
-uprv_cnttab_addContraction(CntTable *table, uint32_t element, UChar codePoint, uint32_t value, UErrorCode *status);
-/* sets a part of contraction sequence in table. If element is non existant, it creates on. Returns element handle */
-U_CAPI uint32_t U_EXPORT2 
-uprv_cnttab_setContraction(CntTable *table, uint32_t element, uint32_t offset, UChar codePoint, uint32_t value, UErrorCode *status);
-/* inserts a part of contraction sequence in table. Sequences behind the offset are moved back. If element is non existant, it creates on. Returns element handle */
-U_CAPI uint32_t U_EXPORT2 
-uprv_cnttab_insertContraction(CntTable *table, uint32_t element, UChar codePoint, uint32_t value, UErrorCode *status);
-/* this is for adding non contractions */
-U_CAPI uint32_t U_EXPORT2 
-uprv_cnttab_changeLastCE(CntTable *table, uint32_t element, uint32_t value, UErrorCode *status);
-
-U_CAPI int32_t U_EXPORT2 
-uprv_cnttab_findCP(CntTable *table, uint32_t element, UChar codePoint, UErrorCode *status);
-
-U_CAPI uint32_t U_EXPORT2 
-uprv_cnttab_getCE(CntTable *table, uint32_t element, uint32_t position, UErrorCode *status);
-
-U_CAPI uint32_t U_EXPORT2 
-uprv_cnttab_changeContraction(CntTable *table, uint32_t element, UChar codePoint, uint32_t newCE, UErrorCode *status);
-
-U_CAPI uint32_t U_EXPORT2 
-uprv_cnttab_findCE(CntTable *table, uint32_t element, UChar codePoint, UErrorCode *status);
-
-U_CAPI UBool U_EXPORT2 
-uprv_cnttab_isTailored(CntTable *table, uint32_t element, UChar *ztString, UErrorCode *status);
-
-U_CDECL_END
-
-#endif /* #if !UCONFIG_NO_COLLATION */
-
-#endif
diff --git a/icu4c/source/i18n/ucol_elm.cpp b/icu4c/source/i18n/ucol_elm.cpp
deleted file mode 100644 (file)
index 3a92e1d..0000000
+++ /dev/null
@@ -1,2070 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 2001-2012, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  ucaelems.cpp
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created 02/22/2001
-*   created by: Vladimir Weinstein
-*
-*   This program reads the Franctional UCA table and generates
-*   internal format for UCA table as well as inverse UCA table.
-*   It then writes binary files containing the data: ucadata.dat 
-*   & invuca.dat
-* 
-*   date        name       comments
-*   03/02/2001  synwee     added setMaxExpansion
-*   03/07/2001  synwee     merged UCA's maxexpansion and tailoring's
-*/
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION
-
-#include "unicode/uchar.h"
-#include "unicode/unistr.h"
-#include "unicode/ucoleitr.h"
-#include "unicode/normlzr.h"
-#include "unicode/utf16.h"
-#include "normalizer2impl.h"
-#include "ucol_elm.h"
-#include "ucol_tok.h"
-#include "ucol_cnt.h"
-#include "unicode/caniter.h"
-#include "cmemory.h"
-#include "uassert.h"
-
-U_NAMESPACE_USE
-
-static uint32_t uprv_uca_processContraction(CntTable *contractions, UCAElements *element, uint32_t existingCE, UErrorCode *status);
-
-U_CDECL_BEGIN
-static int32_t U_CALLCONV
-prefixLookupHash(const UHashTok e) {
-    UCAElements *element = (UCAElements *)e.pointer;
-    UChar buf[256];
-    UHashTok key;
-    key.pointer = buf;
-    uprv_memcpy(buf, element->cPoints, element->cSize*sizeof(UChar));
-    buf[element->cSize] = 0;
-    //key.pointer = element->cPoints;
-    //element->cPoints[element->cSize] = 0;
-    return uhash_hashUChars(key);
-}
-
-static int8_t U_CALLCONV
-prefixLookupComp(const UHashTok e1, const UHashTok e2) {
-    UCAElements *element1 = (UCAElements *)e1.pointer;
-    UCAElements *element2 = (UCAElements *)e2.pointer;
-
-    UChar buf1[256];
-    UHashTok key1;
-    key1.pointer = buf1;
-    uprv_memcpy(buf1, element1->cPoints, element1->cSize*sizeof(UChar));
-    buf1[element1->cSize] = 0;
-
-    UChar buf2[256];
-    UHashTok key2;
-    key2.pointer = buf2;
-    uprv_memcpy(buf2, element2->cPoints, element2->cSize*sizeof(UChar));
-    buf2[element2->cSize] = 0;
-
-    return uhash_compareUChars(key1, key2);
-}
-U_CDECL_END
-
-static int32_t uprv_uca_addExpansion(ExpansionTable *expansions, uint32_t value, UErrorCode *status) {
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-    if(expansions->CEs == NULL) {
-        expansions->CEs = (uint32_t *)uprv_malloc(INIT_EXP_TABLE_SIZE*sizeof(uint32_t));
-        /* test for NULL */
-        if (expansions->CEs == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return 0;
-        }
-        expansions->size = INIT_EXP_TABLE_SIZE;
-        expansions->position = 0;
-    }
-
-    if(expansions->position == expansions->size) {
-        uint32_t *newData = (uint32_t *)uprv_realloc(expansions->CEs, 2*expansions->size*sizeof(uint32_t));
-        if(newData == NULL) {
-#ifdef UCOL_DEBUG
-            fprintf(stderr, "out of memory for expansions\n");
-#endif
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return -1;
-        }
-        expansions->CEs = newData;
-        expansions->size *= 2;
-    }
-
-    expansions->CEs[expansions->position] = value;
-    return(expansions->position++);
-}
-
-U_CAPI tempUCATable*  U_EXPORT2
-uprv_uca_initTempTable(UCATableHeader *image, UColOptionSet *opts, const UCollator *UCA, UColCETags initTag, UColCETags supplementaryInitTag, UErrorCode *status) {
-    MaxJamoExpansionTable *maxjet;
-    MaxExpansionTable *maxet;
-    tempUCATable *t = (tempUCATable *)uprv_malloc(sizeof(tempUCATable));
-    /* test for NULL */
-    if (t == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return NULL;
-    }
-    uprv_memset(t, 0, sizeof(tempUCATable));
-
-    maxet  = (MaxExpansionTable *)uprv_malloc(sizeof(MaxExpansionTable));
-    if (maxet == NULL) {
-        goto allocation_failure;
-    }
-    uprv_memset(maxet, 0, sizeof(MaxExpansionTable));
-    t->maxExpansions       = maxet;
-
-    maxjet = (MaxJamoExpansionTable *)uprv_malloc(sizeof(MaxJamoExpansionTable));
-    if (maxjet == NULL) {
-        goto allocation_failure;
-    }
-    uprv_memset(maxjet, 0, sizeof(MaxJamoExpansionTable));
-    t->maxJamoExpansions = maxjet;
-
-    t->image = image;
-    t->options = opts;
-
-    t->UCA = UCA;
-    t->expansions = (ExpansionTable *)uprv_malloc(sizeof(ExpansionTable));
-    /* test for NULL */
-    if (t->expansions == NULL) {
-        goto allocation_failure;
-    }
-    uprv_memset(t->expansions, 0, sizeof(ExpansionTable));
-
-    t->mapping = utrie_open(NULL, NULL, UCOL_ELM_TRIE_CAPACITY,
-        UCOL_SPECIAL_FLAG | (initTag<<24),
-        UCOL_SPECIAL_FLAG | (supplementaryInitTag << 24),
-        TRUE); // Do your own mallocs for the structure, array and have linear Latin 1
-    if (U_FAILURE(*status)) {
-        goto allocation_failure;
-    }
-    t->prefixLookup = uhash_open(prefixLookupHash, prefixLookupComp, NULL, status);
-    if (U_FAILURE(*status)) {
-        goto allocation_failure;
-    }
-    uhash_setValueDeleter(t->prefixLookup, uprv_free);
-
-    t->contractions = uprv_cnttab_open(t->mapping, status);
-    if (U_FAILURE(*status)) {
-        goto cleanup;
-    }
-
-    /* copy UCA's maxexpansion and merge as we go along */
-    if (UCA != NULL) {
-        /* adding an extra initial value for easier manipulation */
-        maxet->size            = (int32_t)(UCA->lastEndExpansionCE - UCA->endExpansionCE) + 2;
-        maxet->position        = maxet->size - 1;
-        maxet->endExpansionCE  = 
-            (uint32_t *)uprv_malloc(sizeof(uint32_t) * maxet->size);
-        /* test for NULL */
-        if (maxet->endExpansionCE == NULL) {
-            goto allocation_failure;
-        }
-        maxet->expansionCESize =
-            (uint8_t *)uprv_malloc(sizeof(uint8_t) * maxet->size);
-        /* test for NULL */
-        if (maxet->expansionCESize == NULL) {
-            goto allocation_failure;
-        }
-        /* initialized value */
-        *(maxet->endExpansionCE)  = 0;
-        *(maxet->expansionCESize) = 0;
-        uprv_memcpy(maxet->endExpansionCE + 1, UCA->endExpansionCE, 
-            sizeof(uint32_t) * (maxet->size - 1));
-        uprv_memcpy(maxet->expansionCESize + 1, UCA->expansionCESize, 
-            sizeof(uint8_t) * (maxet->size - 1));
-    }
-    else {
-        maxet->size     = 0;
-    }
-    maxjet->endExpansionCE = NULL;
-    maxjet->isV = NULL;
-    maxjet->size = 0;
-    maxjet->position = 0;
-    maxjet->maxLSize = 1;
-    maxjet->maxVSize = 1;
-    maxjet->maxTSize = 1;
-
-    t->unsafeCP = (uint8_t *)uprv_malloc(UCOL_UNSAFECP_TABLE_SIZE);
-    /* test for NULL */
-    if (t->unsafeCP == NULL) {
-        goto allocation_failure;
-    }
-    t->contrEndCP = (uint8_t *)uprv_malloc(UCOL_UNSAFECP_TABLE_SIZE);
-    /* test for NULL */
-    if (t->contrEndCP == NULL) {
-        goto allocation_failure;
-    }
-    uprv_memset(t->unsafeCP, 0, UCOL_UNSAFECP_TABLE_SIZE);
-    uprv_memset(t->contrEndCP, 0, UCOL_UNSAFECP_TABLE_SIZE);
-    t->cmLookup = NULL;
-    return t;
-
-allocation_failure:
-    *status = U_MEMORY_ALLOCATION_ERROR;
-cleanup:
-    uprv_uca_closeTempTable(t);
-    return NULL;
-}
-
-static tempUCATable* U_EXPORT2
-uprv_uca_cloneTempTable(tempUCATable *t, UErrorCode *status) {
-    if(U_FAILURE(*status)) {
-        return NULL;
-    }
-
-    tempUCATable *r = (tempUCATable *)uprv_malloc(sizeof(tempUCATable));
-    /* test for NULL */
-    if (r == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return NULL;
-    }
-    uprv_memset(r, 0, sizeof(tempUCATable));
-
-    /* mapping */
-    if(t->mapping != NULL) {
-        /*r->mapping = ucmpe32_clone(t->mapping, status);*/
-        r->mapping = utrie_clone(NULL, t->mapping, NULL, 0);
-    }
-
-    // a hashing clone function would be very nice. We have none currently...
-    // However, we should be good, as closing should not produce any prefixed elements.
-    r->prefixLookup = NULL; // prefixes are not used in closing
-
-    /* expansions */
-    if(t->expansions != NULL) {
-        r->expansions = (ExpansionTable *)uprv_malloc(sizeof(ExpansionTable));
-        /* test for NULL */
-        if (r->expansions == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            goto cleanup;
-        }
-        r->expansions->position = t->expansions->position;
-        r->expansions->size = t->expansions->size;
-        if(t->expansions->CEs != NULL) {
-            r->expansions->CEs = (uint32_t *)uprv_malloc(sizeof(uint32_t)*t->expansions->size);
-            /* test for NULL */
-            if (r->expansions->CEs == NULL) {
-                *status = U_MEMORY_ALLOCATION_ERROR;
-                goto cleanup;
-            }
-            uprv_memcpy(r->expansions->CEs, t->expansions->CEs, sizeof(uint32_t)*t->expansions->position);
-        } else {
-            r->expansions->CEs = NULL;
-        }
-    }
-
-    if(t->contractions != NULL) {
-        r->contractions = uprv_cnttab_clone(t->contractions, status);
-        // Check for cloning failure.
-        if (r->contractions == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            goto cleanup;
-        }
-        r->contractions->mapping = r->mapping;
-    }
-
-    if(t->maxExpansions != NULL) {
-        r->maxExpansions = (MaxExpansionTable *)uprv_malloc(sizeof(MaxExpansionTable));
-        /* test for NULL */
-        if (r->maxExpansions == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            goto cleanup;
-        }
-        r->maxExpansions->size = t->maxExpansions->size;
-        r->maxExpansions->position = t->maxExpansions->position;
-        if(t->maxExpansions->endExpansionCE != NULL) {
-            r->maxExpansions->endExpansionCE = (uint32_t *)uprv_malloc(sizeof(uint32_t)*t->maxExpansions->size);
-            /* test for NULL */
-            if (r->maxExpansions->endExpansionCE == NULL) {
-                *status = U_MEMORY_ALLOCATION_ERROR;
-                goto cleanup;
-            }
-            uprv_memset(r->maxExpansions->endExpansionCE, 0xDB, sizeof(uint32_t)*t->maxExpansions->size);
-            uprv_memcpy(r->maxExpansions->endExpansionCE, t->maxExpansions->endExpansionCE, t->maxExpansions->position*sizeof(uint32_t));
-        } else {
-            r->maxExpansions->endExpansionCE = NULL;
-        }
-        if(t->maxExpansions->expansionCESize != NULL) {
-            r->maxExpansions->expansionCESize = (uint8_t *)uprv_malloc(sizeof(uint8_t)*t->maxExpansions->size);
-            /* test for NULL */
-            if (r->maxExpansions->expansionCESize == NULL) {
-                *status = U_MEMORY_ALLOCATION_ERROR;
-                goto cleanup;
-            }
-            uprv_memset(r->maxExpansions->expansionCESize, 0xDB, sizeof(uint8_t)*t->maxExpansions->size);
-            uprv_memcpy(r->maxExpansions->expansionCESize, t->maxExpansions->expansionCESize, t->maxExpansions->position*sizeof(uint8_t));
-        } else {
-            r->maxExpansions->expansionCESize = NULL;
-        }
-    }
-
-    if(t->maxJamoExpansions != NULL) {
-        r->maxJamoExpansions = (MaxJamoExpansionTable *)uprv_malloc(sizeof(MaxJamoExpansionTable));
-        /* test for NULL */
-        if (r->maxJamoExpansions == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            goto cleanup;
-        }
-        r->maxJamoExpansions->size = t->maxJamoExpansions->size;
-        r->maxJamoExpansions->position = t->maxJamoExpansions->position;
-        r->maxJamoExpansions->maxLSize = t->maxJamoExpansions->maxLSize;
-        r->maxJamoExpansions->maxVSize = t->maxJamoExpansions->maxVSize;
-        r->maxJamoExpansions->maxTSize = t->maxJamoExpansions->maxTSize;
-        if(t->maxJamoExpansions->size != 0) {
-            r->maxJamoExpansions->endExpansionCE = (uint32_t *)uprv_malloc(sizeof(uint32_t)*t->maxJamoExpansions->size);
-            /* test for NULL */
-            if (r->maxJamoExpansions->endExpansionCE == NULL) {
-                *status = U_MEMORY_ALLOCATION_ERROR;
-                goto cleanup;
-            }
-            uprv_memcpy(r->maxJamoExpansions->endExpansionCE, t->maxJamoExpansions->endExpansionCE, t->maxJamoExpansions->position*sizeof(uint32_t));
-            r->maxJamoExpansions->isV = (UBool *)uprv_malloc(sizeof(UBool)*t->maxJamoExpansions->size);
-            /* test for NULL */
-            if (r->maxJamoExpansions->isV == NULL) {
-                *status = U_MEMORY_ALLOCATION_ERROR;
-                goto cleanup;
-            }
-            uprv_memcpy(r->maxJamoExpansions->isV, t->maxJamoExpansions->isV, t->maxJamoExpansions->position*sizeof(UBool));
-        } else {
-            r->maxJamoExpansions->endExpansionCE = NULL;
-            r->maxJamoExpansions->isV = NULL;
-        }
-    }
-
-    if(t->unsafeCP != NULL) {
-        r->unsafeCP = (uint8_t *)uprv_malloc(UCOL_UNSAFECP_TABLE_SIZE);
-        /* test for NULL */
-        if (r->unsafeCP == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            goto cleanup;
-        }
-        uprv_memcpy(r->unsafeCP, t->unsafeCP, UCOL_UNSAFECP_TABLE_SIZE);
-    }
-
-    if(t->contrEndCP != NULL) {
-        r->contrEndCP = (uint8_t *)uprv_malloc(UCOL_UNSAFECP_TABLE_SIZE);
-        /* test for NULL */
-        if (r->contrEndCP == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            goto cleanup;
-        }
-        uprv_memcpy(r->contrEndCP, t->contrEndCP, UCOL_UNSAFECP_TABLE_SIZE);
-    }
-
-    r->UCA = t->UCA;
-    r->image = t->image;
-    r->options = t->options;
-
-    return r;
-cleanup:
-    uprv_uca_closeTempTable(t);
-    return NULL;
-}
-
-
-U_CAPI void  U_EXPORT2
-uprv_uca_closeTempTable(tempUCATable *t) {
-    if(t != NULL) {
-        if (t->expansions != NULL) {
-            uprv_free(t->expansions->CEs);
-            uprv_free(t->expansions);
-        }
-        if(t->contractions != NULL) {
-            uprv_cnttab_close(t->contractions);
-        }
-        if (t->mapping != NULL) {
-            utrie_close(t->mapping);
-        }
-
-        if(t->prefixLookup != NULL) {
-            uhash_close(t->prefixLookup);
-        }
-
-        if (t->maxExpansions != NULL) {
-            uprv_free(t->maxExpansions->endExpansionCE);
-            uprv_free(t->maxExpansions->expansionCESize);
-            uprv_free(t->maxExpansions);
-        }
-
-        if (t->maxJamoExpansions->size > 0) {
-            uprv_free(t->maxJamoExpansions->endExpansionCE);
-            uprv_free(t->maxJamoExpansions->isV);
-        }
-        uprv_free(t->maxJamoExpansions);
-
-        uprv_free(t->unsafeCP);
-        uprv_free(t->contrEndCP);
-        
-        if (t->cmLookup != NULL) {
-            uprv_free(t->cmLookup->cPoints);
-            uprv_free(t->cmLookup);
-        }
-
-        uprv_free(t);
-    }
-}
-
-/**
-* Looks for the maximum length of all expansion sequences ending with the same
-* collation element. The size required for maxexpansion and maxsize is 
-* returned if the arrays are too small.
-* @param endexpansion the last expansion collation element to be added
-* @param expansionsize size of the expansion
-* @param maxexpansion data structure to store the maximum expansion data.
-* @param status error status
-* @returns size of the maxexpansion and maxsize used.
-*/
-static int uprv_uca_setMaxExpansion(uint32_t           endexpansion,
-                                    uint8_t            expansionsize,
-                                    MaxExpansionTable *maxexpansion,
-                                    UErrorCode        *status)
-{
-    if (maxexpansion->size == 0) {
-        /* we'll always make the first element 0, for easier manipulation */
-        maxexpansion->endExpansionCE = 
-            (uint32_t *)uprv_malloc(INIT_EXP_TABLE_SIZE * sizeof(int32_t));
-        /* test for NULL */
-        if (maxexpansion->endExpansionCE == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return 0;
-        }
-        *(maxexpansion->endExpansionCE) = 0;
-        maxexpansion->expansionCESize =
-            (uint8_t *)uprv_malloc(INIT_EXP_TABLE_SIZE * sizeof(uint8_t));
-        /* test for NULL */;
-        if (maxexpansion->expansionCESize == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return 0;
-        }
-        *(maxexpansion->expansionCESize) = 0;
-        maxexpansion->size     = INIT_EXP_TABLE_SIZE;
-        maxexpansion->position = 0;
-    }
-
-    if (maxexpansion->position + 1 == maxexpansion->size) {
-        uint32_t *neweece = (uint32_t *)uprv_realloc(maxexpansion->endExpansionCE, 
-            2 * maxexpansion->size * sizeof(uint32_t));
-        if (neweece == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return 0;
-        }
-        maxexpansion->endExpansionCE  = neweece;
-
-        uint8_t  *neweces = (uint8_t *)uprv_realloc(maxexpansion->expansionCESize, 
-            2 * maxexpansion->size * sizeof(uint8_t));
-        if (neweces == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return 0;
-        }
-        maxexpansion->expansionCESize = neweces;
-        maxexpansion->size *= 2;
-    }
-
-    uint32_t *pendexpansionce = maxexpansion->endExpansionCE;
-    uint8_t  *pexpansionsize  = maxexpansion->expansionCESize;
-    int      pos              = maxexpansion->position;
-
-    uint32_t *start = pendexpansionce;
-    uint32_t *limit = pendexpansionce + pos;
-
-    /* using binary search to determine if last expansion element is
-    already in the array */
-    uint32_t *mid;
-    int       result = -1;
-    while (start < limit - 1) {
-        mid = start + ((limit - start) >> 1);
-        if (endexpansion <= *mid) {
-            limit = mid;
-        }
-        else {
-            start = mid;
-        }
-    }
-
-    if (*start == endexpansion) {
-        result = (int)(start - pendexpansionce);
-    }
-    else if (*limit == endexpansion) {
-        result = (int)(limit - pendexpansionce);
-    }
-
-    if (result > -1) {
-        /* found the ce in expansion, we'll just modify the size if it is
-        smaller */
-        uint8_t *currentsize = pexpansionsize + result;
-        if (*currentsize < expansionsize) {
-            *currentsize = expansionsize;
-        }
-    }
-    else {
-        /* we'll need to squeeze the value into the array.
-        initial implementation. */
-        /* shifting the subarray down by 1 */
-        int      shiftsize     = (int)((pendexpansionce + pos) - start);
-        uint32_t *shiftpos     = start + 1;
-        uint8_t  *sizeshiftpos = pexpansionsize + (shiftpos - pendexpansionce);
-
-        /* okay need to rearrange the array into sorted order */
-        if (shiftsize == 0 /*|| *(pendexpansionce + pos) < endexpansion*/) { /* the commented part is actually both redundant and dangerous */
-            *(pendexpansionce + pos + 1) = endexpansion;
-            *(pexpansionsize + pos + 1)  = expansionsize;
-        }
-        else {
-            uprv_memmove(shiftpos + 1, shiftpos, shiftsize * sizeof(int32_t));
-            uprv_memmove(sizeshiftpos + 1, sizeshiftpos, 
-                shiftsize * sizeof(uint8_t));
-            *shiftpos     = endexpansion;
-            *sizeshiftpos = expansionsize;
-        }
-        maxexpansion->position ++;
-
-#ifdef UCOL_DEBUG
-        int   temp;
-        UBool found = FALSE;
-        for (temp = 0; temp < maxexpansion->position; temp ++) {
-            if (pendexpansionce[temp] >= pendexpansionce[temp + 1]) {
-                fprintf(stderr, "expansions %d\n", temp);
-            }
-            if (pendexpansionce[temp] == endexpansion) {
-                found =TRUE;
-                if (pexpansionsize[temp] < expansionsize) {
-                    fprintf(stderr, "expansions size %d\n", temp);
-                }
-            }
-        }
-        if (pendexpansionce[temp] == endexpansion) {
-            found =TRUE;
-            if (pexpansionsize[temp] < expansionsize) {
-                fprintf(stderr, "expansions size %d\n", temp);
-            }
-        }
-        if (!found)
-            fprintf(stderr, "expansion not found %d\n", temp);
-#endif
-    }
-
-    return maxexpansion->position;
-}
-
-/**
-* Sets the maximum length of all jamo expansion sequences ending with the same
-* collation element. The size required for maxexpansion and maxsize is 
-* returned if the arrays are too small.
-* @param ch the jamo codepoint
-* @param endexpansion the last expansion collation element to be added
-* @param expansionsize size of the expansion
-* @param maxexpansion data structure to store the maximum expansion data.
-* @param status error status
-* @returns size of the maxexpansion and maxsize used.
-*/
-static int uprv_uca_setMaxJamoExpansion(UChar                  ch,
-                                        uint32_t               endexpansion,
-                                        uint8_t                expansionsize,
-                                        MaxJamoExpansionTable *maxexpansion,
-                                        UErrorCode            *status)
-{
-    UBool isV = TRUE;
-    if (((uint32_t)ch - 0x1100) <= (0x1112 - 0x1100)) {
-        /* determines L for Jamo, doesn't need to store this since it is never
-        at the end of a expansion */
-        if (maxexpansion->maxLSize < expansionsize) {
-            maxexpansion->maxLSize = expansionsize;
-        }
-        return maxexpansion->position;
-    }
-
-    if (((uint32_t)ch - 0x1161) <= (0x1175 - 0x1161)) {
-        /* determines V for Jamo */
-        if (maxexpansion->maxVSize < expansionsize) {
-            maxexpansion->maxVSize = expansionsize;
-        }
-    }
-
-    if (((uint32_t)ch - 0x11A8) <= (0x11C2 - 0x11A8)) {
-        isV = FALSE;
-        /* determines T for Jamo */
-        if (maxexpansion->maxTSize < expansionsize) {
-            maxexpansion->maxTSize = expansionsize;
-        }
-    }
-
-    if (maxexpansion->size == 0) {
-        /* we'll always make the first element 0, for easier manipulation */
-        maxexpansion->endExpansionCE = 
-            (uint32_t *)uprv_malloc(INIT_EXP_TABLE_SIZE * sizeof(uint32_t));
-        /* test for NULL */;
-        if (maxexpansion->endExpansionCE == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return 0;
-        }
-        *(maxexpansion->endExpansionCE) = 0;
-        maxexpansion->isV = 
-            (UBool *)uprv_malloc(INIT_EXP_TABLE_SIZE * sizeof(UBool));
-        /* test for NULL */;
-        if (maxexpansion->isV == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            uprv_free(maxexpansion->endExpansionCE);
-            maxexpansion->endExpansionCE = NULL;
-            return 0;
-        }
-        *(maxexpansion->isV) = 0;
-        maxexpansion->size     = INIT_EXP_TABLE_SIZE;
-        maxexpansion->position = 0;
-    }
-
-    if (maxexpansion->position + 1 == maxexpansion->size) {
-        maxexpansion->size *= 2;
-        maxexpansion->endExpansionCE = (uint32_t *)uprv_realloc(maxexpansion->endExpansionCE, 
-            maxexpansion->size * sizeof(uint32_t));
-        if (maxexpansion->endExpansionCE == NULL) {
-#ifdef UCOL_DEBUG
-            fprintf(stderr, "out of memory for maxExpansions\n");
-#endif
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return 0;
-        }
-        maxexpansion->isV  = (UBool *)uprv_realloc(maxexpansion->isV, 
-            maxexpansion->size * sizeof(UBool));
-        if (maxexpansion->isV == NULL) {
-#ifdef UCOL_DEBUG
-            fprintf(stderr, "out of memory for maxExpansions\n");
-#endif
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            uprv_free(maxexpansion->endExpansionCE);
-            maxexpansion->endExpansionCE = NULL;
-            return 0;
-        }
-    }
-
-    uint32_t *pendexpansionce = maxexpansion->endExpansionCE;
-    int       pos             = maxexpansion->position;
-
-    while (pos > 0) {
-        pos --;
-        if (*(pendexpansionce + pos) == endexpansion) {
-            return maxexpansion->position;
-        }
-    }
-
-    *(pendexpansionce + maxexpansion->position) = endexpansion;
-    *(maxexpansion->isV + maxexpansion->position) = isV;
-    maxexpansion->position ++;
-
-    return maxexpansion->position;
-}
-
-
-static void ContrEndCPSet(uint8_t *table, UChar c) {
-    uint32_t    hash;
-    uint8_t     *htByte;
-
-    hash = c;
-    if (hash >= UCOL_UNSAFECP_TABLE_SIZE*8) {
-        hash = (hash & UCOL_UNSAFECP_TABLE_MASK) + 256;
-    }
-    htByte = &table[hash>>3];
-    *htByte |= (1 << (hash & 7));
-}
-
-
-static void unsafeCPSet(uint8_t *table, UChar c) {
-    uint32_t    hash;
-    uint8_t     *htByte;
-
-    hash = c;
-    if (hash >= UCOL_UNSAFECP_TABLE_SIZE*8) {
-        if (hash >= 0xd800 && hash <= 0xf8ff) {
-            /*  Part of a surrogate, or in private use area.            */
-            /*   These don't go in the table                            */
-            return;
-        }
-        hash = (hash & UCOL_UNSAFECP_TABLE_MASK) + 256;
-    }
-    htByte = &table[hash>>3];
-    *htByte |= (1 << (hash & 7));
-}
-
-static void
-uprv_uca_createCMTable(tempUCATable *t, int32_t noOfCM, UErrorCode *status) {
-    t->cmLookup = (CombinClassTable *)uprv_malloc(sizeof(CombinClassTable));
-    if (t->cmLookup==NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return;
-    }
-    t->cmLookup->cPoints=(UChar *)uprv_malloc(noOfCM*sizeof(UChar));
-    if (t->cmLookup->cPoints ==NULL) {
-        uprv_free(t->cmLookup);
-        t->cmLookup = NULL;
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return;
-    }
-
-    t->cmLookup->size=noOfCM;
-    uprv_memset(t->cmLookup->index, 0, sizeof(t->cmLookup->index));
-
-    return;
-}
-
-static void
-uprv_uca_copyCMTable(tempUCATable *t, UChar *cm, uint16_t *index) {
-    int32_t count=0;
-
-    for (int32_t i=0; i<256; ++i) {
-        if (index[i]>0) {
-            // cPoints is ordered by combining class value.
-            uprv_memcpy(t->cmLookup->cPoints+count, cm+(i<<8), index[i]*sizeof(UChar));
-            count += index[i];
-        }
-        t->cmLookup->index[i]=count;
-    }
-    return;
-}
-
-/* 1. to the UnsafeCP hash table, add all chars with combining class != 0     */
-/* 2. build combining marks table for all chars with combining class != 0     */
-static void uprv_uca_unsafeCPAddCCNZ(tempUCATable *t, UErrorCode *status) {
-
-    UChar              c;
-    uint16_t           fcd;     // Hi byte is lead combining class. lo byte is trailing combing class.
-    UBool buildCMTable = (t->cmLookup==NULL); // flag for building combining class table
-    UChar *cm=NULL;
-    uint16_t index[256];
-    int32_t count=0;
-    const Normalizer2Impl *nfcImpl = Normalizer2Factory::getNFCImpl(*status);
-    if (U_FAILURE(*status)) {
-        return;
-    }
-
-    if (buildCMTable) {
-        if (cm==NULL) {
-            cm = (UChar *)uprv_malloc(sizeof(UChar)*UCOL_MAX_CM_TAB);
-            if (cm==NULL) {
-                *status = U_MEMORY_ALLOCATION_ERROR;
-                return;
-            }
-        }
-        uprv_memset(index, 0, sizeof(index));
-    }
-    for (c=0; c<0xffff; c++) {
-        if (U16_IS_LEAD(c)) {
-            fcd = 0;
-            if (nfcImpl->singleLeadMightHaveNonZeroFCD16(c)) {
-                UChar32 supp = U16_GET_SUPPLEMENTARY(c, 0xdc00);
-                UChar32 suppLimit = supp + 0x400;
-                while (supp < suppLimit) {
-                    fcd |= nfcImpl->getFCD16FromNormData(supp++);
-                }
-            }
-        } else {
-            fcd = nfcImpl->getFCD16(c);
-        }
-        if (fcd >= 0x100 ||               // if the leading combining class(c) > 0 ||
-            (U16_IS_LEAD(c) && fcd != 0)) {//    c is a leading surrogate with some FCD data
-            if (buildCMTable) {
-                uint32_t cClass = fcd & 0xff;
-                //uint32_t temp=(cClass<<8)+index[cClass];
-                cm[(cClass<<8)+index[cClass]] = c; //
-                index[cClass]++;
-                count++;
-            }
-            unsafeCPSet(t->unsafeCP, c);
-        }
-    }
-
-    // copy to cm table
-    if (buildCMTable) {
-        uprv_uca_createCMTable(t, count, status);
-        if(U_FAILURE(*status)) {
-            if (cm!=NULL) {
-                uprv_free(cm);
-            }
-            return;
-        }
-        uprv_uca_copyCMTable(t, cm, index);
-    }
-
-    if(t->prefixLookup != NULL) {
-        int32_t i = -1;
-        const UHashElement *e = NULL;
-        UCAElements *element = NULL;
-        UChar NFCbuf[256];
-        while((e = uhash_nextElement(t->prefixLookup, &i)) != NULL) {
-            element = (UCAElements *)e->value.pointer;
-            // codepoints here are in the NFD form. We need to add the
-            // first code point of the NFC form to unsafe, because
-            // strcoll needs to backup over them.
-            unorm_normalize(element->cPoints, element->cSize, UNORM_NFC, 0,
-                NFCbuf, 256, status);
-            unsafeCPSet(t->unsafeCP, NFCbuf[0]);
-        }
-    }
-
-    if (cm!=NULL) {
-        uprv_free(cm);
-    }
-}
-
-static uint32_t uprv_uca_addPrefix(tempUCATable *t, uint32_t CE,
-                                   UCAElements *element, UErrorCode *status)
-{
-    // currently the longest prefix we're supporting in Japanese is two characters
-    // long. Although this table could quite easily mimic complete contraction stuff
-    // there is no good reason to make a general solution, as it would require some
-    // error prone messing.
-    CntTable *contractions = t->contractions;
-    UChar32 cp;
-    uint32_t cpsize = 0;
-    UChar *oldCP = element->cPoints;
-    uint32_t oldCPSize = element->cSize;
-
-
-    contractions->currentTag = SPEC_PROC_TAG;
-
-    // here, we will normalize & add prefix to the table.
-    uint32_t j = 0;
-#ifdef UCOL_DEBUG
-    for(j=0; j<element->cSize; j++) {
-        fprintf(stdout, "CP: %04X ", element->cPoints[j]);
-    }
-    fprintf(stdout, "El: %08X Pref: ", CE);
-    for(j=0; j<element->prefixSize; j++) {
-        fprintf(stdout, "%04X ", element->prefix[j]);
-    }
-    fprintf(stdout, "%08X ", element->mapCE);
-#endif
-
-    for (j = 1; j<element->prefixSize; j++) {   /* First add NFD prefix chars to unsafe CP hash table */
-        // Unless it is a trail surrogate, which is handled algoritmically and
-        // shouldn't take up space in the table.
-        if(!(U16_IS_TRAIL(element->prefix[j]))) {
-            unsafeCPSet(t->unsafeCP, element->prefix[j]);
-        }
-    }
-
-    UChar tempPrefix = 0;
-
-    for(j = 0; j < /*nfcSize*/element->prefixSize/2; j++) { // prefixes are going to be looked up backwards
-        // therefore, we will promptly reverse the prefix buffer...
-        tempPrefix = *(/*nfcBuffer*/element->prefix+element->prefixSize-j-1);
-        *(/*nfcBuffer*/element->prefix+element->prefixSize-j-1) = element->prefix[j];
-        element->prefix[j] = tempPrefix;
-    }
-
-#ifdef UCOL_DEBUG
-    fprintf(stdout, "Reversed: ");
-    for(j=0; j<element->prefixSize; j++) {
-        fprintf(stdout, "%04X ", element->prefix[j]);
-    }
-    fprintf(stdout, "%08X\n", element->mapCE);
-#endif
-
-    // the first codepoint is also unsafe, as it forms a 'contraction' with the prefix
-    if(!(U16_IS_TRAIL(element->cPoints[0]))) {
-        unsafeCPSet(t->unsafeCP, element->cPoints[0]);
-    }
-
-    // Maybe we need this... To handle prefixes completely in the forward direction...
-    //if(element->cSize == 1) {
-    //  if(!(U16_IS_TRAIL(element->cPoints[0]))) {
-    //    ContrEndCPSet(t->contrEndCP, element->cPoints[0]);
-    //  }
-    //}
-
-    element->cPoints = element->prefix;
-    element->cSize = element->prefixSize;
-
-    // Add the last char of the contraction to the contraction-end hash table.
-    // unless it is a trail surrogate, which is handled algorithmically and
-    // shouldn't be in the table
-    if(!(U16_IS_TRAIL(element->cPoints[element->cSize -1]))) {
-        ContrEndCPSet(t->contrEndCP, element->cPoints[element->cSize -1]);
-    }
-
-    // First we need to check if contractions starts with a surrogate
-    U16_NEXT(element->cPoints, cpsize, element->cSize, cp);
-
-    // If there are any Jamos in the contraction, we should turn on special
-    // processing for Jamos
-    if(UCOL_ISJAMO(element->prefix[0])) {
-        t->image->jamoSpecial = TRUE;
-    }
-    /* then we need to deal with it */
-    /* we could aready have something in table - or we might not */
-
-    if(!isPrefix(CE)) {
-        /* if it wasn't contraction, we wouldn't end up here*/
-        int32_t firstContractionOffset = 0;
-        firstContractionOffset = uprv_cnttab_addContraction(contractions, UPRV_CNTTAB_NEWELEMENT, 0, CE, status);
-        uint32_t newCE = uprv_uca_processContraction(contractions, element, UCOL_NOT_FOUND, status);
-        uprv_cnttab_addContraction(contractions, firstContractionOffset, *element->prefix, newCE, status);
-        uprv_cnttab_addContraction(contractions, firstContractionOffset, 0xFFFF, CE, status);
-        CE =  constructContractCE(SPEC_PROC_TAG, firstContractionOffset);
-    } else { /* we are adding to existing contraction */
-        /* there were already some elements in the table, so we need to add a new contraction */
-        /* Two things can happen here: either the codepoint is already in the table, or it is not */
-        int32_t position = uprv_cnttab_findCP(contractions, CE, *element->prefix, status);
-        if(position > 0) {       /* if it is we just continue down the chain */
-            uint32_t eCE = uprv_cnttab_getCE(contractions, CE, position, status);
-            uint32_t newCE = uprv_uca_processContraction(contractions, element, eCE, status);
-            uprv_cnttab_setContraction(contractions, CE, position, *(element->prefix), newCE, status);
-        } else {                  /* if it isn't, we will have to create a new sequence */
-            uprv_uca_processContraction(contractions, element, UCOL_NOT_FOUND, status);
-            uprv_cnttab_insertContraction(contractions, CE, *(element->prefix), element->mapCE, status);
-        }
-    }
-
-    element->cPoints = oldCP;
-    element->cSize = oldCPSize;
-
-    return CE;
-}
-
-// Note regarding surrogate handling: We are interested only in the single
-// or leading surrogates in a contraction. If a surrogate is somewhere else
-// in the contraction, it is going to be handled as a pair of code units,
-// as it doesn't affect the performance AND handling surrogates specially
-// would complicate code way too much.
-static uint32_t uprv_uca_addContraction(tempUCATable *t, uint32_t CE, 
-                                        UCAElements *element, UErrorCode *status)
-{
-    CntTable *contractions = t->contractions;
-    UChar32 cp;
-    uint32_t cpsize = 0;
-
-    contractions->currentTag = CONTRACTION_TAG;
-
-    // First we need to check if contractions starts with a surrogate
-    U16_NEXT(element->cPoints, cpsize, element->cSize, cp);
-
-    if(cpsize<element->cSize) { // This is a real contraction, if there are other characters after the first
-        uint32_t j = 0;
-        for (j=1; j<element->cSize; j++) {   /* First add contraction chars to unsafe CP hash table */
-            // Unless it is a trail surrogate, which is handled algoritmically and 
-            // shouldn't take up space in the table.
-            if(!(U16_IS_TRAIL(element->cPoints[j]))) {
-                unsafeCPSet(t->unsafeCP, element->cPoints[j]);
-            }
-        }
-        // Add the last char of the contraction to the contraction-end hash table.
-        // unless it is a trail surrogate, which is handled algorithmically and 
-        // shouldn't be in the table
-        if(!(U16_IS_TRAIL(element->cPoints[element->cSize -1]))) {
-            ContrEndCPSet(t->contrEndCP, element->cPoints[element->cSize -1]);
-        }
-
-        // If there are any Jamos in the contraction, we should turn on special 
-        // processing for Jamos
-        if(UCOL_ISJAMO(element->cPoints[0])) {
-            t->image->jamoSpecial = TRUE;
-        }
-        /* then we need to deal with it */
-        /* we could aready have something in table - or we might not */
-        element->cPoints+=cpsize;
-        element->cSize-=cpsize;
-        if(!isContraction(CE)) { 
-            /* if it wasn't contraction, we wouldn't end up here*/
-            int32_t firstContractionOffset = 0;
-            firstContractionOffset = uprv_cnttab_addContraction(contractions, UPRV_CNTTAB_NEWELEMENT, 0, CE, status);
-            uint32_t newCE = uprv_uca_processContraction(contractions, element, UCOL_NOT_FOUND, status);
-            uprv_cnttab_addContraction(contractions, firstContractionOffset, *element->cPoints, newCE, status);
-            uprv_cnttab_addContraction(contractions, firstContractionOffset, 0xFFFF, CE, status);
-            CE =  constructContractCE(CONTRACTION_TAG, firstContractionOffset);
-        } else { /* we are adding to existing contraction */
-            /* there were already some elements in the table, so we need to add a new contraction */
-            /* Two things can happen here: either the codepoint is already in the table, or it is not */
-            int32_t position = uprv_cnttab_findCP(contractions, CE, *element->cPoints, status);
-            if(position > 0) {       /* if it is we just continue down the chain */
-                uint32_t eCE = uprv_cnttab_getCE(contractions, CE, position, status);
-                uint32_t newCE = uprv_uca_processContraction(contractions, element, eCE, status);
-                uprv_cnttab_setContraction(contractions, CE, position, *(element->cPoints), newCE, status);
-            } else {                  /* if it isn't, we will have to create a new sequence */
-                uint32_t newCE = uprv_uca_processContraction(contractions, element, UCOL_NOT_FOUND, status);
-                uprv_cnttab_insertContraction(contractions, CE, *(element->cPoints), newCE, status);
-            }
-        }
-        element->cPoints-=cpsize;
-        element->cSize+=cpsize;
-        /*ucmpe32_set(t->mapping, cp, CE);*/
-        utrie_set32(t->mapping, cp, CE);
-    } else if(!isContraction(CE)) { /* this is just a surrogate, and there is no contraction */
-        /*ucmpe32_set(t->mapping, cp, element->mapCE);*/
-        utrie_set32(t->mapping, cp, element->mapCE);
-    } else { /* fill out the first stage of the contraction with the surrogate CE */
-        uprv_cnttab_changeContraction(contractions, CE, 0, element->mapCE, status);
-        uprv_cnttab_changeContraction(contractions, CE, 0xFFFF, element->mapCE, status);
-    }
-    return CE;
-}
-
-
-static uint32_t uprv_uca_processContraction(CntTable *contractions, UCAElements *element, uint32_t existingCE, UErrorCode *status) {
-    int32_t firstContractionOffset = 0;
-    //    uint32_t contractionElement = UCOL_NOT_FOUND;
-
-    if(U_FAILURE(*status)) {
-        return UCOL_NOT_FOUND;
-    }
-
-    /* end of recursion */
-    if(element->cSize == 1) {
-        if(isCntTableElement(existingCE) && ((UColCETags)getCETag(existingCE) == contractions->currentTag)) {
-            uprv_cnttab_changeContraction(contractions, existingCE, 0, element->mapCE, status);
-            uprv_cnttab_changeContraction(contractions, existingCE, 0xFFFF, element->mapCE, status);
-            return existingCE;
-        } else {
-            return element->mapCE; /*can't do just that. existingCe might be a contraction, meaning that we need to do another step */
-        }
-    }
-
-    /* this recursion currently feeds on the only element we have... We will have to copy it in order to accomodate */
-    /* for both backward and forward cycles */
-
-    /* we encountered either an empty space or a non-contraction element */
-    /* this means we are constructing a new contraction sequence */
-    element->cPoints++;
-    element->cSize--;
-    if(!isCntTableElement(existingCE)) { 
-        /* if it wasn't contraction, we wouldn't end up here*/
-        firstContractionOffset = uprv_cnttab_addContraction(contractions, UPRV_CNTTAB_NEWELEMENT, 0, existingCE, status);
-        uint32_t newCE = uprv_uca_processContraction(contractions, element, UCOL_NOT_FOUND, status);
-        uprv_cnttab_addContraction(contractions, firstContractionOffset, *element->cPoints, newCE, status);
-        uprv_cnttab_addContraction(contractions, firstContractionOffset, 0xFFFF, existingCE, status);
-        existingCE =  constructContractCE(contractions->currentTag, firstContractionOffset);
-    } else { /* we are adding to existing contraction */
-        /* there were already some elements in the table, so we need to add a new contraction */
-        /* Two things can happen here: either the codepoint is already in the table, or it is not */
-        int32_t position = uprv_cnttab_findCP(contractions, existingCE, *element->cPoints, status);
-        if(position > 0) {       /* if it is we just continue down the chain */
-            uint32_t eCE = uprv_cnttab_getCE(contractions, existingCE, position, status);
-            uint32_t newCE = uprv_uca_processContraction(contractions, element, eCE, status);
-            uprv_cnttab_setContraction(contractions, existingCE, position, *(element->cPoints), newCE, status);
-        } else {                  /* if it isn't, we will have to create a new sequence */
-            uint32_t newCE = uprv_uca_processContraction(contractions, element, UCOL_NOT_FOUND, status);
-            uprv_cnttab_insertContraction(contractions, existingCE, *(element->cPoints), newCE, status);
-        }
-    }
-    element->cPoints--;
-    element->cSize++;
-    return existingCE;
-}
-
-static uint32_t uprv_uca_finalizeAddition(tempUCATable *t, UCAElements *element, UErrorCode *status) {
-    uint32_t CE = UCOL_NOT_FOUND;
-    // This should add a completely ignorable element to the 
-    // unsafe table, so that backward iteration will skip
-    // over it when treating contractions.
-    uint32_t i = 0;
-    if(element->mapCE == 0) {
-        for(i = 0; i < element->cSize; i++) {
-            if(!U16_IS_TRAIL(element->cPoints[i])) {
-                unsafeCPSet(t->unsafeCP, element->cPoints[i]);
-            }
-        }
-    }
-    if(element->cSize > 1) { /* we're adding a contraction */
-        uint32_t i = 0;
-        UChar32 cp;
-
-        U16_NEXT(element->cPoints, i, element->cSize, cp);
-        /*CE = ucmpe32_get(t->mapping, cp);*/
-        CE = utrie_get32(t->mapping, cp, NULL);
-
-        CE = uprv_uca_addContraction(t, CE, element, status);
-    } else { /* easy case, */
-        /*CE = ucmpe32_get(t->mapping, element->cPoints[0]);*/
-        CE = utrie_get32(t->mapping, element->cPoints[0], NULL);
-
-        if( CE != UCOL_NOT_FOUND) {
-            if(isCntTableElement(CE) /*isContraction(CE)*/) { /* adding a non contraction element (thai, expansion, single) to already existing contraction */
-                if(!isPrefix(element->mapCE)) { // we cannot reenter prefix elements - as we are going to create a dead loop
-                    // Only expansions and regular CEs can go here... Contractions will never happen in this place
-                    uprv_cnttab_setContraction(t->contractions, CE, 0, 0, element->mapCE, status);
-                    /* This loop has to change the CE at the end of contraction REDO!*/
-                    uprv_cnttab_changeLastCE(t->contractions, CE, element->mapCE, status);
-                }
-            } else {
-                /*ucmpe32_set(t->mapping, element->cPoints[0], element->mapCE);*/
-                utrie_set32(t->mapping, element->cPoints[0], element->mapCE);
-                if ((element->prefixSize!=0) && (!isSpecial(CE) || (getCETag(CE)!=IMPLICIT_TAG))) {
-                    UCAElements *origElem = (UCAElements *)uprv_malloc(sizeof(UCAElements));
-                    /* test for NULL */
-                    if (origElem== NULL) {
-                        *status = U_MEMORY_ALLOCATION_ERROR;
-                        return 0;
-                    }
-                    /* copy the original UCA value */
-                    origElem->prefixSize = 0;
-                    origElem->prefix = NULL;
-                    origElem->cPoints = origElem->uchars;
-                    origElem->cPoints[0] = element->cPoints[0];
-                    origElem->cSize = 1;
-                    origElem->CEs[0]=CE;
-                    origElem->mapCE=CE;
-                    origElem->noOfCEs=1;
-                    uprv_uca_finalizeAddition(t, origElem, status);
-                    uprv_free(origElem);
-                }
-#ifdef UCOL_DEBUG
-                fprintf(stderr, "Warning - trying to overwrite existing data %08X for cp %04X with %08X\n", CE, element->cPoints[0], element->CEs[0]);
-                //*status = U_ILLEGAL_ARGUMENT_ERROR;
-#endif
-            }
-        } else {
-            /*ucmpe32_set(t->mapping, element->cPoints[0], element->mapCE);*/
-            utrie_set32(t->mapping, element->cPoints[0], element->mapCE);
-        }
-    }
-    return CE;
-}
-
-/* This adds a read element, while testing for existence */
-U_CAPI uint32_t  U_EXPORT2
-uprv_uca_addAnElement(tempUCATable *t, UCAElements *element, UErrorCode *status) {
-    U_NAMESPACE_USE
-
-    ExpansionTable *expansions = t->expansions;
-
-    uint32_t i = 1;
-    uint32_t expansion = 0;
-    uint32_t CE;
-
-    if(U_FAILURE(*status)) {
-        return 0xFFFF;
-    }
-
-    element->mapCE = 0; // clear mapCE so that we can catch expansions
-
-    if(element->noOfCEs == 1) {
-        element->mapCE = element->CEs[0];      
-    } else {     
-        /* ICU 2.1 long primaries */
-        /* unfortunately, it looks like we have to look for a long primary here */
-        /* since in canonical closure we are going to hit some long primaries from */
-        /* the first phase, and they will come back as continuations/expansions */
-        /* destroying the effect of the previous opitimization */
-        /* A long primary is a three byte primary with starting secondaries and tertiaries */
-        /* It can appear in long runs of only primary differences (like east Asian tailorings) */
-        /* also, it should not be an expansion, as expansions would break with this */
-        // This part came in from ucol_bld.cpp
-        //if(tok->expansion == 0
-        //&& noOfBytes[0] == 3 && noOfBytes[1] == 1 && noOfBytes[2] == 1
-        //&& CEparts[1] == (UCOL_BYTE_COMMON << 24) && CEparts[2] == (UCOL_BYTE_COMMON << 24)) {
-        /* we will construct a special CE that will go unchanged to the table */
-        if(element->noOfCEs == 2 // a two CE expansion 
-            && isContinuation(element->CEs[1]) // which  is a continuation
-            && (element->CEs[1] & (~(0xFF << 24 | UCOL_CONTINUATION_MARKER))) == 0 // that has only primaries in continuation,
-            && (((element->CEs[0]>>8) & 0xFF) == UCOL_BYTE_COMMON) // a common secondary
-            && ((element->CEs[0] & 0xFF) == UCOL_BYTE_COMMON) // and a common tertiary
-            )
-        {
-#ifdef UCOL_DEBUG
-            fprintf(stdout, "Long primary %04X\n", element->cPoints[0]);
-#endif
-            element->mapCE = UCOL_SPECIAL_FLAG | (LONG_PRIMARY_TAG<<24) // a long primary special
-                | ((element->CEs[0]>>8) & 0xFFFF00) // first and second byte of primary
-                | ((element->CEs[1]>>24) & 0xFF);   // third byte of primary
-        }
-        else {
-            expansion = (uint32_t)(UCOL_SPECIAL_FLAG | (EXPANSION_TAG<<UCOL_TAG_SHIFT) 
-                | (((uprv_uca_addExpansion(expansions, element->CEs[0], status)+(headersize>>2))<<4)
-                   & 0xFFFFF0));
-
-            for(i = 1; i<element->noOfCEs; i++) {
-                uprv_uca_addExpansion(expansions, element->CEs[i], status);
-            }
-            if(element->noOfCEs <= 0xF) {
-                expansion |= element->noOfCEs;
-            } else {
-                uprv_uca_addExpansion(expansions, 0, status);
-            }
-            element->mapCE = expansion;
-            uprv_uca_setMaxExpansion(element->CEs[element->noOfCEs - 1],
-                (uint8_t)element->noOfCEs,
-                t->maxExpansions,
-                status);
-            if(UCOL_ISJAMO(element->cPoints[0])) {
-                t->image->jamoSpecial = TRUE;
-                uprv_uca_setMaxJamoExpansion(element->cPoints[0],
-                    element->CEs[element->noOfCEs - 1],
-                    (uint8_t)element->noOfCEs,
-                    t->maxJamoExpansions,
-                    status);
-            }
-            if (U_FAILURE(*status)) {
-                return 0;
-            }
-        }
-    }
-
-    // We treat digits differently - they are "uber special" and should be
-    // processed differently if numeric collation is on. 
-    UChar32 uniChar = 0;
-    //printElement(element);
-    if ((element->cSize == 2) && U16_IS_LEAD(element->cPoints[0])){
-        uniChar = U16_GET_SUPPLEMENTARY(element->cPoints[0], element->cPoints[1]);
-    } else if (element->cSize == 1){
-        uniChar = element->cPoints[0];
-    }
-
-    // Here, we either have one normal CE OR mapCE is set. Therefore, we stuff only
-    // one element to the expansion buffer. When we encounter a digit and we don't 
-    // do numeric collation, we will just pick the CE we have and break out of case
-    // (see ucol.cpp ucol_prv_getSpecialCE && ucol_prv_getSpecialPrevCE). If we picked
-    // a special, further processing will occur. If it's a simple CE, we'll return due
-    // to how the loop is constructed.
-    if (uniChar != 0 && u_isdigit(uniChar)){
-        expansion = (uint32_t)(UCOL_SPECIAL_FLAG | (DIGIT_TAG<<UCOL_TAG_SHIFT) | 1); // prepare the element
-        if(element->mapCE) { // if there is an expansion, we'll pick it here
-            expansion |= ((uprv_uca_addExpansion(expansions, element->mapCE, status)+(headersize>>2))<<4);
-        } else {
-            expansion |= ((uprv_uca_addExpansion(expansions, element->CEs[0], status)+(headersize>>2))<<4);
-        }
-        element->mapCE = expansion;
-
-        // Need to go back to the beginning of the digit string if in the middle!
-        if(uniChar <= 0xFFFF) { // supplementaries are always unsafe. API takes UChars
-            unsafeCPSet(t->unsafeCP, (UChar)uniChar);
-        }
-    }
-
-    // here we want to add the prefix structure.
-    // I will try to process it as a reverse contraction, if possible.
-    // prefix buffer is already reversed.
-
-    if(element->prefixSize!=0) {
-        // We keep the seen prefix starter elements in a hashtable
-        // we need it to be able to distinguish between the simple
-        // codepoints and prefix starters. Also, we need to use it
-        // for canonical closure.
-
-        UCAElements *composed = (UCAElements *)uprv_malloc(sizeof(UCAElements));
-        /* test for NULL */
-        if (composed == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return 0;
-        }
-        uprv_memcpy(composed, element, sizeof(UCAElements));
-        composed->cPoints = composed->uchars;
-        composed->prefix = composed->prefixChars;
-
-        composed->prefixSize = unorm_normalize(element->prefix, element->prefixSize, UNORM_NFC, 0, composed->prefix, 128, status);
-
-
-        if(t->prefixLookup != NULL) {
-            UCAElements *uCE = (UCAElements *)uhash_get(t->prefixLookup, element);
-            if(uCE != NULL) { // there is already a set of code points here
-                element->mapCE = uprv_uca_addPrefix(t, uCE->mapCE, element, status);
-            } else { // no code points, so this spot is clean
-                element->mapCE = uprv_uca_addPrefix(t, UCOL_NOT_FOUND, element, status);
-                uCE = (UCAElements *)uprv_malloc(sizeof(UCAElements));
-                /* test for NULL */
-                if (uCE == NULL) {
-                    *status = U_MEMORY_ALLOCATION_ERROR;
-                    return 0;
-                }
-                uprv_memcpy(uCE, element, sizeof(UCAElements));
-                uCE->cPoints = uCE->uchars;
-                uhash_put(t->prefixLookup, uCE, uCE, status);
-            }
-            if(composed->prefixSize != element->prefixSize || uprv_memcmp(composed->prefix, element->prefix, element->prefixSize)) {
-                // do it!
-                composed->mapCE = uprv_uca_addPrefix(t, element->mapCE, composed, status);
-            }
-        }
-        uprv_free(composed);
-    }
-
-    // We need to use the canonical iterator here
-    // the way we do it is to generate the canonically equivalent strings 
-    // for the contraction and then add the sequences that pass FCD check
-    if(element->cSize > 1 && !(element->cSize==2 && U16_IS_LEAD(element->cPoints[0]) && U16_IS_TRAIL(element->cPoints[1]))) { // this is a contraction, we should check whether a composed form should also be included
-        UnicodeString source(element->cPoints, element->cSize);
-        CanonicalIterator it(source, *status);
-        source = it.next();
-        while(!source.isBogus()) {
-            if(Normalizer::quickCheck(source, UNORM_FCD, *status) != UNORM_NO) {
-                element->cSize = source.extract(element->cPoints, 128, *status);
-                uprv_uca_finalizeAddition(t, element, status);
-            }
-            source = it.next();
-        }
-        CE = element->mapCE;
-    } else {
-        CE = uprv_uca_finalizeAddition(t, element, status);  
-    }
-
-    return CE;
-}
-
-
-/*void uprv_uca_getMaxExpansionJamo(CompactEIntArray       *mapping, */
-static void uprv_uca_getMaxExpansionJamo(UNewTrie       *mapping, 
-                                         MaxExpansionTable     *maxexpansion,
-                                         MaxJamoExpansionTable *maxjamoexpansion,
-                                         UBool                  jamospecial,
-                                         UErrorCode            *status)
-{
-    const uint32_t VBASE  = 0x1161;
-    const uint32_t TBASE  = 0x11A8;
-    const uint32_t VCOUNT = 21;
-    const uint32_t TCOUNT = 28;
-
-    uint32_t v = VBASE + VCOUNT - 1;
-    uint32_t t = TBASE + TCOUNT - 1;
-    uint32_t ce;
-
-    while (v >= VBASE) {
-        /*ce = ucmpe32_get(mapping, v);*/
-        ce = utrie_get32(mapping, v, NULL);
-        if (ce < UCOL_SPECIAL_FLAG) {
-            uprv_uca_setMaxExpansion(ce, 2, maxexpansion, status);
-        }
-        v --;
-    }
-
-    while (t >= TBASE)
-    {
-        /*ce = ucmpe32_get(mapping, t);*/
-        ce = utrie_get32(mapping, t, NULL);
-        if (ce < UCOL_SPECIAL_FLAG) {
-            uprv_uca_setMaxExpansion(ce, 3, maxexpansion, status);
-        }
-        t --;
-    }
-    /*  According to the docs, 99% of the time, the Jamo will not be special */
-    if (jamospecial) {
-        /* gets the max expansion in all unicode characters */
-        int     count    = maxjamoexpansion->position;
-        uint8_t maxTSize = (uint8_t)(maxjamoexpansion->maxLSize + 
-            maxjamoexpansion->maxVSize +
-            maxjamoexpansion->maxTSize);
-        uint8_t maxVSize = (uint8_t)(maxjamoexpansion->maxLSize + 
-            maxjamoexpansion->maxVSize);
-
-        while (count > 0) {
-            count --;
-            if (*(maxjamoexpansion->isV + count) == TRUE) {
-                uprv_uca_setMaxExpansion(
-                    *(maxjamoexpansion->endExpansionCE + count), 
-                    maxVSize, maxexpansion, status);
-            }
-            else {
-                uprv_uca_setMaxExpansion(
-                    *(maxjamoexpansion->endExpansionCE + count), 
-                    maxTSize, maxexpansion, status);
-            }
-        }
-    }
-}
-
-U_CDECL_BEGIN
-static inline uint32_t U_CALLCONV
-getFoldedValue(UNewTrie *trie, UChar32 start, int32_t offset)
-{
-    uint32_t value;
-    uint32_t tag;
-    UChar32 limit;
-    UBool inBlockZero;
-
-    limit=start+0x400;
-    while(start<limit) {
-        value=utrie_get32(trie, start, &inBlockZero);
-        tag = getCETag(value);
-        if(inBlockZero == TRUE) {
-            start+=UTRIE_DATA_BLOCK_LENGTH;
-        } else if(!(isSpecial(value) && (tag == IMPLICIT_TAG || tag == NOT_FOUND_TAG))) {
-            /* These are values that are starting in either UCA (IMPLICIT_TAG) or in the 
-            * tailorings (NOT_FOUND_TAG). Presence of these tags means that there is 
-            * nothing in this position and that it should be skipped.
-            */
-#ifdef UCOL_DEBUG
-            static int32_t count = 1;
-            fprintf(stdout, "%i, Folded %08X, value %08X\n", count++, start, value);
-#endif
-            return (uint32_t)(UCOL_SPECIAL_FLAG | (SURROGATE_TAG<<24) | offset);
-        } else {
-            ++start;
-        }
-    }
-    return 0;
-}
-U_CDECL_END
-
-#ifdef UCOL_DEBUG
-// This is a debug function to print the contents of a trie.
-// It is used in conjuction with the code around utrie_unserialize call
-UBool enumRange(const void *context, UChar32 start, UChar32 limit, uint32_t value) {
-    if(start<0x10000) {
-        fprintf(stdout, "%08X, %08X, %08X\n", start, limit, value);
-    } else {
-        fprintf(stdout, "%08X=%04X %04X, %08X=%04X %04X, %08X\n", start, U16_LEAD(start), U16_TRAIL(start), limit, U16_LEAD(limit), U16_TRAIL(limit), value);
-    }
-    return TRUE;
-}
-
-int32_t 
-myGetFoldingOffset(uint32_t data) {
-    if(data > UCOL_NOT_FOUND && getCETag(data) == SURROGATE_TAG) {
-        return (data&0xFFFFFF);
-    } else {
-        return 0;
-    }
-}
-#endif
-
-U_CAPI UCATableHeader* U_EXPORT2
-uprv_uca_assembleTable(tempUCATable *t, UErrorCode *status) {
-    /*CompactEIntArray *mapping = t->mapping;*/
-    UNewTrie *mapping = t->mapping;
-    ExpansionTable *expansions = t->expansions;
-    CntTable *contractions = t->contractions;
-    MaxExpansionTable *maxexpansion = t->maxExpansions;
-
-    if(U_FAILURE(*status)) {
-        return NULL;
-    }
-
-    uint32_t beforeContractions = (uint32_t)((headersize+paddedsize(expansions->position*sizeof(uint32_t)))/sizeof(UChar));
-
-    int32_t contractionsSize = 0;
-    contractionsSize = uprv_cnttab_constructTable(contractions, beforeContractions, status);
-
-    /* the following operation depends on the trie data. Therefore, we have to do it before */
-    /* the trie is compacted */
-    /* sets jamo expansions */
-    uprv_uca_getMaxExpansionJamo(mapping, maxexpansion, t->maxJamoExpansions,
-        t->image->jamoSpecial, status);
-
-    /*ucmpe32_compact(mapping);*/
-    /*UMemoryStream *ms = uprv_mstrm_openNew(8192);*/
-    /*int32_t mappingSize = ucmpe32_flattenMem(mapping, ms);*/
-    /*const uint8_t *flattened = uprv_mstrm_getBuffer(ms, &mappingSize);*/
-
-    // After setting the jamo expansions, compact the trie and get the needed size
-    int32_t mappingSize = utrie_serialize(mapping, NULL, 0, getFoldedValue /*getFoldedValue*/, FALSE, status);
-
-    uint32_t tableOffset = 0;
-    uint8_t *dataStart;
-
-    /* TODO: LATIN1 array is now in the utrie - it should be removed from the calculation */
-
-    uint32_t toAllocate =(uint32_t)(headersize+                                    
-        paddedsize(expansions->position*sizeof(uint32_t))+
-        paddedsize(mappingSize)+
-        paddedsize(contractionsSize*(sizeof(UChar)+sizeof(uint32_t)))+
-        //paddedsize(0x100*sizeof(uint32_t))  /* Latin1 is now included in the trie */
-        /* maxexpansion array */
-        + paddedsize(maxexpansion->position * sizeof(uint32_t)) +
-        /* maxexpansion size array */
-        paddedsize(maxexpansion->position * sizeof(uint8_t)) +
-        paddedsize(UCOL_UNSAFECP_TABLE_SIZE) +   /*  Unsafe chars             */
-        paddedsize(UCOL_UNSAFECP_TABLE_SIZE));    /*  Contraction Ending chars */
-
-
-    dataStart = (uint8_t *)uprv_malloc(toAllocate);
-    /* test for NULL */
-    if (dataStart == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return NULL;
-    }
-
-    UCATableHeader *myData = (UCATableHeader *)dataStart;
-    // Please, do reset all the fields!
-    uprv_memset(dataStart, 0, toAllocate);
-    // Make sure we know this is reset
-    myData->magic = UCOL_HEADER_MAGIC;
-    myData->isBigEndian = U_IS_BIG_ENDIAN;
-    myData->charSetFamily = U_CHARSET_FAMILY;
-    myData->formatVersion[0] = UCA_FORMAT_VERSION_0;
-    myData->formatVersion[1] = UCA_FORMAT_VERSION_1;
-    myData->formatVersion[2] = UCA_FORMAT_VERSION_2;
-    myData->formatVersion[3] = UCA_FORMAT_VERSION_3;
-    myData->jamoSpecial = t->image->jamoSpecial;
-
-    // Don't copy stuff from UCA header!
-    //uprv_memcpy(myData, t->image, sizeof(UCATableHeader));
-
-    myData->contractionSize = contractionsSize;
-
-    tableOffset += (uint32_t)(paddedsize(sizeof(UCATableHeader)));
-
-    myData->options = tableOffset;
-    uprv_memcpy(dataStart+tableOffset, t->options, sizeof(UColOptionSet));
-    tableOffset += (uint32_t)(paddedsize(sizeof(UColOptionSet)));
-
-    /* copy expansions */
-    /*myData->expansion = (uint32_t *)dataStart+tableOffset;*/
-    myData->expansion = tableOffset;
-    uprv_memcpy(dataStart+tableOffset, expansions->CEs, expansions->position*sizeof(uint32_t));
-    tableOffset += (uint32_t)(paddedsize(expansions->position*sizeof(uint32_t)));
-
-    /* contractions block */
-    if(contractionsSize != 0) {
-        /* copy contraction index */
-        /*myData->contractionIndex = (UChar *)(dataStart+tableOffset);*/
-        myData->contractionIndex = tableOffset;
-        uprv_memcpy(dataStart+tableOffset, contractions->codePoints, contractionsSize*sizeof(UChar));
-        tableOffset += (uint32_t)(paddedsize(contractionsSize*sizeof(UChar)));
-
-        /* copy contraction collation elements */
-        /*myData->contractionCEs = (uint32_t *)(dataStart+tableOffset);*/
-        myData->contractionCEs = tableOffset;
-        uprv_memcpy(dataStart+tableOffset, contractions->CEs, contractionsSize*sizeof(uint32_t));
-        tableOffset += (uint32_t)(paddedsize(contractionsSize*sizeof(uint32_t)));
-    } else {
-        myData->contractionIndex = 0;
-        myData->contractionCEs = 0;
-    }
-
-    /* copy mapping table */
-    /*myData->mappingPosition = dataStart+tableOffset;*/
-    /*myData->mappingPosition = tableOffset;*/
-    /*uprv_memcpy(dataStart+tableOffset, flattened, mappingSize);*/
-
-    myData->mappingPosition = tableOffset;
-    utrie_serialize(mapping, dataStart+tableOffset, toAllocate-tableOffset, getFoldedValue, FALSE, status);
-#ifdef UCOL_DEBUG
-    // This is debug code to dump the contents of the trie. It needs two functions defined above
-    {
-        UTrie UCAt = { 0 };
-        uint32_t trieWord;
-        utrie_unserialize(&UCAt, dataStart+tableOffset, 9999999, status);
-        UCAt.getFoldingOffset = myGetFoldingOffset;
-        if(U_SUCCESS(*status)) {
-            utrie_enum(&UCAt, NULL, enumRange, NULL);
-        }
-        trieWord = UTRIE_GET32_FROM_LEAD(&UCAt, 0xDC01);
-    }
-#endif
-    tableOffset += paddedsize(mappingSize);
-
-
-    int32_t i = 0;
-
-    /* copy max expansion table */
-    myData->endExpansionCE      = tableOffset;
-    myData->endExpansionCECount = maxexpansion->position - 1;
-    /* not copying the first element which is a dummy */
-    uprv_memcpy(dataStart + tableOffset, maxexpansion->endExpansionCE + 1, 
-        (maxexpansion->position - 1) * sizeof(uint32_t));
-    tableOffset += (uint32_t)(paddedsize((maxexpansion->position)* sizeof(uint32_t)));
-    myData->expansionCESize = tableOffset;
-    uprv_memcpy(dataStart + tableOffset, maxexpansion->expansionCESize + 1, 
-        (maxexpansion->position - 1) * sizeof(uint8_t));
-    tableOffset += (uint32_t)(paddedsize((maxexpansion->position)* sizeof(uint8_t)));
-
-    /* Unsafe chars table.  Finish it off, then copy it. */
-    uprv_uca_unsafeCPAddCCNZ(t, status);
-    if (t->UCA != 0) {              /* Or in unsafebits from UCA, making a combined table.    */
-        for (i=0; i<UCOL_UNSAFECP_TABLE_SIZE; i++) {    
-            t->unsafeCP[i] |= t->UCA->unsafeCP[i];
-        }
-    }
-    myData->unsafeCP = tableOffset;
-    uprv_memcpy(dataStart + tableOffset, t->unsafeCP, UCOL_UNSAFECP_TABLE_SIZE);
-    tableOffset += paddedsize(UCOL_UNSAFECP_TABLE_SIZE);
-
-
-    /* Finish building Contraction Ending chars hash table and then copy it out.  */
-    if (t->UCA != 0) {              /* Or in unsafebits from UCA, making a combined table.    */
-        for (i=0; i<UCOL_UNSAFECP_TABLE_SIZE; i++) {    
-            t->contrEndCP[i] |= t->UCA->contrEndCP[i];
-        }
-    }
-    myData->contrEndCP = tableOffset;
-    uprv_memcpy(dataStart + tableOffset, t->contrEndCP, UCOL_UNSAFECP_TABLE_SIZE);
-    tableOffset += paddedsize(UCOL_UNSAFECP_TABLE_SIZE);
-
-    if(tableOffset != toAllocate) {
-#ifdef UCOL_DEBUG
-        fprintf(stderr, "calculation screwup!!! Expected to write %i but wrote %i instead!!!\n", toAllocate, tableOffset);
-#endif
-        *status = U_INTERNAL_PROGRAM_ERROR;
-        uprv_free(dataStart);
-        return 0;
-    }
-
-    myData->size = tableOffset;
-    /* This should happen upon ressurection */
-    /*const uint8_t *mapPosition = (uint8_t*)myData+myData->mappingPosition;*/
-    /*uprv_mstrm_close(ms);*/
-    return myData;
-}
-
-
-struct enumStruct {
-    tempUCATable *t;
-    UCollator *tempColl;
-    UCollationElements* colEl;
-    const Normalizer2Impl *nfcImpl;
-    UnicodeSet *closed;
-    int32_t noOfClosures;
-    UErrorCode *status;
-};
-U_CDECL_BEGIN
-static UBool U_CALLCONV
-_enumCategoryRangeClosureCategory(const void *context, UChar32 start, UChar32 limit, UCharCategory type) {
-
-    if (type != U_UNASSIGNED && type != U_PRIVATE_USE_CHAR) { // if the range is assigned - we might ommit more categories later
-        UErrorCode *status = ((enumStruct *)context)->status;
-        tempUCATable *t = ((enumStruct *)context)->t;
-        UCollator *tempColl = ((enumStruct *)context)->tempColl;
-        UCollationElements* colEl = ((enumStruct *)context)->colEl;
-        UCAElements el;
-        UChar decompBuffer[4];
-        const UChar *decomp;
-        int32_t noOfDec = 0;
-
-        UChar32 u32 = 0;
-        UChar comp[2];
-        uint32_t len = 0;
-
-        for(u32 = start; u32 < limit; u32++) {
-            decomp = ((enumStruct *)context)->nfcImpl->
-                getDecomposition(u32, decompBuffer, noOfDec);
-            //if((noOfDec = unorm_normalize(comp, len, UNORM_NFD, 0, decomp, 256, status)) > 1
-            //|| (noOfDec == 1 && *decomp != (UChar)u32))
-            if(decomp != NULL)
-            {
-                len = 0;
-                U16_APPEND_UNSAFE(comp, len, u32);
-                if(ucol_strcoll(tempColl, comp, len, decomp, noOfDec) != UCOL_EQUAL) {
-#ifdef UCOL_DEBUG
-                    fprintf(stderr, "Closure: U+%04X -> ", u32);
-                    UChar32 c;
-                    int32_t i = 0;
-                    while(i < noOfDec) {
-                        U16_NEXT(decomp, i, noOfDec, c);
-                        fprintf(stderr, "%04X ", c);
-                    }
-                    fprintf(stderr, "\n");
-                    // print CEs for code point vs. decomposition
-                    fprintf(stderr, "U+%04X CEs: ", u32);
-                    UCollationElements *iter = ucol_openElements(tempColl, comp, len, status);
-                    int32_t ce;
-                    while((ce = ucol_next(iter, status)) != UCOL_NULLORDER) {
-                        fprintf(stderr, "%08X ", ce);
-                    }
-                    fprintf(stderr, "\nDecomp CEs: ");
-                    ucol_setText(iter, decomp, noOfDec, status);
-                    while((ce = ucol_next(iter, status)) != UCOL_NULLORDER) {
-                        fprintf(stderr, "%08X ", ce);
-                    }
-                    fprintf(stderr, "\n");
-                    ucol_closeElements(iter);
-#endif
-                    if(((enumStruct *)context)->closed != NULL) {
-                        ((enumStruct *)context)->closed->add(u32);
-                    }
-                    ((enumStruct *)context)->noOfClosures++;
-                    el.cPoints = (UChar *)decomp;
-                    el.cSize = noOfDec;
-                    el.noOfCEs = 0;
-                    el.prefix = el.prefixChars;
-                    el.prefixSize = 0;
-
-                    UCAElements *prefix=(UCAElements *)uhash_get(t->prefixLookup, &el);
-                    el.cPoints = comp;
-                    el.cSize = len;
-                    el.prefix = el.prefixChars;
-                    el.prefixSize = 0;
-                    if(prefix == NULL) {
-                        el.noOfCEs = 0;
-                        ucol_setText(colEl, decomp, noOfDec, status);
-                        while((el.CEs[el.noOfCEs] = ucol_next(colEl, status)) != (uint32_t)UCOL_NULLORDER) {
-                            el.noOfCEs++;
-                        }
-                    } else {
-                        el.noOfCEs = 1;
-                        el.CEs[0] = prefix->mapCE;
-                        // This character uses a prefix. We have to add it 
-                        // to the unsafe table, as it decomposed form is already
-                        // in. In Japanese, this happens for \u309e & \u30fe
-                        // Since unsafeCPSet is static in ucol_elm, we are going
-                        // to wrap it up in the uprv_uca_unsafeCPAddCCNZ function
-                    }
-                    uprv_uca_addAnElement(t, &el, status);
-                }
-            }
-        }
-    }
-    return TRUE;
-}
-U_CDECL_END
-
-static void
-uprv_uca_setMapCE(tempUCATable *t, UCAElements *element, UErrorCode *status) {
-    uint32_t expansion = 0;
-    int32_t j;
-
-    ExpansionTable *expansions = t->expansions;
-    if(element->noOfCEs == 2 // a two CE expansion
-        && isContinuation(element->CEs[1]) // which  is a continuation
-        && (element->CEs[1] & (~(0xFF << 24 | UCOL_CONTINUATION_MARKER))) == 0 // that has only primaries in continuation,
-        && (((element->CEs[0]>>8) & 0xFF) == UCOL_BYTE_COMMON) // a common secondary
-        && ((element->CEs[0] & 0xFF) == UCOL_BYTE_COMMON) // and a common tertiary
-        ) {
-            element->mapCE = UCOL_SPECIAL_FLAG | (LONG_PRIMARY_TAG<<24) // a long primary special
-                | ((element->CEs[0]>>8) & 0xFFFF00) // first and second byte of primary
-                | ((element->CEs[1]>>24) & 0xFF);   // third byte of primary
-        } else {
-            expansion = (uint32_t)(UCOL_SPECIAL_FLAG | (EXPANSION_TAG<<UCOL_TAG_SHIFT)
-                | (((uprv_uca_addExpansion(expansions, element->CEs[0], status)+(headersize>>2))<<4)
-                   & 0xFFFFF0));
-
-            for(j = 1; j<(int32_t)element->noOfCEs; j++) {
-                uprv_uca_addExpansion(expansions, element->CEs[j], status);
-            }
-            if(element->noOfCEs <= 0xF) {
-                expansion |= element->noOfCEs;
-            } else {
-                uprv_uca_addExpansion(expansions, 0, status);
-            }
-            element->mapCE = expansion;
-            uprv_uca_setMaxExpansion(element->CEs[element->noOfCEs - 1],
-                (uint8_t)element->noOfCEs,
-                t->maxExpansions,
-                status);
-        }
-}
-
-static void
-uprv_uca_addFCD4AccentedContractions(tempUCATable *t,
-                                      UCollationElements* colEl,
-                                      UChar *data,
-                                      int32_t len,
-                                      UCAElements *el,
-                                      UErrorCode *status) {
-    UChar decomp[256], comp[256];
-    int32_t decLen, compLen;
-
-    decLen = unorm_normalize(data, len, UNORM_NFD, 0, decomp, 256, status);
-    compLen = unorm_normalize(data, len, UNORM_NFC, 0, comp, 256, status);
-    decomp[decLen] = comp[compLen] = 0;
-
-    el->cPoints = decomp;
-    el->cSize = decLen;
-    el->noOfCEs = 0;
-    el->prefixSize = 0;
-    el->prefix = el->prefixChars;
-
-    UCAElements *prefix=(UCAElements *)uhash_get(t->prefixLookup, el);
-    el->cPoints = comp;
-    el->cSize = compLen;
-    el->prefix = el->prefixChars;
-    el->prefixSize = 0;
-    if(prefix == NULL) {
-        el->noOfCEs = 0;
-        ucol_setText(colEl, decomp, decLen, status);
-        while((el->CEs[el->noOfCEs] = ucol_next(colEl, status)) != (uint32_t)UCOL_NULLORDER) {
-            el->noOfCEs++;
-        }
-        uprv_uca_setMapCE(t, el, status);
-        uprv_uca_addAnElement(t, el, status);
-    }
-    el->cPoints=NULL; /* don't leak reference to stack */
-}
-
-static void
-uprv_uca_addMultiCMContractions(tempUCATable *t,
-                                UCollationElements* colEl,
-                                tempTailorContext *c,
-                                UCAElements *el,
-                                UErrorCode *status) {
-    CombinClassTable *cmLookup = t->cmLookup;
-    UChar  newDecomp[256];
-    int32_t maxComp, newDecLen;
-    const Normalizer2Impl *nfcImpl = Normalizer2Factory::getNFCImpl(*status);
-    if (U_FAILURE(*status)) {
-        return;
-    }
-    int16_t curClass = nfcImpl->getFCD16(c->tailoringCM) & 0xff;
-    CompData *precomp = c->precomp;
-    int32_t  compLen = c->compLen;
-    UChar *comp = c->comp;
-    maxComp = c->precompLen;
-
-    for (int32_t j=0; j < maxComp; j++) {
-        int32_t count=0;
-        do {
-            if ( count == 0 ) {  // Decompose the saved precomposed char.
-                UChar temp[2];
-                temp[0]=precomp[j].cp;
-                temp[1]=0;
-                newDecLen = unorm_normalize(temp, 1, UNORM_NFD, 0,
-                            newDecomp, sizeof(newDecomp)/sizeof(UChar), status);
-                newDecomp[newDecLen++] = cmLookup->cPoints[c->cmPos];
-            }
-            else {  // swap 2 combining marks when they are equal.
-                uprv_memcpy(newDecomp, c->decomp, sizeof(UChar)*(c->decompLen));
-                newDecLen = c->decompLen;
-                newDecomp[newDecLen++] = precomp[j].cClass;
-            }
-            newDecomp[newDecLen] = 0;
-            compLen = unorm_normalize(newDecomp, newDecLen, UNORM_NFC, 0,
-                              comp, 256, status);
-            if (compLen==1) {
-                comp[compLen++] = newDecomp[newDecLen++] = c->tailoringCM;
-                comp[compLen] = newDecomp[newDecLen] = 0;
-                el->cPoints = newDecomp;
-                el->cSize = newDecLen;
-
-                UCAElements *prefix=(UCAElements *)uhash_get(t->prefixLookup, el);
-                el->cPoints = c->comp;
-                el->cSize = compLen;
-                el->prefix = el->prefixChars;
-                el->prefixSize = 0;
-                if(prefix == NULL) {
-                    el->noOfCEs = 0;
-                    ucol_setText(colEl, newDecomp, newDecLen, status);
-                    while((el->CEs[el->noOfCEs] = ucol_next(colEl, status)) != (uint32_t)UCOL_NULLORDER) {
-                        el->noOfCEs++;
-                    }
-                    uprv_uca_setMapCE(t, el, status);
-                    uprv_uca_finalizeAddition(t, el, status);
-
-                    // Save the current precomposed char and its class to find any
-                    // other combining mark combinations.
-                    precomp[c->precompLen].cp=comp[0];
-                    precomp[c->precompLen].cClass = curClass;
-                    c->precompLen++;
-                }
-            }
-        } while (++count<2 && (precomp[j].cClass == curClass));
-    }
-
-}
-
-static void
-uprv_uca_addTailCanonicalClosures(tempUCATable *t,
-                                  UCollationElements* colEl,
-                                  UChar baseCh,
-                                  UChar cMark,
-                                  UCAElements *el,
-                                  UErrorCode *status) {
-    CombinClassTable *cmLookup = t->cmLookup;
-    const Normalizer2Impl *nfcImpl = Normalizer2Factory::getNFCImpl(*status);
-    if (U_FAILURE(*status)) {
-        return;
-    }
-    int16_t maxIndex = nfcImpl->getFCD16(cMark) & 0xff;
-    UCAElements element;
-    uint16_t *index;
-    UChar  decomp[256];
-    UChar  comp[256];
-    CompData precomp[256];   // precomposed array
-    int32_t  precompLen = 0; // count for precomp
-    int32_t i, len, decompLen, replacedPos;
-    tempTailorContext c;
-
-    if ( cmLookup == NULL ) {
-        return;
-    }
-    index = cmLookup->index;
-    int32_t cClass=nfcImpl->getFCD16(cMark) & 0xff;
-    maxIndex = (int32_t)index[(nfcImpl->getFCD16(cMark) & 0xff)-1];
-    c.comp = comp;
-    c.decomp = decomp;
-    c.precomp = precomp;
-    c.tailoringCM =  cMark;
-
-    if (cClass>0) {
-        maxIndex = (int32_t)index[cClass-1];
-    }
-    else {
-        maxIndex=0;
-    }
-    decomp[0]=baseCh;
-    for ( i=0; i<maxIndex ; i++ ) {
-        decomp[1] = cmLookup->cPoints[i];
-        decomp[2]=0;
-        decompLen=2;
-        len = unorm_normalize(decomp, decompLen, UNORM_NFC, 0, comp, 256, status);
-        if (len==1) {
-            // Save the current precomposed char and its class to find any
-            // other combining mark combinations.
-            precomp[precompLen].cp=comp[0];
-            precomp[precompLen].cClass =
-                       index[nfcImpl->getFCD16(decomp[1]) & 0xff];
-            precompLen++;
-            replacedPos=0;
-            for (decompLen=0; decompLen< (int32_t)el->cSize; decompLen++) {
-                decomp[decompLen] = el->cPoints[decompLen];
-                if (decomp[decompLen]==cMark) {
-                    replacedPos = decompLen;  // record the position for later use
-                }
-            }
-            if ( replacedPos != 0 ) {
-                decomp[replacedPos]=cmLookup->cPoints[i];
-            }
-            decomp[decompLen] = 0;
-            len = unorm_normalize(decomp, decompLen, UNORM_NFC, 0, comp, 256, status);
-            comp[len++] = decomp[decompLen++] = cMark;
-            comp[len] = decomp[decompLen] = 0;
-            element.cPoints = decomp;
-            element.cSize = decompLen;
-            element.noOfCEs = 0;
-            element.prefix = el->prefixChars;
-            element.prefixSize = 0;
-
-            UCAElements *prefix=(UCAElements *)uhash_get(t->prefixLookup, &element);
-            element.cPoints = comp;
-            element.cSize = len;
-            element.prefix = el->prefixChars;
-            element.prefixSize = 0;
-            if(prefix == NULL) {
-                element.noOfCEs = 0;
-                ucol_setText(colEl, decomp, decompLen, status);
-                while((element.CEs[element.noOfCEs] = ucol_next(colEl, status)) != (uint32_t)UCOL_NULLORDER) {
-                    element.noOfCEs++;
-                }
-                uprv_uca_setMapCE(t, &element, status);
-                uprv_uca_finalizeAddition(t, &element, status);
-            }
-
-            // This is a fix for tailoring contractions with accented
-            // character at the end of contraction string.
-            if ((len>2) && 
-                (nfcImpl->getFCD16(comp[len-2]) & 0xff00)==0) {
-                uprv_uca_addFCD4AccentedContractions(t, colEl, comp, len, &element, status);
-            }
-
-            if (precompLen >1) {
-                c.compLen = len;
-                c.decompLen = decompLen;
-                c.precompLen = precompLen;
-                c.cmPos = i;
-                uprv_uca_addMultiCMContractions(t, colEl, &c, &element, status);
-                precompLen = c.precompLen;
-            }
-        }
-    }
-}
-
-U_CFUNC int32_t U_EXPORT2
-uprv_uca_canonicalClosure(tempUCATable *t,
-                          UColTokenParser *src,
-                          UnicodeSet *closed,
-                          UErrorCode *status)
-{
-    enumStruct context;
-    context.closed = closed;
-    context.noOfClosures = 0;
-    UCAElements el;
-    UColToken *tok;
-    uint32_t i = 0, j = 0;
-    UChar  baseChar, firstCM;
-    context.nfcImpl=Normalizer2Factory::getNFCImpl(*status);
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-
-    UCollator *tempColl = NULL;
-    tempUCATable *tempTable = uprv_uca_cloneTempTable(t, status);
-    // Check for null pointer
-    if (U_FAILURE(*status)) {
-        return 0;
-    }
-
-    UCATableHeader *tempData = uprv_uca_assembleTable(tempTable, status);
-    tempColl = ucol_initCollator(tempData, 0, t->UCA, status);
-    if ( tempTable->cmLookup != NULL ) {
-        t->cmLookup = tempTable->cmLookup;  // copy over to t
-        tempTable->cmLookup = NULL;
-    }
-    uprv_uca_closeTempTable(tempTable);
-
-    if(U_SUCCESS(*status)) {
-        tempColl->ucaRules = NULL;
-        tempColl->actualLocale = NULL;
-        tempColl->validLocale = NULL;
-        tempColl->requestedLocale = NULL;
-        tempColl->hasRealData = TRUE;
-        tempColl->freeImageOnClose = TRUE;
-    } else if(tempData != 0) {
-        uprv_free(tempData);
-    }
-
-    /* produce canonical closure */
-    UCollationElements* colEl = ucol_openElements(tempColl, NULL, 0, status);
-    // Check for null pointer
-    if (U_FAILURE(*status)) {
-        return 0;
-    }
-    context.t = t;
-    context.tempColl = tempColl;
-    context.colEl = colEl;
-    context.status = status;
-    u_enumCharTypes(_enumCategoryRangeClosureCategory, &context);
-
-    if ( (src==NULL) || !src->buildCCTabFlag ) {
-        ucol_closeElements(colEl);
-        ucol_close(tempColl);
-        return context.noOfClosures;  // no extra contraction needed to add
-    }
-
-    for (i=0; i < src->resultLen; i++) {
-        baseChar = firstCM= (UChar)0;
-        tok = src->lh[i].first;
-        while (tok != NULL && U_SUCCESS(*status)) {
-            el.prefix = el.prefixChars;
-            el.cPoints = el.uchars;
-            if(tok->prefix != 0) {
-                el.prefixSize = tok->prefix>>24;
-                uprv_memcpy(el.prefix, src->source + (tok->prefix & 0x00FFFFFF), el.prefixSize*sizeof(UChar));
-
-                el.cSize = (tok->source >> 24)-(tok->prefix>>24);
-                uprv_memcpy(el.uchars, (tok->source & 0x00FFFFFF)+(tok->prefix>>24) + src->source, el.cSize*sizeof(UChar));
-            } else {
-                el.prefixSize = 0;
-                *el.prefix = 0;
-
-                el.cSize = (tok->source >> 24);
-                uprv_memcpy(el.uchars, (tok->source & 0x00FFFFFF) + src->source, el.cSize*sizeof(UChar));
-            }
-            if(src->UCA != NULL) {
-                for(j = 0; j<el.cSize; j++) {
-                    int16_t fcd = context.nfcImpl->getFCD16(el.cPoints[j]);
-                    if ( (fcd & 0xff) == 0 ) {
-                        baseChar = el.cPoints[j];  // last base character
-                        firstCM=0;  // reset combining mark value
-                    }
-                    else {
-                        if ( (baseChar!=0) && (firstCM==0) ) {
-                            firstCM = el.cPoints[j];  // first combining mark
-                        }
-                    }
-                }
-            }
-            if ( (baseChar!= (UChar)0) && (firstCM != (UChar)0) ) {
-                // find all the canonical rules
-                uprv_uca_addTailCanonicalClosures(t, colEl, baseChar, firstCM, &el, status);
-            }
-            tok = tok->next;
-        }
-    }
-    ucol_closeElements(colEl);
-    ucol_close(tempColl);
-
-    return context.noOfClosures;
-}
-
-#endif /* #if !UCONFIG_NO_COLLATION */
diff --git a/icu4c/source/i18n/ucol_elm.h b/icu4c/source/i18n/ucol_elm.h
deleted file mode 100644 (file)
index e200b51..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 2000-2011, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  ucol_elm.h
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created 02/22/2001
-*   created by: Vladimir Weinstein
-*
-*   This program reads the Franctional UCA table and generates
-*   internal format for UCA table as well as inverse UCA table.
-*   It then writes binary files containing the data: ucadata.dat 
-*   & invuca.dat
-*/
-#ifndef UCOL_UCAELEMS_H
-#define UCOL_UCAELEMS_H
-
-#include "unicode/utypes.h"
-#include "unicode/uniset.h"
-#include "ucol_tok.h"
-
-#if !UCONFIG_NO_COLLATION
-
-#include "ucol_imp.h"
-
-#ifdef UCOL_DEBUG
-#include "cmemory.h"
-#include <stdio.h>
-#endif
-
-U_CDECL_BEGIN
-
-/* This is the maximum trie capacity for the mapping trie.
-Due to current limitations in genuca and the design of UTrie,
-this number can't be more than 256K.
-As of Unicode 5, it currently could safely go to 128K without
-a problem. Normally, less than 32K are tailored.
-*/
-#define UCOL_ELM_TRIE_CAPACITY 0x40000
-
-/* This is the maxmun capacity for temparay combining class 
- * table.  The table will be compacted after scanning all the
- * Unicode codepoints.
-*/
-#define UCOL_MAX_CM_TAB  0x10000
-
-
-typedef struct {
-    uint32_t *CEs;
-    int32_t position;
-    int32_t size;
-} ExpansionTable;
-
-typedef struct {
-    UChar prefixChars[128];
-    UChar *prefix;
-    uint32_t prefixSize;
-    UChar uchars[128];
-    UChar *cPoints;
-    uint32_t cSize;          /* Number of characters in sequence - for contraction */
-    uint32_t noOfCEs;        /* Number of collation elements                       */
-    uint32_t CEs[128];      /* These are collation elements - there could be more than one - in case of expansion */
-    uint32_t mapCE;         /* This is the value element maps in original table   */
-    uint32_t sizePrim[128];
-    uint32_t sizeSec[128];
-    uint32_t sizeTer[128];
-    UBool caseBit;
-    UBool isThai;
-} UCAElements;
-
-typedef struct {
-  uint32_t *endExpansionCE;
-  UBool    *isV;
-  int32_t   position;
-  int32_t   size;
-  uint8_t   maxLSize;
-  uint8_t   maxVSize;
-  uint8_t   maxTSize;
-} MaxJamoExpansionTable;
-
-typedef struct {
-  uint32_t *endExpansionCE;
-  uint8_t  *expansionCESize;
-  int32_t   position;
-  int32_t   size;
-} MaxExpansionTable;
-
-typedef struct {
-    uint16_t   index[256];  /* index of cPoints by combining class 0-255. */
-    UChar      *cPoints;    /* code point array of all combining marks */
-    uint32_t   size;        /* total number of combining marks */
-} CombinClassTable;
-
-typedef struct {
-  /*CompactEIntArray      *mapping; */
-  UNewTrie                 *mapping; 
-  ExpansionTable        *expansions; 
-  struct CntTable       *contractions;
-  UCATableHeader        *image;
-  UColOptionSet         *options;
-  MaxExpansionTable     *maxExpansions;
-  MaxJamoExpansionTable *maxJamoExpansions;
-  uint8_t               *unsafeCP;
-  uint8_t               *contrEndCP;
-  const UCollator       *UCA;
-  UHashtable      *prefixLookup;
-  CombinClassTable      *cmLookup;  /* combining class lookup for tailoring. */
-} tempUCATable; 
-
-typedef struct {
-    UChar cp;
-    uint16_t cClass;   // combining class
-}CompData;
-
-typedef struct {
-    CompData *precomp;
-    int32_t precompLen;
-    UChar *decomp;
-    int32_t decompLen;
-    UChar *comp;
-    int32_t compLen;
-    uint16_t curClass;
-    uint16_t tailoringCM;
-    int32_t  cmPos;
-}tempTailorContext;
-
-U_CAPI tempUCATable * U_EXPORT2 uprv_uca_initTempTable(UCATableHeader *image, UColOptionSet *opts, const UCollator *UCA, UColCETags initTag, UColCETags supplementaryInitTag, UErrorCode *status);
-U_CAPI void U_EXPORT2 uprv_uca_closeTempTable(tempUCATable *t);
-U_CAPI uint32_t U_EXPORT2 uprv_uca_addAnElement(tempUCATable *t, UCAElements *element, UErrorCode *status);
-U_CAPI UCATableHeader * U_EXPORT2 uprv_uca_assembleTable(tempUCATable *t, UErrorCode *status);
-
-U_CAPI int32_t U_EXPORT2
-uprv_uca_canonicalClosure(tempUCATable *t, UColTokenParser *src,
-                          icu::UnicodeSet *closed, UErrorCode *status);
-
-U_CDECL_END
-
-#endif /* #if !UCONFIG_NO_COLLATION */
-
-#endif
index deaa2dbdb0ea894e84d6e7b968865462224201ec..39d1b28cbe733ec2dc2749cd1a81ac9a7847351d 100644 (file)
@@ -1,7 +1,7 @@
 /*
 *******************************************************************************
 *
-*   Copyright (C) 1998-2013, International Business Machines
+*   Copyright (C) 1998-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
 #define UCOL_IMP_H
 
 #include "unicode/utypes.h"
-#ifdef __cplusplus
-#   include "unicode/utf16.h"
-#endif
-
-#define UCA_DATA_TYPE "icu"
-#define UCA_DATA_NAME "ucadata"
-#define INVC_DATA_TYPE "icu"
-#define INVC_DATA_NAME "invuca"
-
-/**
- * Convenience string denoting the Collation data tree
- * @internal ICU 3.0
- */
-#define U_ICUDATA_COLL U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "coll"
 
 #if !UCONFIG_NO_COLLATION
 
-#ifdef __cplusplus
-#include "unicode/normalizer2.h"
-#include "unicode/unistr.h"
-#endif
 #include "unicode/ucol.h"
-#include "ucol_data.h"
-#include "utrie.h"
-#include "cmemory.h"
-
-/* This is the internal header file which contains important declarations for 
- * the collation framework. 
- * Ready to use collators are stored as binary images. Both UCA and tailorings 
- * share the same binary format. Individual files (currently only UCA) have a 
- * udata header in front of the image and should be opened using udata_open.
- * Tailoring images are currently stored inside resource bundles and are intialized
- * through ucol_open API.
- *
- * The following describes the formats for collation binaries
- * (UCA & tailorings) and for the inverse UCA table.
- * Substructures are described in the collation design document at
- * http://source.icu-project.org/repos/icu/icuhtml/trunk/design/collation/ICU_collation_design.htm
- *
- * -------------------------------------------------------------
- *
- * Here is the format of binary collation image.
- *
- * Physical order of structures:
- * - header (UCATableHeader)
- * - options (UColOptionSet)
- * - expansions (CE[])
- * - contractions (UChar[contractionSize] + CE[contractionSize])
- * - serialized UTrie with mappings of code points to CEs
- * - max expansion tables (CE[endExpansionCECount] + uint8_t[endExpansionCECount])
- * - two bit sets for backward processing in strcoll (identical prefixes)
- *   and for backward CE iteration (each set is uint8_t[UCOL_UNSAFECP_TABLE_SIZE])
- * - UCA constants (UCAConstants)
- * - UCA contractions (UChar[contractionUCACombosSize][contractionUCACombosWidth])
- *
- * UCATableHeader fields:
- *
- * int32_t size; - image size in bytes
- *
- * Offsets to interesting data. All offsets are in bytes.
- * to get the address add to the header address and cast properly.
- * Some offsets are zero if the corresponding structures are empty.
- *
- * Tailoring binaries that only set options and contain no mappings etc.
- * will have all offsets 0 except for the options and expansion offsets,
- * which give the position and length of the options array.
- *
- * uint32_t options; - offset to default collator options (UColOptionSet *),
- *                     a set of 32-bit values. See declaration of UColOptionSet for more details
- *
- * uint32_t UCAConsts; - only used (!=0) in UCA image - structure which holds values for indirect positioning and implicit ranges
- *                       See declaration of UCAConstants structure. This is a set of unsigned 32-bit values used to store 
- *                       important constant values that are defined in the UCA and used for building and runtime.
- *
- * uint32_t contractionUCACombos; - only used (!=0) in UCA image - list of UCA contractions. This is a zero terminated array of UChar[contractionUCACombosWidth],
- *                                  containing contractions from the UCA. These are needed in the build process to copy UCA contractions
- *                                  in case the base contraction symbol is tailored.
- *
- * uint32_t magic; - must contain UCOL_HEADER_MAGIC (formatVersion 2.3)
- *
- * uint32_t mappingPosition;  - offset to UTrie (const uint8_t *mappingPosition). This is a serialized UTrie and should be treated as such. 
- *                              Used as a primary lookup table for collation elements.
- *
- * uint32_t expansion;  - offset to expansion table (uint32_t *expansion). This is an array of expansion CEs. Never 0.
- *
- * uint32_t contractionIndex; - offset to contraction table (UChar *contractionIndex). Used to look up contraction sequences. Contents
- *                              are aligned with the contents of contractionCEs table. 0 if no contractions.
- *
- * uint32_t contractionCEs;  - offset to resulting contraction CEs (uint32_t *contractionCEs). When a contraction is resolved in the
- *                             in the contractionIndex table, the resulting index is used to look up corresponding CE in this table. 
- *                             0 if no contractions.
- * uint32_t contractionSize; - size of contraction table in elements (both Index and CEs). 
- *
- * Tables described below are used for Boyer-Moore searching algorithm - they define the size of longest expansion
- * and last CEs in expansions.
- * uint32_t endExpansionCE; - offset to array of last collation element in expansion (uint32_t *).
- *                            Never 0.
- * uint32_t expansionCESize; - array of maximum expansion sizes (uint8_t *)
- * int32_t  endExpansionCECount; - size of endExpansionCE. See UCOL_GETMAXEXPANSION
- *                                 for the usage model
- *
- * These two offsets point to byte tables that are used in the backup heuristics.
- * uint32_t unsafeCP; - hash table of unsafe code points (uint8_t *). See ucol_unsafeCP function.
- * uint32_t contrEndCP; - hash table of final code points in contractions (uint8_t *). See ucol_contractionEndCP.              
- *
- * int32_t contractionUCACombosSize; - number of UChar[contractionUCACombosWidth] in contractionUCACombos
- *                                     (formatVersion 2.3)
- * UBool jamoSpecial; - Jamo special indicator (uint8_t). If TRUE, Jamos are special, so we cannot use simple Hangul decomposition.
- * UBool isBigEndian; - endianness of this collation binary (formatVersion 2.3)
- * uint8_t charSetFamily; - charset family of this collation binary (formatVersion 2.3)
- * uint8_t contractionUCACombosWidth; - number of UChars per UCA contraction in contractionUCACombos (formatVersion 2.3)
- *
- * Various version fields
- * UVersionInfo version; - version 4 uint8_t
- * UVersionInfo UCAVersion;  - version 4 uint8_t
- * UVersionInfo UCDVersion;  - version 4 uint8_t
- * UVersionInfo formatVersion; - version of the format of the collation binary
- *                               same formatVersion as in ucadata.icu's UDataInfo header
- *                               (formatVersion 2.3)
- *
- * uint32_t offset to the reordering code to lead CE byte remapping table
- * uint32_t offset to the lead CE byte to reordering code mapping table
- *
- * uint8_t reserved[76];  - currently unused
- *
- * -------------------------------------------------------------
- *
- * Inverse UCA is used for constructing collators from rules. It is always an individual file
- * and always has a UDataInfo header. 
- * here is the structure:
- * 
- * uint32_t byteSize; - size of inverse UCA image in bytes
- * uint32_t tableSize; - length of inverse table (number of uint32_t[3] rows)
- * uint32_t contsSize; - size of continuation table (number of UChars in table)
- *
- * uint32_t table; - offset to inverse table (uint32_t *)
- *                   Inverse table contains of rows of 3 uint32_t values. First two values are CE and a possible continuation
- *                   the third value is either a code unit (if there is only one code unit for element) or an index to continuation 
- *                   (number of code units combined with an index).
- *                   table. If more than one codepoint have the same CE, continuation table contains code units separated by FFFF and final
- *                   code unit sequence for a CE is terminated by FFFE.
- * uint32_t conts; - offset to continuation table (uint16_t *). Contains code units that transform to a same CE.
- *
- * UVersionInfo UCAVersion; -  version of the UCA, read from file 4 uint8_t
- * uint8_t padding[8]; - padding 8 uint8_t
- * Header is followed by the table and continuation table.
-*/
-
-/* definition of UCOL_HEADER_MAGIC moved to common/ucol_data.h */
-
-/* UDataInfo for UCA mapping table */
-/* dataFormat="UCol"            */
-#define UCA_DATA_FORMAT_0 ((uint8_t)0x55)
-#define UCA_DATA_FORMAT_1 ((uint8_t)0x43)
-#define UCA_DATA_FORMAT_2 ((uint8_t)0x6f)
-#define UCA_DATA_FORMAT_3 ((uint8_t)0x6c)
-
-#define UCA_FORMAT_VERSION_0 ((uint8_t)3)
-#define UCA_FORMAT_VERSION_1 0
-#define UCA_FORMAT_VERSION_2 ((uint8_t)0)
-#define UCA_FORMAT_VERSION_3 ((uint8_t)0)
-
-/* UDataInfo for inverse UCA table */
-/* dataFormat="InvC"            */
-#define INVUCA_DATA_FORMAT_0 ((uint8_t)0x49)
-#define INVUCA_DATA_FORMAT_1 ((uint8_t)0x6E)
-#define INVUCA_DATA_FORMAT_2 ((uint8_t)0x76)
-#define INVUCA_DATA_FORMAT_3 ((uint8_t)0x43)
-
-#define INVUCA_FORMAT_VERSION_0 ((uint8_t)2)
-#define INVUCA_FORMAT_VERSION_1 ((uint8_t)1)
-#define INVUCA_FORMAT_VERSION_2 ((uint8_t)0)
-#define INVUCA_FORMAT_VERSION_3 ((uint8_t)0)
-
-/* This is the size of the stack allocated buffer for sortkey generation and similar operations */
-/* if it is too small, heap allocation will occur.*/
-/* you can change this value if you need memory - it will affect the performance, though, since we're going to malloc */
-#define UCOL_MAX_BUFFER 128
-
-#define UCOL_NORMALIZATION_GROWTH 2
-#define UCOL_NORMALIZATION_MAX_BUFFER UCOL_MAX_BUFFER*UCOL_NORMALIZATION_GROWTH
-
-/* This writable buffer is used if we encounter Thai and need to reorder the string on the fly */
-/* Sometimes we already have a writable buffer (like in case of normalized strings). */
-/*
-you can change this value to any value >= 4 if you need memory -
-it will affect the performance, though, since we're going to malloc.
-Note 3 is the minimum value for Thai collation and 4 is the
-minimum number for special Jamo
-*/
-#define UCOL_WRITABLE_BUFFER_SIZE 256
-
-/* This is the size of the buffer for expansion CE's */
-/* In reality we should not have to deal with expm sequences longer then 16 */
-/* you can change this value if you need memory */
-/* WARNING THIS BUFFER DOES HAVE MALLOC FALLBACK. If you make it too small, you'll get into performance trouble */
-/* Reasonable small value is around 10, if you don't do Arabic or other funky collations that have long expansion sequence */
-/* This is the longest expansion sequence we can handle without bombing out */
-#define UCOL_EXPAND_CE_BUFFER_SIZE 64
-
-/* This is the size to increase the buffer for expansion CE's */
-#define UCOL_EXPAND_CE_BUFFER_EXTEND_SIZE 64
-
-
-/* Unsafe UChar hash table table size.                                           */
-/*  size is 32 bytes for 1 bit for each latin 1 char + some power of two for     */
-/*  hashing the rest of the chars.   Size in bytes                               */
-#define UCOL_UNSAFECP_TABLE_SIZE 1056
-                                    /* mask value down to "some power of two"-1  */
-                                    /*  number of bits, not num of bytes.        */
-#define UCOL_UNSAFECP_TABLE_MASK 0x1fff
-
-
-/* flags bits for collIterate.flags       */
-/*                                        */
-/*  NORM - set for incremental normalize of source string */
-#define UCOL_ITER_NORM  1
-
-#define UCOL_ITER_HASLEN 2
-
-                              /* UCOL_ITER_INNORMBUF - set if the "pos" is in          */
-                              /*               the writable side buffer, handling      */
-                              /*               incrementally normalized characters.    */
-#define UCOL_ITER_INNORMBUF 4
-
-                              /* UCOL_ITER_ALLOCATED - set if this iterator has        */
-                              /*    malloced storage to expand a buffer.               */
-#define UCOL_ITER_ALLOCATED 8
-                              /* UCOL_HIRAGANA_Q - note if the codepoint was hiragana  */
-#define UCOL_HIRAGANA_Q     16
-                              /* UCOL_WAS_HIRAGANA - set to TRUE if there was a Hiragana */
-                              /* otherwise set to false                                  */
-#define UCOL_WAS_HIRAGANA   32 
-                              /* UCOL_USE_ITERATOR - set this if collIterate uses a */
-                              /* character iterator instead of simply accessing string */
-                              /* by index */
-#define UCOL_USE_ITERATOR   64
-
-#define UCOL_FORCE_HAN_IMPLICIT 128
-
-#define NFC_ZERO_CC_BLOCK_LIMIT_  0x300
-
-#ifdef __cplusplus
-
-U_NAMESPACE_BEGIN
-
-typedef struct collIterate : public UMemory {
-  const UChar *string; /* Original string */
-  /* UChar *start;  Pointer to the start of the source string. Either points to string
-                    or to writableBuffer */
-  const UChar *endp; /* string end ptr.  Is undefined for null terminated strings */
-  const UChar *pos; /* This is position in the string.  Can be to original or writable buf */
-
-  uint32_t *toReturn; /* This is the CE from CEs buffer that should be returned */
-  uint32_t *CEpos; /* This is the position to which we have stored processed CEs */
-
-  int32_t *offsetReturn; /* This is the offset to return, if non-NULL */
-  int32_t *offsetStore;  /* This is the pointer for storing offsets */
-  int32_t offsetRepeatCount;  /* Repeat stored offset if non-zero */
-  int32_t offsetRepeatValue;  /* offset value to repeat */
-
-  UnicodeString writableBuffer;
-  const UChar *fcdPosition; /* Position in the original string to continue FCD check from. */
-  const UCollator *coll;
-  const Normalizer2 *nfd;
-  uint8_t   flags;
-  uint8_t   origFlags;
-  uint32_t *extendCEs; /* This is use if CEs is not big enough */
-  int32_t extendCEsSize; /* Holds the size of the dynamic CEs buffer */
-  uint32_t CEs[UCOL_EXPAND_CE_BUFFER_SIZE]; /* This is where we store CEs */
-
-  int32_t *offsetBuffer;    /* A dynamic buffer to hold offsets */
-  int32_t offsetBufferSize; /* The size of the offset buffer */
-
-  UCharIterator *iterator;
-  /*int32_t iteratorIndex;*/
-
-  // The offsetBuffer should probably be a UVector32, but helper functions
-  // are an improvement over duplicated code.
-  void appendOffset(int32_t offset, UErrorCode &errorCode);
-} collIterate;
-
-U_NAMESPACE_END
-
-#else
-
-typedef struct collIterate collIterate;
-
-#endif
 
-#define paddedsize(something) ((something)+((((something)%4)!=0)?(4-(something)%4):0))
-#define headersize (paddedsize(sizeof(UCATableHeader))+paddedsize(sizeof(UColOptionSet)))
-
-/* 
-struct used internally in getSpecial*CE.
-data similar to collIterate.
-*/
-struct collIterateState {
-    const UChar *pos; /* This is position in the string.  Can be to original or writable buf */
-    const UChar *returnPos;
-    const UChar *fcdPosition; /* Position in the original string to continue FCD check from. */
-    const UChar *bufferaddress; /* address of the normalization buffer */
-    int32_t  buffersize;
-    uint8_t   flags;
-    uint8_t   origFlags;
-    uint32_t   iteratorIndex;
-    int32_t    iteratorMove;
-};
-
-U_CAPI void U_EXPORT2
-uprv_init_collIterate(const UCollator *collator,
-                      const UChar *sourceString, int32_t sourceLen,
-                      U_NAMESPACE_QUALIFIER collIterate *s, UErrorCode *status);
-
-/* Internal functions for C test code. */
-U_CAPI U_NAMESPACE_QUALIFIER collIterate * U_EXPORT2
-uprv_new_collIterate(UErrorCode *status);
-
-U_CAPI void U_EXPORT2
-uprv_delete_collIterate(U_NAMESPACE_QUALIFIER collIterate *s);
-
-/* @return s->pos == s->endp */
-U_CAPI UBool U_EXPORT2
-uprv_collIterateAtEnd(U_NAMESPACE_QUALIFIER collIterate *s);
-
-#ifdef __cplusplus
-
-U_NAMESPACE_BEGIN
-
-struct UCollationPCE;
-typedef struct UCollationPCE UCollationPCE;
-
-U_NAMESPACE_END
-
-struct UCollationElements : public icu::UMemory
-{
-  /**
-  * Struct wrapper for source data
-  */
-        icu::collIterate iteratordata_;
-  /**
-  * Indicates if this data has been reset.
-  */
-        UBool              reset_;
-  /**
-  * Indicates if the data should be deleted.
-  */
-        UBool              isWritable;
-
-/**
- * Data for getNextProcessed, getPreviousProcessed.
+/** Check whether two collators are equal. Collators are considered equal if they
+ *  will sort strings the same. This means that both the current attributes and the
+ *  rules must be equivalent.
+ *  @param source first collator
+ *  @param target second collator
+ *  @return TRUE or FALSE
+ *  @internal ICU 3.0
  */
-        icu::UCollationPCE     *pce;
-};
-
-#else
-/*opaque type*/
-struct UCollationElements;
-#endif
-
-U_CAPI void U_EXPORT2
-uprv_init_pce(const struct UCollationElements *elems);
-
-#define UCOL_LEVELTERMINATOR 1
-
-/* mask off anything but primary order */
-#define UCOL_PRIMARYORDERMASK 0xffff0000
-/* mask off anything but secondary order */
-#define UCOL_SECONDARYORDERMASK 0x0000ff00
-/* mask off anything but tertiary order */
-#define UCOL_TERTIARYORDERMASK 0x000000ff
-/* primary order shift */
-#define UCOL_PRIMARYORDERSHIFT 16
-/* secondary order shift */
-#define UCOL_SECONDARYORDERSHIFT 8
-
-#define UCOL_BYTE_SIZE_MASK 0xFF
-
-#define UCOL_CASE_BYTE_START 0x80
-#define UCOL_CASE_SHIFT_START 7
-
-#define UCOL_IGNORABLE 0
-
-/* get weights from a CE */
-#define UCOL_PRIMARYORDER(order) (((order) & UCOL_PRIMARYORDERMASK)>> UCOL_PRIMARYORDERSHIFT)
-#define UCOL_SECONDARYORDER(order) (((order) & UCOL_SECONDARYORDERMASK)>> UCOL_SECONDARYORDERSHIFT)
-#define UCOL_TERTIARYORDER(order) ((order) & UCOL_TERTIARYORDERMASK)
-
-/**
- * Determine if a character is a Thai vowel (which sorts after
- * its base consonant).
- */
-#define UCOL_ISTHAIPREVOWEL(ch) ((((uint32_t)(ch) - 0xe40) <= (0xe44 - 0xe40)) || \
-                                 (((uint32_t)(ch) - 0xec0) <= (0xec4 - 0xec0)))
+U_INTERNAL UBool U_EXPORT2
+ucol_equals(const UCollator *source, const UCollator *target);
 
 /**
- * Determine if a character is a Thai base consonant
+ * Convenience string denoting the Collation data tree
  */
-#define UCOL_ISTHAIBASECONSONANT(ch) ((uint32_t)(ch) - 0xe01) <= (0xe2e - 0xe01)
-
-#define UCOL_ISJAMO(ch) ((((uint32_t)(ch) - 0x1100) <= (0x1112 - 0x1100)) || \
-                         (((uint32_t)(ch) - 0x1161) <= (0x1175 - 0x1161)) || \
-                         (((uint32_t)(ch) - 0x11A8) <= (0x11C2 - 0x11A8)))
-
-/* Han character ranges */
-#define UCOL_FIRST_HAN 0x4E00
-#define UCOL_LAST_HAN  0x9FFF
-#define UCOL_FIRST_HAN_A 0x3400
-#define UCOL_LAST_HAN_A  0x4DBF
-#define UCOL_FIRST_HAN_COMPAT 0xFAE0
-#define UCOL_LAST_HAN_COMPAT  0xFA2F
-
-/* Han extension B is in plane 2 */
-#define UCOL_FIRST_HAN_B       0x20000
-#define UCOL_LAST_HAN_B        0x2A6DF
-
-/* Hangul range */
-#define UCOL_FIRST_HANGUL 0xAC00
-#define UCOL_LAST_HANGUL  0xD7AF
-
-/* Jamo ranges */
-#define UCOL_FIRST_L_JAMO 0x1100
-#define UCOL_FIRST_V_JAMO 0x1161
-#define UCOL_FIRST_T_JAMO 0x11A8
-#define UCOL_LAST_T_JAMO  0x11F9
-
-
-#if 0
-/* initializes collIterate structure */
-/* made as macro to speed up things */
-#define init_collIterate(collator, sourceString, sourceLen, s) { \
-    (s)->start = (s)->string = (s)->pos = (UChar *)(sourceString); \
-    (s)->endp  = (sourceLen) == -1 ? NULL :(UChar *)(sourceString)+(sourceLen); \
-    (s)->CEpos = (s)->toReturn = (s)->CEs; \
-    (s)->isThai = TRUE; \
-    (s)->writableBuffer = (s)->stackWritableBuffer; \
-    (s)->writableBufSize = UCOL_WRITABLE_BUFFER_SIZE; \
-    (s)->coll = (collator); \
-    (s)->fcdPosition = 0;   \
-    (s)->flags = 0; \
-    if(((collator)->normalizationMode == UCOL_ON)) (s)->flags |= UCOL_ITER_NORM; \
-}
-#endif
-
-
-
-/*
-* Macro to get the maximum size of an expansion ending with the argument ce.
-* Used in the Boyer Moore algorithm.
-* Note for tailoring, the UCA maxexpansion table has been merged.
-* Hence we only have to search the tailored collator only.
-* @param coll const UCollator pointer
-* @param order last collation element of the expansion sequence
-* @param result size of the longest expansion with argument collation element
-*        as the last element
-*/
-#define UCOL_GETMAXEXPANSION(coll, order, result) {                          \
-  const uint32_t *start;                                                     \
-  const uint32_t *limit;                                                     \
-  const uint32_t *mid;                                                       \
-  start = (coll)->endExpansionCE;                                            \
-  limit = (coll)->lastEndExpansionCE;                                        \
-  while (start < limit - 1) {                                                \
-    mid = start + ((limit - start) >> 1);                                    \
-    if ((order) <= *mid) {                                                   \
-      limit = mid;                                                           \
-    }                                                                        \
-    else {                                                                   \
-      start = mid;                                                           \
-    }                                                                        \
-  }                                                                          \
-  if (*start == order) {                                                     \
-    result = *((coll)->expansionCESize + (start - (coll)->endExpansionCE));  \
-  }                                                                          \
-  else if (*limit == order) {                                                \
-         result = *(coll->expansionCESize + (limit - coll->endExpansionCE)); \
-       }                                                                     \
-       else if ((order & 0xFFFF) == 0x00C0) {                                \
-              result = 2;                                                    \
-            }                                                                \
-            else {                                                           \
-              result = 1;                                                    \
-            }                                                                \
-}
-
-U_CFUNC
-uint32_t ucol_prv_getSpecialCE(const UCollator *coll, UChar ch, uint32_t CE,
-                               U_NAMESPACE_QUALIFIER collIterate *source, UErrorCode *status);
-
-U_CFUNC
-uint32_t ucol_prv_getSpecialPrevCE(const UCollator *coll, UChar ch, uint32_t CE,
-                                   U_NAMESPACE_QUALIFIER collIterate *source, UErrorCode *status);
-U_CAPI uint32_t U_EXPORT2 ucol_getNextCE(const UCollator *coll,
-                                         U_NAMESPACE_QUALIFIER collIterate *collationSource, UErrorCode *status);
-U_CFUNC uint32_t U_EXPORT2 ucol_getPrevCE(const UCollator *coll,
-                                          U_NAMESPACE_QUALIFIER collIterate *collationSource,
-                                          UErrorCode *status);
-/* get some memory */
-void *ucol_getABuffer(const UCollator *coll, uint32_t size);
+#define U_ICUDATA_COLL U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "coll"
 
 #ifdef __cplusplus
 
 U_NAMESPACE_BEGIN
 
-class CollationKey;
-class SortKeyByteSink;
-
-U_NAMESPACE_END
+struct CollationTailoring;
 
-/* function used by C++ getCollationKey to prevent restarting the calculation */
-U_CFUNC int32_t
-ucol_getCollationKey(const UCollator *coll,
-                     const UChar *source, int32_t sourceLength,
-                     icu::CollationKey &key,
-                     UErrorCode &errorCode);
+class Locale;
+class UnicodeString;
 
-typedef void U_CALLCONV
-SortKeyGenerator(const    UCollator    *coll,
-        const    UChar        *source,
-        int32_t        sourceLength,
-        icu::SortKeyByteSink &result,
-        UErrorCode *status);
+/** Implemented in ucol_res.cpp. */
+class CollationLoader {
+public:
+    static void appendRootRules(UnicodeString &s);
+    static UnicodeString *loadRules(const char *localeID, const char *collationType,
+                                    UErrorCode &errorCode);
+    static const CollationTailoring *loadTailoring(const Locale &locale, Locale &validLocale,
+                                                   UErrorCode &errorCode);
 
-/* worker function for generating sortkeys */
-U_CFUNC
-void U_CALLCONV
-ucol_calcSortKey(const    UCollator    *coll,
-        const    UChar        *source,
-        int32_t        sourceLength,
-        icu::SortKeyByteSink &result,
-        UErrorCode *status);
-
-U_CFUNC
-void U_CALLCONV
-ucol_calcSortKeySimpleTertiary(const    UCollator    *coll,
-        const    UChar        *source,
-        int32_t        sourceLength,
-        icu::SortKeyByteSink &result,
-        UErrorCode *status);
-
-#else
-
-typedef void U_CALLCONV
-SortKeyGenerator(const    UCollator    *coll,
-        const    UChar        *source,
-        int32_t        sourceLength,
-        void *result,
-        UErrorCode *status);
-
-#endif
-
-/**
- * Used to set requested and valid locales on a collator returned by the collator
- * service.
- */
-U_CFUNC void U_EXPORT2
-ucol_setReqValidLocales(UCollator *coll, char *requestedLocaleToAdopt, char *validLocaleToAdopt, char *actualLocaleToAdopt);
-
-#define UCOL_SPECIAL_FLAG 0xF0000000
-#define UCOL_TAG_SHIFT 24
-#define UCOL_TAG_MASK 0x0F000000
-#define INIT_EXP_TABLE_SIZE 1024
-#define UCOL_NOT_FOUND 0xF0000000
-#define UCOL_EXPANSION 0xF1000000
-#define UCOL_CONTRACTION 0xF2000000
-#define UCOL_THAI 0xF3000000
-#define UCOL_UNMARKED 0x03
-#define UCOL_NEW_TERTIARYORDERMASK 0x0000003f
-
-/* Bit mask for primary collation strength. */
-#define UCOL_PRIMARYMASK    0xFFFF0000
-
-/* Bit mask for secondary collation strength. */
-#define UCOL_SECONDARYMASK  0x0000FF00
-
-/* Bit mask for tertiary collation strength. */
-#define UCOL_TERTIARYMASK   0x000000FF
-
-/**
- * Internal.
- * This indicates the last element in a UCollationElements has been consumed.
- * Compare with the UCOL_NULLORDER, UCOL_NULLORDER is returned if error occurs.
- */
-#define UCOL_NO_MORE_CES            0x00010101
-#define UCOL_NO_MORE_CES_PRIMARY    0x00010000
-#define UCOL_NO_MORE_CES_SECONDARY  0x00000100
-#define UCOL_NO_MORE_CES_TERTIARY   0x00000001
-
-#define isSpecial(CE) ((((CE)&UCOL_SPECIAL_FLAG)>>28)==0xF)
-
-#define UCOL_UPPER_CASE 0x80
-#define UCOL_MIXED_CASE 0x40
-#define UCOL_LOWER_CASE 0x00
-
-#define UCOL_CONTINUATION_MARKER 0xC0
-#define UCOL_REMOVE_CONTINUATION 0xFFFFFF3F
-
-#define isContinuation(CE) (((CE) & UCOL_CONTINUATION_MARKER) == UCOL_CONTINUATION_MARKER)
-#define isFlagged(CE) (((CE) & 0x80) == 0x80)
-#define isLongPrimary(CE) (((CE) & 0xC0) == 0xC0)
-
-#define getCETag(CE) (((CE)&UCOL_TAG_MASK)>>UCOL_TAG_SHIFT)
-#define isContraction(CE) (isSpecial((CE)) && (getCETag((CE)) == CONTRACTION_TAG))
-#define isPrefix(CE) (isSpecial((CE)) && (getCETag((CE)) == SPEC_PROC_TAG))
-#define constructContractCE(tag, CE) (UCOL_SPECIAL_FLAG | ((tag)<<UCOL_TAG_SHIFT) | ((CE)&0xFFFFFF))
-#define constructSpecProcCE(CE) (UCOL_SPECIAL_FLAG | (SPEC_PROC_TAG<<UCOL_TAG_SHIFT) | ((CE)&0xFFFFFF))
-#define getContractOffset(CE) ((CE)&0xFFFFFF)
-#define getExpansionOffset(CE) (((CE)&0x00FFFFF0)>>4)
-#define getExpansionCount(CE) ((CE)&0xF)
-#define isCEIgnorable(CE) (((CE) & 0xFFFFFFBF) == 0)
-
-/* StringSearch internal use */
-#define inNormBuf(coleiter) ((coleiter)->iteratordata_.flags & UCOL_ITER_INNORMBUF)
-#define isFCDPointerNull(coleiter) ((coleiter)->iteratordata_.fcdPosition == NULL)
-#define hasExpansion(coleiter) ((coleiter)->iteratordata_.CEpos != (coleiter)->iteratordata_.CEs)
-#define getExpansionPrefix(coleiter) ((coleiter)->iteratordata_.toReturn - (coleiter)->iteratordata_.CEs)
-#define setExpansionPrefix(coleiter, offset) ((coleiter)->iteratordata_.CEs + offset)
-#define getExpansionSuffix(coleiter) ((coleiter)->iteratordata_.CEpos - (coleiter)->iteratordata_.toReturn)
-#define setExpansionSuffix(coleiter, offset) ((coleiter)->iteratordata_.toReturn = (coleiter)->iteratordata_.CEpos - leftoverces)
-
-/* This is an enum that lists magic special byte values from the fractional UCA.
- * See also http://site.icu-project.org/design/collation/bytes */
-/* TODO: all the #defines that refer to special byte values from the UCA should be changed to point here */
-
-enum {
-    UCOL_BYTE_ZERO = 0x00,
-    UCOL_BYTE_LEVEL_SEPARATOR = 0x01,
-    UCOL_BYTE_SORTKEY_GLUE = 0x02,
-    UCOL_BYTE_SHIFT_PREFIX = 0x03,
-    UCOL_BYTE_UNSHIFTED_MIN = UCOL_BYTE_SHIFT_PREFIX,
-    UCOL_BYTE_FIRST_TAILORED = 0x04,
-    UCOL_BYTE_COMMON = 0x05,
-    UCOL_BYTE_FIRST_UCA = UCOL_BYTE_COMMON,
-    /* TODO: Make the following values dynamic since they change with almost every UCA version. */
-    UCOL_CODAN_PLACEHOLDER = 0x12,
-    UCOL_BYTE_FIRST_NON_LATIN_PRIMARY = 0x5B,
-    UCOL_BYTE_UNSHIFTED_MAX = 0xFF
-}; 
-
-#if 0
-#define UCOL_RESET_TOP_VALUE                0x9F000303
-#define UCOL_FIRST_PRIMARY_IGNORABLE        0x00008705
-#define UCOL_LAST_PRIMARY_IGNORABLE         0x0000DD05
-#define UCOL_LAST_PRIMARY_IGNORABLE_CONT    0x000051C0
-#define UCOL_FIRST_SECONDARY_IGNORABLE      0x00000000
-#define UCOL_LAST_SECONDARY_IGNORABLE       0x00000500
-#define UCOL_FIRST_TERTIARY_IGNORABLE       0x00000000
-#define UCOL_LAST_TERTIARY_IGNORABLE        0x00000000
-#define UCOL_FIRST_VARIABLE                 0x05070505
-#define UCOL_LAST_VARIABLE                  0x179B0505
-#define UCOL_FIRST_NON_VARIABLE             0x1A200505
-#define UCOL_LAST_NON_VARIABLE              0x7B41058F
-
-#define UCOL_NEXT_TOP_VALUE                 0xE8960303
-#define UCOL_NEXT_FIRST_PRIMARY_IGNORABLE   0x00008905
-#define UCOL_NEXT_LAST_PRIMARY_IGNORABLE    0x03000303
-#define UCOL_NEXT_FIRST_SECONDARY_IGNORABLE 0x00008705
-#define UCOL_NEXT_LAST_SECONDARY_IGNORABLE  0x00000500
-#define UCOL_NEXT_FIRST_TERTIARY_IGNORABLE  0x00000000
-#define UCOL_NEXT_LAST_TERTIARY_IGNORABLE   0x00000000
-#define UCOL_NEXT_FIRST_VARIABLE            0x05090505
-#define UCOL_NEXT_LAST_VARIABLE             0x1A200505
-
-#define PRIMARY_IMPLICIT_MIN 0xE8000000
-#define PRIMARY_IMPLICIT_MAX 0xF0000000
-#endif
-
-/* These constants can be changed - sortkey size is affected by them */
-#define UCOL_PROPORTION2 0.5
-#define UCOL_PROPORTION3 0.667
-
-/* These values come from the UCA */
-#define UCOL_COMMON_BOT2 UCOL_BYTE_COMMON
-#define UCOL_COMMON_TOP2 0x86u
-#define UCOL_TOTAL2 (UCOL_COMMON_TOP2-UCOL_COMMON_BOT2-1) 
-
-#define UCOL_FLAG_BIT_MASK_CASE_SW_OFF 0x80
-#define UCOL_FLAG_BIT_MASK_CASE_SW_ON 0x40
-#define UCOL_COMMON_TOP3_CASE_SW_OFF 0x85
-#define UCOL_COMMON_TOP3_CASE_SW_LOWER 0x45
-#define UCOL_COMMON_TOP3_CASE_SW_UPPER 0xC5
-
-/* These values come from the UCA */
-#define UCOL_COMMON_BOT3 0x05
-
-#define UCOL_COMMON_BOTTOM3_CASE_SW_UPPER 0x86;
-#define UCOL_COMMON_BOTTOM3_CASE_SW_LOWER UCOL_COMMON_BOT3;
-
-#define UCOL_TOP_COUNT2  (UCOL_PROPORTION2*UCOL_TOTAL2)
-#define UCOL_BOT_COUNT2  (UCOL_TOTAL2-UCOL_TOP_COUNT2)
-
-
-#define UCOL_COMMON2 UCOL_COMMON_BOT2
-#define UCOL_COMMON3_UPPERFIRST 0xC5
-#define UCOL_COMMON3_NORMAL UCOL_COMMON_BOT3
-
-#define UCOL_COMMON4 0xFF
-
-/* constants for case level/case first handling */
-/* used to instantiate UCollators fields in ucol_updateInternalState */
-#define UCOL_CASE_SWITCH      0xC0
-#define UCOL_NO_CASE_SWITCH   0x00
-
-#define UCOL_REMOVE_CASE      0x3F
-#define UCOL_KEEP_CASE        0xFF
-
-#define UCOL_CASE_BIT_MASK    0xC0
-
-#define UCOL_TERT_CASE_MASK   0xFF
-
-#define UCOL_ENDOFLATINONERANGE 0xFF
-#define UCOL_LATINONETABLELEN   (UCOL_ENDOFLATINONERANGE+50)
-#define UCOL_BAIL_OUT_CE      0xFF000000
-
-
-typedef enum {
-    NOT_FOUND_TAG = 0,
-    EXPANSION_TAG = 1,       /* This code point results in an expansion */
-    CONTRACTION_TAG = 2,     /* Start of a contraction */
-    THAI_TAG = 3,            /* Thai character - do the reordering */
-    CHARSET_TAG = 4,         /* Charset processing, not yet implemented */
-    SURROGATE_TAG = 5,       /* Lead surrogate that is tailored and doesn't start a contraction */
-    HANGUL_SYLLABLE_TAG = 6, /* AC00-D7AF*/
-    LEAD_SURROGATE_TAG = 7,  /* D800-DBFF*/
-    TRAIL_SURROGATE_TAG = 8,     /* DC00-DFFF*/
-    CJK_IMPLICIT_TAG = 9,    /* 0x3400-0x4DB5, 0x4E00-0x9FA5, 0xF900-0xFA2D*/
-    IMPLICIT_TAG = 10,
-    SPEC_PROC_TAG = 11,
-    /* ICU 2.1 */
-    LONG_PRIMARY_TAG = 12,   /* This is a three byte primary with starting secondaries and tertiaries */
-                             /* It fits in a single 32 bit CE and is used instead of expansion to save */
-                             /* space without affecting the performance (hopefully) */
-                             
-    DIGIT_TAG = 13,          /* COllate Digits As Numbers (CODAN) implementation */
-    
-    CE_TAGS_COUNT
-} UColCETags;
-
-/*
- *****************************************************************************************
- * set to zero
- * NON_CHARACTER FDD0 - FDEF, FFFE, FFFF, 1FFFE, 1FFFF, 2FFFE, 2FFFF,...e.g. **FFFE, **FFFF
- ******************************************************************************************
- */
-
-typedef struct {
-      uint32_t variableTopValue;
-      /*UColAttributeValue*/ int32_t frenchCollation;
-      /*UColAttributeValue*/ int32_t alternateHandling; /* attribute for handling variable elements*/
-      /*UColAttributeValue*/ int32_t caseFirst;         /* who goes first, lower case or uppercase */
-      /*UColAttributeValue*/ int32_t caseLevel;         /* do we have an extra case level */
-      /*UColAttributeValue*/ int32_t normalizationMode; /* attribute for normalization */
-      /*UColAttributeValue*/ int32_t strength;          /* attribute for strength */
-      /*UColAttributeValue*/ int32_t hiraganaQ;         /* attribute for special Hiragana */
-      /*UColAttributeValue*/ int32_t numericCollation;  /* attribute for numeric collation */
-      uint32_t reserved[15];                 /* for future use */
-} UColOptionSet;
-
-typedef struct {
-  uint32_t UCA_FIRST_TERTIARY_IGNORABLE[2];       /*0x00000000*/
-  uint32_t UCA_LAST_TERTIARY_IGNORABLE[2];        /*0x00000000*/
-  uint32_t UCA_FIRST_PRIMARY_IGNORABLE[2];        /*0x00008705*/
-  uint32_t UCA_FIRST_SECONDARY_IGNORABLE[2];      /*0x00000000*/
-  uint32_t UCA_LAST_SECONDARY_IGNORABLE[2];       /*0x00000500*/
-  uint32_t UCA_LAST_PRIMARY_IGNORABLE[2];         /*0x0000DD05*/
-  uint32_t UCA_FIRST_VARIABLE[2];                 /*0x05070505*/
-  uint32_t UCA_LAST_VARIABLE[2];                  /*0x13CF0505*/
-  uint32_t UCA_FIRST_NON_VARIABLE[2];             /*0x16200505*/
-  uint32_t UCA_LAST_NON_VARIABLE[2];              /*0x767C0505*/
-  uint32_t UCA_RESET_TOP_VALUE[2];                /*0x9F000303*/
-  uint32_t UCA_FIRST_IMPLICIT[2];
-  uint32_t UCA_LAST_IMPLICIT[2]; 
-  uint32_t UCA_FIRST_TRAILING[2];
-  uint32_t UCA_LAST_TRAILING[2]; 
-
-#if 0
-  uint32_t UCA_NEXT_TOP_VALUE[2];                 /*0xE8960303*/
-  uint32_t UCA_NEXT_FIRST_PRIMARY_IGNORABLE;   /*0x00008905*/
-  uint32_t UCA_NEXT_LAST_PRIMARY_IGNORABLE;    /*0x03000303*/
-  uint32_t UCA_NEXT_FIRST_SECONDARY_IGNORABLE; /*0x00008705*/
-  uint32_t UCA_NEXT_LAST_SECONDARY_IGNORABLE;  /*0x00000500*/
-  uint32_t UCA_NEXT_FIRST_TERTIARY_IGNORABLE;  /*0x00000000*/
-  uint32_t UCA_NEXT_LAST_TERTIARY_IGNORABLE;   /*0x00000000*/
-  uint32_t UCA_NEXT_FIRST_VARIABLE;            /*0x05090505*/
-  uint32_t UCA_NEXT_LAST_VARIABLE;             /*0x16200505*/
-#endif
-
-  uint32_t UCA_PRIMARY_TOP_MIN;
-  uint32_t UCA_PRIMARY_IMPLICIT_MIN; /*0xE8000000*/
-  uint32_t UCA_PRIMARY_IMPLICIT_MAX; /*0xF0000000*/
-  uint32_t UCA_PRIMARY_TRAILING_MIN; /*0xE8000000*/
-  uint32_t UCA_PRIMARY_TRAILING_MAX; /*0xF0000000*/
-  uint32_t UCA_PRIMARY_SPECIAL_MIN; /*0xE8000000*/
-  uint32_t UCA_PRIMARY_SPECIAL_MAX; /*0xF0000000*/
-} UCAConstants;
-
-/* definition of UCATableHeader moved to common/ucol_data.h */
-
-#define U_UNKNOWN_STATE 0
-#define U_COLLATOR_STATE 0x01
-#define U_STATE_LIMIT 0x02
-
-/* This is the first structure in a state */
-/* it should be machine independent */
-typedef struct {
-  /* this structure is supposed to be readable on all the platforms.*/
-  /* first 2 fields hold the size of the structure in a platform independent way */
-  uint8_t sizeLo;
-  uint8_t sizeHi;
-  /* identifying the writing platform */
-  uint8_t isBigEndian;
-  /* see U_CHARSET_FAMILY values in utypes.h */
-  uint8_t charsetFamily;
-  /* version of ICU this state structure comes from */
-  uint8_t icuVersion[4];
-  /* What is the data following this state */
-  uint8_t type;
-  /* more stuff to come, keep it on 16 byte boundary */
-  uint8_t reserved[7];
-} UStateStruct;
-
-/* This structure follows UStatusStruct */
-/* and contains data specific for the collators */
-/* Endianess needs to be decided before accessing this structure */
-/* However, it's size IS endianess independent */
-typedef struct {
-  /* size of this structure */
-  uint8_t sizeLo;
-  uint8_t sizeHi;
-  /* This state is followed by the frozen tailoring */
-  uint8_t containsTailoring;
-  /* This state is followed by the frozen UCA */
-  uint8_t containsUCA;
-  /* Version info - the same one */
-  uint8_t versionInfo[4];
-
-  /* for charset CEs */
-  uint8_t charsetName[32];                 
-  /* this is the resolved locale name*/
-  uint8_t locale[32];                      
-
-  /* Attributes. Open ended */
-  /* all the following will be moved to uint32_t because of portability */
-  /* variable top value */
-  uint32_t variableTopValue;
-  /* attribute for handling variable elements*/
-  uint32_t /*UColAttributeValue*/ alternateHandling; 
-  /* how to handle secondary weights */
-  uint32_t /*UColAttributeValue*/ frenchCollation;
-  /* who goes first, lower case or uppercase */
-  uint32_t /*UColAttributeValue*/ caseFirst;         
-  /* do we have an extra case level */
-  uint32_t /*UColAttributeValue*/ caseLevel;         
-  /* attribute for normalization */
-  uint32_t /*UColAttributeValue*/ normalizationMode; 
-  /* attribute for strength */
-  uint32_t /*UColAttributeValue*/ strength;
-  /* to be immediately 16 byte aligned */
-  uint8_t reserved[12];
-} UColStateStruct;
-
-#define UCOL_INV_SIZEMASK 0xFFF00000
-#define UCOL_INV_OFFSETMASK 0x000FFFFF
-#define UCOL_INV_SHIFTVALUE 20
-
-U_CDECL_BEGIN
-
-/* definition of InverseUCATableHeader moved to common/ucol_data.h */
-
-typedef void U_CALLCONV
-ResourceCleaner(UCollator *coll);
-
-
-struct UCollator {
-    UColOptionSet  *options;
-    SortKeyGenerator *sortKeyGen;
-    uint32_t *latinOneCEs;
-    char* actualLocale;
-    char* validLocale;
-    char* requestedLocale;
-    const UChar *rules;
-    const UChar *ucaRules;
-    const UCollator *UCA;
-    const UCATableHeader *image;
-    UTrie mapping;
-    const uint32_t *latinOneMapping;
-    const uint32_t *expansion;
-    const UChar    *contractionIndex;
-    const uint32_t *contractionCEs;
-
-    const uint32_t *endExpansionCE;    /* array of last ces in an expansion ce.
-                                          corresponds to expansionCESize */
-    const uint32_t *lastEndExpansionCE;/* pointer to the last element in endExpansionCE */
-    const uint8_t  *expansionCESize;   /* array of the maximum size of a
-                                         expansion ce with the last ce
-                                         corresponding to endExpansionCE,
-                                         terminated with a null */
-    const uint8_t *unsafeCP;           /* unsafe code points hashtable */
-    const uint8_t *contrEndCP;         /* Contraction ending chars hash table */
-    UChar          minUnsafeCP;        /* Smallest unsafe Code Point. */
-    UChar          minContrEndCP;      /* Smallest code point at end of a contraction */
-
-    int32_t rulesLength;
-    int32_t latinOneTableLen;
-
-    uint32_t variableTopValue;
-    UColAttributeValue frenchCollation;
-    UColAttributeValue alternateHandling; /* attribute for handling variable elements*/
-    UColAttributeValue caseFirst;         /* who goes first, lower case or uppercase */
-    UColAttributeValue caseLevel;         /* do we have an extra case level */
-    UColAttributeValue normalizationMode; /* attribute for normalization */
-    UColAttributeValue strength;          /* attribute for strength */
-    UColAttributeValue hiraganaQ;         /* attribute for Hiragana */
-    UColAttributeValue numericCollation;
-    UBool variableTopValueisDefault;
-    UBool frenchCollationisDefault;
-    UBool alternateHandlingisDefault; /* attribute for handling variable elements*/
-    UBool caseFirstisDefault;         /* who goes first, lower case or uppercase */
-    UBool caseLevelisDefault;         /* do we have an extra case level */
-    UBool normalizationModeisDefault; /* attribute for normalization */
-    UBool strengthisDefault;          /* attribute for strength */
-    UBool hiraganaQisDefault;         /* attribute for Hiragana */
-    UBool numericCollationisDefault;
-    UBool hasRealData;                /* some collators have only options, like French, no rules */
-                                      /* to speed up things, we use the UCA image, but we don't want it */
-                                      /* to run around */
-
-    UBool freeOnClose;
-    UBool freeOptionsOnClose;
-    UBool freeRulesOnClose;
-    UBool freeImageOnClose;
-    UBool freeDefaultReorderCodesOnClose;
-    UBool freeReorderCodesOnClose;
-    UBool freeLeadBytePermutationTableOnClose;
-
-    UBool latinOneUse;
-    UBool latinOneRegenTable;
-    UBool latinOneFailed;
-
-    int8_t tertiaryAddition; /* when switching case, we need to add or subtract different values */
-    uint8_t caseSwitch;
-    uint8_t tertiaryCommon;
-    uint8_t tertiaryMask;
-    uint8_t tertiaryTop; /* Upper range when compressing */
-    uint8_t tertiaryBottom; /* Upper range when compressing */
-    uint8_t tertiaryTopCount;
-    uint8_t tertiaryBottomCount;
-
-    UVersionInfo dataVersion;               /* Data info of UCA table */
-    int32_t* defaultReorderCodes;
-    int32_t defaultReorderCodesLength;
-    int32_t* reorderCodes;
-    int32_t reorderCodesLength;
-    uint8_t* leadBytePermutationTable;
-    void  *delegate;  /* if non-null: C++ object to delegate all API calls to. */
+private:
+    CollationLoader();  // not implemented, all methods are static
+    static void loadRootRules(UErrorCode &errorCode);
 };
 
-U_CDECL_END
-
-/* various internal functions */
-
-/* do not close UCA returned by ucol_initUCA! */
-U_CFUNC
-UCollator* ucol_initUCA(UErrorCode *status);
-
-U_CFUNC
-UCollator* ucol_initCollator(const UCATableHeader *image, UCollator *fillIn, const UCollator *UCA, UErrorCode *status);
-
-U_CFUNC
-void ucol_setOptionsFromHeader(UCollator* result, UColOptionSet * opts, UErrorCode *status);
-
-U_CFUNC
-UCollator* ucol_open_internal(const char* loc, UErrorCode* status);
-
-#if 0
-U_CFUNC
-void ucol_putOptionsToHeader(UCollator* result, UColOptionSet * opts, UErrorCode *status);
-#endif
-
-U_CFUNC
-void ucol_updateInternalState(UCollator *coll, UErrorCode *status);
-
-U_CFUNC uint32_t U_EXPORT2 ucol_getFirstCE(const UCollator *coll, UChar u, UErrorCode *status);
-U_CAPI UBool U_EXPORT2 ucol_isTailored(const UCollator *coll, const UChar u, UErrorCode *status);
-
-U_CAPI const InverseUCATableHeader* U_EXPORT2 ucol_initInverseUCA(UErrorCode *status);
-
-U_CAPI void U_EXPORT2 
-uprv_uca_initImplicitConstants(UErrorCode *status);
-
-U_CAPI uint32_t U_EXPORT2
-uprv_uca_getImplicitFromRaw(UChar32 cp);
-
-/*U_CFUNC uint32_t U_EXPORT2
-uprv_uca_getImplicitPrimary(UChar32 cp);*/
-
-U_CAPI UChar32 U_EXPORT2
-uprv_uca_getRawFromImplicit(uint32_t implicit);
-
-U_CAPI UChar32 U_EXPORT2
-uprv_uca_getRawFromCodePoint(UChar32 i);
-
-U_CAPI UChar32 U_EXPORT2
-uprv_uca_getCodePointFromRaw(UChar32 i);
-
-typedef const UChar* GetCollationRulesFunction(void* context, const char* locale, const char* type, int32_t* pLength, UErrorCode* status);
-
-U_CAPI UCollator* U_EXPORT2
-ucol_openRulesForImport( const UChar        *rules,
-                         int32_t            rulesLength,
-                         UColAttributeValue normalizationMode,
-                         UCollationStrength strength,
-                         UParseError        *parseError,
-                         GetCollationRulesFunction  importFunc,
-                         void* context,
-                         UErrorCode         *status);
-
-       
-U_CFUNC void U_EXPORT2 
-ucol_buildPermutationTable(UCollator *coll, UErrorCode *status);
-
-U_CFUNC int U_EXPORT2 
-ucol_getLeadBytesForReorderCode(const UCollator *uca, int reorderCode, uint16_t* returnLeadBytes, int returnCapacity);
-
-U_CFUNC int U_EXPORT2 
-ucol_getReorderCodesForLeadByte(const UCollator *uca, int leadByte, int16_t* returnReorderCodes, int returnCapacity);
-
-#ifdef __cplusplus
-/*
- *  Test whether a character is potentially "unsafe" for use as a collation
- *  starting point.  Unsafe chars are those with combining class != 0 plus
- *  those that are the 2nd thru nth character in a contraction sequence.
- *
- *  Function is in header file because it's used in both collation and string search,
- *  and needs to be inline for performance.
- */
-static inline UBool ucol_unsafeCP(UChar c, const UCollator *coll) {
-    int32_t  hash;
-    uint8_t  htbyte;
-
-    if (c < coll->minUnsafeCP) {
-        return FALSE;
-    }
-
-    hash = c;
-    if (hash >= UCOL_UNSAFECP_TABLE_SIZE*8) {
-        if(U16_IS_SURROGATE(c)) {
-            /*  Lead or trail surrogate             */
-            /*  These are always considered unsafe. */
-            return TRUE;
-        }
-        hash = (hash & UCOL_UNSAFECP_TABLE_MASK) + 256;
-    }
-    htbyte = coll->unsafeCP[hash>>3];
-    return ((htbyte >> (hash & 7)) & 1);
-}
-#endif /* __cplusplus */
+U_NAMESPACE_END
 
-/* The offsetBuffer in collIterate might need to be freed to avoid memory leaks. */
-void ucol_freeOffsetBuffer(U_NAMESPACE_QUALIFIER collIterate *s); 
+#endif  /* __cplusplus */
 
 #endif /* #if !UCONFIG_NO_COLLATION */
 
index 55c529eb85ff8a85f0288f54ef4614e6097373cf..15f0d6d901a8ac2971c5257f8a85a2d1a66c58c8 100644 (file)
@@ -1,6 +1,6 @@
 /*
 *******************************************************************************
-*   Copyright (C) 1996-2013, International Business Machines
+*   Copyright (C) 1996-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
 *   file name:  ucol_res.cpp
 * 03/01/2001  synwee    Added maxexpansion functionality.
 * 03/16/2001  weiv      Collation framework is rewritten in C and made UCA compliant
 * 12/08/2004  grhoten   Split part of ucol.cpp into ucol_res.cpp
+* 2012-2014   markus    Rewritten in C++ again.
 */
 
 #include "unicode/utypes.h"
 
 #if !UCONFIG_NO_COLLATION
-#include "unicode/uloc.h"
+
 #include "unicode/coll.h"
+#include "unicode/localpointer.h"
+#include "unicode/locid.h"
 #include "unicode/tblcoll.h"
-#include "unicode/caniter.h"
-#include "unicode/uscript.h"
-#include "unicode/ustring.h"
-
-#include "ucol_bld.h"
-#include "ucol_imp.h"
-#include "ucol_tok.h"
-#include "ucol_elm.h"
-#include "uresimp.h"
-#include "ustr_imp.h"
+#include "unicode/ucol.h"
+#include "unicode/uloc.h"
+#include "unicode/unistr.h"
+#include "unicode/ures.h"
+#include "cmemory.h"
 #include "cstring.h"
-#include "umutex.h"
-#include "ucln_in.h"
-#include "ustrenum.h"
+#include "collationdatareader.h"
+#include "collationroot.h"
+#include "collationtailoring.h"
 #include "putilimp.h"
-#include "utracimp.h"
-#include "cmemory.h"
 #include "uassert.h"
+#include "ucln_in.h"
+#include "ucol_imp.h"
 #include "uenumimp.h"
 #include "ulist.h"
+#include "umutex.h"
+#include "uresimp.h"
+#include "ustrenum.h"
+#include "utracimp.h"
 
-U_NAMESPACE_USE
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
 
-static void ucol_setReorderCodesFromParser(UCollator *coll, UColTokenParser *parser, UErrorCode *status);
+U_NAMESPACE_BEGIN
 
-// static UCA. There is only one. Collators don't use it.
-// It is referenced only in ucol_initUCA and ucol_cleanup
-static UCollator* _staticUCA = NULL;
-static icu::UInitOnce gStaticUCAInitOnce = U_INITONCE_INITIALIZER;
-// static pointer to udata memory. Inited in ucol_initUCA
-// used for cleanup in ucol_cleanup
-static UDataMemory* UCA_DATA_MEM = NULL;
+namespace {
+
+static const UChar *rootRules = NULL;
+static int32_t rootRulesLength = 0;
+static UResourceBundle *rootBundle = NULL;
+static UInitOnce gInitOnce = U_INITONCE_INITIALIZER;
+
+}  // namespace
 
 U_CDECL_BEGIN
+
 static UBool U_CALLCONV
-ucol_res_cleanup(void)
-{
-    if (UCA_DATA_MEM) {
-        udata_close(UCA_DATA_MEM);
-        UCA_DATA_MEM = NULL;
-    }
-    if (_staticUCA) {
-        ucol_close(_staticUCA);
-        _staticUCA = NULL;
-    }
-    gStaticUCAInitOnce.reset();
+ucol_res_cleanup() {
+    rootRules = NULL;
+    rootRulesLength = 0;
+    ures_close(rootBundle);
+    rootBundle = NULL;
+    gInitOnce.reset();
     return TRUE;
 }
 
-static UBool U_CALLCONV
-isAcceptableUCA(void * /*context*/,
-             const char * /*type*/, const char * /*name*/,
-             const UDataInfo *pInfo){
-  /* context, type & name are intentionally not used */
-    if( pInfo->size>=20 &&
-        pInfo->isBigEndian==U_IS_BIG_ENDIAN &&
-        pInfo->charsetFamily==U_CHARSET_FAMILY &&
-        pInfo->dataFormat[0]==UCA_DATA_FORMAT_0 &&   /* dataFormat="UCol" */
-        pInfo->dataFormat[1]==UCA_DATA_FORMAT_1 &&
-        pInfo->dataFormat[2]==UCA_DATA_FORMAT_2 &&
-        pInfo->dataFormat[3]==UCA_DATA_FORMAT_3 &&
-        pInfo->formatVersion[0]==UCA_FORMAT_VERSION_0
-#if UCA_FORMAT_VERSION_1!=0
-        && pInfo->formatVersion[1]>=UCA_FORMAT_VERSION_1
-#endif
-        //pInfo->formatVersion[1]==UCA_FORMAT_VERSION_1 &&
-        //pInfo->formatVersion[2]==UCA_FORMAT_VERSION_2 && // Too harsh
-        //pInfo->formatVersion[3]==UCA_FORMAT_VERSION_3 && // Too harsh
-        ) {
-        return TRUE;
-        // Note: In ICU 51 and earlier,
-        // we used to check that the UCA data version (pInfo->dataVersion)
-        // matches the UCD version (u_getUnicodeVersion())
-        // but that complicated version updates, and
-        // a mismatch is "only" a problem for handling canonical equivalence.
-        // It need not be a fatal error.
-    } else {
-        return FALSE;
-    }
-}
 U_CDECL_END
 
-static void U_CALLCONV ucol_initStaticUCA(UErrorCode &status) {
-    U_ASSERT(_staticUCA == NULL);
-    U_ASSERT(UCA_DATA_MEM == NULL);
-    ucln_i18n_registerCleanup(UCLN_I18N_UCOL_RES, ucol_res_cleanup);
-
-    UDataMemory *result = udata_openChoice(U_ICUDATA_COLL, UCA_DATA_TYPE, UCA_DATA_NAME, isAcceptableUCA, NULL, &status);
-    if(U_FAILURE(status)){
-        udata_close(result);
+void
+CollationLoader::loadRootRules(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return; }
+    rootBundle = ures_open(U_ICUDATA_COLL, kRootLocaleName, &errorCode);
+    if(U_FAILURE(errorCode)) { return; }
+    rootRules = ures_getStringByKey(rootBundle, "UCARules", &rootRulesLength, &errorCode);
+    if(U_FAILURE(errorCode)) {
+        ures_close(rootBundle);
+        rootBundle = NULL;
         return;
     }
-
-    _staticUCA = ucol_initCollator((const UCATableHeader *)udata_getMemory(result), NULL, NULL, &status);
-    if(U_SUCCESS(status)){
-        // Initalize variables for implicit generation
-        uprv_uca_initImplicitConstants(&status);
-        UCA_DATA_MEM = result;
-
-    }else{
-        ucol_close(_staticUCA);
-        _staticUCA = NULL;
-        udata_close(result);
-    }
-}
-
-
-/* do not close UCA returned by ucol_initUCA! */
-UCollator *
-ucol_initUCA(UErrorCode *status) {
-    umtx_initOnce(gStaticUCAInitOnce, &ucol_initStaticUCA, *status);
-    return _staticUCA;
+    ucln_i18n_registerCleanup(UCLN_I18N_UCOL_RES, ucol_res_cleanup);
 }
 
-U_CAPI void U_EXPORT2
-ucol_forgetUCA(void)
-{
-    _staticUCA = NULL;
-    UCA_DATA_MEM = NULL;
-    gStaticUCAInitOnce.reset();
+void
+CollationLoader::appendRootRules(UnicodeString &s) {
+    UErrorCode errorCode = U_ZERO_ERROR;
+    umtx_initOnce(gInitOnce, CollationLoader::loadRootRules, errorCode);
+    if(U_SUCCESS(errorCode)) {
+        s.append(rootRules, rootRulesLength);
+    }
 }
 
-/****************************************************************************/
-/* Following are the open/close functions                                   */
-/*                                                                          */
-/****************************************************************************/
-static UCollator*
-tryOpeningFromRules(UResourceBundle *collElem, UErrorCode *status) {
-    int32_t rulesLen = 0;
-    const UChar *rules = ures_getStringByKey(collElem, "Sequence", &rulesLen, status);
-    return ucol_openRules(rules, rulesLen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, status);
+UnicodeString *
+CollationLoader::loadRules(const char *localeID, const char *collationType, UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return NULL; }
+    U_ASSERT(collationType != NULL && *collationType != 0);
+
+    LocalUResourceBundlePointer bundle(ures_open(U_ICUDATA_COLL, localeID, &errorCode));
+    LocalUResourceBundlePointer collations(
+            ures_getByKey(bundle.getAlias(), "collations", NULL, &errorCode));
+    LocalUResourceBundlePointer data(
+            ures_getByKeyWithFallback(collations.getAlias(), collationType, NULL, &errorCode));
+    int32_t length;
+    const UChar *s =  ures_getStringByKey(data.getAlias(), "Sequence", &length, &errorCode);
+    if(U_FAILURE(errorCode)) { return NULL; }
+
+    // No string pointer aliasing so that we need not hold onto the resource bundle.
+    UnicodeString *rules = new UnicodeString(s, length);
+    if(rules == NULL) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return NULL;
+    }
+    return rules;
 }
 
-
-// API in ucol_imp.h
-
-U_CFUNC UCollator*
-ucol_open_internal(const char *loc,
-                   UErrorCode *status)
-{
-    UErrorCode intStatus = U_ZERO_ERROR;
-    const UCollator* UCA = ucol_initUCA(status);
-
-    /* New version */
-    if(U_FAILURE(*status)) return 0;
-
-
-
-    UCollator *result = NULL;
-    UResourceBundle *b = ures_open(U_ICUDATA_COLL, loc, status);
-
-    /* we try to find stuff from keyword */
-    UResourceBundle *collations = ures_getByKey(b, "collations", NULL, status);
-    UResourceBundle *collElem = NULL;
-    char keyBuffer[256];
-    // if there is a keyword, we pick it up and try to get elements
-    if(!uloc_getKeywordValue(loc, "collation", keyBuffer, 256, status) ||
-        !uprv_strcmp(keyBuffer,"default")) { /* Treat 'zz@collation=default' as 'zz'. */
-        // no keyword. we try to find the default setting, which will give us the keyword value
-        intStatus = U_ZERO_ERROR;
-        // finding default value does not affect collation fallback status
-        UResourceBundle *defaultColl = ures_getByKeyWithFallback(collations, "default", NULL, &intStatus);
-        if(U_SUCCESS(intStatus)) {
-            int32_t defaultKeyLen = 0;
-            const UChar *defaultKey = ures_getString(defaultColl, &defaultKeyLen, &intStatus);
-            u_UCharsToChars(defaultKey, keyBuffer, defaultKeyLen);
-            keyBuffer[defaultKeyLen] = 0;
+const CollationTailoring *
+CollationLoader::loadTailoring(const Locale &locale, Locale &validLocale, UErrorCode &errorCode) {
+    const CollationTailoring *root = CollationRoot::getRoot(errorCode);
+    if(U_FAILURE(errorCode)) { return NULL; }
+    const char *name = locale.getName();
+    if(*name == 0 || uprv_strcmp(name, "root") == 0) {
+        validLocale = Locale::getRoot();
+        return root;
+    }
+
+    LocalUResourceBundlePointer bundle(ures_open(U_ICUDATA_COLL, name, &errorCode));
+    if(errorCode == U_MISSING_RESOURCE_ERROR) {
+        errorCode = U_USING_DEFAULT_WARNING;
+        validLocale = Locale::getRoot();
+        return root;
+    }
+    const char *vLocale = ures_getLocaleByType(bundle.getAlias(), ULOC_ACTUAL_LOCALE, &errorCode);
+    if(U_FAILURE(errorCode)) { return NULL; }
+    validLocale = Locale(vLocale);
+
+    // There are zero or more tailorings in the collations table.
+    LocalUResourceBundlePointer collations(
+            ures_getByKey(bundle.getAlias(), "collations", NULL, &errorCode));
+    if(errorCode == U_MISSING_RESOURCE_ERROR) {
+        errorCode = U_USING_DEFAULT_WARNING;
+        return root;
+    }
+    if(U_FAILURE(errorCode)) { return NULL; }
+
+    // Fetch the collation type from the locale ID and the default type from the data.
+    char type[16];
+    int32_t typeLength = locale.getKeywordValue("collation", type, LENGTHOF(type) - 1, errorCode);
+    if(U_FAILURE(errorCode)) {
+        errorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return NULL;
+    }
+    type[typeLength] = 0;  // in case of U_NOT_TERMINATED_WARNING
+    char defaultType[16];
+    {
+        UErrorCode internalErrorCode = U_ZERO_ERROR;
+        LocalUResourceBundlePointer def(
+                ures_getByKeyWithFallback(collations.getAlias(), "default", NULL,
+                                          &internalErrorCode));
+        int32_t length;
+        const UChar *s = ures_getString(def.getAlias(), &length, &internalErrorCode);
+        if(U_SUCCESS(internalErrorCode) && length < LENGTHOF(defaultType)) {
+            u_UCharsToChars(s, defaultType, length + 1);
         } else {
-            *status = U_INTERNAL_PROGRAM_ERROR;
-            return NULL;
-        }
-        ures_close(defaultColl);
+            uprv_strcpy(defaultType, "standard");
+        }
+    }
+    if(typeLength == 0 || uprv_strcmp(type, "default") == 0) {
+        uprv_strcpy(type, defaultType);
+    }
+
+    // Load the collations/type tailoring, with type fallback.
+    UBool typeFallback = FALSE;
+    LocalUResourceBundlePointer data(
+            ures_getByKeyWithFallback(collations.getAlias(), type, NULL, &errorCode));
+    if(errorCode == U_MISSING_RESOURCE_ERROR &&
+            typeLength > 6 && uprv_strncmp(type, "search", 6) == 0) {
+        // fall back from something like "searchjl" to "search"
+        typeFallback = TRUE;
+        type[6] = 0;
+        errorCode = U_ZERO_ERROR;
+        data.adoptInstead(
+            ures_getByKeyWithFallback(collations.getAlias(), type, NULL, &errorCode));
+    }
+    if(errorCode == U_MISSING_RESOURCE_ERROR && uprv_strcmp(type, defaultType) != 0) {
+        // fall back to the default type
+        typeFallback = TRUE;
+        uprv_strcpy(type, defaultType);
+        errorCode = U_ZERO_ERROR;
+        data.adoptInstead(
+            ures_getByKeyWithFallback(collations.getAlias(), type, NULL, &errorCode));
+    }
+    if(errorCode == U_MISSING_RESOURCE_ERROR && uprv_strcmp(type, "standard") != 0) {
+        // fall back to the "standard" type
+        typeFallback = TRUE;
+        uprv_strcpy(type, "standard");
+        errorCode = U_ZERO_ERROR;
+        data.adoptInstead(
+            ures_getByKeyWithFallback(collations.getAlias(), type, NULL, &errorCode));
+    }
+    if(errorCode == U_MISSING_RESOURCE_ERROR) {
+        errorCode = U_USING_DEFAULT_WARNING;
+        return root;
+    }
+    if(U_FAILURE(errorCode)) { return NULL; }
+
+    LocalPointer<CollationTailoring> t(new CollationTailoring(root->settings));
+    if(t.isNull() || t->isBogus()) {
+        errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return NULL;
     }
-    collElem = ures_getByKeyWithFallback(collations, keyBuffer, collations, status);
-    collations = NULL; // We just reused the collations object as collElem.
-
-    UResourceBundle *binary = NULL;
-    UResourceBundle *reorderRes = NULL;
-    
-    if(*status == U_MISSING_RESOURCE_ERROR) { /* We didn't find the tailoring data, we fallback to the UCA */
-        *status = U_USING_DEFAULT_WARNING;
-        result = ucol_initCollator(UCA->image, result, UCA, status);
-        if (U_FAILURE(*status)) {
-            goto clean;
-        }
-        // if we use UCA, real locale is root
-        ures_close(b);
-        b = ures_open(U_ICUDATA_COLL, "", status);
-        ures_close(collElem);
-        collElem = ures_open(U_ICUDATA_COLL, "", status);
-        if(U_FAILURE(*status)) {
-            goto clean;
-        }
-        result->hasRealData = FALSE;
-    } else if(U_SUCCESS(*status)) {
-        intStatus = U_ZERO_ERROR;
-
-        binary = ures_getByKey(collElem, "%%CollationBin", NULL, &intStatus);
 
-        if(intStatus == U_MISSING_RESOURCE_ERROR) { /* we didn't find the binary image, we should use the rules */
-            binary = NULL;
-            result = tryOpeningFromRules(collElem, status);
-            if(U_FAILURE(*status)) {
-                goto clean;
-            }
-        } else if(U_SUCCESS(intStatus)) { /* otherwise, we'll pick a collation data that exists */
-            int32_t len = 0;
-            const uint8_t *inData = ures_getBinary(binary, &len, status);
-            if(U_FAILURE(*status)) {
-                goto clean;
-            }
-            UCATableHeader *colData = (UCATableHeader *)inData;
-            if(uprv_memcmp(colData->UCAVersion, UCA->image->UCAVersion, sizeof(UVersionInfo)) != 0 ||
-                uprv_memcmp(colData->UCDVersion, UCA->image->UCDVersion, sizeof(UVersionInfo)) != 0 ||
-                colData->version[0] != UCOL_BUILDER_VERSION)
-            {
-                *status = U_DIFFERENT_UCA_VERSION;
-                result = tryOpeningFromRules(collElem, status);
-            } else {
-                if(U_FAILURE(*status)){
-                    goto clean;
-                }
-                if((uint32_t)len > (paddedsize(sizeof(UCATableHeader)) + paddedsize(sizeof(UColOptionSet)))) {
-                    result = ucol_initCollator((const UCATableHeader *)inData, result, UCA, status);
-                    if(U_FAILURE(*status)){
-                        goto clean;
-                    }
-                    result->hasRealData = TRUE;
-                } else {
-                    result = ucol_initCollator(UCA->image, result, UCA, status);
-                    ucol_setOptionsFromHeader(result, (UColOptionSet *)(inData+((const UCATableHeader *)inData)->options), status);
-                    if(U_FAILURE(*status)){
-                        goto clean;
-                    }
-                    result->hasRealData = FALSE;
-                }
-                result->freeImageOnClose = FALSE;
-                
-                reorderRes = ures_getByKey(collElem, "%%ReorderCodes", NULL, &intStatus);
-                if (U_SUCCESS(intStatus)) {
-                    int32_t reorderCodesLen = 0;
-                    const int32_t* reorderCodes = ures_getIntVector(reorderRes, &reorderCodesLen, status);
-                    if (reorderCodesLen > 0) {
-                        ucol_setReorderCodes(result, reorderCodes, reorderCodesLen, status);
-                        // copy the reorder codes into the default reorder codes
-                        result->defaultReorderCodesLength = result->reorderCodesLength;
-                        result->defaultReorderCodes =  (int32_t*) uprv_malloc(result->defaultReorderCodesLength * sizeof(int32_t));
-                        uprv_memcpy(result->defaultReorderCodes, result->reorderCodes, result->defaultReorderCodesLength * sizeof(int32_t));
-                        result->freeDefaultReorderCodesOnClose = TRUE;
-                    }
-                    if (U_FAILURE(*status)) {
-                        goto clean;
-                    }
-                }
-            }
-
-        } else { // !U_SUCCESS(binaryStatus)
-            if(U_SUCCESS(*status)) {
-                *status = intStatus; // propagate underlying error
-            }
-            goto clean;
+    // Is this the same as the root collator? If so, then use that instead.
+    const char *actualLocale = ures_getLocaleByType(data.getAlias(), ULOC_ACTUAL_LOCALE, &errorCode);
+    if(U_FAILURE(errorCode)) { return NULL; }
+    if((*actualLocale == 0 || uprv_strcmp(actualLocale, "root") == 0) &&
+            uprv_strcmp(type, "standard") == 0) {
+        if(typeFallback) {
+            errorCode = U_USING_DEFAULT_WARNING;
+        }
+        return root;
+    }
+    t->actualLocale = Locale(actualLocale);
+
+    // deserialize
+    LocalUResourceBundlePointer binary(
+            ures_getByKey(data.getAlias(), "%%CollationBin", NULL, &errorCode));
+    // Note: U_MISSING_RESOURCE_ERROR --> The old code built from rules if available
+    // but that created undesirable dependencies.
+    int32_t length;
+    const uint8_t *inBytes = ures_getBinary(binary.getAlias(), &length, &errorCode);
+    if(U_FAILURE(errorCode)) { return NULL; }
+    CollationDataReader::read(root, inBytes, length, *t, errorCode);
+    // Note: U_COLLATOR_VERSION_MISMATCH --> The old code built from rules if available
+    // but that created undesirable dependencies.
+    if(U_FAILURE(errorCode)) { return NULL; }
+
+    // Try to fetch the optional rules string.
+    {
+        UErrorCode internalErrorCode = U_ZERO_ERROR;
+        int32_t length;
+        const UChar *s = ures_getStringByKey(data.getAlias(), "Sequence", &length,
+                                             &internalErrorCode);
+        if(U_SUCCESS(errorCode)) {
+            t->rules.setTo(TRUE, s, length);
+        }
+    }
+
+    // Set the collation types on the informational locales,
+    // except when they match the default types (for brevity and backwards compatibility).
+    // For the valid locale, suppress the default type.
+    if(uprv_strcmp(type, defaultType) != 0) {
+        validLocale.setKeywordValue("collation", type, errorCode);
+        if(U_FAILURE(errorCode)) { return NULL; }
+    }
+
+    // For the actual locale, suppress the default type *according to the actual locale*.
+    // For example, zh has default=pinyin and contains all of the Chinese tailorings.
+    // zh_Hant has default=stroke but has no other data.
+    // For the valid locale "zh_Hant" we need to suppress stroke.
+    // For the actual locale "zh" we need to suppress pinyin instead.
+    if(uprv_strcmp(actualLocale, vLocale) != 0) {
+        // Opening a bundle for the actual locale should always succeed.
+        LocalUResourceBundlePointer actualBundle(
+                ures_open(U_ICUDATA_COLL, actualLocale, &errorCode));
+        if(U_FAILURE(errorCode)) { return NULL; }
+        UErrorCode internalErrorCode = U_ZERO_ERROR;
+        LocalUResourceBundlePointer def(
+                ures_getByKeyWithFallback(actualBundle.getAlias(), "collations/default", NULL,
+                                          &internalErrorCode));
+        int32_t length;
+        const UChar *s = ures_getString(def.getAlias(), &length, &internalErrorCode);
+        if(U_SUCCESS(internalErrorCode) && length < LENGTHOF(defaultType)) {
+            u_UCharsToChars(s, defaultType, length + 1);
+        } else {
+            uprv_strcpy(defaultType, "standard");
         }
-        intStatus = U_ZERO_ERROR;
-        result->rules = ures_getStringByKey(collElem, "Sequence", &result->rulesLength, &intStatus);
-        result->freeRulesOnClose = FALSE;
-    } else { /* There is another error, and we're just gonna clean up */
-        goto clean;
-    }
-
-    intStatus = U_ZERO_ERROR;
-    result->ucaRules = ures_getStringByKey(b,"UCARules",NULL,&intStatus);
-
-    if(loc == NULL) {
-        loc = ures_getLocaleByType(b, ULOC_ACTUAL_LOCALE, status);
     }
-    result->requestedLocale = uprv_strdup(loc);
-    /* test for NULL */
-    if (result->requestedLocale == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        goto clean;
+    if(uprv_strcmp(type, defaultType) != 0) {
+        t->actualLocale.setKeywordValue("collation", type, errorCode);
+        if(U_FAILURE(errorCode)) { return NULL; }
     }
-    loc = ures_getLocaleByType(collElem, ULOC_ACTUAL_LOCALE, status);
-    result->actualLocale = uprv_strdup(loc);
-    /* test for NULL */
-    if (result->actualLocale == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        goto clean;
-    }
-    loc = ures_getLocaleByType(b, ULOC_ACTUAL_LOCALE, status);
-    result->validLocale = uprv_strdup(loc);
-    /* test for NULL */
-    if (result->validLocale == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        goto clean;
+
+    if(typeFallback) {
+        errorCode = U_USING_DEFAULT_WARNING;
     }
+    t->bundle = bundle.orphan();
+    return t.orphan();
+}
 
-    ures_close(b);
-    ures_close(collElem);
-    ures_close(binary);
-    ures_close(reorderRes);
-    return result;
+U_NAMESPACE_END
 
-clean:
-    ures_close(b);
-    ures_close(collElem);
-    ures_close(binary);
-    ures_close(reorderRes);
-    ucol_close(result);
-    return NULL;
-}
+U_NAMESPACE_USE
 
 U_CAPI UCollator*
 ucol_open(const char *loc,
@@ -348,360 +311,14 @@ ucol_open(const char *loc,
     UTRACE_DATA1(UTRACE_INFO, "locale = \"%s\"", loc);
     UCollator *result = NULL;
 
-#if !UCONFIG_NO_SERVICE
-    result = Collator::createUCollator(loc, status);
-    if (result == NULL)
-#endif
-    {
-        result = ucol_open_internal(loc, status);
-    }
-    UTRACE_EXIT_PTR_STATUS(result, *status);
-    return result;
-}
-
-
-UCollator*
-ucol_openRulesForImport( const UChar        *rules,
-                         int32_t            rulesLength,
-                         UColAttributeValue normalizationMode,
-                         UCollationStrength strength,
-                         UParseError        *parseError,
-                         GetCollationRulesFunction  importFunc,
-                         void* context,
-                         UErrorCode         *status)
-{
-    UColTokenParser src;
-    UColAttributeValue norm;
-    UParseError tErr;
-
-    if(status == NULL || U_FAILURE(*status)){
-        return 0;
-    }
-
-    if(rules == NULL || rulesLength < -1) {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        return 0;
-    }
-
-    if(rulesLength == -1) {
-        rulesLength = u_strlen(rules);
-    }
-
-    if(parseError == NULL){
-        parseError = &tErr;
-    }
-
-    switch(normalizationMode) {
-    case UCOL_OFF:
-    case UCOL_ON:
-    case UCOL_DEFAULT:
-        norm = normalizationMode;
-        break;
-    default:
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        return 0;
-    }
-
-    UCollator *result = NULL;
-    UCATableHeader *table = NULL;
-    UCollator *UCA = ucol_initUCA(status);
-
-    if(U_FAILURE(*status)){
-        return NULL;
-    }
-
-    ucol_tok_initTokenList(&src, rules, rulesLength, UCA, importFunc, context, status);
-    ucol_tok_assembleTokenList(&src,parseError, status);
-
-    if(U_FAILURE(*status)) {
-        /* if status is U_ILLEGAL_ARGUMENT_ERROR, src->current points at the offending option */
-        /* if status is U_INVALID_FORMAT_ERROR, src->current points after the problematic part of the rules */
-        /* so something might be done here... or on lower level */
-#ifdef UCOL_DEBUG
-        if(*status == U_ILLEGAL_ARGUMENT_ERROR) {
-            fprintf(stderr, "bad option starting at offset %i\n", (int)(src.current-src.source));
-        } else {
-            fprintf(stderr, "invalid rule just before offset %i\n", (int)(src.current-src.source));
-        }
-#endif
-        goto cleanup;
-    }
-
-     /* if we have a set of rules, let's make something of it */
-    if(src.resultLen > 0 || src.removeSet != NULL) {
-        /* also, if we wanted to remove some contractions, we should make a tailoring */
-        table = ucol_assembleTailoringTable(&src, status);
-        if(U_SUCCESS(*status)) {
-            // builder version
-            table->version[0] = UCOL_BUILDER_VERSION;
-            // no tailoring information on this level
-            table->version[1] = table->version[2] = table->version[3] = 0;
-            // set UCD version
-            u_getUnicodeVersion(table->UCDVersion);
-            // set UCA version
-            uprv_memcpy(table->UCAVersion, UCA->image->UCAVersion, sizeof(UVersionInfo));
-            result = ucol_initCollator(table, 0, UCA, status);
-            if (U_FAILURE(*status)) {
-                goto cleanup;
-            }
-            result->hasRealData = TRUE;
-            result->freeImageOnClose = TRUE;
-        } else {
-            goto cleanup;
-        }
-    } else { /* no rules, but no error either */
-        // must be only options
-        // We will init the collator from UCA
-        result = ucol_initCollator(UCA->image, 0, UCA, status);
-        // Check for null result
-        if (U_FAILURE(*status)) {
-            goto cleanup;
-        }
-        // And set only the options
-        UColOptionSet *opts = (UColOptionSet *)uprv_malloc(sizeof(UColOptionSet));
-        /* test for NULL */
-        if (opts == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            goto cleanup;
-        }
-        uprv_memcpy(opts, src.opts, sizeof(UColOptionSet));
-        ucol_setOptionsFromHeader(result, opts, status);
-        result->freeOptionsOnClose = TRUE;
-        result->hasRealData = FALSE;
-        result->freeImageOnClose = FALSE;
-    }
-
-    ucol_setReorderCodesFromParser(result, &src, status);
-
+    Collator *coll = Collator::createInstance(loc, *status);
     if(U_SUCCESS(*status)) {
-        UChar *newRules;
-        result->dataVersion[0] = UCOL_BUILDER_VERSION;
-        if(rulesLength > 0) {
-            newRules = (UChar *)uprv_malloc((rulesLength+1)*U_SIZEOF_UCHAR);
-            /* test for NULL */
-            if (newRules == NULL) {
-                *status = U_MEMORY_ALLOCATION_ERROR;
-                goto cleanup;
-            }
-            uprv_memcpy(newRules, rules, rulesLength*U_SIZEOF_UCHAR);
-            newRules[rulesLength]=0;
-            result->rules = newRules;
-            result->rulesLength = rulesLength;
-            result->freeRulesOnClose = TRUE;
-        }
-        result->ucaRules = NULL;
-        result->actualLocale = NULL;
-        result->validLocale = NULL;
-        result->requestedLocale = NULL;
-        ucol_buildPermutationTable(result, status);
-        ucol_setAttribute(result, UCOL_STRENGTH, strength, status);
-        ucol_setAttribute(result, UCOL_NORMALIZATION_MODE, norm, status);
-    } else {
-cleanup:
-        if(result != NULL) {
-            ucol_close(result);
-        } else {
-            if(table != NULL) {
-                uprv_free(table);
-            }
-        }
-        result = NULL;
+        result = coll->toUCollator();
     }
-
-    ucol_tok_closeTokenList(&src);
-
+    UTRACE_EXIT_PTR_STATUS(result, *status);
     return result;
 }
 
-U_CAPI UCollator* U_EXPORT2
-ucol_openRules( const UChar        *rules,
-               int32_t            rulesLength,
-               UColAttributeValue normalizationMode,
-               UCollationStrength strength,
-               UParseError        *parseError,
-               UErrorCode         *status)
-{
-    return ucol_openRulesForImport(rules,
-                                   rulesLength,
-                                   normalizationMode,
-                                   strength,
-                                   parseError,
-                                   ucol_tok_getRulesFromBundle,
-                                   NULL,
-                                   status);
-}
-
-U_CAPI int32_t U_EXPORT2
-ucol_getRulesEx(const UCollator *coll, UColRuleOption delta, UChar *buffer, int32_t bufferLen) {
-    UErrorCode status = U_ZERO_ERROR;
-    int32_t len = 0;
-    int32_t UCAlen = 0;
-    const UChar* ucaRules = 0;
-    const UChar *rules = ucol_getRules(coll, &len);
-    if(delta == UCOL_FULL_RULES) {
-        /* take the UCA rules and append real rules at the end */
-        /* UCA rules will be probably coming from the root RB */
-        ucaRules = coll->ucaRules;
-        if (ucaRules) {
-            UCAlen = u_strlen(ucaRules);
-        }
-        /*
-        ucaRules = ures_getStringByKey(coll->rb,"UCARules",&UCAlen,&status);
-        UResourceBundle* cresb = ures_getByKeyWithFallback(coll->rb, "collations", NULL, &status);
-        UResourceBundle*  uca = ures_getByKeyWithFallback(cresb, "UCA", NULL, &status);
-        ucaRules = ures_getStringByKey(uca,"Sequence",&UCAlen,&status);
-        ures_close(uca);
-        ures_close(cresb);
-        */
-    }
-    if(U_FAILURE(status)) {
-        return 0;
-    }
-    if(buffer!=0 && bufferLen>0){
-        *buffer=0;
-        if(UCAlen > 0) {
-            u_memcpy(buffer, ucaRules, uprv_min(UCAlen, bufferLen));
-        }
-        if(len > 0 && bufferLen > UCAlen) {
-            u_memcpy(buffer+UCAlen, rules, uprv_min(len, bufferLen-UCAlen));
-        }
-    }
-    return u_terminateUChars(buffer, bufferLen, len+UCAlen, &status);
-}
-
-static const UChar _NUL = 0;
-
-U_CAPI const UChar* U_EXPORT2
-ucol_getRules(    const    UCollator       *coll,
-              int32_t            *length)
-{
-    if(coll->rules != NULL) {
-        *length = coll->rulesLength;
-        return coll->rules;
-    }
-    else {
-        *length = 0;
-        return &_NUL;
-    }
-}
-
-U_CAPI UBool U_EXPORT2
-ucol_equals(const UCollator *source, const UCollator *target) {
-    UErrorCode status = U_ZERO_ERROR;
-    // if pointers are equal, collators are equal
-    if(source == target) {
-        return TRUE;
-    }
-    int32_t i = 0, j = 0;
-    // if any of attributes are different, collators are not equal
-    for(i = 0; i < UCOL_ATTRIBUTE_COUNT; i++) {
-        if(ucol_getAttribute(source, (UColAttribute)i, &status) != ucol_getAttribute(target, (UColAttribute)i, &status) || U_FAILURE(status)) {
-            return FALSE;
-        }
-    }
-    if (source->reorderCodesLength != target->reorderCodesLength){
-        return FALSE;
-    }
-    for (i = 0; i < source->reorderCodesLength; i++) {
-        if(source->reorderCodes[i] != target->reorderCodes[i]) {
-            return FALSE;
-        }
-    }
-
-    int32_t sourceRulesLen = 0, targetRulesLen = 0;
-    const UChar *sourceRules = ucol_getRules(source, &sourceRulesLen);
-    const UChar *targetRules = ucol_getRules(target, &targetRulesLen);
-
-    if(sourceRulesLen == targetRulesLen && u_strncmp(sourceRules, targetRules, sourceRulesLen) == 0) {
-        // all the attributes are equal and the rules are equal - collators are equal
-        return(TRUE);
-    }
-    // hard part, need to construct tree from rules and see if they yield the same tailoring
-    UBool result = TRUE;
-    UParseError parseError;
-    UColTokenParser sourceParser, targetParser;
-    int32_t sourceListLen = 0, targetListLen = 0;
-    ucol_tok_initTokenList(&sourceParser, sourceRules, sourceRulesLen, source->UCA, ucol_tok_getRulesFromBundle, NULL, &status);
-    ucol_tok_initTokenList(&targetParser, targetRules, targetRulesLen, target->UCA, ucol_tok_getRulesFromBundle, NULL, &status);
-    sourceListLen = ucol_tok_assembleTokenList(&sourceParser, &parseError, &status);
-    targetListLen = ucol_tok_assembleTokenList(&targetParser, &parseError, &status);
-
-    if(sourceListLen != targetListLen) {
-        // different number of resets
-        result = FALSE;
-    } else {
-        UColToken *sourceReset = NULL, *targetReset = NULL;
-        UChar *sourceResetString = NULL, *targetResetString = NULL;
-        int32_t sourceStringLen = 0, targetStringLen = 0;
-        for(i = 0; i < sourceListLen; i++) {
-            sourceReset = sourceParser.lh[i].reset;
-            sourceResetString = sourceParser.source+(sourceReset->source & 0xFFFFFF);
-            sourceStringLen = sourceReset->source >> 24;
-            for(j = 0; j < sourceListLen; j++) {
-                targetReset = targetParser.lh[j].reset;
-                targetResetString = targetParser.source+(targetReset->source & 0xFFFFFF);
-                targetStringLen = targetReset->source >> 24;
-                if(sourceStringLen == targetStringLen && (u_strncmp(sourceResetString, targetResetString, sourceStringLen) == 0)) {
-                    sourceReset = sourceParser.lh[i].first;
-                    targetReset = targetParser.lh[j].first;
-                    while(sourceReset != NULL && targetReset != NULL) {
-                        sourceResetString = sourceParser.source+(sourceReset->source & 0xFFFFFF);
-                        sourceStringLen = sourceReset->source >> 24;
-                        targetResetString = targetParser.source+(targetReset->source & 0xFFFFFF);
-                        targetStringLen = targetReset->source >> 24;
-                        if(sourceStringLen != targetStringLen || (u_strncmp(sourceResetString, targetResetString, sourceStringLen) != 0)) {
-                            result = FALSE;
-                            goto returnResult;
-                        }
-                        // probably also need to check the expansions
-                        if(sourceReset->expansion) {
-                            if(!targetReset->expansion) {
-                                result = FALSE;
-                                goto returnResult;
-                            } else {
-                                // compare expansions
-                                sourceResetString = sourceParser.source+(sourceReset->expansion& 0xFFFFFF);
-                                sourceStringLen = sourceReset->expansion >> 24;
-                                targetResetString = targetParser.source+(targetReset->expansion & 0xFFFFFF);
-                                targetStringLen = targetReset->expansion >> 24;
-                                if(sourceStringLen != targetStringLen || (u_strncmp(sourceResetString, targetResetString, sourceStringLen) != 0)) {
-                                    result = FALSE;
-                                    goto returnResult;
-                                }
-                            }
-                        } else {
-                            if(targetReset->expansion) {
-                                result = FALSE;
-                                goto returnResult;
-                            }
-                        }
-                        sourceReset = sourceReset->next;
-                        targetReset = targetReset->next;
-                    }
-                    if(sourceReset != targetReset) { // at least one is not NULL
-                        // there are more tailored elements in one list
-                        result = FALSE;
-                        goto returnResult;
-                    }
-
-
-                    break;
-                }
-            }
-            // couldn't find the reset anchor, so the collators are not equal
-            if(j == sourceListLen) {
-                result = FALSE;
-                goto returnResult;
-            }
-        }
-    }
-
-returnResult:
-    ucol_tok_closeTokenList(&sourceParser);
-    ucol_tok_closeTokenList(&targetParser);
-    return result;
-
-}
 
 U_CAPI int32_t U_EXPORT2
 ucol_getDisplayName(    const    char        *objLoc,
@@ -766,7 +383,7 @@ static const char RESOURCE_NAME[] = "collations";
 
 static const char* const KEYWORDS[] = { "collation" };
 
-#define KEYWORD_COUNT (sizeof(KEYWORDS)/sizeof(KEYWORDS[0]))
+#define KEYWORD_COUNT LENGTHOF(KEYWORDS)
 
 U_CAPI UEnumeration* U_EXPORT2
 ucol_getKeywords(UErrorCode *status) {
@@ -929,456 +546,4 @@ ucol_getFunctionalEquivalent(char* result, int32_t resultCapacity,
         isAvailable, TRUE, status);
 }
 
-/* returns the locale name the collation data comes from */
-U_CAPI const char * U_EXPORT2
-ucol_getLocale(const UCollator *coll, ULocDataLocaleType type, UErrorCode *status) {
-    return ucol_getLocaleByType(coll, type, status);
-}
-
-U_CAPI const char * U_EXPORT2
-ucol_getLocaleByType(const UCollator *coll, ULocDataLocaleType type, UErrorCode *status) {
-    const char *result = NULL;
-    if(status == NULL || U_FAILURE(*status)) {
-        return NULL;
-    }
-    UTRACE_ENTRY(UTRACE_UCOL_GETLOCALE);
-    UTRACE_DATA1(UTRACE_INFO, "coll=%p", coll);
-
-    if(coll->delegate!=NULL) {
-      return ((const Collator*)coll->delegate)->getLocale(type, *status).getName();
-    }
-    switch(type) {
-    case ULOC_ACTUAL_LOCALE:
-        result = coll->actualLocale;
-        break;
-    case ULOC_VALID_LOCALE:
-        result = coll->validLocale;
-        break;
-    case ULOC_REQUESTED_LOCALE:
-        result = coll->requestedLocale;
-        break;
-    default:
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-    }
-    UTRACE_DATA1(UTRACE_INFO, "result = %s", result);
-    UTRACE_EXIT_STATUS(*status);
-    return result;
-}
-
-U_CFUNC void U_EXPORT2
-ucol_setReqValidLocales(UCollator *coll, char *requestedLocaleToAdopt, char *validLocaleToAdopt, char *actualLocaleToAdopt)
-{
-    if (coll) {
-        if (coll->validLocale) {
-            uprv_free(coll->validLocale);
-        }
-        coll->validLocale = validLocaleToAdopt;
-        if (coll->requestedLocale) { // should always have
-            uprv_free(coll->requestedLocale);
-        }
-        coll->requestedLocale = requestedLocaleToAdopt;
-        if (coll->actualLocale) {
-            uprv_free(coll->actualLocale);
-        }
-        coll->actualLocale = actualLocaleToAdopt;
-    }
-}
-
-U_CAPI USet * U_EXPORT2
-ucol_getTailoredSet(const UCollator *coll, UErrorCode *status)
-{
-    U_NAMESPACE_USE
-
-    if(status == NULL || U_FAILURE(*status)) {
-        return NULL;
-    }
-    if(coll == NULL || coll->UCA == NULL) {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        return NULL;
-    }
-    UParseError parseError;
-    UColTokenParser src;
-    int32_t rulesLen = 0;
-    const UChar *rules = ucol_getRules(coll, &rulesLen);
-    UBool startOfRules = TRUE;
-    // we internally use the C++ class, for the following reasons:
-    // 1. we need to utilize canonical iterator, which is a C++ only class
-    // 2. canonical iterator returns UnicodeStrings - USet cannot take them
-    // 3. USet is internally really UnicodeSet, C is just a wrapper
-    UnicodeSet *tailored = new UnicodeSet();
-    UnicodeString pattern;
-    UnicodeString empty;
-    CanonicalIterator it(empty, *status);
-
-
-    // The idea is to tokenize the rule set. For each non-reset token,
-    // we add all the canonicaly equivalent FCD sequences
-    ucol_tok_initTokenList(&src, rules, rulesLen, coll->UCA, ucol_tok_getRulesFromBundle, NULL, status);
-    while (ucol_tok_parseNextToken(&src, startOfRules, &parseError, status) != NULL) {
-        startOfRules = FALSE;
-        if(src.parsedToken.strength != UCOL_TOK_RESET) {
-            const UChar *stuff = src.source+(src.parsedToken.charsOffset);
-            it.setSource(UnicodeString(stuff, src.parsedToken.charsLen), *status);
-            pattern = it.next();
-            while(!pattern.isBogus()) {
-                if(Normalizer::quickCheck(pattern, UNORM_FCD, *status) != UNORM_NO) {
-                    tailored->add(pattern);
-                }
-                pattern = it.next();
-            }
-        }
-    }
-    ucol_tok_closeTokenList(&src);
-    return (USet *)tailored;
-}
-
-/*
- * Collation Reordering
- */
-void ucol_setReorderCodesFromParser(UCollator *coll, UColTokenParser *parser, UErrorCode *status) {
-    if (U_FAILURE(*status)) {
-        return;
-    }
-    
-    if (parser->reorderCodesLength == 0 || parser->reorderCodes == NULL) {
-        return;
-    }
-    
-    coll->reorderCodesLength = 0;
-    if (coll->reorderCodes != NULL && coll->freeReorderCodesOnClose == TRUE) {
-        uprv_free(coll->reorderCodes);
-    }
-    coll->reorderCodes = NULL;
-    coll->freeReorderCodesOnClose = FALSE;
-
-    if (coll->defaultReorderCodes != NULL && coll->freeDefaultReorderCodesOnClose == TRUE) {
-        uprv_free(coll->defaultReorderCodes);
-    }
-    coll->freeDefaultReorderCodesOnClose = FALSE;
-    coll->defaultReorderCodesLength = parser->reorderCodesLength;
-    coll->defaultReorderCodes =  (int32_t*) uprv_malloc(coll->defaultReorderCodesLength * sizeof(int32_t));
-    if (coll->defaultReorderCodes == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return;
-    }
-    uprv_memcpy(coll->defaultReorderCodes, parser->reorderCodes, coll->defaultReorderCodesLength * sizeof(int32_t));
-    coll->freeDefaultReorderCodesOnClose = TRUE;
-    
-    coll->reorderCodesLength = parser->reorderCodesLength;
-    coll->reorderCodes = (int32_t*) uprv_malloc(coll->reorderCodesLength * sizeof(int32_t));
-    if (coll->reorderCodes == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return;
-    }
-    uprv_memcpy(coll->reorderCodes, parser->reorderCodes, coll->reorderCodesLength * sizeof(int32_t));
-    coll->freeReorderCodesOnClose = TRUE;
-}
-
-/*
- * Data is stored in the reorder code to lead byte table as:
- *  index count - unsigned short (2 bytes) - number of index entries
- *  data size - unsigned short (2 bytes) - number of unsigned short data elements
- *  index[index count] - array of 2 unsigned shorts (4 bytes each entry)
- *      - reorder code, offset
- *      - index is sorted by reorder code
- *      - if an offset has the high bit set then it is not an offset but a single data entry
- *        once the high bit is stripped off
- *  data[data size] - array of unsigned short (2 bytes each entry)
- *      - the data is an usigned short count followed by count number 
- *        of lead bytes stored in an unsigned short
- */
-U_CFUNC int U_EXPORT2
-ucol_getLeadBytesForReorderCode(const UCollator *uca, int reorderCode, uint16_t* returnLeadBytes, int returnCapacity) {
-    uint16_t reorderCodeIndexLength = *((uint16_t*) ((uint8_t *)uca->image + uca->image->scriptToLeadByte));
-    uint16_t* reorderCodeIndex = (uint16_t*) ((uint8_t *)uca->image + uca->image->scriptToLeadByte + 2 *sizeof(uint16_t));
-    
-    // reorder code index is 2 uint16_t's - reorder code + offset
-    for (int i = 0; i < reorderCodeIndexLength; i++) {
-        if (reorderCode == reorderCodeIndex[i*2]) {
-            uint16_t dataOffset = reorderCodeIndex[(i*2) + 1];
-            if ((dataOffset & 0x8000) == 0x8000) {
-                // offset isn't offset but instead is a single data element
-                if (returnCapacity >= 1) {
-                    returnLeadBytes[0] = dataOffset & ~0x8000;
-                    return 1;
-                }
-                return 0;
-            }
-            uint16_t* dataOffsetBase = (uint16_t*) ((uint8_t *)reorderCodeIndex + reorderCodeIndexLength * (2 * sizeof(uint16_t)));
-            uint16_t leadByteCount = *(dataOffsetBase + dataOffset);
-            leadByteCount = leadByteCount > returnCapacity ? returnCapacity : leadByteCount;
-            uprv_memcpy(returnLeadBytes, dataOffsetBase + dataOffset + 1, leadByteCount * sizeof(uint16_t));
-            return leadByteCount;
-        }
-    }
-    return 0;
-}
-
-/*
- * Data is stored in the lead byte to reorder code table as:
- *  index count - unsigned short (2 bytes) - number of index entries
- *  data size - unsigned short (2 bytes) - number of unsigned short data elements
- *  index[index count] - array of unsigned short (2 bytes each entry)
- *      - index is sorted by lead byte
- *      - if an index has the high bit set then it is not an index but a single data entry
- *        once the high bit is stripped off
- *  data[data size] - array of unsigned short (2 bytes each entry)
- *      - the data is an usigned short count followed by count number of reorder codes
- */
-U_CFUNC int U_EXPORT2
-ucol_getReorderCodesForLeadByte(const UCollator *uca, int leadByte, int16_t* returnReorderCodes, int returnCapacity) {
-    uint16_t* leadByteTable = ((uint16_t*) ((uint8_t *)uca->image + uca->image->leadByteToScript));
-    uint16_t leadByteIndexLength = *leadByteTable;
-    if (leadByte >= leadByteIndexLength) {
-        return 0;
-    }
-    uint16_t leadByteIndex = *(leadByteTable + (2 + leadByte));
-
-    if ((leadByteIndex & 0x8000) == 0x8000) {
-        // offset isn't offset but instead is a single data element
-        if (returnCapacity >= 1) {
-            returnReorderCodes[0] = leadByteIndex & ~0x8000;
-            return 1;
-        }
-        return 0;
-    }
-    //uint16_t* dataOffsetBase = leadByteTable + (2 + leadByteIndexLength);
-    uint16_t* reorderCodeData = leadByteTable + (2 + leadByteIndexLength) + leadByteIndex;
-    uint16_t reorderCodeCount = *reorderCodeData > returnCapacity ? returnCapacity : *reorderCodeData;
-    uprv_memcpy(returnReorderCodes, reorderCodeData + 1, reorderCodeCount * sizeof(uint16_t));
-    return reorderCodeCount;
-}
-
-// used to mark ignorable reorder code slots
-static const int32_t UCOL_REORDER_CODE_IGNORE = UCOL_REORDER_CODE_LIMIT + 1;
-
-U_CFUNC void U_EXPORT2
-ucol_buildPermutationTable(UCollator *coll, UErrorCode *status) {
-    uint16_t leadBytesSize = 256;
-    uint16_t leadBytes[256];
-
-    // The lowest byte that hasn't been assigned a mapping
-    int toBottom = 0x03;
-    // The highest byte that hasn't been assigned a mapping - don't include the special or trailing
-    int toTop = 0xe4;
-
-    // are we filling from the bottom?
-    bool fromTheBottom = true;
-    int32_t reorderCodesIndex = -1;
-    
-    // lead bytes that have alread been assigned to the permutation table
-    bool newLeadByteUsed[256];
-    // permutation table slots that have already been filled
-    bool permutationSlotFilled[256];
-
-    // nothing to do
-    if(U_FAILURE(*status) || coll == NULL) {
-        return;
-    }
-    
-    // clear the reordering
-    if (coll->reorderCodes == NULL || coll->reorderCodesLength == 0 
-            || (coll->reorderCodesLength == 1 && coll->reorderCodes[0] == UCOL_REORDER_CODE_NONE)) {
-        if (coll->leadBytePermutationTable != NULL) {
-            if (coll->freeLeadBytePermutationTableOnClose) {
-                uprv_free(coll->leadBytePermutationTable);
-            }
-            coll->leadBytePermutationTable = NULL;
-            coll->freeLeadBytePermutationTableOnClose = FALSE;
-            coll->reorderCodesLength = 0;
-        }
-        return;
-    }
-
-    // set reordering to the default reordering
-    if (coll->reorderCodes[0] == UCOL_REORDER_CODE_DEFAULT) {
-        if (coll->reorderCodesLength != 1) {
-            *status = U_ILLEGAL_ARGUMENT_ERROR;
-            return;
-        }
-        if (coll->freeReorderCodesOnClose == TRUE) {
-            uprv_free(coll->reorderCodes);
-        }
-        coll->reorderCodes = NULL;
-        coll->freeReorderCodesOnClose = FALSE;
-
-        if (coll->leadBytePermutationTable != NULL && coll->freeLeadBytePermutationTableOnClose == TRUE) {
-            uprv_free(coll->leadBytePermutationTable);
-        }
-        coll->leadBytePermutationTable = NULL;
-        coll->freeLeadBytePermutationTableOnClose = FALSE;
-
-        if (coll->defaultReorderCodesLength == 0) {
-            return;
-        }
-        
-        coll->reorderCodes = (int32_t*)uprv_malloc(coll->defaultReorderCodesLength * sizeof(int32_t));
-        if (coll->reorderCodes == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        coll->freeReorderCodesOnClose = TRUE;
-        coll->reorderCodesLength = coll->defaultReorderCodesLength;
-        uprv_memcpy(coll->reorderCodes, coll->defaultReorderCodes, coll->reorderCodesLength * sizeof(int32_t));
-    }
-
-    if (coll->leadBytePermutationTable == NULL) {
-        coll->leadBytePermutationTable = (uint8_t*)uprv_malloc(256*sizeof(uint8_t));
-        if (coll->leadBytePermutationTable == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        coll->freeLeadBytePermutationTableOnClose = TRUE;
-    }
-
-    int32_t internalReorderCodesLength = coll->reorderCodesLength + (UCOL_REORDER_CODE_LIMIT - UCOL_REORDER_CODE_FIRST);
-    LocalMemory<int32_t> internalReorderCodes((int32_t*)uprv_malloc(internalReorderCodesLength * sizeof(int32_t)));
-    if (internalReorderCodes.isNull()) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        if (coll->leadBytePermutationTable != NULL && coll->freeLeadBytePermutationTableOnClose == TRUE) {
-            uprv_free(coll->leadBytePermutationTable);
-        }
-        coll->leadBytePermutationTable = NULL;
-        coll->freeLeadBytePermutationTableOnClose = FALSE;
-        return;
-    }
-
-    // prefill the reordering codes with the leading entries
-    for (uint32_t codeIndex = 0; codeIndex < (UCOL_REORDER_CODE_LIMIT - UCOL_REORDER_CODE_FIRST); codeIndex++) {
-        internalReorderCodes[codeIndex] = UCOL_REORDER_CODE_FIRST + codeIndex;
-    }
-    for (int32_t codeIndex = 0; codeIndex < coll->reorderCodesLength; codeIndex++) {
-        uint32_t reorderCodesCode = coll->reorderCodes[codeIndex];
-        internalReorderCodes[codeIndex + (UCOL_REORDER_CODE_LIMIT - UCOL_REORDER_CODE_FIRST)] = reorderCodesCode;
-        if (reorderCodesCode >= UCOL_REORDER_CODE_FIRST && reorderCodesCode < UCOL_REORDER_CODE_LIMIT) {
-            internalReorderCodes[reorderCodesCode - UCOL_REORDER_CODE_FIRST] = UCOL_REORDER_CODE_IGNORE;
-        }
-    }
-
-    for (int i = 0; i < 256; i++) {
-        if (i < toBottom || i > toTop) {
-            permutationSlotFilled[i] = true;
-            newLeadByteUsed[i] = true;
-            coll->leadBytePermutationTable[i] = i;
-        } else {
-            permutationSlotFilled[i] = false;
-            newLeadByteUsed[i] = false;
-            coll->leadBytePermutationTable[i] = 0;
-        }
-    }
-    
-    /* Start from the front of the list and place each script we encounter at the
-     * earliest possible locatation in the permutation table. If we encounter
-     * UNKNOWN, start processing from the back, and place each script in the last
-     * possible location. At each step, we also need to make sure that any scripts
-     * that need to not be moved are copied to their same location in the final table.
-     */
-    for (int reorderCodesCount = 0; reorderCodesCount < internalReorderCodesLength; reorderCodesCount++) {
-        reorderCodesIndex += fromTheBottom ? 1 : -1;
-        int32_t next = internalReorderCodes[reorderCodesIndex];
-        if (next == UCOL_REORDER_CODE_IGNORE) {
-            continue;
-        }
-        if (next == USCRIPT_UNKNOWN) {
-            if (fromTheBottom == false) {
-                // double turnaround
-                *status = U_ILLEGAL_ARGUMENT_ERROR;
-                if (coll->leadBytePermutationTable != NULL && coll->freeLeadBytePermutationTableOnClose == TRUE) {
-                    uprv_free(coll->leadBytePermutationTable);
-                }
-                coll->leadBytePermutationTable = NULL;
-                coll->freeLeadBytePermutationTableOnClose = FALSE;
-                coll->reorderCodesLength = 0;
-                return;
-            }
-            fromTheBottom = false;
-            reorderCodesIndex = internalReorderCodesLength;
-            continue;
-        }
-        
-        uint16_t leadByteCount = ucol_getLeadBytesForReorderCode(coll->UCA, next, leadBytes, leadBytesSize);
-        if (fromTheBottom) {
-            for (int leadByteIndex = 0; leadByteIndex < leadByteCount; leadByteIndex++) {
-                // don't place a lead byte twice in the permutation table
-                if (permutationSlotFilled[leadBytes[leadByteIndex]]) {
-                    // lead byte already used
-                    *status = U_ILLEGAL_ARGUMENT_ERROR;
-                    if (coll->leadBytePermutationTable != NULL && coll->freeLeadBytePermutationTableOnClose == TRUE) {
-                        uprv_free(coll->leadBytePermutationTable);
-                    }
-                    coll->leadBytePermutationTable = NULL;
-                    coll->freeLeadBytePermutationTableOnClose = FALSE;
-                    coll->reorderCodesLength = 0;
-                    return;
-                }
-   
-                coll->leadBytePermutationTable[leadBytes[leadByteIndex]] = toBottom;
-                newLeadByteUsed[toBottom] = true;
-                permutationSlotFilled[leadBytes[leadByteIndex]] = true;
-                toBottom++;
-            }
-        } else {
-            for (int leadByteIndex = leadByteCount - 1; leadByteIndex >= 0; leadByteIndex--) {
-                // don't place a lead byte twice in the permutation table
-                if (permutationSlotFilled[leadBytes[leadByteIndex]]) {
-                    // lead byte already used
-                    *status = U_ILLEGAL_ARGUMENT_ERROR;
-                    if (coll->leadBytePermutationTable != NULL && coll->freeLeadBytePermutationTableOnClose == TRUE) {
-                        uprv_free(coll->leadBytePermutationTable);
-                    }
-                    coll->leadBytePermutationTable = NULL;
-                    coll->freeLeadBytePermutationTableOnClose = FALSE;
-                    coll->reorderCodesLength = 0;
-                    return;
-                }
-
-                coll->leadBytePermutationTable[leadBytes[leadByteIndex]] = toTop;
-                newLeadByteUsed[toTop] = true;
-                permutationSlotFilled[leadBytes[leadByteIndex]] = true;
-                toTop--;
-            }
-        }
-    }
-    
-#ifdef REORDER_DEBUG
-    fprintf(stdout, "\n@@@@ Partial Script Reordering Table\n");
-    for (int i = 0; i < 256; i++) {
-        fprintf(stdout, "\t%02x = %02x\n", i, coll->leadBytePermutationTable[i]);
-    }
-    fprintf(stdout, "\n@@@@ Lead Byte Used Table\n");
-    for (int i = 0; i < 256; i++) {
-        fprintf(stdout, "\t%02x = %02x\n", i, newLeadByteUsed[i]);
-    }
-    fprintf(stdout, "\n@@@@ Permutation Slot Filled Table\n");
-    for (int i = 0; i < 256; i++) {
-        fprintf(stdout, "\t%02x = %02x\n", i, permutationSlotFilled[i]);
-    }
-#endif
-
-    /* Copy everything that's left over */
-    int reorderCode = 0;
-    for (int i = 0; i < 256; i++) {
-        if (!permutationSlotFilled[i]) {
-            while (reorderCode < 256 && newLeadByteUsed[reorderCode]) {
-                reorderCode++;
-            }
-            coll->leadBytePermutationTable[i] = reorderCode;
-            permutationSlotFilled[i] = true;
-            newLeadByteUsed[reorderCode] = true;
-        }
-    } 
-    
-#ifdef REORDER_DEBUG
-    fprintf(stdout, "\n@@@@ Script Reordering Table\n");
-    for (int i = 0; i < 256; i++) {
-        fprintf(stdout, "\t%02x = %02x\n", i, coll->leadBytePermutationTable[i]);
-    } 
-#endif
-
-    // force a regen of the latin one table since it is affected by the script reordering
-    coll->latinOneRegenTable = TRUE;
-    ucol_updateInternalState(coll, status);
-}
-
 #endif /* #if !UCONFIG_NO_COLLATION */
index d92ddf7569094f595b57fc2fbde2cf432359fb1e..15e0981bc3bdb0eb4bf3e0a298ecc2013cce1453 100644 (file)
@@ -1,6 +1,6 @@
 /*
 *******************************************************************************
-*   Copyright (C) 2004-2012, International Business Machines
+*   Copyright (C) 2004-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
 *   file name:  ucol_sit.cpp
 
 #include "unicode/ustring.h"
 #include "unicode/udata.h"
-
+#include "unicode/utf16.h"
 #include "utracimp.h"
 #include "ucol_imp.h"
-#include "ucol_tok.h"
 #include "cmemory.h"
 #include "cstring.h"
 #include "uresimp.h"
@@ -30,6 +29,8 @@
 
 #if !UCONFIG_NO_COLLATION
 
+#include "unicode/tblcoll.h"
+
 enum OptionsList {
     UCOL_SIT_LANGUAGE = 0,
     UCOL_SIT_SCRIPT   = 1,
@@ -126,21 +127,6 @@ static const AttributeConversion conversions[12] = {
 };
 
 
-static char
-ucol_sit_attributeValueToLetter(UColAttributeValue value, UErrorCode *status) {
-    uint32_t i = 0;
-    for(i = 0; i < sizeof(conversions)/sizeof(conversions[0]); i++) {
-        if(conversions[i].value == value) {
-            return conversions[i].letter;
-        }
-    }
-    *status = U_ILLEGAL_ARGUMENT_ERROR;
-#ifdef UCOL_TRACE_SIT
-    fprintf(stderr, "%s:%d: unknown UColAttributeValue %d: %s\n", __FILE__, __LINE__, value, u_errorName(*status));
-#endif    
-    return 0;
-}
-
 static UColAttributeValue
 ucol_sit_letterToAttributeValue(char letter, UErrorCode *status) {
     uint32_t i = 0;
@@ -571,23 +557,6 @@ ucol_openFromShortString( const char *definition,
 }
 
 
-static void appendShortStringElement(const char *src, int32_t len, char *result, int32_t *resultSize, int32_t capacity, char arg)
-{
-    if(len) {
-        if(*resultSize) {
-            if(*resultSize < capacity) {
-                uprv_strcat(result, "_");
-            }
-            (*resultSize)++;
-        }
-        *resultSize += len + 1;
-        if(*resultSize < capacity) {
-            uprv_strncat(result, &arg, 1);
-            uprv_strncat(result, src, len);
-        }
-    }
-}
-
 U_CAPI int32_t U_EXPORT2
 ucol_getShortDefinitionString(const UCollator *coll,
                               const char *locale,
@@ -596,59 +565,11 @@ ucol_getShortDefinitionString(const UCollator *coll,
                               UErrorCode *status)
 {
     if(U_FAILURE(*status)) return 0;
-    if(coll->delegate != NULL) {
-      return ((icu::Collator*)coll->delegate)->internalGetShortDefinitionString(locale,dst,capacity,*status);
-    }
-    char buffer[internalBufferSize];
-    uprv_memset(buffer, 0, internalBufferSize*sizeof(char));
-    int32_t resultSize = 0;
-    char tempbuff[internalBufferSize];
-    char locBuff[internalBufferSize];
-    uprv_memset(buffer, 0, internalBufferSize*sizeof(char));
-    int32_t elementSize = 0;
-    UBool isAvailable = 0;
-    CollatorSpec s;
-    ucol_sit_initCollatorSpecs(&s);
-
-    if(!locale) {
-        locale = ucol_getLocaleByType(coll, ULOC_VALID_LOCALE, status);
-    }
-    elementSize = ucol_getFunctionalEquivalent(locBuff, internalBufferSize, "collation", locale, &isAvailable, status);
-
-    if(elementSize) {
-        // we should probably canonicalize here...
-        elementSize = uloc_getLanguage(locBuff, tempbuff, internalBufferSize, status);
-        appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, /*capacity*/internalBufferSize, languageArg);
-        elementSize = uloc_getCountry(locBuff, tempbuff, internalBufferSize, status);
-        appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, /*capacity*/internalBufferSize, regionArg);
-        elementSize = uloc_getScript(locBuff, tempbuff, internalBufferSize, status);
-        appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, /*capacity*/internalBufferSize, scriptArg);
-        elementSize = uloc_getVariant(locBuff, tempbuff, internalBufferSize, status);
-        appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, /*capacity*/internalBufferSize, variantArg);
-        elementSize = uloc_getKeywordValue(locBuff, "collation", tempbuff, internalBufferSize, status);
-        appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, /*capacity*/internalBufferSize, keywordArg);
-    }
-
-    int32_t i = 0;
-    UColAttributeValue attribute = UCOL_DEFAULT;
-    for(i = 0; i < UCOL_SIT_ITEMS_COUNT; i++) {
-        if(options[i].action == _processCollatorOption) {
-            attribute = ucol_getAttributeOrDefault(coll, (UColAttribute)options[i].attr, status);
-            if(attribute != UCOL_DEFAULT) {
-                char letter = ucol_sit_attributeValueToLetter(attribute, status);
-                appendShortStringElement(&letter, 1,
-                    buffer, &resultSize, /*capacity*/internalBufferSize, options[i].optionStart);
-            }
-        }
-    }
-    if(coll->variableTopValueisDefault == FALSE) {
-        //s.variableTopValue = ucol_getVariableTop(coll, status);
-        elementSize = T_CString_integerToString(tempbuff, coll->variableTopValue, 16);
-        appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, capacity, variableTopValArg);
+    if(coll == NULL) {
+        *status = U_ILLEGAL_ARGUMENT_ERROR;
+        return 0;
     }
-
-    UParseError parseError;
-    return ucol_normalizeShortDefinitionString(buffer, dst, capacity, &parseError, status);
+    return ((icu::Collator*)coll)->internalGetShortDefinitionString(locale,dst,capacity,*status);
 }
 
 U_CAPI int32_t U_EXPORT2
@@ -679,164 +600,6 @@ ucol_normalizeShortDefinitionString(const char *definition,
     return ucol_sit_dumpSpecs(&s, destination, capacity, status);
 }
 
-U_CAPI UColAttributeValue  U_EXPORT2
-ucol_getAttributeOrDefault(const UCollator *coll, UColAttribute attr, UErrorCode *status)
-{
-    if(U_FAILURE(*status) || coll == NULL) {
-      return UCOL_DEFAULT;
-    }
-    switch(attr) {
-    case UCOL_NUMERIC_COLLATION:
-        return coll->numericCollationisDefault?UCOL_DEFAULT:coll->numericCollation;
-    case UCOL_HIRAGANA_QUATERNARY_MODE:
-        return coll->hiraganaQisDefault?UCOL_DEFAULT:coll->hiraganaQ;
-    case UCOL_FRENCH_COLLATION: /* attribute for direction of secondary weights*/
-        return coll->frenchCollationisDefault?UCOL_DEFAULT:coll->frenchCollation;
-    case UCOL_ALTERNATE_HANDLING: /* attribute for handling variable elements*/
-        return coll->alternateHandlingisDefault?UCOL_DEFAULT:coll->alternateHandling;
-    case UCOL_CASE_FIRST: /* who goes first, lower case or uppercase */
-        return coll->caseFirstisDefault?UCOL_DEFAULT:coll->caseFirst;
-    case UCOL_CASE_LEVEL: /* do we have an extra case level */
-        return coll->caseLevelisDefault?UCOL_DEFAULT:coll->caseLevel;
-    case UCOL_NORMALIZATION_MODE: /* attribute for normalization */
-        return coll->normalizationModeisDefault?UCOL_DEFAULT:coll->normalizationMode;
-    case UCOL_STRENGTH:         /* attribute for strength */
-        return coll->strengthisDefault?UCOL_DEFAULT:coll->strength;
-    case UCOL_ATTRIBUTE_COUNT:
-    default:
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-#ifdef UCOL_TRACE_SIT
-        fprintf(stderr, "%s:%d: Unknown attr value '%d': %s\n", __FILE__, __LINE__, (int)attr, u_errorName(*status));
-#endif
-        break;
-    }
-    return UCOL_DEFAULT;
-}
-
-
-struct contContext {
-    const UCollator *coll;
-    USet            *conts;
-    USet            *expansions;
-    USet            *removedContractions;
-    UBool           addPrefixes;
-    UErrorCode      *status;
-};
-
-
-
-static void
-addSpecial(contContext *context, UChar *buffer, int32_t bufLen,
-               uint32_t CE, int32_t leftIndex, int32_t rightIndex, UErrorCode *status)
-{
-  const UCollator *coll = context->coll;
-  USet *contractions = context->conts;
-  USet *expansions = context->expansions;
-  UBool addPrefixes = context->addPrefixes;
-
-    const UChar *UCharOffset = (UChar *)coll->image+getContractOffset(CE);
-    uint32_t newCE = *(coll->contractionCEs + (UCharOffset - coll->contractionIndex));
-    // we might have a contraction that ends from previous level
-    if(newCE != UCOL_NOT_FOUND) {
-      if(isSpecial(CE) && getCETag(CE) == CONTRACTION_TAG && isSpecial(newCE) && getCETag(newCE) == SPEC_PROC_TAG && addPrefixes) {
-        addSpecial(context, buffer, bufLen, newCE, leftIndex, rightIndex, status);
-      }
-      if(contractions && rightIndex-leftIndex > 1) {
-            uset_addString(contractions, buffer+leftIndex, rightIndex-leftIndex);
-            if(expansions && isSpecial(CE) && getCETag(CE) == EXPANSION_TAG) {
-              uset_addString(expansions, buffer+leftIndex, rightIndex-leftIndex);
-            }
-      }
-    }
-
-    UCharOffset++;
-    // check whether we're doing contraction or prefix
-    if(getCETag(CE) == SPEC_PROC_TAG && addPrefixes) {
-      if(leftIndex == 0) {
-          *status = U_INTERNAL_PROGRAM_ERROR;
-          return;
-      }
-      --leftIndex;
-      while(*UCharOffset != 0xFFFF) {
-          newCE = *(coll->contractionCEs + (UCharOffset - coll->contractionIndex));
-          buffer[leftIndex] = *UCharOffset;
-          if(isSpecial(newCE) && (getCETag(newCE) == CONTRACTION_TAG || getCETag(newCE) == SPEC_PROC_TAG)) {
-              addSpecial(context, buffer, bufLen, newCE, leftIndex, rightIndex, status);
-          } else {
-            if(contractions) {
-                uset_addString(contractions, buffer+leftIndex, rightIndex-leftIndex);
-            }
-            if(expansions && isSpecial(newCE) && getCETag(newCE) == EXPANSION_TAG) {
-              uset_addString(expansions, buffer+leftIndex, rightIndex-leftIndex);
-            }
-          }
-          UCharOffset++;
-      }
-    } else if(getCETag(CE) == CONTRACTION_TAG) {
-      if(rightIndex == bufLen-1) {
-          *status = U_INTERNAL_PROGRAM_ERROR;
-          return;
-      }
-      while(*UCharOffset != 0xFFFF) {
-          newCE = *(coll->contractionCEs + (UCharOffset - coll->contractionIndex));
-          buffer[rightIndex] = *UCharOffset;
-          if(isSpecial(newCE) && (getCETag(newCE) == CONTRACTION_TAG || getCETag(newCE) == SPEC_PROC_TAG)) {
-              addSpecial(context, buffer, bufLen, newCE, leftIndex, rightIndex+1, status);
-          } else {
-            if(contractions) {
-              uset_addString(contractions, buffer+leftIndex, rightIndex+1-leftIndex);
-            }
-            if(expansions && isSpecial(newCE) && getCETag(newCE) == EXPANSION_TAG) {
-              uset_addString(expansions, buffer+leftIndex, rightIndex+1-leftIndex);
-            }
-          }
-          UCharOffset++;
-      }
-    }
-
-}
-
-U_CDECL_BEGIN
-static UBool U_CALLCONV
-_processSpecials(const void *context, UChar32 start, UChar32 limit, uint32_t CE)
-{
-    UErrorCode *status = ((contContext *)context)->status;
-    USet *expansions = ((contContext *)context)->expansions;
-    USet *removed = ((contContext *)context)->removedContractions;
-    UBool addPrefixes = ((contContext *)context)->addPrefixes;
-    UChar contraction[internalBufferSize];
-    if(isSpecial(CE)) {
-      if(((getCETag(CE) == SPEC_PROC_TAG && addPrefixes) || getCETag(CE) == CONTRACTION_TAG)) {
-        while(start < limit && U_SUCCESS(*status)) {
-            // if there are suppressed contractions, we don't
-            // want to add them.
-            if(removed && uset_contains(removed, start)) {
-                start++;
-                continue;
-            }
-            // we start our contraction from middle, since we don't know if it
-            // will grow toward right or left
-            contraction[internalBufferSize/2] = (UChar)start;
-            addSpecial(((contContext *)context), contraction, internalBufferSize, CE, internalBufferSize/2, internalBufferSize/2+1, status);
-            start++;
-        }
-      } else if(expansions && getCETag(CE) == EXPANSION_TAG) {
-        while(start < limit && U_SUCCESS(*status)) {
-          uset_add(expansions, start++);
-        }
-      }
-    }
-    if(U_FAILURE(*status)) {
-        return FALSE;
-    } else {
-        return TRUE;
-    }
-}
-
-U_CDECL_END
-
-
-
 /**
  * Get a set containing the contractions defined by the collator. The set includes
  * both the UCA contractions and the contractions defined by the collator
@@ -878,78 +641,14 @@ ucol_getContractionsAndExpansions( const UCollator *coll,
         *status = U_ILLEGAL_ARGUMENT_ERROR;
         return;
     }
-
-    if(contractions) {
-      uset_clear(contractions);
-    }
-    if(expansions) {
-      uset_clear(expansions);
-    }
-    int32_t rulesLen = 0;
-    const UChar* rules = ucol_getRules(coll, &rulesLen);
-    UColTokenParser src;
-    ucol_tok_initTokenList(&src, rules, rulesLen, coll->UCA,
-                           ucol_tok_getRulesFromBundle, NULL, status);
-
-    contContext c = { NULL, contractions, expansions, src.removeSet, addPrefixes, status };
-
-    // Add the UCA contractions
-    c.coll = coll->UCA;
-    utrie_enum(&coll->UCA->mapping, NULL, _processSpecials, &c);
-
-    // This is collator specific. Add contractions from a collator
-    c.coll = coll;
-    c.removedContractions =  NULL;
-    utrie_enum(&coll->mapping, NULL, _processSpecials, &c);
-    ucol_tok_closeTokenList(&src);
-}
-
-U_CAPI int32_t U_EXPORT2
-ucol_getUnsafeSet( const UCollator *coll,
-                  USet *unsafe,
-                  UErrorCode *status)
-{
-    UChar buffer[internalBufferSize];
-    int32_t len = 0;
-
-    uset_clear(unsafe);
-
-    // cccpattern = "[[:^tccc=0:][:^lccc=0:]]", unfortunately variant
-    static const UChar cccpattern[25] = { 0x5b, 0x5b, 0x3a, 0x5e, 0x74, 0x63, 0x63, 0x63, 0x3d, 0x30, 0x3a, 0x5d,
-                                    0x5b, 0x3a, 0x5e, 0x6c, 0x63, 0x63, 0x63, 0x3d, 0x30, 0x3a, 0x5d, 0x5d, 0x00 };
-
-    // add chars that fail the fcd check
-    uset_applyPattern(unsafe, cccpattern, 24, USET_IGNORE_SPACE, status);
-
-    // add Thai/Lao prevowels
-    uset_addRange(unsafe, 0xe40, 0xe44);
-    uset_addRange(unsafe, 0xec0, 0xec4);
-    // add lead/trail surrogates
-    uset_addRange(unsafe, 0xd800, 0xdfff);
-
-    USet *contractions = uset_open(0,0);
-
-    int32_t i = 0, j = 0;
-    int32_t contsSize = ucol_getContractions(coll, contractions, status);
-    UChar32 c = 0;
-    // Contraction set consists only of strings
-    // to get unsafe code points, we need to
-    // break the strings apart and add them to the unsafe set
-    for(i = 0; i < contsSize; i++) {
-        len = uset_getItem(contractions, i, NULL, NULL, buffer, internalBufferSize, status);
-        if(len > 0) {
-            j = 0;
-            while(j < len) {
-                U16_NEXT(buffer, j, len, c);
-                if(j < len) {
-                    uset_add(unsafe, c);
-                }
-            }
-        }
+    const icu::RuleBasedCollator *rbc = icu::RuleBasedCollator::rbcFromUCollator(coll);
+    if(rbc == NULL) {
+        *status = U_UNSUPPORTED_ERROR;
+        return;
     }
-
-    uset_close(contractions);
-
-    return uset_size(unsafe);
+    rbc->internalGetContractionsAndExpansions(
+            icu::UnicodeSet::fromUSet(contractions),
+            icu::UnicodeSet::fromUSet(expansions),
+            addPrefixes, *status);
 }
 #endif
diff --git a/icu4c/source/i18n/ucol_tok.cpp b/icu4c/source/i18n/ucol_tok.cpp
deleted file mode 100644 (file)
index dc20d99..0000000
+++ /dev/null
@@ -1,2456 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 2001-2013, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  ucol_tok.cpp
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created 02/22/2001
-*   created by: Vladimir Weinstein
-*
-* This module reads a tailoring rule string and produces a list of
-* tokens that will be turned into collation elements
-*
-*/
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION
-
-#include "unicode/uscript.h"
-#include "unicode/ustring.h"
-#include "unicode/uchar.h"
-#include "unicode/uniset.h"
-
-#include "cmemory.h"
-#include "cstring.h"
-#include "patternprops.h"
-#include "ucol_bld.h"
-#include "ucol_tok.h"
-#include "ulocimp.h"
-#include "uresimp.h"
-
-// Define this only for debugging.
-// #define DEBUG_FOR_COLL_RULES 1
-
-#ifdef DEBUG_FOR_COLL_RULES
-#include <iostream>
-#endif
-
-U_NAMESPACE_USE
-
-U_CDECL_BEGIN
-static int32_t U_CALLCONV
-uhash_hashTokens(const UHashTok k)
-{
-    int32_t hash = 0;
-    //uint32_t key = (uint32_t)k.integer;
-    UColToken *key = (UColToken *)k.pointer;
-    if (key != 0) {
-        int32_t len = (key->source & 0xFF000000)>>24;
-        int32_t inc = ((len - 32) / 32) + 1;
-
-        const UChar *p = (key->source & 0x00FFFFFF) + *(key->rulesToParseHdl);
-        const UChar *limit = p + len;
-
-        while (p<limit) {
-            hash = (hash * 37) + *p;
-            p += inc;
-        }
-    }
-    return hash;
-}
-
-static UBool U_CALLCONV
-uhash_compareTokens(const UHashTok key1, const UHashTok key2)
-{
-    //uint32_t p1 = (uint32_t) key1.integer;
-    //uint32_t p2 = (uint32_t) key2.integer;
-    UColToken *p1 = (UColToken *)key1.pointer;
-    UColToken *p2 = (UColToken *)key2.pointer;
-    const UChar *s1 = (p1->source & 0x00FFFFFF) + *(p1->rulesToParseHdl);
-    const UChar *s2 = (p2->source & 0x00FFFFFF) + *(p2->rulesToParseHdl);
-    uint32_t s1L = ((p1->source & 0xFF000000) >> 24);
-    uint32_t s2L = ((p2->source & 0xFF000000) >> 24);
-    const UChar *end = s1+s1L-1;
-
-    if (p1 == p2) {
-        return TRUE;
-    }
-    if (p1->source == 0 || p2->source == 0) {
-        return FALSE;
-    }
-    if(s1L != s2L) {
-        return FALSE;
-    }
-    if(p1->source == p2->source) {
-        return TRUE;
-    }
-    while((s1 < end) && *s1 == *s2) {
-        ++s1;
-        ++s2;
-    }
-    if(*s1 == *s2) {
-        return TRUE;
-    } else {
-        return FALSE;
-    }
-}
-U_CDECL_END
-
-/*
- * Debug messages used to pinpoint where a format error occurred.
- * A better way is to include context-sensitive information in syntaxError() function.
- *
- * To turn this debugging on, either uncomment the following line, or define use -DDEBUG_FOR_FORMAT_ERROR
- * in the compile line.
- */
-/* #define DEBUG_FOR_FORMAT_ERROR 1 */
-
-#ifdef DEBUG_FOR_FORMAT_ERROR
-#define DBG_FORMAT_ERROR { printf("U_INVALID_FORMAT_ERROR at line %d", __LINE__);}
-#else
-#define DBG_FORMAT_ERROR
-#endif
-
-
-/*
- * Controls debug messages so that the output can be compared before and after a
- * big change.  Prints the information of every code point that comes out of the
- * collation parser and its strength into a file.  When a big change in format
- * happens, the files before and after the change should be identical.
- *
- * To turn this debugging on, either uncomment the following line, or define use -DDEBUG_FOR_CODE_POINTS
- * in the compile line.
- */
-// #define DEBUG_FOR_CODE_POINTS 1
-
-#ifdef DEBUG_FOR_CODE_POINTS
-    FILE* dfcp_fp = NULL;
-#endif
-
-
-typedef struct {
-    uint32_t startCE;
-    uint32_t startContCE;
-    uint32_t limitCE;
-    uint32_t limitContCE;
-} indirectBoundaries;
-
-/* these values are used for finding CE values for indirect positioning. */
-/* Indirect positioning is a mechanism for allowing resets on symbolic   */
-/* values. It only works for resets and you cannot tailor indirect names */
-/* An indirect name can define either an anchor point or a range. An     */
-/* anchor point behaves in exactly the same way as a code point in reset */
-/* would, except that it cannot be tailored. A range (we currently only  */
-/* know for the [top] range will explicitly set the upper bound for      */
-/* generated CEs, thus allowing for better control over how many CEs can */
-/* be squeezed between in the range without performance penalty.         */
-/* In that respect, we use [top] for tailoring of locales that use CJK   */
-/* characters. Other indirect values are currently a pure convenience,   */
-/* they can be used to assure that the CEs will be always positioned in  */
-/* the same place relative to a point with known properties (e.g. first  */
-/* primary ignorable). */
-static indirectBoundaries ucolIndirectBoundaries[15];
-/*
-static indirectBoundaries ucolIndirectBoundaries[11] = {
-{ UCOL_RESET_TOP_VALUE,               0,
-UCOL_NEXT_TOP_VALUE,                0 },
-{ UCOL_FIRST_PRIMARY_IGNORABLE,       0,
-0,                                  0 },
-{ UCOL_LAST_PRIMARY_IGNORABLE,        UCOL_LAST_PRIMARY_IGNORABLE_CONT,
-0,                                  0 },
-{ UCOL_FIRST_SECONDARY_IGNORABLE,     0,
-0,                                  0 },
-{ UCOL_LAST_SECONDARY_IGNORABLE,      0,
-0,                                  0 },
-{ UCOL_FIRST_TERTIARY_IGNORABLE,      0,
-0,                                  0 },
-{ UCOL_LAST_TERTIARY_IGNORABLE,       0,
-0,                                  0 },
-{ UCOL_FIRST_VARIABLE,                0,
-0,                                  0 },
-{ UCOL_LAST_VARIABLE,                 0,
-0,                                  0 },
-{ UCOL_FIRST_NON_VARIABLE,            0,
-0,                                  0 },
-{ UCOL_LAST_NON_VARIABLE,             0,
-0,                                  0 },
-};
-*/
-
-static void setIndirectBoundaries(uint32_t indexR, uint32_t *start, uint32_t *end) {
-
-    // Set values for the top - TODO: once we have values for all the indirects, we are going
-    // to initalize here.
-    ucolIndirectBoundaries[indexR].startCE = start[0];
-    ucolIndirectBoundaries[indexR].startContCE = start[1];
-    if(end) {
-        ucolIndirectBoundaries[indexR].limitCE = end[0];
-        ucolIndirectBoundaries[indexR].limitContCE = end[1];
-    } else {
-        ucolIndirectBoundaries[indexR].limitCE = 0;
-        ucolIndirectBoundaries[indexR].limitContCE = 0;
-    }
-}
-
-
-static inline
-void syntaxError(const UChar* rules,
-                 int32_t pos,
-                 int32_t rulesLen,
-                 UParseError* parseError)
-{
-    parseError->offset = pos;
-    parseError->line = 0 ; /* we are not using line numbers */
-
-    // for pre-context
-    int32_t start = (pos < U_PARSE_CONTEXT_LEN)? 0 : (pos - (U_PARSE_CONTEXT_LEN-1));
-    int32_t stop  = pos;
-
-    u_memcpy(parseError->preContext,rules+start,stop-start);
-    //null terminate the buffer
-    parseError->preContext[stop-start] = 0;
-
-    //for post-context
-    start = pos+1;
-    stop  = ((pos+U_PARSE_CONTEXT_LEN)<= rulesLen )? (pos+(U_PARSE_CONTEXT_LEN-1)) :
-    rulesLen;
-
-    if(start < stop) {
-        u_memcpy(parseError->postContext,rules+start,stop-start);
-        //null terminate the buffer
-        parseError->postContext[stop-start]= 0;
-    } else {
-        parseError->postContext[0] = 0;
-    }
-}
-
-static
-void ucol_uprv_tok_setOptionInImage(UColOptionSet *opts, UColAttribute attrib, UColAttributeValue value) {
-    switch(attrib) {
-    case UCOL_HIRAGANA_QUATERNARY_MODE:
-        opts->hiraganaQ = value;
-        break;
-    case UCOL_FRENCH_COLLATION:
-        opts->frenchCollation = value;
-        break;
-    case UCOL_ALTERNATE_HANDLING:
-        opts->alternateHandling = value;
-        break;
-    case UCOL_CASE_FIRST:
-        opts->caseFirst = value;
-        break;
-    case UCOL_CASE_LEVEL:
-        opts->caseLevel = value;
-        break;
-    case UCOL_NORMALIZATION_MODE:
-        opts->normalizationMode = value;
-        break;
-    case UCOL_STRENGTH:
-        opts->strength = value;
-        break;
-    case UCOL_NUMERIC_COLLATION:
-        opts->numericCollation = value;
-        break;
-    case UCOL_ATTRIBUTE_COUNT:
-    default:
-        break;
-    }
-}
-
-#define UTOK_OPTION_COUNT 22
-
-static UBool didInit = FALSE;
-/* we can be strict, or we can be lenient */
-/* I'd surely be lenient with the option arguments */
-/* maybe even with options */
-U_STRING_DECL(suboption_00, "non-ignorable", 13);
-U_STRING_DECL(suboption_01, "shifted",        7);
-
-U_STRING_DECL(suboption_02, "lower",          5);
-U_STRING_DECL(suboption_03, "upper",          5);
-U_STRING_DECL(suboption_04, "off",            3);
-U_STRING_DECL(suboption_05, "on",             2);
-U_STRING_DECL(suboption_06, "1",              1);
-U_STRING_DECL(suboption_07, "2",              1);
-U_STRING_DECL(suboption_08, "3",              1);
-U_STRING_DECL(suboption_09, "4",              1);
-U_STRING_DECL(suboption_10, "I",              1);
-
-U_STRING_DECL(suboption_11, "primary",        7);
-U_STRING_DECL(suboption_12, "secondary",      9);
-U_STRING_DECL(suboption_13, "tertiary",       8);
-U_STRING_DECL(suboption_14, "variable",       8);
-U_STRING_DECL(suboption_15, "regular",        7);
-U_STRING_DECL(suboption_16, "implicit",       8);
-U_STRING_DECL(suboption_17, "trailing",       8);
-
-
-U_STRING_DECL(option_00,    "undefined",      9);
-U_STRING_DECL(option_01,    "rearrange",      9);
-U_STRING_DECL(option_02,    "alternate",      9);
-U_STRING_DECL(option_03,    "backwards",      9);
-U_STRING_DECL(option_04,    "variable top",  12);
-U_STRING_DECL(option_05,    "top",            3);
-U_STRING_DECL(option_06,    "normalization", 13);
-U_STRING_DECL(option_07,    "caseLevel",      9);
-U_STRING_DECL(option_08,    "caseFirst",      9);
-U_STRING_DECL(option_09,    "scriptOrder",   11);
-U_STRING_DECL(option_10,    "charsetname",   11);
-U_STRING_DECL(option_11,    "charset",        7);
-U_STRING_DECL(option_12,    "before",         6);
-U_STRING_DECL(option_13,    "hiraganaQ",      9);
-U_STRING_DECL(option_14,    "strength",       8);
-U_STRING_DECL(option_15,    "first",          5);
-U_STRING_DECL(option_16,    "last",           4);
-U_STRING_DECL(option_17,    "optimize",       8);
-U_STRING_DECL(option_18,    "suppressContractions",         20);
-U_STRING_DECL(option_19,    "numericOrdering",              15);
-U_STRING_DECL(option_20,    "import",         6);
-U_STRING_DECL(option_21,    "reorder",         7);
-
-/*
-[last variable] last variable value
-[last primary ignorable] largest CE for primary ignorable
-[last secondary ignorable] largest CE for secondary ignorable
-[last tertiary ignorable] largest CE for tertiary ignorable
-[top] guaranteed to be above all implicit CEs, for now and in the future (in 1.8)
-*/
-
-
-static const ucolTokSuboption alternateSub[2] = {
-    {suboption_00, 13, UCOL_NON_IGNORABLE},
-    {suboption_01,  7, UCOL_SHIFTED}
-};
-
-static const ucolTokSuboption caseFirstSub[3] = {
-    {suboption_02, 5, UCOL_LOWER_FIRST},
-    {suboption_03,  5, UCOL_UPPER_FIRST},
-    {suboption_04,  3, UCOL_OFF},
-};
-
-static const ucolTokSuboption onOffSub[2] = {
-    {suboption_04, 3, UCOL_OFF},
-    {suboption_05, 2, UCOL_ON}
-};
-
-static const ucolTokSuboption frenchSub[1] = {
-    {suboption_07, 1, UCOL_ON}
-};
-
-static const ucolTokSuboption beforeSub[3] = {
-    {suboption_06, 1, UCOL_PRIMARY},
-    {suboption_07, 1, UCOL_SECONDARY},
-    {suboption_08, 1, UCOL_TERTIARY}
-};
-
-static const ucolTokSuboption strengthSub[5] = {
-    {suboption_06, 1, UCOL_PRIMARY},
-    {suboption_07, 1, UCOL_SECONDARY},
-    {suboption_08, 1, UCOL_TERTIARY},
-    {suboption_09, 1, UCOL_QUATERNARY},
-    {suboption_10, 1, UCOL_IDENTICAL},
-};
-
-static const ucolTokSuboption firstLastSub[7] = {
-    {suboption_11, 7, UCOL_PRIMARY},
-    {suboption_12, 9, UCOL_PRIMARY},
-    {suboption_13, 8, UCOL_PRIMARY},
-    {suboption_14, 8, UCOL_PRIMARY},
-    {suboption_15, 7, UCOL_PRIMARY},
-    {suboption_16, 8, UCOL_PRIMARY},
-    {suboption_17, 8, UCOL_PRIMARY},
-};
-
-enum OptionNumber {
-    OPTION_ALTERNATE_HANDLING = 0,
-    OPTION_FRENCH_COLLATION,
-    OPTION_CASE_LEVEL,
-    OPTION_CASE_FIRST,
-    OPTION_NORMALIZATION_MODE,
-    OPTION_HIRAGANA_QUATERNARY,
-    OPTION_STRENGTH,
-    OPTION_NUMERIC_COLLATION,
-    OPTION_NORMAL_OPTIONS_LIMIT = OPTION_NUMERIC_COLLATION,
-    OPTION_VARIABLE_TOP,
-    OPTION_REARRANGE,
-    OPTION_BEFORE,
-    OPTION_TOP,
-    OPTION_FIRST,
-    OPTION_LAST,
-    OPTION_OPTIMIZE,
-    OPTION_SUPPRESS_CONTRACTIONS,
-    OPTION_UNDEFINED,
-    OPTION_SCRIPT_ORDER,
-    OPTION_CHARSET_NAME,
-    OPTION_CHARSET,
-    OPTION_IMPORT,
-    OPTION_SCRIPTREORDER
-} ;
-
-static const ucolTokOption rulesOptions[UTOK_OPTION_COUNT] = {
-    /*00*/ {option_02,  9, alternateSub, 2, UCOL_ALTERNATE_HANDLING}, /*"alternate" */
-    /*01*/ {option_03,  9, frenchSub, 1, UCOL_FRENCH_COLLATION}, /*"backwards"      */
-    /*02*/ {option_07,  9, onOffSub, 2, UCOL_CASE_LEVEL},  /*"caseLevel"      */
-    /*03*/ {option_08,  9, caseFirstSub, 3, UCOL_CASE_FIRST}, /*"caseFirst"   */
-    /*04*/ {option_06, 13, onOffSub, 2, UCOL_NORMALIZATION_MODE}, /*"normalization" */
-    /*05*/ {option_13, 9, onOffSub, 2, UCOL_HIRAGANA_QUATERNARY_MODE}, /*"hiraganaQ" */
-    /*06*/ {option_14, 8, strengthSub, 5, UCOL_STRENGTH}, /*"strength" */
-    /*07*/ {option_19, 15, onOffSub, 2, UCOL_NUMERIC_COLLATION},  /*"numericOrdering"*/
-    /*08*/ {option_04, 12, NULL, 0, UCOL_ATTRIBUTE_COUNT}, /*"variable top"   */
-    /*09*/ {option_01,  9, NULL, 0, UCOL_ATTRIBUTE_COUNT}, /*"rearrange"      */
-    /*10*/ {option_12,  6, beforeSub, 3, UCOL_ATTRIBUTE_COUNT}, /*"before"    */
-    /*11*/ {option_05,  3, NULL, 0, UCOL_ATTRIBUTE_COUNT}, /*"top"            */
-    /*12*/ {option_15,  5, firstLastSub, 7, UCOL_ATTRIBUTE_COUNT}, /*"first" */
-    /*13*/ {option_16,  4, firstLastSub, 7, UCOL_ATTRIBUTE_COUNT}, /*"last" */
-    /*14*/ {option_17,  8, NULL, 0, UCOL_ATTRIBUTE_COUNT}, /*"optimize"      */
-    /*15*/ {option_18, 20, NULL, 0, UCOL_ATTRIBUTE_COUNT}, /*"suppressContractions"      */
-    /*16*/ {option_00,  9, NULL, 0, UCOL_ATTRIBUTE_COUNT}, /*"undefined"      */
-    /*17*/ {option_09, 11, NULL, 0, UCOL_ATTRIBUTE_COUNT}, /*"scriptOrder"    */
-    /*18*/ {option_10, 11, NULL, 0, UCOL_ATTRIBUTE_COUNT}, /*"charsetname"    */
-    /*19*/ {option_11,  7, NULL, 0, UCOL_ATTRIBUTE_COUNT},  /*"charset"        */
-    /*20*/ {option_20,  6, NULL, 0, UCOL_ATTRIBUTE_COUNT},  /*"import"        */
-    /*21*/ {option_21,  7, NULL, 0, UCOL_ATTRIBUTE_COUNT}  /*"reorder"        */
-};
-
-static
-int32_t u_strncmpNoCase(const UChar     *s1,
-                        const UChar     *s2,
-                        int32_t     n)
-{
-    if(n > 0) {
-        int32_t rc;
-        for(;;) {
-            rc = (int32_t)u_tolower(*s1) - (int32_t)u_tolower(*s2);
-            if(rc != 0 || *s1 == 0 || --n == 0) {
-                return rc;
-            }
-            ++s1;
-            ++s2;
-        }
-    }
-    return 0;
-}
-
-static
-void ucol_uprv_tok_initData() {
-    if(!didInit) {
-        U_STRING_INIT(suboption_00, "non-ignorable", 13);
-        U_STRING_INIT(suboption_01, "shifted",        7);
-
-        U_STRING_INIT(suboption_02, "lower",          5);
-        U_STRING_INIT(suboption_03, "upper",          5);
-        U_STRING_INIT(suboption_04, "off",            3);
-        U_STRING_INIT(suboption_05, "on",             2);
-
-        U_STRING_INIT(suboption_06, "1",              1);
-        U_STRING_INIT(suboption_07, "2",              1);
-        U_STRING_INIT(suboption_08, "3",              1);
-        U_STRING_INIT(suboption_09, "4",              1);
-        U_STRING_INIT(suboption_10, "I",              1);
-
-        U_STRING_INIT(suboption_11, "primary",        7);
-        U_STRING_INIT(suboption_12, "secondary",      9);
-        U_STRING_INIT(suboption_13, "tertiary",       8);
-        U_STRING_INIT(suboption_14, "variable",       8);
-        U_STRING_INIT(suboption_15, "regular",        7);
-        U_STRING_INIT(suboption_16, "implicit",       8);
-        U_STRING_INIT(suboption_17, "trailing",       8);
-
-
-        U_STRING_INIT(option_00, "undefined",      9);
-        U_STRING_INIT(option_01, "rearrange",      9);
-        U_STRING_INIT(option_02, "alternate",      9);
-        U_STRING_INIT(option_03, "backwards",      9);
-        U_STRING_INIT(option_04, "variable top",  12);
-        U_STRING_INIT(option_05, "top",            3);
-        U_STRING_INIT(option_06, "normalization", 13);
-        U_STRING_INIT(option_07, "caseLevel",      9);
-        U_STRING_INIT(option_08, "caseFirst",      9);
-        U_STRING_INIT(option_09, "scriptOrder",   11);
-        U_STRING_INIT(option_10, "charsetname",   11);
-        U_STRING_INIT(option_11, "charset",        7);
-        U_STRING_INIT(option_12, "before",         6);
-        U_STRING_INIT(option_13, "hiraganaQ",      9);
-        U_STRING_INIT(option_14, "strength",       8);
-        U_STRING_INIT(option_15, "first",          5);
-        U_STRING_INIT(option_16, "last",           4);
-        U_STRING_INIT(option_17, "optimize",       8);
-        U_STRING_INIT(option_18, "suppressContractions",         20);
-        U_STRING_INIT(option_19, "numericOrdering",      15);
-        U_STRING_INIT(option_20, "import ",        6);
-        U_STRING_INIT(option_21, "reorder",        7);
-        didInit = TRUE;
-    }
-}
-
-
-// This function reads basic options to set in the runtime collator
-// used by data driven tests. Should not support build time options
-U_CAPI const UChar * U_EXPORT2
-ucol_tok_getNextArgument(const UChar *start, const UChar *end,
-                         UColAttribute *attrib, UColAttributeValue *value,
-                         UErrorCode *status)
-{
-    uint32_t i = 0;
-    int32_t j=0;
-    UBool foundOption = FALSE;
-    const UChar *optionArg = NULL;
-
-    ucol_uprv_tok_initData();
-
-    while(start < end && PatternProps::isWhiteSpace(*start)) { /* eat whitespace */
-        start++;
-    }
-    if(start >= end) {
-        return NULL;
-    }
-    /* skip opening '[' */
-    if(*start == 0x005b) {
-        start++;
-    } else {
-        *status = U_ILLEGAL_ARGUMENT_ERROR; // no opening '['
-        return NULL;
-    }
-
-    while(i < UTOK_OPTION_COUNT) {
-        if(u_strncmpNoCase(start, rulesOptions[i].optionName, rulesOptions[i].optionLen) == 0) {
-            foundOption = TRUE;
-            if(end - start > rulesOptions[i].optionLen) {
-                optionArg = start+rulesOptions[i].optionLen+1; /* start of the options, skip space */
-                while(PatternProps::isWhiteSpace(*optionArg)) { /* eat whitespace */
-                    optionArg++;
-                }
-            }
-            break;
-        }
-        i++;
-    }
-
-    if(!foundOption) {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        return NULL;
-    }
-
-    if(optionArg) {
-        for(j = 0; j<rulesOptions[i].subSize; j++) {
-            if(u_strncmpNoCase(optionArg, rulesOptions[i].subopts[j].subName, rulesOptions[i].subopts[j].subLen) == 0) {
-                //ucol_uprv_tok_setOptionInImage(src->opts, rulesOptions[i].attr, rulesOptions[i].subopts[j].attrVal);
-                *attrib = rulesOptions[i].attr;
-                *value = rulesOptions[i].subopts[j].attrVal;
-                optionArg += rulesOptions[i].subopts[j].subLen;
-                while(PatternProps::isWhiteSpace(*optionArg)) { /* eat whitespace */
-                    optionArg++;
-                }
-                if(*optionArg == 0x005d) {
-                    optionArg++;
-                    return optionArg;
-                } else {
-                    *status = U_ILLEGAL_ARGUMENT_ERROR;
-                    return NULL;
-                }
-            }
-        }
-    }
-    *status = U_ILLEGAL_ARGUMENT_ERROR;
-    return NULL;
-}
-
-static
-USet *ucol_uprv_tok_readAndSetUnicodeSet(const UChar *start, const UChar *end, UErrorCode *status) {
-    while(*start != 0x005b) { /* advance while we find the first '[' */
-        start++;
-    }
-    // now we need to get a balanced set of '[]'. The problem is that a set can have
-    // many, and *end point to the first closing '['
-    int32_t noOpenBraces = 1;
-    int32_t current = 1; // skip the opening brace
-    while(start+current < end && noOpenBraces != 0) {
-        if(start[current] == 0x005b) {
-            noOpenBraces++;
-        } else if(start[current] == 0x005D) { // closing brace
-            noOpenBraces--;
-        }
-        current++;
-    }
-
-    if(noOpenBraces != 0 || u_strchr(start+current, 0x005d /*']'*/) == NULL) {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        return NULL;
-    }
-    return uset_openPattern(start, current, status);
-}
-
-/**
- * Reads an option and matches the option name with the predefined options. (Case-insensitive.)
- * @param start Pointer to the start UChar.
- * @param end Pointer to the last valid pointer beyond which the option will not extend.
- * @param optionArg Address of the pointer at which the options start (after the option name)
- * @return The index of the option, or -1 if the option is not valid.
- */
-static
-int32_t ucol_uprv_tok_readOption(const UChar *start, const UChar *end, const UChar **optionArg) {
-    int32_t i = 0;
-    ucol_uprv_tok_initData();
-
-    while(PatternProps::isWhiteSpace(*start)) { /* eat whitespace */
-        start++;
-    }
-    while(i < UTOK_OPTION_COUNT) {
-        if(u_strncmpNoCase(start, rulesOptions[i].optionName, rulesOptions[i].optionLen) == 0) {
-            if(end - start > rulesOptions[i].optionLen) {
-                *optionArg = start+rulesOptions[i].optionLen; /* End of option name; start of the options */
-                while(PatternProps::isWhiteSpace(**optionArg)) { /* eat whitespace */
-                    (*optionArg)++;
-                }
-            }
-            break;
-        }
-        i++;
-    }
-    if(i == UTOK_OPTION_COUNT) {
-        i = -1; // didn't find an option
-    }
-    return i;
-}
-
-
-static
-void ucol_tok_parseScriptReorder(UColTokenParser *src, UErrorCode *status) {
-    int32_t codeCount = 0;
-    int32_t codeIndex = 0;
-    char conversion[64];
-    int32_t tokenLength = 0;
-    const UChar* space;
-    
-    const UChar* current = src->current;
-    const UChar* end = u_memchr(src->current, 0x005d, src->end - src->current);
-
-    // eat leading whitespace
-    while(current < end && u_isWhitespace(*current)) {
-        current++;
-    }
-
-    while(current < end) {    
-        space = u_memchr(current, 0x0020, end - current);
-        space = space == 0 ? end : space;
-        tokenLength = space - current;
-        if (tokenLength < 4) {
-            *status = U_INVALID_FORMAT_ERROR;
-            return;
-        }
-        codeCount++;
-        current += tokenLength;
-        while(current < end && u_isWhitespace(*current)) { /* eat whitespace */
-            ++current;
-        }
-    }
-
-    if (codeCount == 0) {
-        *status = U_INVALID_FORMAT_ERROR;
-    }
-    
-    src->reorderCodesLength = codeCount;
-    src->reorderCodes = (int32_t*)uprv_malloc(codeCount * sizeof(int32_t));
-    current = src->current;
-    
-    // eat leading whitespace
-    while(current < end && u_isWhitespace(*current)) {
-        current++;
-    }
-
-    while(current < end) {    
-        space = u_memchr(current, 0x0020, end - current);
-        space = space == 0 ? end : space;
-        tokenLength = space - current;
-        if (tokenLength < 4) {
-            *status = U_ILLEGAL_ARGUMENT_ERROR;
-            return;
-        } else {
-            u_UCharsToChars(current, conversion, tokenLength);
-            conversion[tokenLength] = '\0';
-            src->reorderCodes[codeIndex] = ucol_findReorderingEntry(conversion);
-            if (src->reorderCodes[codeIndex] == USCRIPT_INVALID_CODE) {
-                src->reorderCodes[codeIndex] = u_getPropertyValueEnum(UCHAR_SCRIPT, conversion);
-            }
-            if (src->reorderCodes[codeIndex] == USCRIPT_INVALID_CODE) {
-                *status = U_ILLEGAL_ARGUMENT_ERROR;
-            }
-        }
-        codeIndex++;
-        current += tokenLength;
-        while(current < end && u_isWhitespace(*current)) { /* eat whitespace */
-            ++current;
-        }
-    }
-}
-
-// reads and conforms to various options in rules
-// end is the position of the first closing ']'
-// However, some of the options take an UnicodeSet definition
-// which needs to duplicate the closing ']'
-// for example: '[copy [\uAC00-\uD7FF]]'
-// These options will move end to the second ']' and the
-// caller will set the current to it.
-static
-uint8_t ucol_uprv_tok_readAndSetOption(UColTokenParser *src, UErrorCode *status) {
-    const UChar* start = src->current;
-    int32_t i = 0;
-    int32_t j=0;
-    const UChar *optionArg = NULL;
-
-    uint8_t result = 0;
-
-    start++; /*skip opening '['*/
-    i = ucol_uprv_tok_readOption(start, src->end, &optionArg);
-    if(optionArg) {
-        src->current = optionArg;
-    }
-
-    if(i < 0) {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-    } else {
-        int32_t noOpenBraces = 1;
-        switch(i) {
-    case OPTION_ALTERNATE_HANDLING:
-    case OPTION_FRENCH_COLLATION:
-    case OPTION_CASE_LEVEL:
-    case OPTION_CASE_FIRST:
-    case OPTION_NORMALIZATION_MODE:
-    case OPTION_HIRAGANA_QUATERNARY:
-    case OPTION_STRENGTH:
-    case OPTION_NUMERIC_COLLATION:
-        if(optionArg) {
-            for(j = 0; j<rulesOptions[i].subSize; j++) {
-                if(u_strncmpNoCase(optionArg, rulesOptions[i].subopts[j].subName, rulesOptions[i].subopts[j].subLen) == 0) {
-                    ucol_uprv_tok_setOptionInImage(src->opts, rulesOptions[i].attr, rulesOptions[i].subopts[j].attrVal);
-                    result =  UCOL_TOK_SUCCESS;
-                }
-            }
-        }
-        if(result == 0) {
-            *status = U_ILLEGAL_ARGUMENT_ERROR;
-        }
-        break;
-    case OPTION_VARIABLE_TOP:
-        result = UCOL_TOK_SUCCESS | UCOL_TOK_VARIABLE_TOP;
-        break;
-    case OPTION_REARRANGE:
-        result = UCOL_TOK_SUCCESS;
-        break;
-    case OPTION_BEFORE:
-        if(optionArg) {
-            for(j = 0; j<rulesOptions[i].subSize; j++) {
-                if(u_strncmpNoCase(optionArg, rulesOptions[i].subopts[j].subName, rulesOptions[i].subopts[j].subLen) == 0) {
-                    result = UCOL_TOK_SUCCESS | (rulesOptions[i].subopts[j].attrVal + 1);
-                }
-            }
-        }
-        if(result == 0) {
-            *status = U_ILLEGAL_ARGUMENT_ERROR;
-        }
-        break;
-    case OPTION_TOP: /* we are going to have an array with structures of limit CEs */
-        /* index to this array will be src->parsedToken.indirectIndex*/
-        src->parsedToken.indirectIndex = 0;
-        result = UCOL_TOK_SUCCESS | UCOL_TOK_TOP;
-        break;
-    case OPTION_FIRST:
-    case OPTION_LAST: /* first, last */
-        for(j = 0; j<rulesOptions[i].subSize; j++) {
-            if(u_strncmpNoCase(optionArg, rulesOptions[i].subopts[j].subName, rulesOptions[i].subopts[j].subLen) == 0) {
-                // the calculation below assumes that OPTION_FIRST and OPTION_LAST are at i and i+1 and that the first
-                // element of indirect boundaries is reserved for top.
-                src->parsedToken.indirectIndex = (uint16_t)(i-OPTION_FIRST+1+j*2);
-                result =  UCOL_TOK_SUCCESS | UCOL_TOK_TOP;;
-            }
-        }
-        if(result == 0) {
-            *status = U_ILLEGAL_ARGUMENT_ERROR;
-        }
-        break;
-    case OPTION_OPTIMIZE:
-    case OPTION_SUPPRESS_CONTRACTIONS:  // copy and remove are handled before normalization
-        // we need to move end here
-        src->current++; // skip opening brace
-        while(src->current < src->end && noOpenBraces != 0) {
-            if(*src->current == 0x005b) {
-                noOpenBraces++;
-            } else if(*src->current == 0x005D) { // closing brace
-                noOpenBraces--;
-            }
-            src->current++;
-        }
-        result = UCOL_TOK_SUCCESS;
-        break;
-    case OPTION_SCRIPTREORDER:
-        ucol_tok_parseScriptReorder(src, status);
-        break;
-    default:
-        *status = U_UNSUPPORTED_ERROR;
-        break;
-        }
-    }
-    src->current = u_memchr(src->current, 0x005d, (int32_t)(src->end-src->current));
-    return result;
-}
-
-
-inline void ucol_tok_addToExtraCurrent(UColTokenParser *src, const UChar *stuff, int32_t len, UErrorCode *status) {
-    if (stuff == NULL || len <= 0) {
-        return;
-    }
-    UnicodeString tempStuff(FALSE, stuff, len);
-    if(src->extraCurrent+len >= src->extraEnd) {
-        /* reallocate */
-        if (stuff >= src->source && stuff <= src->end) {
-            // Copy the "stuff" contents into tempStuff's own buffer.
-            // UnicodeString is copy-on-write.
-            if (len > 0) {
-                tempStuff.setCharAt(0, tempStuff[0]);
-            } else {
-                tempStuff.remove();
-            }
-        }
-        UChar *newSrc = (UChar *)uprv_realloc(src->source, (src->extraEnd-src->source)*2*sizeof(UChar));
-        if(newSrc != NULL) {
-            src->current = newSrc + (src->current - src->source);
-            src->extraCurrent = newSrc + (src->extraCurrent - src->source);
-            src->end = newSrc + (src->end - src->source);
-            src->extraEnd = newSrc + (src->extraEnd-src->source)*2;
-            src->sourceCurrent = newSrc + (src->sourceCurrent-src->source);
-            src->source = newSrc;
-        } else {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-    }
-    if(len == 1) {
-        *src->extraCurrent++ = tempStuff[0];
-    } else {
-        u_memcpy(src->extraCurrent, tempStuff.getBuffer(), len);
-        src->extraCurrent += len;
-    }
-}
-
-inline UBool ucol_tok_doSetTop(UColTokenParser *src, UErrorCode *status) {
-    /*
-    top = TRUE;
-    */
-    UChar buff[5];
-    src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source);
-    buff[0] = 0xFFFE;
-    buff[1] = (UChar)(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startCE >> 16);
-    buff[2] = (UChar)(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startCE & 0xFFFF);
-    if(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startContCE == 0) {
-        src->parsedToken.charsLen = 3;
-        ucol_tok_addToExtraCurrent(src, buff, 3, status);
-    } else {
-        buff[3] = (UChar)(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startContCE >> 16);
-        buff[4] = (UChar)(ucolIndirectBoundaries[src->parsedToken.indirectIndex].startContCE & 0xFFFF);
-        src->parsedToken.charsLen = 5;
-        ucol_tok_addToExtraCurrent(src, buff, 5, status);
-    }
-    return TRUE;
-}
-
-static UBool isCharNewLine(UChar c){
-    switch(c){
-    case 0x000A: /* LF  */
-    case 0x000D: /* CR  */
-    case 0x000C: /* FF  */
-    case 0x0085: /* NEL */
-    case 0x2028: /* LS  */
-    case 0x2029: /* PS  */
-        return TRUE;
-    default:
-        return FALSE;
-    }
-}
-
-/*
- * This function is called several times when a range is processed.  Each time, the next code point
- * is processed.
- * The following variables must be set before calling this function:
- *   src->currentRangeCp:  The current code point to process.
- *   src->lastRangeCp: The last code point in the range.
- * Pre-requisite: src->currentRangeCp <= src->lastRangeCp.
- */
-static const UChar*
-ucol_tok_processNextCodePointInRange(UColTokenParser *src,
-                                     UErrorCode *status)
-{
-  // Append current code point to source
-  UChar buff[U16_MAX_LENGTH];
-  uint32_t i = 0;
-
-  uint32_t nChars = U16_LENGTH(src->currentRangeCp);
-  src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source);
-  src->parsedToken.charsLen = nChars;
-
-  U16_APPEND_UNSAFE(buff, i, src->currentRangeCp);
-  ucol_tok_addToExtraCurrent(src, buff, nChars, status);
-
-  ++src->currentRangeCp;
-  if (src->currentRangeCp > src->lastRangeCp) {
-    src->inRange = FALSE;
-
-    if (src->currentStarredCharIndex > src->lastStarredCharIndex) {
-      src->isStarred = FALSE;
-    }
-  } else {
-    src->previousCp = src->currentRangeCp;
-  }
-  return src->current;
-}
-
-/*
- * This function is called several times when a starred list is processed.  Each time, the next code point
- * in the list is processed.
- * The following variables must be set before calling this function:
- *   src->currentStarredCharIndex:  Index (in src->source) of the first char of the current code point.
- *   src->lastStarredCharIndex: Index to the last character in the list.
- * Pre-requisite: src->currentStarredCharIndex <= src->lastStarredCharIndex.
- */
-static const UChar*
-ucol_tok_processNextTokenInStarredList(UColTokenParser *src)
-{
-  // Extract the characters corresponding to the next code point.
-  UChar32 cp;
-  src->parsedToken.charsOffset = src->currentStarredCharIndex;
-  int32_t prev = src->currentStarredCharIndex;
-  U16_NEXT(src->source, src->currentStarredCharIndex, (uint32_t)(src->end - src->source), cp);
-  src->parsedToken.charsLen = src->currentStarredCharIndex - prev;
-
-  // When we are done parsing the starred string, turn the flag off so that
-  // the normal processing is restored.
-  if (src->currentStarredCharIndex > src->lastStarredCharIndex) {
-    src->isStarred = FALSE;
-  }
-  src->previousCp = cp;
-  return src->current;
-}
-
-/*
- * Partially parses the next token, keeps the indices in src->parsedToken, and updates the counters.
- *
- * This routine parses and separates almost all tokens. The following are the syntax characters recognized.
- *  # : Comment character
- *  & : Reset operator
- *  = : Equality
- *  < : Primary collation
- *  << : Secondary collation
- *  <<< : Tertiary collation
- *  ; : Secondary collation
- *  , : Tertiary collation
- *  / : Expansions
- *  | : Prefix
- *  - : Range
-
- *  ! : Java Thai modifier, ignored
- *  @ : French only
-
- * [] : Options
- * '' : Quotes
- *
- *  Along with operators =, <, <<, <<<, the operator * is supported to indicate a list.  For example, &a<*bcdexyz
- *  is equivalent to &a<b<c<d<e<x<y<z.  In lists, ranges also can be given, so &a*b-ex-z is equivalent to the above.
- *  This function do not separate the tokens in a list.  Instead, &a<*b-ex-z is parsed as three tokens - "&a",
- *  "<*b", "-ex", "-z".  The strength (< in this case), whether in a list, whether in a range and the previous
- *  character returned as cached so that the calling program can do further splitting.
- */
-static const UChar*
-ucol_tok_parseNextTokenInternal(UColTokenParser *src,
-                                UBool startOfRules,
-                                UParseError *parseError,
-                                UErrorCode *status)
-{
-    UBool variableTop = FALSE;
-    UBool top = FALSE;
-    UBool inChars = TRUE;
-    UBool inQuote = FALSE;
-    UBool wasInQuote = FALSE;
-    uint8_t before = 0;
-    UBool isEscaped = FALSE;
-
-    // TODO: replace these variables with src->parsedToken counterparts
-    // no need to use them anymore since we have src->parsedToken.
-    // Ideally, token parser would be a nice class... Once, when I have
-    // more time (around 2020 probably).
-    uint32_t newExtensionLen = 0;
-    uint32_t extensionOffset = 0;
-    uint32_t newStrength = UCOL_TOK_UNSET;
-    UChar buff[10];
-
-    src->parsedToken.charsOffset = 0;  src->parsedToken.charsLen = 0;
-    src->parsedToken.prefixOffset = 0; src->parsedToken.prefixLen = 0;
-    src->parsedToken.indirectIndex = 0;
-
-    while (src->current < src->end) {
-        UChar ch = *(src->current);
-
-        if (inQuote) {
-            if (ch == 0x0027/*'\''*/) {
-                inQuote = FALSE;
-            } else {
-                if ((src->parsedToken.charsLen == 0) || inChars) {
-                    if(src->parsedToken.charsLen == 0) {
-                        src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source);
-                    }
-                    src->parsedToken.charsLen++;
-                } else {
-                    if(newExtensionLen == 0) {
-                        extensionOffset = (uint32_t)(src->extraCurrent - src->source);
-                    }
-                    newExtensionLen++;
-                }
-            }
-        }else if(isEscaped){
-            isEscaped =FALSE;
-            if (newStrength == UCOL_TOK_UNSET) {
-                *status = U_INVALID_FORMAT_ERROR;
-                syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError);
-                DBG_FORMAT_ERROR
-                return NULL;
-                // enabling rules to start with non-tokens a < b
-                // newStrength = UCOL_TOK_RESET;
-            }
-            if(ch != 0x0000  && src->current != src->end) {
-                if (inChars) {
-                    if(src->parsedToken.charsLen == 0) {
-                        src->parsedToken.charsOffset = (uint32_t)(src->current - src->source);
-                    }
-                    src->parsedToken.charsLen++;
-                } else {
-                    if(newExtensionLen == 0) {
-                        extensionOffset = (uint32_t)(src->current - src->source);
-                    }
-                    newExtensionLen++;
-                }
-            }
-        }else {
-            if(!PatternProps::isWhiteSpace(ch)) {
-                /* Sets the strength for this entry */
-                switch (ch) {
-                case 0x003D/*'='*/ :
-                    if (newStrength != UCOL_TOK_UNSET) {
-                        goto EndOfLoop;
-                    }
-
-                    /* if we start with strength, we'll reset to top */
-                    if(startOfRules == TRUE) {
-                        src->parsedToken.indirectIndex = 5;
-                        top = ucol_tok_doSetTop(src, status);
-                        newStrength = UCOL_TOK_RESET;
-                        goto EndOfLoop;
-                    }
-                    newStrength = UCOL_IDENTICAL;
-                    if(*(src->current+1) == 0x002A) {/*'*'*/
-                        src->current++;
-                        src->isStarred = TRUE;
-                    }
-                    break;
-
-                case 0x002C/*','*/:
-                    if (newStrength != UCOL_TOK_UNSET) {
-                        goto EndOfLoop;
-                    }
-
-                    /* if we start with strength, we'll reset to top */
-                    if(startOfRules == TRUE) {
-                        src->parsedToken.indirectIndex = 5;
-                        top = ucol_tok_doSetTop(src, status);
-                        newStrength = UCOL_TOK_RESET;
-                        goto EndOfLoop;
-                    }
-                    newStrength = UCOL_TERTIARY;
-                    break;
-
-                case  0x003B/*';'*/:
-                    if (newStrength != UCOL_TOK_UNSET) {
-                        goto EndOfLoop;
-                    }
-
-                    /* if we start with strength, we'll reset to top */
-                    if(startOfRules == TRUE) {
-                        src->parsedToken.indirectIndex = 5;
-                        top = ucol_tok_doSetTop(src, status);
-                        newStrength = UCOL_TOK_RESET;
-                        goto EndOfLoop;
-                    }
-                    newStrength = UCOL_SECONDARY;
-                    break;
-
-                case 0x003C/*'<'*/:
-                    if (newStrength != UCOL_TOK_UNSET) {
-                        goto EndOfLoop;
-                    }
-
-                    /* if we start with strength, we'll reset to top */
-                    if(startOfRules == TRUE) {
-                        src->parsedToken.indirectIndex = 5;
-                        top = ucol_tok_doSetTop(src, status);
-                        newStrength = UCOL_TOK_RESET;
-                        goto EndOfLoop;
-                    }
-                    /* before this, do a scan to verify whether this is */
-                    /* another strength */
-                    if(*(src->current+1) == 0x003C) {
-                        src->current++;
-                        if(*(src->current+1) == 0x003C) {
-                            src->current++; /* three in a row! */
-                            newStrength = UCOL_TERTIARY;
-                        } else { /* two in a row */
-                            newStrength = UCOL_SECONDARY;
-                        }
-                    } else { /* just one */
-                        newStrength = UCOL_PRIMARY;
-                    }
-                    if(*(src->current+1) == 0x002A) {/*'*'*/
-                        src->current++;
-                        src->isStarred = TRUE;
-                    }
-                    break;
-
-                case 0x0026/*'&'*/:
-                    if (newStrength != UCOL_TOK_UNSET) {
-                        /**/
-                        goto EndOfLoop;
-                    }
-
-                    newStrength = UCOL_TOK_RESET; /* PatternEntry::RESET = 0 */
-                    break;
-
-                case 0x005b/*'['*/:
-                    /* options - read an option, analyze it */
-                    if(u_strchr(src->current, 0x005d /*']'*/) != NULL) {
-                        uint8_t result = ucol_uprv_tok_readAndSetOption(src, status);
-                        if(U_SUCCESS(*status)) {
-                            if(result & UCOL_TOK_TOP) {
-                                if(newStrength == UCOL_TOK_RESET) {
-                                    top = ucol_tok_doSetTop(src, status);
-                                    if(before) { // This is a combination of before and indirection like '&[before 2][first regular]<b'
-                                        src->parsedToken.charsLen+=2;
-                                        buff[0] = 0x002d;
-                                        buff[1] = before;
-                                        ucol_tok_addToExtraCurrent(src, buff, 2, status);
-                                    }
-
-                                    src->current++;
-                                    goto EndOfLoop;
-                                } else {
-                                    *status = U_INVALID_FORMAT_ERROR;
-                                    syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError);
-                                    DBG_FORMAT_ERROR
-                                }
-                            } else if(result & UCOL_TOK_VARIABLE_TOP) {
-                                if(newStrength != UCOL_TOK_RESET && newStrength != UCOL_TOK_UNSET) {
-                                    variableTop = TRUE;
-                                    src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source);
-                                    src->parsedToken.charsLen = 1;
-                                    buff[0] = 0xFFFF;
-                                    ucol_tok_addToExtraCurrent(src, buff, 1, status);
-                                    src->current++;
-                                    goto EndOfLoop;
-                                } else {
-                                    *status = U_INVALID_FORMAT_ERROR;
-                                    syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError);
-                                    DBG_FORMAT_ERROR
-                                }
-                            } else if (result & UCOL_TOK_BEFORE){
-                                if(newStrength == UCOL_TOK_RESET) {
-                                    before = result & UCOL_TOK_BEFORE;
-                                } else {
-                                    *status = U_INVALID_FORMAT_ERROR;
-                                    syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError);
-                                    DBG_FORMAT_ERROR
-                                }
-                            }
-                        } else {
-                            *status = U_INVALID_FORMAT_ERROR;
-                            syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError);
-                            DBG_FORMAT_ERROR
-                            return NULL;
-                        }
-                    }
-                    break;
-                case 0x0021/*! skip java thai modifier reordering*/:
-                    break;
-                case 0x002F/*'/'*/:
-                    wasInQuote = FALSE; /* if we were copying source characters, we want to stop now */
-                    inChars = FALSE; /* we're now processing expansion */
-                    break;
-                case 0x005C /* back slash for escaped chars */:
-                    isEscaped = TRUE;
-                    break;
-                    /* found a quote, we're gonna start copying */
-                case 0x0027/*'\''*/:
-                    if (newStrength == UCOL_TOK_UNSET) { /* quote is illegal until we have a strength */
-                      *status = U_INVALID_FORMAT_ERROR;
-                      syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError);
-                      DBG_FORMAT_ERROR
-                      return NULL;
-                      // enabling rules to start with a non-token character a < b
-                      // newStrength = UCOL_TOK_RESET;
-                    }
-
-                    inQuote = TRUE;
-
-                    if(inChars) { /* we're doing characters */
-                        if(wasInQuote == FALSE) {
-                            src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source);
-                        }
-                        if (src->parsedToken.charsLen != 0) {
-                            ucol_tok_addToExtraCurrent(src, src->current - src->parsedToken.charsLen, src->parsedToken.charsLen, status);
-                        }
-                        src->parsedToken.charsLen++;
-                    } else { /* we're doing an expansion */
-                        if(wasInQuote == FALSE) {
-                            extensionOffset = (uint32_t)(src->extraCurrent - src->source);
-                        }
-                        if (newExtensionLen != 0) {
-                            ucol_tok_addToExtraCurrent(src, src->current - newExtensionLen, newExtensionLen, status);
-                        }
-                        newExtensionLen++;
-                    }
-
-                    wasInQuote = TRUE;
-
-                    ch = *(++(src->current));
-                    if(ch == 0x0027) { /* copy the double quote */
-                        ucol_tok_addToExtraCurrent(src, &ch, 1, status);
-                        inQuote = FALSE;
-                    }
-                    break;
-
-                    /* '@' is french only if the strength is not currently set */
-                    /* if it is, it's just a regular character in collation rules */
-                case 0x0040/*'@'*/:
-                    if (newStrength == UCOL_TOK_UNSET) {
-                        src->opts->frenchCollation = UCOL_ON;
-                        break;
-                    }
-
-                case 0x007C /*|*/: /* this means we have actually been reading prefix part */
-                    // we want to store read characters to the prefix part and continue reading
-                    // the characters (proper way would be to restart reading the chars, but in
-                    // that case we would have to complicate the token hasher, which I do not
-                    // intend to play with. Instead, we will do prefixes when prefixes are due
-                    // (before adding the elements).
-                    src->parsedToken.prefixOffset = src->parsedToken.charsOffset;
-                    src->parsedToken.prefixLen = src->parsedToken.charsLen;
-
-                    if(inChars) { /* we're doing characters */
-                        if(wasInQuote == FALSE) {
-                            src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source);
-                        }
-                        if (src->parsedToken.charsLen != 0) {
-                            ucol_tok_addToExtraCurrent(src, src->current - src->parsedToken.charsLen, src->parsedToken.charsLen, status);
-                        }
-                        src->parsedToken.charsLen++;
-                    }
-
-                    wasInQuote = TRUE;
-
-                    do {
-                        ch = *(++(src->current));
-                        // skip whitespace between '|' and the character
-                    } while (PatternProps::isWhiteSpace(ch));
-                    break;
-
-                    //charsOffset = 0;
-                    //newCharsLen = 0;
-                    //break; // We want to store the whole prefix/character sequence. If we break
-                    // the '|' is going to get lost.
-
-                case 0x002D /*-*/: /* A range. */
-                    if (newStrength != UCOL_TOK_UNSET) {
-                      // While processing the pending token, the isStarred field
-                      // is reset, so it needs to be saved for the next
-                      // invocation.
-                      src->savedIsStarred = src->isStarred;
-                      goto EndOfLoop;
-                   }
-                   src->isStarred = src->savedIsStarred;
-
-                   // Ranges are valid only in starred tokens.
-                   if (!src->isStarred) {
-                     *status = U_INVALID_FORMAT_ERROR;
-                     syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError);
-                     DBG_FORMAT_ERROR
-                     return NULL;
-                   }
-                   newStrength = src->parsedToken.strength;
-                   src->inRange = TRUE;
-                   break;
-
-                case 0x0023 /*#*/: /* this is a comment, skip everything through the end of line */
-                    do {
-                        ch = *(++(src->current));
-                    } while (!isCharNewLine(ch));
-
-                    break;
-                default:
-                    if (newStrength == UCOL_TOK_UNSET) {
-                      *status = U_INVALID_FORMAT_ERROR;
-                      syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError);
-                      DBG_FORMAT_ERROR
-                      return NULL;
-                    }
-
-                    if (ucol_tok_isSpecialChar(ch) && (inQuote == FALSE)) {
-                        *status = U_INVALID_FORMAT_ERROR;
-                        syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError);
-                        DBG_FORMAT_ERROR
-                        return NULL;
-                    }
-
-                    if(ch == 0x0000 && src->current+1 == src->end) {
-                        break;
-                    }
-
-                    if (inChars) {
-                        if(src->parsedToken.charsLen == 0) {
-                            src->parsedToken.charsOffset = (uint32_t)(src->current - src->source);
-                        }
-                        src->parsedToken.charsLen++;
-                    } else {
-                        if(newExtensionLen == 0) {
-                            extensionOffset = (uint32_t)(src->current - src->source);
-                        }
-                        newExtensionLen++;
-                    }
-
-                    break;
-                }
-            }
-        }
-
-        if(wasInQuote) {
-            if(ch != 0x27) {
-                if(inQuote || !PatternProps::isWhiteSpace(ch)) {
-                    ucol_tok_addToExtraCurrent(src, &ch, 1, status);
-                }
-            }
-        }
-
-        src->current++;
-    }
-
-EndOfLoop:
-    wasInQuote = FALSE;
-    if (newStrength == UCOL_TOK_UNSET) {
-        return NULL;
-    }
-
-    if (src->parsedToken.charsLen == 0 && top == FALSE) {
-        syntaxError(src->source,(int32_t)(src->current-src->source),(int32_t)(src->end-src->source),parseError);
-        *status = U_INVALID_FORMAT_ERROR;
-        DBG_FORMAT_ERROR
-        return NULL;
-    }
-
-    src->parsedToken.strength = newStrength;
-    src->parsedToken.extensionOffset = extensionOffset;
-    src->parsedToken.extensionLen = newExtensionLen;
-    src->parsedToken.flags = (UCOL_TOK_VARIABLE_TOP * (variableTop?1:0)) | (UCOL_TOK_TOP * (top?1:0)) | before;
-
-    return src->current;
-}
-
-/*
- * Parses the next token, keeps the indices in src->parsedToken, and updates the counters.
- * @see ucol_tok_parseNextTokenInternal() for the description of what operators are supported.
- *
- * In addition to what ucol_tok_parseNextTokenInternal() does, this function does the following:
- *  1) ucol_tok_parseNextTokenInternal() returns a range as a single token.  This function separates
- *     it to separate tokens and returns one by one.  In order to do that, the necessary states are
- *     cached as member variables of the token parser.
- *  2) When encountering a range, ucol_tok_parseNextTokenInternal() processes characters up to the
- *     starting character as a single list token (which is separated into individual characters here)
- *     and as another list token starting with the last character in the range.  Before expanding it
- *     as a list of tokens, this function expands the range by filling the intermediate characters and
- *     returns them one by one as separate tokens.
- * Necessary checks are done for invalid combinations.
- */
-U_CAPI const UChar* U_EXPORT2
-ucol_tok_parseNextToken(UColTokenParser *src,
-                        UBool startOfRules,
-                        UParseError *parseError,
-                        UErrorCode *status)
-{
-  const UChar *nextToken;
-
-  if (src->inRange) {
-    // We are not done processing a range.  Continue it.
-    return ucol_tok_processNextCodePointInRange(src, status);
-  } else if (src->isStarred) {
-    // We are not done processing a starred token.  Continue it.
-    return ucol_tok_processNextTokenInStarredList(src);
-  }
-
-  // Get the next token.
-  nextToken = ucol_tok_parseNextTokenInternal(src, startOfRules, parseError, status);
-
-  if (nextToken == NULL) {
-    return NULL;
-  }
-
-  if (src->inRange) {
-    // A new range has started.
-    // Check whether it is a chain of ranges with more than one hyphen.
-    if (src->lastRangeCp > 0 && src->lastRangeCp == src->previousCp) {
-        *status = U_INVALID_FORMAT_ERROR;
-        syntaxError(src->source,src->parsedToken.charsOffset-1,
-                    src->parsedToken.charsOffset+src->parsedToken.charsLen, parseError);
-        DBG_FORMAT_ERROR
-        return NULL;
-    }
-
-    // The current token indicates the second code point of the range.
-    // Process just that, and then proceed with the star.
-    src->currentStarredCharIndex = src->parsedToken.charsOffset;
-    U16_NEXT(src->source, src->currentStarredCharIndex, 
-             (uint32_t)(src->end - src->source), src->lastRangeCp);
-    if (src->lastRangeCp <= src->previousCp) {
-        *status = U_INVALID_FORMAT_ERROR;
-        syntaxError(src->source,src->parsedToken.charsOffset-1,
-                    src->parsedToken.charsOffset+src->parsedToken.charsLen,parseError);
-        DBG_FORMAT_ERROR
-        return NULL;
-    }
-
-    // Set current range code point to process the range loop
-    src->currentRangeCp = src->previousCp + 1;
-
-    src->lastStarredCharIndex = src->parsedToken.charsOffset + src->parsedToken.charsLen - 1;
-
-    return ucol_tok_processNextCodePointInRange(src, status);
- } else if (src->isStarred) {
-    // We define two indices m_currentStarredCharIndex_ and m_lastStarredCharIndex_ so that
-    // [m_currentStarredCharIndex_ .. m_lastStarredCharIndex_], both inclusive, need to be
-    // separated into several tokens and returned.
-    src->currentStarredCharIndex = src->parsedToken.charsOffset;
-    src->lastStarredCharIndex =  src->parsedToken.charsOffset + src->parsedToken.charsLen - 1;
-
-    return ucol_tok_processNextTokenInStarredList(src);
-  } else {
-    // Set previous codepoint
-    U16_GET(src->source, 0, src->parsedToken.charsOffset, (uint32_t)(src->end - src->source), src->previousCp);
-  }
-  return nextToken;
-}
-
-
-/*
-Processing Description
-1 Build a ListList. Each list has a header, which contains two lists (positive
-and negative), a reset token, a baseCE, nextCE, and previousCE. The lists and
-reset may be null.
-2 As you process, you keep a LAST pointer that points to the last token you
-handled.
-
-*/
-
-static UColToken *ucol_tok_initAReset(UColTokenParser *src, const UChar *expand, uint32_t *expandNext,
-                                      UParseError *parseError, UErrorCode *status)
-{
-    if(src->resultLen == src->listCapacity) {
-        // Unfortunately, this won't work, as we store addresses of lhs in token
-        src->listCapacity *= 2;
-        src->lh = (UColTokListHeader *)uprv_realloc(src->lh, src->listCapacity*sizeof(UColTokListHeader));
-        if(src->lh == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return NULL;
-        }
-    }
-    /* do the reset thing */
-    UColToken *sourceToken = (UColToken *)uprv_malloc(sizeof(UColToken));
-    /* test for NULL */
-    if (sourceToken == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return NULL;
-    }
-    sourceToken->rulesToParseHdl = &(src->source);
-    sourceToken->source = src->parsedToken.charsLen << 24 | src->parsedToken.charsOffset;
-    sourceToken->expansion = src->parsedToken.extensionLen << 24 | src->parsedToken.extensionOffset;
-
-    sourceToken->debugSource = *(src->source + src->parsedToken.charsOffset);
-    sourceToken->debugExpansion = *(src->source + src->parsedToken.extensionOffset);
-
-    // keep the flags around so that we know about before
-    sourceToken->flags = src->parsedToken.flags;
-
-    if(src->parsedToken.prefixOffset != 0) {
-        // this is a syntax error
-        *status = U_INVALID_FORMAT_ERROR;
-        syntaxError(src->source,src->parsedToken.charsOffset-1,src->parsedToken.charsOffset+src->parsedToken.charsLen,parseError);
-        DBG_FORMAT_ERROR
-        uprv_free(sourceToken);
-        return 0;
-    } else {
-        sourceToken->prefix = 0;
-    }
-
-    sourceToken->polarity = UCOL_TOK_POLARITY_POSITIVE; /* TODO: this should also handle reverse */
-    sourceToken->strength = UCOL_TOK_RESET;
-    sourceToken->next = NULL;
-    sourceToken->previous = NULL;
-    sourceToken->noOfCEs = 0;
-    sourceToken->noOfExpCEs = 0;
-    sourceToken->listHeader = &src->lh[src->resultLen];
-
-    src->lh[src->resultLen].first = NULL;
-    src->lh[src->resultLen].last = NULL;
-    src->lh[src->resultLen].first = NULL;
-    src->lh[src->resultLen].last = NULL;
-
-    src->lh[src->resultLen].reset = sourceToken;
-
-    /*
-    3 Consider each item: relation, source, and expansion: e.g. ...< x / y ...
-    First convert all expansions into normal form. Examples:
-    If "xy" doesn't occur earlier in the list or in the UCA, convert &xy * c *
-    d * ... into &x * c/y * d * ...
-    Note: reset values can never have expansions, although they can cause the
-    very next item to have one. They may be contractions, if they are found
-    earlier in the list.
-    */
-    *expandNext = 0;
-    if(expand != NULL) {
-        /* check to see if there is an expansion */
-        if(src->parsedToken.charsLen > 1) {
-            uint32_t resetCharsOffset;
-            resetCharsOffset = (uint32_t)(expand - src->source);
-            sourceToken->source = ((resetCharsOffset - src->parsedToken.charsOffset ) << 24) | src->parsedToken.charsOffset;
-            *expandNext = ((src->parsedToken.charsLen + src->parsedToken.charsOffset - resetCharsOffset)<<24) | (resetCharsOffset);
-        }
-    }
-
-    src->resultLen++;
-
-    uhash_put(src->tailored, sourceToken, sourceToken, status);
-
-    return sourceToken;
-}
-
-static
-inline UColToken *getVirginBefore(UColTokenParser *src, UColToken *sourceToken, uint8_t strength, UParseError *parseError, UErrorCode *status) {
-    if(U_FAILURE(*status)) {
-        return NULL;
-    }
-    /* this is a virgin before - we need to fish the anchor from the UCA */
-    collIterate s;
-    uint32_t baseCE = UCOL_NOT_FOUND, baseContCE = UCOL_NOT_FOUND;
-    uint32_t CE, SecondCE;
-    // uint32_t invPos;
-    if(sourceToken != NULL) {
-        uprv_init_collIterate(src->UCA, src->source+((sourceToken->source)&0xFFFFFF), 1, &s, status);
-    } else {
-        uprv_init_collIterate(src->UCA, src->source+src->parsedToken.charsOffset /**charsOffset*/, 1, &s, status);
-    }
-    if(U_FAILURE(*status)) {
-        return NULL;
-    }
-
-    baseCE = ucol_getNextCE(src->UCA, &s, status) & 0xFFFFFF3F;
-    baseContCE = ucol_getNextCE(src->UCA, &s, status);
-    if(baseContCE == UCOL_NO_MORE_CES) {
-        baseContCE = 0;
-    }
-
-
-    UCAConstants *consts = (UCAConstants *)((uint8_t *)src->UCA->image + src->UCA->image->UCAConsts);
-    uint32_t ch = 0;
-    uint32_t expandNext = 0;
-    UColToken key;
-
-    if((baseCE & 0xFF000000) >= (consts->UCA_PRIMARY_IMPLICIT_MIN<<24) && (baseCE & 0xFF000000) <= (consts->UCA_PRIMARY_IMPLICIT_MAX<<24) ) { /* implicits - */
-        uint32_t primary = (baseCE & UCOL_PRIMARYMASK) | ((baseContCE & UCOL_PRIMARYMASK) >> 16);
-        uint32_t raw = uprv_uca_getRawFromImplicit(primary);
-        ch = uprv_uca_getCodePointFromRaw(raw-1);
-        uint32_t primaryCE = uprv_uca_getImplicitFromRaw(raw-1);
-        CE = (primaryCE & UCOL_PRIMARYMASK) | 0x0505;
-        SecondCE = ((primaryCE << 16) & UCOL_PRIMARYMASK) | UCOL_CONTINUATION_MARKER;
-
-        src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source);
-        *src->extraCurrent++ = 0xFFFE;
-        *src->extraCurrent++ = (UChar)ch;
-        src->parsedToken.charsLen++;
-
-        key.source = (src->parsedToken.charsLen/**newCharsLen*/ << 24) | src->parsedToken.charsOffset/**charsOffset*/;
-        key.rulesToParseHdl = &(src->source);
-
-        //sourceToken = (UColToken *)uhash_iget(src->tailored, (int32_t)key);
-        sourceToken = (UColToken *)uhash_get(src->tailored, &key);
-
-        if(sourceToken == NULL) {
-            src->lh[src->resultLen].baseCE = CE & 0xFFFFFF3F;
-            if(isContinuation(SecondCE)) {
-                src->lh[src->resultLen].baseContCE = SecondCE;
-            } else {
-                src->lh[src->resultLen].baseContCE = 0;
-            }
-            src->lh[src->resultLen].nextCE = 0;
-            src->lh[src->resultLen].nextContCE = 0;
-            src->lh[src->resultLen].previousCE = 0;
-            src->lh[src->resultLen].previousContCE = 0;
-
-            src->lh[src->resultLen].indirect = FALSE;
-
-            sourceToken = ucol_tok_initAReset(src, 0, &expandNext, parseError, status);
-        }
-
-    } else {
-        /* invPos = */ ucol_inv_getPrevCE(src, baseCE, baseContCE, &CE, &SecondCE, strength);
-
-        // we got the previous CE. Now we need to see if the difference between
-        // the two CEs is really of the requested strength.
-        // if it's a bigger difference (we asked for secondary and got primary), we
-        // need to modify the CE.
-        if(ucol_getCEStrengthDifference(baseCE, baseContCE, CE, SecondCE) < strength) {
-            // adjust the strength
-            // now we are in the situation where our baseCE should actually be modified in
-            // order to get the CE in the right position.
-            if(strength == UCOL_SECONDARY) {
-                CE = baseCE - 0x0200;
-            } else { // strength == UCOL_TERTIARY
-                CE = baseCE - 0x02;
-            }
-            if(baseContCE) {
-                if(strength == UCOL_SECONDARY) {
-                    SecondCE = baseContCE - 0x0200;
-                } else { // strength == UCOL_TERTIARY
-                    SecondCE = baseContCE - 0x02;
-                }
-            }
-        }
-
-#if 0
-        // the code below relies on getting a code point from the inverse table, in order to be
-        // able to merge the situations like &x < 9 &[before 1]a < d. This won't work:
-        // 1. There are many code points that have the same CE
-        // 2. The CE to codepoint table (things pointed to by CETable[3*invPos+2] are broken.
-        // Also, in case when there is no equivalent strength before an element, we have to actually
-        // construct one. For example, &[before 2]a << x won't result in x << a, because the element
-        // before a is a primary difference.
-
-        //uint32_t *CETable = (uint32_t *)((uint8_t *)src->invUCA+src->invUCA->table);
-
-
-        ch = CETable[3*invPos+2];
-
-        if((ch &  UCOL_INV_SIZEMASK) != 0) {
-            uint16_t *conts = (uint16_t *)((uint8_t *)src->invUCA+src->invUCA->conts);
-            uint32_t offset = (ch & UCOL_INV_OFFSETMASK);
-            ch = conts[offset];
-        }
-
-        *src->extraCurrent++ = (UChar)ch;
-        src->parsedToken.charsOffset = (uint32_t)(src->extraCurrent - src->source - 1);
-        src->parsedToken.charsLen = 1;
-
-        // We got an UCA before. However, this might have been tailored.
-        // example:
-        // &\u30ca = \u306a
-        // &[before 3]\u306a<<<\u306a|\u309d
-
-
-        // uint32_t key = (*newCharsLen << 24) | *charsOffset;
-        key.source = (src->parsedToken.charsLen/**newCharsLen*/ << 24) | src->parsedToken.charsOffset/**charsOffset*/;
-        key.rulesToParseHdl = &(src->source);
-
-        //sourceToken = (UColToken *)uhash_iget(src->tailored, (int32_t)key);
-        sourceToken = (UColToken *)uhash_get(src->tailored, &key);
-#endif
-
-        // here is how it should be. The situation such as &[before 1]a < x, should be
-        // resolved exactly as if we wrote &a > x.
-        // therefore, I don't really care if the UCA value before a has been changed.
-        // However, I do care if the strength between my element and the previous element
-        // is bigger then I wanted. So, if CE < baseCE and I wanted &[before 2], then i'll
-        // have to construct the base CE.
-
-
-
-        // if we found a tailored thing, we have to use the UCA value and construct
-        // a new reset token with constructed name
-        //if(sourceToken != NULL && sourceToken->strength != UCOL_TOK_RESET) {
-        // character to which we want to anchor is already tailored.
-        // We need to construct a new token which will be the anchor
-        // point
-        //*(src->extraCurrent-1) = 0xFFFE;
-        //*src->extraCurrent++ = (UChar)ch;
-        // grab before
-        src->parsedToken.charsOffset -= 10;
-        src->parsedToken.charsLen += 10;
-        src->lh[src->resultLen].baseCE = CE & 0xFFFFFF3F;
-        if(isContinuation(SecondCE)) {
-            src->lh[src->resultLen].baseContCE = SecondCE;
-        } else {
-            src->lh[src->resultLen].baseContCE = 0;
-        }
-        src->lh[src->resultLen].nextCE = 0;
-        src->lh[src->resultLen].nextContCE = 0;
-        src->lh[src->resultLen].previousCE = 0;
-        src->lh[src->resultLen].previousContCE = 0;
-
-        src->lh[src->resultLen].indirect = FALSE;
-
-        sourceToken = ucol_tok_initAReset(src, 0, &expandNext, parseError, status);
-        //}
-    }
-
-    return sourceToken;
-
-}
-
-uint32_t ucol_tok_assembleTokenList(UColTokenParser *src, UParseError *parseError, UErrorCode *status) {
-    UColToken *lastToken = NULL;
-    const UChar *parseEnd = NULL;
-    uint32_t expandNext = 0;
-    UBool variableTop = FALSE;
-    UBool top = FALSE;
-    uint16_t specs = 0;
-    UColTokListHeader *ListList = NULL;
-
-    src->parsedToken.strength = UCOL_TOK_UNSET;
-
-    ListList = src->lh;
-
-    if(U_FAILURE(*status)) {
-        return 0;
-    }
-#ifdef DEBUG_FOR_CODE_POINTS
-    char filename[35];
-    sprintf(filename, "/tmp/debug_for_cp_%09d.txt", getpid());
-    dfcp_fp = fopen(filename, "a");
-    fprintf(stdout, "Output is in the file %s.\n", filename);
-#endif
-
-#ifdef DEBUG_FOR_COLL_RULES
-    std::string s3;
-    UnicodeString(src->source).toUTF8String(s3);
-    std::cout << "src->source = " << s3 << std::endl;
-#endif
-
-    while(src->current < src->end || src->isStarred) {
-        src->parsedToken.prefixOffset = 0;
-
-        parseEnd = ucol_tok_parseNextToken(src,
-            (UBool)(lastToken == NULL),
-            parseError,
-            status);
-
-        specs = src->parsedToken.flags;
-
-
-        variableTop = ((specs & UCOL_TOK_VARIABLE_TOP) != 0);
-        top = ((specs & UCOL_TOK_TOP) != 0);
-
-        if(U_SUCCESS(*status) && parseEnd != NULL) {
-            UColToken *sourceToken = NULL;
-            //uint32_t key = 0;
-            uint32_t lastStrength = UCOL_TOK_UNSET;
-
-            if(lastToken != NULL ) {
-                lastStrength = lastToken->strength;
-            }
-
-#ifdef DEBUG_FOR_CODE_POINTS
-            UChar32 cp;
-            U16_GET(src->source, 0, src->parsedToken.charsOffset, (uint32_t)(src->extraEnd - src->source), cp);
-            fprintf(dfcp_fp, "Code point = %x, Strength = %x\n", cp, src->parsedToken.strength);
-#endif
-            //key = newCharsLen << 24 | charsOffset;
-            UColToken key;
-            key.source = src->parsedToken.charsLen << 24 | src->parsedToken.charsOffset;
-            key.rulesToParseHdl = &(src->source);
-
-            /*  4 Lookup each source in the CharsToToken map, and find a sourceToken */
-            sourceToken = (UColToken *)uhash_get(src->tailored, &key);
-
-            if(src->parsedToken.strength != UCOL_TOK_RESET) {
-                if(lastToken == NULL) { /* this means that rules haven't started properly */
-                    *status = U_INVALID_FORMAT_ERROR;
-                    syntaxError(src->source,0,(int32_t)(src->end-src->source),parseError);
-                    DBG_FORMAT_ERROR
-                    return 0;
-                }
-                /*  6 Otherwise (when relation != reset) */
-                if(sourceToken == NULL) {
-                    /* If sourceToken is null, create new one, */
-                    sourceToken = (UColToken *)uprv_malloc(sizeof(UColToken));
-                    /* test for NULL */
-                    if (sourceToken == NULL) {
-                        *status = U_MEMORY_ALLOCATION_ERROR;
-                        return 0;
-                    }
-                    sourceToken->rulesToParseHdl = &(src->source);
-                    sourceToken->source = src->parsedToken.charsLen << 24 | src->parsedToken.charsOffset;
-
-                    sourceToken->debugSource = *(src->source + src->parsedToken.charsOffset);
-
-                    sourceToken->prefix = src->parsedToken.prefixLen << 24 | src->parsedToken.prefixOffset;
-                    sourceToken->debugPrefix = *(src->source + src->parsedToken.prefixOffset);
-
-                    sourceToken->polarity = UCOL_TOK_POLARITY_POSITIVE; /* TODO: this should also handle reverse */
-                    sourceToken->next = NULL;
-                    sourceToken->previous = NULL;
-                    sourceToken->noOfCEs = 0;
-                    sourceToken->noOfExpCEs = 0;
-                    // keep the flags around so that we know about before
-                    sourceToken->flags = src->parsedToken.flags;
-                    uhash_put(src->tailored, sourceToken, sourceToken, status);
-                    if(U_FAILURE(*status)) {
-                        return 0;
-                    }
-                } else {
-                    /* we could have fished out a reset here */
-                    if(sourceToken->strength != UCOL_TOK_RESET && lastToken != sourceToken) {
-                        /* otherwise remove sourceToken from where it was. */
-                        if(sourceToken->next != NULL) {
-                            if(sourceToken->next->strength > sourceToken->strength) {
-                                sourceToken->next->strength = sourceToken->strength;
-                            }
-                            sourceToken->next->previous = sourceToken->previous;
-                        } else {
-                            sourceToken->listHeader->last = sourceToken->previous;
-                        }
-
-                        if(sourceToken->previous != NULL) {
-                            sourceToken->previous->next = sourceToken->next;
-                        } else {
-                            sourceToken->listHeader->first = sourceToken->next;
-                        }
-                        sourceToken->next = NULL;
-                        sourceToken->previous = NULL;
-                    }
-                }
-
-                sourceToken->strength = src->parsedToken.strength;
-                sourceToken->listHeader = lastToken->listHeader;
-
-                /*
-                1.  Find the strongest strength in each list, and set strongestP and strongestN
-                accordingly in the headers.
-                */
-                if(lastStrength == UCOL_TOK_RESET
-                    || sourceToken->listHeader->first == 0) {
-                        /* If LAST is a reset
-                        insert sourceToken in the list. */
-                        if(sourceToken->listHeader->first == 0) {
-                            sourceToken->listHeader->first = sourceToken;
-                            sourceToken->listHeader->last = sourceToken;
-                        } else { /* we need to find a place for us */
-                            /* and we'll get in front of the same strength */
-                            if(sourceToken->listHeader->first->strength <= sourceToken->strength) {
-                                sourceToken->next = sourceToken->listHeader->first;
-                                sourceToken->next->previous = sourceToken;
-                                sourceToken->listHeader->first = sourceToken;
-                                sourceToken->previous = NULL;
-                            } else {
-                                lastToken = sourceToken->listHeader->first;
-                                while(lastToken->next != NULL && lastToken->next->strength > sourceToken->strength) {
-                                    lastToken = lastToken->next;
-                                }
-                                if(lastToken->next != NULL) {
-                                    lastToken->next->previous = sourceToken;
-                                } else {
-                                    sourceToken->listHeader->last = sourceToken;
-                                }
-                                sourceToken->previous = lastToken;
-                                sourceToken->next = lastToken->next;
-                                lastToken->next = sourceToken;
-                            }
-                        }
-                    } else {
-                        /* Otherwise (when LAST is not a reset)
-                        if polarity (LAST) == polarity(relation), insert sourceToken after LAST,
-                        otherwise insert before.
-                        when inserting after or before, search to the next position with the same
-                        strength in that direction. (This is called postpone insertion).         */
-                        if(sourceToken != lastToken) {
-                            if(lastToken->polarity == sourceToken->polarity) {
-                                while(lastToken->next != NULL && lastToken->next->strength > sourceToken->strength) {
-                                    lastToken = lastToken->next;
-                                }
-                                sourceToken->previous = lastToken;
-                                if(lastToken->next != NULL) {
-                                    lastToken->next->previous = sourceToken;
-                                } else {
-                                    sourceToken->listHeader->last = sourceToken;
-                                }
-
-                                sourceToken->next = lastToken->next;
-                                lastToken->next = sourceToken;
-                            } else {
-                                while(lastToken->previous != NULL && lastToken->previous->strength > sourceToken->strength) {
-                                    lastToken = lastToken->previous;
-                                }
-                                sourceToken->next = lastToken;
-                                if(lastToken->previous != NULL) {
-                                    lastToken->previous->next = sourceToken;
-                                } else {
-                                    sourceToken->listHeader->first = sourceToken;
-                                }
-                                sourceToken->previous = lastToken->previous;
-                                lastToken->previous = sourceToken;
-                            }
-                        } else { /* repeated one thing twice in rules, stay with the stronger strength */
-                            if(lastStrength < sourceToken->strength) {
-                                sourceToken->strength = lastStrength;
-                            }
-                        }
-                    }
-
-                    /* if the token was a variable top, we're gonna put it in */
-                    if(variableTop == TRUE && src->varTop == NULL) {
-                        variableTop = FALSE;
-                        src->varTop = sourceToken;
-                    }
-
-                    // Treat the expansions.
-                    // There are two types of expansions: explicit (x / y) and reset based propagating expansions
-                    // (&abc * d * e <=> &ab * d / c * e / c)
-                    // if both of them are in effect for a token, they are combined.
-
-                    sourceToken->expansion = src->parsedToken.extensionLen << 24 | src->parsedToken.extensionOffset;
-
-                    if(expandNext != 0) {
-                        if(sourceToken->strength == UCOL_PRIMARY) { /* primary strength kills off the implicit expansion */
-                            expandNext = 0;
-                        } else if(sourceToken->expansion == 0) { /* if there is no expansion, implicit is just added to the token */
-                            sourceToken->expansion = expandNext;
-                        } else { /* there is both explicit and implicit expansion. We need to make a combination */
-                            uprv_memcpy(src->extraCurrent, src->source + (expandNext & 0xFFFFFF), (expandNext >> 24)*sizeof(UChar));
-                            uprv_memcpy(src->extraCurrent+(expandNext >> 24), src->source + src->parsedToken.extensionOffset, src->parsedToken.extensionLen*sizeof(UChar));
-                            sourceToken->expansion = (uint32_t)(((expandNext >> 24) + src->parsedToken.extensionLen)<<24 | (uint32_t)(src->extraCurrent - src->source));
-                            src->extraCurrent += (expandNext >> 24) + src->parsedToken.extensionLen;
-                        }
-                    }
-
-                    // This is just for debugging purposes
-                    if(sourceToken->expansion != 0) {
-                        sourceToken->debugExpansion = *(src->source + src->parsedToken.extensionOffset);
-                    } else {
-                        sourceToken->debugExpansion = 0;
-                    }
-                    // if the previous token was a reset before, the strength of this
-                    // token must match the strength of before. Otherwise we have an
-                    // undefined situation.
-                    // In other words, we currently have a cludge which we use to
-                    // represent &a >> x. This is written as &[before 2]a << x.
-                    if((lastToken->flags & UCOL_TOK_BEFORE) != 0) {
-                        uint8_t beforeStrength = (lastToken->flags & UCOL_TOK_BEFORE) - 1;
-                        if(beforeStrength != sourceToken->strength) {
-                            *status = U_INVALID_FORMAT_ERROR;
-                            syntaxError(src->source,0,(int32_t)(src->end-src->source),parseError);
-                            DBG_FORMAT_ERROR
-                            return 0;
-                        }
-                    }
-            } else {
-                if(lastToken != NULL && lastStrength == UCOL_TOK_RESET) {
-                    /* if the previous token was also a reset, */
-                    /*this means that we have two consecutive resets */
-                    /* and we want to remove the previous one if empty*/
-                    if(src->resultLen > 0 && ListList[src->resultLen-1].first == NULL) {
-                        src->resultLen--;
-                    }
-                }
-
-                if(sourceToken == NULL) { /* this is a reset, but it might still be somewhere in the tailoring, in shorter form */
-                    uint32_t searchCharsLen = src->parsedToken.charsLen;
-                    while(searchCharsLen > 1 && sourceToken == NULL) {
-                        searchCharsLen--;
-                        //key = searchCharsLen << 24 | charsOffset;
-                        UColToken key;
-                        key.source = searchCharsLen << 24 | src->parsedToken.charsOffset;
-                        key.rulesToParseHdl = &(src->source);
-                        sourceToken = (UColToken *)uhash_get(src->tailored, &key);
-                    }
-                    if(sourceToken != NULL) {
-                        expandNext = (src->parsedToken.charsLen - searchCharsLen) << 24 | (src->parsedToken.charsOffset + searchCharsLen);
-                    }
-                }
-
-                if((specs & UCOL_TOK_BEFORE) != 0) { /* we're doing before */
-                    if(top == FALSE) { /* there is no indirection */
-                        uint8_t strength = (specs & UCOL_TOK_BEFORE) - 1;
-                        if(sourceToken != NULL && sourceToken->strength != UCOL_TOK_RESET) {
-                            /* this is a before that is already ordered in the UCA - so we need to get the previous with good strength */
-                            while(sourceToken->strength > strength && sourceToken->previous != NULL) {
-                                sourceToken = sourceToken->previous;
-                            }
-                            /* here, either we hit the strength or NULL */
-                            if(sourceToken->strength == strength) {
-                                if(sourceToken->previous != NULL) {
-                                    sourceToken = sourceToken->previous;
-                                } else { /* start of list */
-                                    sourceToken = sourceToken->listHeader->reset;
-                                }
-                            } else { /* we hit NULL */
-                                /* we should be doing the else part */
-                                sourceToken = sourceToken->listHeader->reset;
-                                sourceToken = getVirginBefore(src, sourceToken, strength, parseError, status);
-                            }
-                        } else {
-                            sourceToken = getVirginBefore(src, sourceToken, strength, parseError, status);
-                        }
-                    } else { /* this is both before and indirection */
-                        top = FALSE;
-                        ListList[src->resultLen].previousCE = 0;
-                        ListList[src->resultLen].previousContCE = 0;
-                        ListList[src->resultLen].indirect = TRUE;
-                        /* we need to do slightly more work. we need to get the baseCE using the */
-                        /* inverse UCA & getPrevious. The next bound is not set, and will be decided */
-                        /* in ucol_bld */
-                        uint8_t strength = (specs & UCOL_TOK_BEFORE) - 1;
-                        uint32_t baseCE = ucolIndirectBoundaries[src->parsedToken.indirectIndex].startCE;
-                        uint32_t baseContCE = ucolIndirectBoundaries[src->parsedToken.indirectIndex].startContCE;//&0xFFFFFF3F;
-                        uint32_t CE = UCOL_NOT_FOUND, SecondCE = UCOL_NOT_FOUND;
-
-                        UCAConstants *consts = (UCAConstants *)((uint8_t *)src->UCA->image + src->UCA->image->UCAConsts);
-                        if((baseCE & 0xFF000000) >= (consts->UCA_PRIMARY_IMPLICIT_MIN<<24) && 
-                           (baseCE & 0xFF000000) <= (consts->UCA_PRIMARY_IMPLICIT_MAX<<24) ) { /* implicits - */
-                            uint32_t primary = (baseCE & UCOL_PRIMARYMASK) | ((baseContCE & UCOL_PRIMARYMASK) >> 16);
-                            uint32_t raw = uprv_uca_getRawFromImplicit(primary);
-                            uint32_t primaryCE = uprv_uca_getImplicitFromRaw(raw-1);
-                            CE = (primaryCE & UCOL_PRIMARYMASK) | 0x0505;
-                            SecondCE = ((primaryCE << 16) & UCOL_PRIMARYMASK) | UCOL_CONTINUATION_MARKER;
-                        } else {
-                            /*int32_t invPos = ucol_inv_getPrevCE(baseCE, baseContCE, &CE, &SecondCE, strength);*/
-                            ucol_inv_getPrevCE(src, baseCE, baseContCE, &CE, &SecondCE, strength);
-                        }
-
-                        ListList[src->resultLen].baseCE = CE;
-                        ListList[src->resultLen].baseContCE = SecondCE;
-                        ListList[src->resultLen].nextCE = 0;
-                        ListList[src->resultLen].nextContCE = 0;
-
-                        sourceToken = ucol_tok_initAReset(src, 0, &expandNext, parseError, status);
-                    }
-                }
-
-
-                /*  5 If the relation is a reset:
-                If sourceToken is null
-                Create new list, create new sourceToken, make the baseCE from source, put
-                the sourceToken in ListHeader of the new list */
-                if(sourceToken == NULL) {
-                    /*
-                    3 Consider each item: relation, source, and expansion: e.g. ...< x / y ...
-                    First convert all expansions into normal form. Examples:
-                    If "xy" doesn't occur earlier in the list or in the UCA, convert &xy * c *
-                    d * ... into &x * c/y * d * ...
-                    Note: reset values can never have expansions, although they can cause the
-                    very next item to have one. They may be contractions, if they are found
-                    earlier in the list.
-                    */
-                    if(top == FALSE) {
-                        collIterate s;
-                        uint32_t CE = UCOL_NOT_FOUND, SecondCE = UCOL_NOT_FOUND;
-
-                        uprv_init_collIterate(src->UCA, src->source+src->parsedToken.charsOffset, src->parsedToken.charsLen, &s, status);
-
-                        CE = ucol_getNextCE(src->UCA, &s, status);
-                        const UChar *expand = s.pos;
-                        SecondCE = ucol_getNextCE(src->UCA, &s, status);
-
-                        ListList[src->resultLen].baseCE = CE & 0xFFFFFF3F;
-                        if(isContinuation(SecondCE)) {
-                            ListList[src->resultLen].baseContCE = SecondCE;
-                        } else {
-                            ListList[src->resultLen].baseContCE = 0;
-                        }
-                        ListList[src->resultLen].nextCE = 0;
-                        ListList[src->resultLen].nextContCE = 0;
-                        ListList[src->resultLen].previousCE = 0;
-                        ListList[src->resultLen].previousContCE = 0;
-                        ListList[src->resultLen].indirect = FALSE;
-                        sourceToken = ucol_tok_initAReset(src, expand, &expandNext, parseError, status);
-                    } else { /* top == TRUE */
-                        /* just use the supplied values */
-                        top = FALSE;
-                        ListList[src->resultLen].previousCE = 0;
-                        ListList[src->resultLen].previousContCE = 0;
-                        ListList[src->resultLen].indirect = TRUE;
-                        ListList[src->resultLen].baseCE = ucolIndirectBoundaries[src->parsedToken.indirectIndex].startCE;
-                        ListList[src->resultLen].baseContCE = ucolIndirectBoundaries[src->parsedToken.indirectIndex].startContCE;
-                        ListList[src->resultLen].nextCE = ucolIndirectBoundaries[src->parsedToken.indirectIndex].limitCE;
-                        ListList[src->resultLen].nextContCE = ucolIndirectBoundaries[src->parsedToken.indirectIndex].limitContCE;
-
-                        sourceToken = ucol_tok_initAReset(src, 0, &expandNext, parseError, status);
-
-                    }
-                } else { /* reset to something already in rules */
-                    top = FALSE;
-                }
-            }
-            /*  7 After all this, set LAST to point to sourceToken, and goto step 3. */
-            lastToken = sourceToken;
-        } else {
-            if(U_FAILURE(*status)) {
-                return 0;
-            }
-        }
-    }
-#ifdef DEBUG_FOR_CODE_POINTS
-    fclose(dfcp_fp);
-#endif
-
-
-    if(src->resultLen > 0 && ListList[src->resultLen-1].first == NULL) {
-        src->resultLen--;
-    }
-    return src->resultLen;
-}
-
-const UChar* ucol_tok_getRulesFromBundle(
-    void* /*context*/,
-    const char* locale,
-    const char* type,
-    int32_t* pLength,
-    UErrorCode* status)
-{
-    const UChar* rules = NULL;
-    UResourceBundle* bundle;
-    UResourceBundle* collations;
-    UResourceBundle* collation;
-
-    *pLength = 0;
-
-    bundle = ures_open(U_ICUDATA_COLL, locale, status);
-    if(U_SUCCESS(*status)){
-        collations = ures_getByKey(bundle, "collations", NULL, status);
-        if(U_SUCCESS(*status)){
-            collation = ures_getByKey(collations, type, NULL, status);
-            if(U_SUCCESS(*status)){
-                rules = ures_getStringByKey(collation, "Sequence", pLength, status);
-                if(U_FAILURE(*status)){
-                    *pLength = 0;
-                    rules = NULL;
-                }
-                ures_close(collation);
-            }
-            ures_close(collations);
-        }
-    }
-
-    ures_close(bundle);
-
-    return rules;
-}
-
-void ucol_tok_initTokenList(
-    UColTokenParser *src,
-    const UChar *rules,
-    uint32_t rulesLength,
-    const UCollator *UCA,
-    GetCollationRulesFunction importFunc,
-    void* context, 
-    UErrorCode *status) {
-    U_NAMESPACE_USE
-
-    uint32_t nSize = 0;
-    uint32_t estimatedSize = (2*rulesLength+UCOL_TOK_EXTRA_RULE_SPACE_SIZE);
-
-    bool needToDeallocRules = false;
-
-    if(U_FAILURE(*status)) {
-        return;
-    }
-
-    // set everything to zero, so that we can clean up gracefully
-    uprv_memset(src, 0, sizeof(UColTokenParser));
-
-    // first we need to find options that don't like to be normalized,
-    // like copy and remove...
-    //const UChar *openBrace = rules;
-    int32_t optionNumber = -1;
-    const UChar *setStart = NULL;
-    uint32_t i = 0;
-    while(i < rulesLength) {
-        if(rules[i] == 0x005B) {    // '[': start of an option
-            /* Gets the following:
-               optionNumber: The index of the option.
-               setStart: The pointer at which the option arguments start.
-             */
-            optionNumber = ucol_uprv_tok_readOption(rules+i+1, rules+rulesLength, &setStart);
-
-            if(optionNumber == OPTION_OPTIMIZE) { /* copy - parts of UCA to tailoring */
-                // [optimize]
-                USet *newSet = ucol_uprv_tok_readAndSetUnicodeSet(setStart, rules+rulesLength, status);
-                if(U_SUCCESS(*status)) {
-                    if(src->copySet == NULL) {
-                        src->copySet = newSet;
-                    } else {
-                        uset_addAll(src->copySet, newSet);
-                        uset_close(newSet);
-                    }
-                } else {
-                    return;
-                }
-            } else if(optionNumber == OPTION_SUPPRESS_CONTRACTIONS) {
-                USet *newSet = ucol_uprv_tok_readAndSetUnicodeSet(setStart, rules+rulesLength, status);
-                if(U_SUCCESS(*status)) {
-                    if(src->removeSet == NULL) {
-                        src->removeSet = newSet;
-                    } else {
-                        uset_addAll(src->removeSet, newSet);
-                        uset_close(newSet);
-                    }
-                } else {
-                    return;
-                }
-            } else if(optionNumber == OPTION_IMPORT){
-                // [import <collation-name>]
-
-                // Find the address of the closing ].
-                UChar* import_end = u_strchr(setStart, 0x005D);
-                int32_t optionEndOffset = (int32_t)(import_end + 1 - rules);
-                // Ignore trailing whitespace.
-                while(PatternProps::isWhiteSpace(*(import_end-1))) {
-                    --import_end;
-                }
-
-                int32_t optionLength = (int32_t)(import_end - setStart);
-                char option[50];
-                if(optionLength >= (int32_t)sizeof(option)) {
-                    *status = U_ILLEGAL_ARGUMENT_ERROR;
-                    return;
-                }
-                u_UCharsToChars(setStart, option, optionLength);
-                option[optionLength] = 0;
-
-                *status = U_ZERO_ERROR;
-                char locale[50];
-                int32_t templ;
-                uloc_forLanguageTag(option, locale, (int32_t)sizeof(locale), &templ, status);
-                if(U_FAILURE(*status)) {
-                    *status = U_ILLEGAL_ARGUMENT_ERROR;
-                    return;
-                }
-
-                char type[50];
-                if (uloc_getKeywordValue(locale, "collation", type, (int32_t)sizeof(type), status) <= 0 ||
-                    U_FAILURE(*status)
-                ) {
-                    *status = U_ZERO_ERROR;
-                    uprv_strcpy(type, "standard");
-                }
-
-                // TODO: Use public functions when available, see ticket #8134.
-                char *keywords = (char *)locale_getKeywordsStart(locale);
-                if(keywords != NULL) {
-                    *keywords = 0;
-                }
-
-                int32_t importRulesLength = 0;
-                const UChar* importRules = importFunc(context, locale, type, &importRulesLength, status);
-
-                if (U_FAILURE(*status) || importRules==NULL) {
-                  /**
-                   * This seems to happen when genrb -R is used (#10043).
-                   * Make this an error, not a crash.
-                   */
-                  if(U_SUCCESS(*status)) {
-                    *status = U_MISSING_RESOURCE_ERROR;
-                  }
-                  return;
-                }
-#ifdef DEBUG_FOR_COLL_RULES
-                std::string s;
-                UnicodeString(importRules).toUTF8String(s);
-                std::cout << "Import rules = " << s << std::endl;
-#endif
-
-                // Add the length of the imported rules to length of the original rules,
-                // and subtract the length of the import option.
-                uint32_t newRulesLength = rulesLength + importRulesLength - (optionEndOffset - i);
-
-                UChar* newRules = (UChar*)uprv_malloc(newRulesLength*sizeof(UChar));
-
-#ifdef DEBUG_FOR_COLL_RULES
-                std::string s1;
-                UnicodeString(rules).toUTF8String(s1);
-                std::cout << "Original rules = " << s1 << std::endl;
-#endif
-
-
-                // Copy the section of the original rules leading up to the import
-                uprv_memcpy(newRules, rules, i*sizeof(UChar));
-                // Copy the imported rules
-                uprv_memcpy(newRules+i, importRules, importRulesLength*sizeof(UChar));
-                // Copy the rest of the original rules (minus the import option itself)
-                uprv_memcpy(newRules+i+importRulesLength,
-                            rules+optionEndOffset,
-                            (rulesLength-optionEndOffset)*sizeof(UChar));
-
-#ifdef DEBUG_FOR_COLL_RULES
-                std::string s2;
-                UnicodeString(newRules).toUTF8String(s2);
-                std::cout << "Resulting rules = " << s2 << std::endl;
-#endif
-
-                if(needToDeallocRules){
-                    // if needToDeallocRules is set, then we allocated rules, so it's safe to cast and free
-                    uprv_free((void*)rules);
-                }
-                needToDeallocRules = true;
-                rules = newRules;
-                rulesLength = newRulesLength;
-
-                estimatedSize += importRulesLength*2;
-
-                // First character of the new rules needs to be processed
-                i--;
-            }
-        }
-        //openBrace++;
-        i++;
-    }
-
-    src->source = (UChar *)uprv_malloc(estimatedSize*sizeof(UChar));
-    /* test for NULL */
-    if (src->source == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return;
-    }
-    uprv_memset(src->source, 0, estimatedSize*sizeof(UChar));
-    nSize = unorm_normalize(rules, rulesLength, UNORM_NFD, 0, src->source, estimatedSize, status);
-    if(nSize > estimatedSize || *status == U_BUFFER_OVERFLOW_ERROR) {
-        *status = U_ZERO_ERROR;
-        src->source = (UChar *)uprv_realloc(src->source, (nSize+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar));
-        /* test for NULL */
-        if (src->source == NULL) {
-            *status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        nSize = unorm_normalize(rules, rulesLength, UNORM_NFD, 0, src->source, nSize+UCOL_TOK_EXTRA_RULE_SPACE_SIZE, status);
-    }
-    if(needToDeallocRules){
-        // if needToDeallocRules is set, then we allocated rules, so it's safe to cast and free
-        uprv_free((void*)rules);
-    }
-
-
-    src->current = src->source;
-    src->end = src->source+nSize;
-    src->sourceCurrent = src->source;
-    src->extraCurrent = src->end+1; // Preserve terminating zero in the rule string so that option scanning works correctly
-    src->extraEnd = src->source+estimatedSize; //src->end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
-    src->varTop = NULL;
-    src->UCA = UCA;
-    src->invUCA = ucol_initInverseUCA(status);
-    src->parsedToken.charsLen = 0;
-    src->parsedToken.charsOffset = 0;
-    src->parsedToken.extensionLen = 0;
-    src->parsedToken.extensionOffset = 0;
-    src->parsedToken.prefixLen = 0;
-    src->parsedToken.prefixOffset = 0;
-    src->parsedToken.flags = 0;
-    src->parsedToken.strength = UCOL_TOK_UNSET;
-    src->buildCCTabFlag = FALSE;
-    src->isStarred = FALSE;
-    src->inRange = FALSE;
-    src->lastRangeCp = 0;
-    src->previousCp = 0;
-
-    if(U_FAILURE(*status)) {
-        return;
-    }
-    src->tailored = uhash_open(uhash_hashTokens, uhash_compareTokens, NULL, status);
-    if(U_FAILURE(*status)) {
-        return;
-    }
-    uhash_setValueDeleter(src->tailored, uprv_free);
-
-    src->opts = (UColOptionSet *)uprv_malloc(sizeof(UColOptionSet));
-    /* test for NULL */
-    if (src->opts == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return;
-    }
-
-    uprv_memcpy(src->opts, UCA->options, sizeof(UColOptionSet));
-
-    src->lh = 0;
-    src->listCapacity = 1024;
-    src->lh = (UColTokListHeader *)uprv_malloc(src->listCapacity*sizeof(UColTokListHeader));
-    //Test for NULL
-    if (src->lh == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return;
-    }
-    uprv_memset(src->lh, 0, src->listCapacity*sizeof(UColTokListHeader));
-    src->resultLen = 0;
-
-    UCAConstants *consts = (UCAConstants *)((uint8_t *)src->UCA->image + src->UCA->image->UCAConsts);
-
-    // UCOL_RESET_TOP_VALUE
-    setIndirectBoundaries(0, consts->UCA_LAST_NON_VARIABLE, consts->UCA_FIRST_IMPLICIT);
-    // UCOL_FIRST_PRIMARY_IGNORABLE
-    setIndirectBoundaries(1, consts->UCA_FIRST_PRIMARY_IGNORABLE, 0);
-    // UCOL_LAST_PRIMARY_IGNORABLE
-    setIndirectBoundaries(2, consts->UCA_LAST_PRIMARY_IGNORABLE, 0);
-    // UCOL_FIRST_SECONDARY_IGNORABLE
-    setIndirectBoundaries(3, consts->UCA_FIRST_SECONDARY_IGNORABLE, 0);
-    // UCOL_LAST_SECONDARY_IGNORABLE
-    setIndirectBoundaries(4, consts->UCA_LAST_SECONDARY_IGNORABLE, 0);
-    // UCOL_FIRST_TERTIARY_IGNORABLE
-    setIndirectBoundaries(5, consts->UCA_FIRST_TERTIARY_IGNORABLE, 0);
-    // UCOL_LAST_TERTIARY_IGNORABLE
-    setIndirectBoundaries(6, consts->UCA_LAST_TERTIARY_IGNORABLE, 0);
-    // UCOL_FIRST_VARIABLE
-    setIndirectBoundaries(7, consts->UCA_FIRST_VARIABLE, 0);
-    // UCOL_LAST_VARIABLE
-    setIndirectBoundaries(8, consts->UCA_LAST_VARIABLE, 0);
-    // UCOL_FIRST_NON_VARIABLE
-    setIndirectBoundaries(9, consts->UCA_FIRST_NON_VARIABLE, 0);
-    // UCOL_LAST_NON_VARIABLE
-    setIndirectBoundaries(10, consts->UCA_LAST_NON_VARIABLE, consts->UCA_FIRST_IMPLICIT);
-    // UCOL_FIRST_IMPLICIT
-    setIndirectBoundaries(11, consts->UCA_FIRST_IMPLICIT, 0);
-    // UCOL_LAST_IMPLICIT
-    setIndirectBoundaries(12, consts->UCA_LAST_IMPLICIT, consts->UCA_FIRST_TRAILING);
-    // UCOL_FIRST_TRAILING
-    setIndirectBoundaries(13, consts->UCA_FIRST_TRAILING, 0);
-    // UCOL_LAST_TRAILING
-    setIndirectBoundaries(14, consts->UCA_LAST_TRAILING, 0);
-    ucolIndirectBoundaries[14].limitCE = (consts->UCA_PRIMARY_SPECIAL_MIN<<24);
-}
-
-
-void ucol_tok_closeTokenList(UColTokenParser *src) {
-    if(src->copySet != NULL) {
-        uset_close(src->copySet);
-    }
-    if(src->removeSet != NULL) {
-        uset_close(src->removeSet);
-    }
-    if(src->tailored != NULL) {
-        uhash_close(src->tailored);
-    }
-    if(src->lh != NULL) {
-        uprv_free(src->lh);
-    }
-    if(src->source != NULL) {
-        uprv_free(src->source);
-    }
-    if(src->opts != NULL) {
-        uprv_free(src->opts);
-    }
-    if (src->reorderCodes != NULL) {
-        uprv_free(src->reorderCodes);
-    }
-}
-
-#endif /* #if !UCONFIG_NO_COLLATION */
diff --git a/icu4c/source/i18n/ucol_tok.h b/icu4c/source/i18n/ucol_tok.h
deleted file mode 100644 (file)
index 516534c..0000000
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
-*******************************************************************************
-*
-*   Copyright (C) 2001-2011, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  ucol_tok.h
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created 02/22/2001
-*   created by: Vladimir Weinstein
-*
-* This module reads a tailoring rule string and produces a list of 
-* tokens that will be turned into collation elements
-* 
-*/
-
-#ifndef UCOL_TOKENS_H
-#define UCOL_TOKENS_H
-
-#include "unicode/utypes.h"
-#include "unicode/uset.h"
-
-#if !UCONFIG_NO_COLLATION
-
-#include "ucol_imp.h"
-#include "uhash.h"
-#include "unicode/parseerr.h"
-
-#define UCOL_TOK_UNSET 0xFFFFFFFF
-#define UCOL_TOK_RESET 0xDEADBEEF
-
-#define UCOL_TOK_POLARITY_NEGATIVE 0
-#define UCOL_TOK_POLARITY_POSITIVE 1
-
-#define UCOL_TOK_TOP 0x04
-#define UCOL_TOK_VARIABLE_TOP 0x08
-#define UCOL_TOK_BEFORE 0x03
-#define UCOL_TOK_SUCCESS 0x10
-
-/* this is space for the extra strings that need to be unquoted */
-/* during the parsing of the rules */
-#define UCOL_TOK_EXTRA_RULE_SPACE_SIZE 4096
-typedef struct UColToken UColToken;
-
-typedef struct  {
-  UColToken* first;
-  UColToken* last;
-  UColToken* reset;
-  UBool indirect;
-  uint32_t baseCE;
-  uint32_t baseContCE;
-  uint32_t nextCE;
-  uint32_t nextContCE;
-  uint32_t previousCE;
-  uint32_t previousContCE;
-  int32_t pos[UCOL_STRENGTH_LIMIT];
-  uint32_t gapsLo[3*UCOL_CE_STRENGTH_LIMIT];
-  uint32_t gapsHi[3*UCOL_CE_STRENGTH_LIMIT];
-  uint32_t numStr[UCOL_CE_STRENGTH_LIMIT];
-  UColToken* fStrToken[UCOL_CE_STRENGTH_LIMIT];
-  UColToken* lStrToken[UCOL_CE_STRENGTH_LIMIT];
-} UColTokListHeader;
-
-struct UColToken {
-  UChar debugSource;
-  UChar debugExpansion;
-  UChar debugPrefix;
-  uint32_t CEs[128];
-  uint32_t noOfCEs;
-  uint32_t expCEs[128];
-  uint32_t noOfExpCEs;
-  uint32_t source;
-  uint32_t expansion;
-  uint32_t prefix;
-  uint32_t strength;
-  uint32_t toInsert;
-  uint32_t polarity; /* 1 for <, <<, <<<, , ; and -1 for >, >>, >>> */
-  UColTokListHeader *listHeader;
-  UColToken* previous;
-  UColToken* next;
-  UChar **rulesToParseHdl;
-  uint16_t flags;
-};
-
-/* 
- * This is a token that has been parsed
- * but not yet processed. Used to reduce
- * the number of arguments in the parser
- */
-typedef struct {
-  uint32_t strength;
-  uint32_t charsOffset;
-  uint32_t charsLen;
-  uint32_t extensionOffset;
-  uint32_t extensionLen;
-  uint32_t prefixOffset;
-  uint32_t prefixLen;
-  uint16_t flags;
-  uint16_t indirectIndex;
-} UColParsedToken;
-
-
-typedef struct {
-  UColParsedToken parsedToken;
-  UChar *source;
-  UChar *end;
-  const UChar *current;
-  UChar *sourceCurrent;
-  UChar *extraCurrent;
-  UChar *extraEnd;
-  const InverseUCATableHeader *invUCA;
-  const UCollator *UCA;
-  UHashtable *tailored;
-  UColOptionSet *opts;
-  uint32_t resultLen;
-  uint32_t listCapacity;
-  UColTokListHeader *lh;
-  UColToken *varTop;
-  USet *copySet;
-  USet *removeSet;
-  UBool buildCCTabFlag;  /* Tailoring rule requirs building combining class table. */
-
-  UChar32 previousCp;               /* Previous code point. */
-  /* For processing starred lists. */
-  UBool isStarred;                   /* Are we processing a starred token? */
-  UBool savedIsStarred;
-  uint32_t currentStarredCharIndex;  /* Index of the current charrecter in the starred expression. */
-  uint32_t lastStarredCharIndex;    /* Index to the last character in the starred expression. */
-
-  /* For processing ranges. */
-  UBool inRange;                     /* Are we in a range? */
-  UChar32 currentRangeCp;           /* Current code point in the range. */
-  UChar32 lastRangeCp;              /* The last code point in the range. */
-  
-  /* reorder codes for collation reordering */
-  int32_t* reorderCodes;
-  int32_t reorderCodesLength;
-
-} UColTokenParser;
-
-typedef struct {
-  const UChar *subName;
-  int32_t subLen;
-  UColAttributeValue attrVal;
-} ucolTokSuboption;
-
-typedef struct {
-   const UChar *optionName;
-   int32_t optionLen;
-   const ucolTokSuboption *subopts;
-   int32_t subSize;
-   UColAttribute attr;
-} ucolTokOption;
-
-#define ucol_tok_isSpecialChar(ch)              \
-    (((((ch) <= 0x002F) && ((ch) >= 0x0020)) || \
-      (((ch) <= 0x003F) && ((ch) >= 0x003A)) || \
-      (((ch) <= 0x0060) && ((ch) >= 0x005B)) || \
-      (((ch) <= 0x007E) && ((ch) >= 0x007D)) || \
-      (ch) == 0x007B))
-
-
-U_CFUNC 
-uint32_t ucol_tok_assembleTokenList(UColTokenParser *src,
-                                    UParseError *parseError, 
-                                    UErrorCode *status);
-
-U_CFUNC
-void ucol_tok_initTokenList(UColTokenParser *src,
-                            const UChar *rules,
-                            const uint32_t rulesLength,
-                            const UCollator *UCA,
-                            GetCollationRulesFunction importFunc,
-                            void* context,
-                            UErrorCode *status);
-
-U_CFUNC void ucol_tok_closeTokenList(UColTokenParser *src);
-
-U_CAPI const UChar* U_EXPORT2 ucol_tok_parseNextToken(UColTokenParser *src, 
-                        UBool startOfRules,
-                        UParseError *parseError,
-                        UErrorCode *status);
-
-
-U_CAPI const UChar * U_EXPORT2
-ucol_tok_getNextArgument(const UChar *start, const UChar *end, 
-                               UColAttribute *attrib, UColAttributeValue *value, 
-                               UErrorCode *status);
-U_CAPI int32_t U_EXPORT2 ucol_inv_getNextCE(const UColTokenParser *src,
-                                            uint32_t CE, uint32_t contCE,
-                                            uint32_t *nextCE, uint32_t *nextContCE,
-                                            uint32_t strength);
-U_CFUNC int32_t U_EXPORT2 ucol_inv_getPrevCE(const UColTokenParser *src,
-                                            uint32_t CE, uint32_t contCE,
-                                            uint32_t *prevCE, uint32_t *prevContCE,
-                                            uint32_t strength);
-
-const UChar* U_CALLCONV ucol_tok_getRulesFromBundle(
-    void* context,
-    const char* locale,
-    const char* type,
-    int32_t* pLength,
-    UErrorCode* status);
-
-#endif /* #if !UCONFIG_NO_COLLATION */
-
-#endif
diff --git a/icu4c/source/i18n/ucol_wgt.cpp b/icu4c/source/i18n/ucol_wgt.cpp
deleted file mode 100644 (file)
index 57d49fc..0000000
+++ /dev/null
@@ -1,577 +0,0 @@
-/*  
-*******************************************************************************
-*
-*   Copyright (C) 1999-2011, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  ucol_wgt.cpp
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created on: 2001mar08
-*   created by: Markus W. Scherer
-*
-*   This file contains code for allocating n collation element weights
-*   between two exclusive limits.
-*   It is used only internally by ucol_bld.
-*/
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION
-
-#include "ucol_imp.h"
-#include "ucol_wgt.h"
-#include "cmemory.h"
-#include "uarrsort.h"
-
-#ifdef UCOL_DEBUG
-#   include <stdio.h>
-#endif
-
-/* collation element weight allocation -------------------------------------- */
-
-/* helper functions for CE weights */
-
-static inline int32_t
-lengthOfWeight(uint32_t weight) {
-    if((weight&0xffffff)==0) {
-        return 1;
-    } else if((weight&0xffff)==0) {
-        return 2;
-    } else if((weight&0xff)==0) {
-        return 3;
-    } else {
-        return 4;
-    }
-}
-
-static inline uint32_t
-getWeightTrail(uint32_t weight, int32_t length) {
-    return (uint32_t)(weight>>(8*(4-length)))&0xff;
-}
-
-static inline uint32_t
-setWeightTrail(uint32_t weight, int32_t length, uint32_t trail) {
-    length=8*(4-length);
-    return (uint32_t)((weight&(0xffffff00<<length))|(trail<<length));
-}
-
-static inline uint32_t
-getWeightByte(uint32_t weight, int32_t idx) {
-    return getWeightTrail(weight, idx); /* same calculation */
-}
-
-static inline uint32_t
-setWeightByte(uint32_t weight, int32_t idx, uint32_t byte) {
-    uint32_t mask; /* 0xffffffff except a 00 "hole" for the index-th byte */
-
-    idx*=8;
-    if(idx<32) {
-        mask=((uint32_t)0xffffffff)>>idx;
-    } else {
-        // Do not use uint32_t>>32 because on some platforms that does not shift at all
-        // while we need it to become 0.
-        // PowerPC: 0xffffffff>>32 = 0           (wanted)
-        // x86:     0xffffffff>>32 = 0xffffffff  (not wanted)
-        //
-        // ANSI C99 6.5.7 Bitwise shift operators:
-        // "If the value of the right operand is negative
-        // or is greater than or equal to the width of the promoted left operand,
-        // the behavior is undefined."
-        mask=0;
-    }
-    idx=32-idx;
-    mask|=0xffffff00<<idx;
-    return (uint32_t)((weight&mask)|(byte<<idx));
-}
-
-static inline uint32_t
-truncateWeight(uint32_t weight, int32_t length) {
-    return (uint32_t)(weight&(0xffffffff<<(8*(4-length))));
-}
-
-static inline uint32_t
-incWeightTrail(uint32_t weight, int32_t length) {
-    return (uint32_t)(weight+(1UL<<(8*(4-length))));
-}
-
-static inline uint32_t
-decWeightTrail(uint32_t weight, int32_t length) {
-    return (uint32_t)(weight-(1UL<<(8*(4-length))));
-}
-
-static inline uint32_t
-incWeight(uint32_t weight, int32_t length, uint32_t maxByte) {
-    uint32_t byte;
-
-    for(;;) {
-        byte=getWeightByte(weight, length);
-        if(byte<maxByte) {
-            return setWeightByte(weight, length, byte+1);
-        } else {
-            /* roll over, set this byte to UCOL_BYTE_FIRST_TAILORED and increment the previous one */
-            weight=setWeightByte(weight, length, UCOL_BYTE_FIRST_TAILORED);
-            --length;
-        }
-    }
-}
-
-static inline int32_t
-lengthenRange(WeightRange *range, uint32_t maxByte, uint32_t countBytes) {
-    int32_t length;
-
-    length=range->length2+1;
-    range->start=setWeightTrail(range->start, length, UCOL_BYTE_FIRST_TAILORED);
-    range->end=setWeightTrail(range->end, length, maxByte);
-    range->count2*=countBytes;
-    range->length2=length;
-    return length;
-}
-
-/* for uprv_sortArray: sort ranges in weight order */
-static int32_t U_CALLCONV
-compareRanges(const void * /*context*/, const void *left, const void *right) {
-    uint32_t l, r;
-
-    l=((const WeightRange *)left)->start;
-    r=((const WeightRange *)right)->start;
-    if(l<r) {
-        return -1;
-    } else if(l>r) {
-        return 1;
-    } else {
-        return 0;
-    }
-}
-
-/*
- * take two CE weights and calculate the
- * possible ranges of weights between the two limits, excluding them
- * for weights with up to 4 bytes there are up to 2*4-1=7 ranges
- */
-static inline int32_t
-getWeightRanges(uint32_t lowerLimit, uint32_t upperLimit,
-                uint32_t maxByte, uint32_t countBytes,
-                WeightRange ranges[7]) {
-    WeightRange lower[5], middle, upper[5]; /* [0] and [1] are not used - this simplifies indexing */
-    uint32_t weight, trail;
-    int32_t length, lowerLength, upperLength, rangeCount;
-
-    /* assume that both lowerLimit & upperLimit are not 0 */
-
-    /* get the lengths of the limits */
-    lowerLength=lengthOfWeight(lowerLimit);
-    upperLength=lengthOfWeight(upperLimit);
-
-#ifdef UCOL_DEBUG
-    printf("length of lower limit 0x%08lx is %ld\n", lowerLimit, lowerLength);
-    printf("length of upper limit 0x%08lx is %ld\n", upperLimit, upperLength);
-#endif
-
-    if(lowerLimit>=upperLimit) {
-#ifdef UCOL_DEBUG
-        printf("error: no space between lower & upper limits\n");
-#endif
-        return 0;
-    }
-
-    /* check that neither is a prefix of the other */
-    if(lowerLength<upperLength) {
-        if(lowerLimit==truncateWeight(upperLimit, lowerLength)) {
-#ifdef UCOL_DEBUG
-            printf("error: lower limit 0x%08lx is a prefix of upper limit 0x%08lx\n", lowerLimit, upperLimit);
-#endif
-            return 0;
-        }
-    }
-    /* if the upper limit is a prefix of the lower limit then the earlier test lowerLimit>=upperLimit has caught it */
-
-    /* reset local variables */
-    uprv_memset(lower, 0, sizeof(lower));
-    uprv_memset(&middle, 0, sizeof(middle));
-    uprv_memset(upper, 0, sizeof(upper));
-
-    /*
-     * With the limit lengths of 1..4, there are up to 7 ranges for allocation:
-     * range     minimum length
-     * lower[4]  4
-     * lower[3]  3
-     * lower[2]  2
-     * middle    1
-     * upper[2]  2
-     * upper[3]  3
-     * upper[4]  4
-     *
-     * We are now going to calculate up to 7 ranges.
-     * Some of them will typically overlap, so we will then have to merge and eliminate ranges.
-     */
-    weight=lowerLimit;
-    for(length=lowerLength; length>=2; --length) {
-        trail=getWeightTrail(weight, length);
-        if(trail<maxByte) {
-            lower[length].start=incWeightTrail(weight, length);
-            lower[length].end=setWeightTrail(weight, length, maxByte);
-            lower[length].length=length;
-            lower[length].count=maxByte-trail;
-        }
-        weight=truncateWeight(weight, length-1);
-    }
-    middle.start=incWeightTrail(weight, 1);
-
-    weight=upperLimit;
-    for(length=upperLength; length>=2; --length) {
-        trail=getWeightTrail(weight, length);
-        if(trail>UCOL_BYTE_FIRST_TAILORED) {
-            upper[length].start=setWeightTrail(weight, length, UCOL_BYTE_FIRST_TAILORED);
-            upper[length].end=decWeightTrail(weight, length);
-            upper[length].length=length;
-            upper[length].count=trail-UCOL_BYTE_FIRST_TAILORED;
-        }
-        weight=truncateWeight(weight, length-1);
-    }
-    middle.end=decWeightTrail(weight, 1);
-
-    /* set the middle range */
-    middle.length=1;
-    if(middle.end>=middle.start) {
-        middle.count=(int32_t)((middle.end-middle.start)>>24)+1;
-    } else {
-        /* eliminate overlaps */
-        uint32_t start, end;
-
-        /* remove the middle range */
-        middle.count=0;
-
-        /* reduce or remove the lower ranges that go beyond upperLimit */
-        for(length=4; length>=2; --length) {
-            if(lower[length].count>0 && upper[length].count>0) {
-                start=upper[length].start;
-                end=lower[length].end;
-
-                if(end>=start || incWeight(end, length, maxByte)==start) {
-                    /* lower and upper ranges collide or are directly adjacent: merge these two and remove all shorter ranges */
-                    start=lower[length].start;
-                    end=lower[length].end=upper[length].end;
-                    /*
-                     * merging directly adjacent ranges needs to subtract the 0/1 gaps in between;
-                     * it may result in a range with count>countBytes
-                     */
-                    lower[length].count=
-                        (int32_t)(getWeightTrail(end, length)-getWeightTrail(start, length)+1+
-                                  countBytes*(getWeightByte(end, length-1)-getWeightByte(start, length-1)));
-                    upper[length].count=0;
-                    while(--length>=2) {
-                        lower[length].count=upper[length].count=0;
-                    }
-                    break;
-                }
-            }
-        }
-    }
-
-#ifdef UCOL_DEBUG
-    /* print ranges */
-    for(length=4; length>=2; --length) {
-        if(lower[length].count>0) {
-            printf("lower[%ld] .start=0x%08lx .end=0x%08lx .count=%ld\n", length, lower[length].start, lower[length].end, lower[length].count);
-        }
-    }
-    if(middle.count>0) {
-        printf("middle   .start=0x%08lx .end=0x%08lx .count=%ld\n", middle.start, middle.end, middle.count);
-    }
-    for(length=2; length<=4; ++length) {
-        if(upper[length].count>0) {
-            printf("upper[%ld] .start=0x%08lx .end=0x%08lx .count=%ld\n", length, upper[length].start, upper[length].end, upper[length].count);
-        }
-    }
-#endif
-
-    /* copy the ranges, shortest first, into the result array */
-    rangeCount=0;
-    if(middle.count>0) {
-        uprv_memcpy(ranges, &middle, sizeof(WeightRange));
-        rangeCount=1;
-    }
-    for(length=2; length<=4; ++length) {
-        /* copy upper first so that later the middle range is more likely the first one to use */
-        if(upper[length].count>0) {
-            uprv_memcpy(ranges+rangeCount, upper+length, sizeof(WeightRange));
-            ++rangeCount;
-        }
-        if(lower[length].count>0) {
-            uprv_memcpy(ranges+rangeCount, lower+length, sizeof(WeightRange));
-            ++rangeCount;
-        }
-    }
-    return rangeCount;
-}
-
-/*
- * call getWeightRanges and then determine heuristically
- * which ranges to use for a given number of weights between (excluding)
- * two limits
- */
-U_CFUNC int32_t
-ucol_allocWeights(uint32_t lowerLimit, uint32_t upperLimit,
-                  uint32_t n,
-                  uint32_t maxByte,
-                  WeightRange ranges[7]) {
-    /* number of usable byte values 3..maxByte */
-    uint32_t countBytes=maxByte-UCOL_BYTE_FIRST_TAILORED+1;
-
-    uint32_t lengthCounts[6]; /* [0] unused, [5] to make index checks unnecessary */
-    uint32_t maxCount;
-    int32_t i, rangeCount, minLength/*, maxLength*/;
-
-    /* countBytes to the power of index */
-    uint32_t powers[5];
-    /* gcc requires explicit initialization */
-    powers[0] = 1;
-    powers[1] = countBytes;
-    powers[2] = countBytes*countBytes;
-    powers[3] = countBytes*countBytes*countBytes;
-    powers[4] = countBytes*countBytes*countBytes*countBytes;
-
-#ifdef UCOL_DEBUG
-    puts("");
-#endif
-
-    rangeCount=getWeightRanges(lowerLimit, upperLimit, maxByte, countBytes, ranges);
-    if(rangeCount<=0) {
-#ifdef UCOL_DEBUG
-        printf("error: unable to get Weight ranges\n");
-#endif
-        return 0;
-    }
-
-    /* what is the maximum number of weights with these ranges? */
-    maxCount=0;
-    for(i=0; i<rangeCount; ++i) {
-        maxCount+=(uint32_t)ranges[i].count*powers[4-ranges[i].length];
-    }
-    if(maxCount>=n) {
-#ifdef UCOL_DEBUG
-        printf("the maximum number of %lu weights is sufficient for n=%lu\n", maxCount, n);
-#endif
-    } else {
-#ifdef UCOL_DEBUG
-        printf("error: the maximum number of %lu weights is insufficient for n=%lu\n", maxCount, n);
-#endif
-        return 0;
-    }
-
-    /* set the length2 and count2 fields */
-    for(i=0; i<rangeCount; ++i) {
-        ranges[i].length2=ranges[i].length;
-        ranges[i].count2=(uint32_t)ranges[i].count;
-    }
-
-    /* try until we find suitably large ranges */
-    for(;;) {
-        /* get the smallest number of bytes in a range */
-        minLength=ranges[0].length2;
-
-        /* sum up the number of elements that fit into ranges of each byte length */
-        uprv_memset(lengthCounts, 0, sizeof(lengthCounts));
-        for(i=0; i<rangeCount; ++i) {
-            lengthCounts[ranges[i].length2]+=ranges[i].count2;
-        }
-
-        /* now try to allocate n elements in the available short ranges */
-        if(n<=(lengthCounts[minLength]+lengthCounts[minLength+1])) {
-            /* trivial cases, use the first few ranges */
-            maxCount=0;
-            rangeCount=0;
-            do {
-                maxCount+=ranges[rangeCount].count2;
-                ++rangeCount;
-            } while(n>maxCount);
-#ifdef UCOL_DEBUG
-            printf("take first %ld ranges\n", rangeCount);
-#endif
-            break;
-        } else if(n<=ranges[0].count2*countBytes) {
-            /* easy case, just make this one range large enough by lengthening it once more, possibly split it */
-            uint32_t count1, count2, power_1, power;
-
-            /*maxLength=minLength+1;*/
-
-            /* calculate how to split the range between maxLength-1 (count1) and maxLength (count2) */
-            power_1=powers[minLength-ranges[0].length];
-            power=power_1*countBytes;
-            count2=(n+power-1)/power;
-            count1=ranges[0].count-count2;
-
-            /* split the range */
-#ifdef UCOL_DEBUG
-            printf("split the first range %ld:%ld\n", count1, count2);
-#endif
-            if(count1<1) {
-                rangeCount=1;
-
-                /* lengthen the entire range to maxLength */
-                lengthenRange(ranges, maxByte, countBytes);
-            } else {
-                /* really split the range */
-                uint32_t byte;
-
-                /* create a new range with the end and initial and current length of the old one */
-                rangeCount=2;
-                ranges[1].end=ranges[0].end;
-                ranges[1].length=ranges[0].length;
-                ranges[1].length2=minLength;
-
-                /* set the end of the first range according to count1 */
-                i=ranges[0].length;
-                byte=getWeightByte(ranges[0].start, i)+count1-1;
-
-                /*
-                 * ranges[0].count and count1 may be >countBytes
-                 * from merging adjacent ranges;
-                 * byte>maxByte is possible
-                 */
-                if(byte<=maxByte) {
-                    ranges[0].end=setWeightByte(ranges[0].start, i, byte);
-                } else /* byte>maxByte */ {
-                    ranges[0].end=setWeightByte(incWeight(ranges[0].start, i-1, maxByte), i, byte-countBytes);
-                }
-
-                /* set the bytes in the end weight at length+1..length2 to maxByte */
-                byte=(maxByte<<24)|(maxByte<<16)|(maxByte<<8)|maxByte; /* this used to be 0xffffffff */
-                ranges[0].end=truncateWeight(ranges[0].end, i)|
-                              ((byte>>(8*i))&(byte<<(8*(4-minLength))));
-
-                /* set the start of the second range to immediately follow the end of the first one */
-                ranges[1].start=incWeight(ranges[0].end, minLength, maxByte);
-
-                /* set the count values (informational) */
-                ranges[0].count=count1;
-                ranges[1].count=count2;
-
-                ranges[0].count2=count1*power_1;
-                ranges[1].count2=count2*power_1; /* will be *countBytes when lengthened */
-
-                /* lengthen the second range to maxLength */
-                lengthenRange(ranges+1, maxByte, countBytes);
-            }
-            break;
-        }
-
-        /* no good match, lengthen all minLength ranges and iterate */
-#ifdef UCOL_DEBUG
-        printf("lengthen the short ranges from %ld bytes to %ld and iterate\n", minLength, minLength+1);
-#endif
-        for(i=0; ranges[i].length2==minLength; ++i) {
-            lengthenRange(ranges+i, maxByte, countBytes);
-        }
-    }
-
-    if(rangeCount>1) {
-        /* sort the ranges by weight values */
-        UErrorCode errorCode=U_ZERO_ERROR;
-        uprv_sortArray(ranges, rangeCount, sizeof(WeightRange), compareRanges, NULL, FALSE, &errorCode);
-        /* ignore error code: we know that the internal sort function will not fail here */
-    }
-
-#ifdef UCOL_DEBUG
-    puts("final ranges:");
-    for(i=0; i<rangeCount; ++i) {
-        printf("ranges[%ld] .start=0x%08lx .end=0x%08lx .length=%ld .length2=%ld .count=%ld .count2=%lu\n",
-               i, ranges[i].start, ranges[i].end, ranges[i].length, ranges[i].length2, ranges[i].count, ranges[i].count2);
-    }
-#endif
-
-    /* set maxByte in ranges[0] for ucol_nextWeight() */
-    ranges[0].count=maxByte;
-
-    return rangeCount;
-}
-
-/*
- * given a set of ranges calculated by ucol_allocWeights(),
- * iterate through the weights
- */
-U_CFUNC uint32_t
-ucol_nextWeight(WeightRange ranges[], int32_t *pRangeCount) {
-    if(*pRangeCount<=0) {
-        return 0xffffffff;
-    } else {
-        uint32_t weight, maxByte;
-
-        /* get maxByte from the .count field */
-        maxByte=ranges[0].count;
-
-        /* get the next weight */
-        weight=ranges[0].start;
-        if(weight==ranges[0].end) {
-            /* this range is finished, remove it and move the following ones up */
-            if(--*pRangeCount>0) {
-                uprv_memmove(ranges, ranges+1, *pRangeCount*sizeof(WeightRange));
-                ranges[0].count=maxByte; /* keep maxByte in ranges[0] */
-            }
-        } else {
-            /* increment the weight for the next value */
-            ranges[0].start=incWeight(weight, ranges[0].length2, maxByte);
-        }
-
-        return weight;
-    }
-}
-
-#if 0 // #ifdef UCOL_DEBUG
-
-static void
-testAlloc(uint32_t lowerLimit, uint32_t upperLimit, uint32_t n, UBool enumerate) {
-    WeightRange ranges[8];
-    int32_t rangeCount;
-
-    rangeCount=ucol_allocWeights(lowerLimit, upperLimit, n, ranges);
-    if(enumerate) {
-        uint32_t weight;
-
-        while(n>0) {
-            weight=ucol_nextWeight(ranges, &rangeCount);
-            if(weight==0xffffffff) {
-                printf("error: 0xffffffff with %lu more weights to go\n", n);
-                break;
-            }
-            printf("    0x%08lx\n", weight);
-            --n;
-        }
-    }
-}
-
-extern int
-main(int argc, const char *argv[]) {
-#if 0
-#endif
-    testAlloc(0x364214fc, 0x44b87d23, 5, FALSE);
-    testAlloc(0x36421500, 0x44b87d23, 5, FALSE);
-    testAlloc(0x36421500, 0x44b87d23, 20, FALSE);
-    testAlloc(0x36421500, 0x44b87d23, 13700, FALSE);
-    testAlloc(0x36421500, 0x38b87d23, 1, FALSE);
-    testAlloc(0x36421500, 0x38b87d23, 20, FALSE);
-    testAlloc(0x36421500, 0x38b87d23, 200, TRUE);
-    testAlloc(0x36421500, 0x38b87d23, 13700, FALSE);
-    testAlloc(0x36421500, 0x37b87d23, 13700, FALSE);
-    testAlloc(0x36ef1500, 0x37b87d23, 13700, FALSE);
-    testAlloc(0x36421500, 0x36b87d23, 13700, FALSE);
-    testAlloc(0x36b87122, 0x36b87d23, 13700, FALSE);
-    testAlloc(0x49000000, 0x4a600000, 13700, FALSE);
-    testAlloc(0x9fffffff, 0xd0000000, 13700, FALSE);
-    testAlloc(0x9fffffff, 0xd0000000, 67400, FALSE);
-    testAlloc(0x9fffffff, 0xa0030000, 67400, FALSE);
-    testAlloc(0x9fffffff, 0xa0030000, 40000, FALSE);
-    testAlloc(0xa0000000, 0xa0030000, 40000, FALSE);
-    testAlloc(0xa0031100, 0xa0030000, 40000, FALSE);
-#if 0
-#endif
-    return 0;
-}
-
-#endif
-
-#endif /* #if !UCONFIG_NO_COLLATION */
diff --git a/icu4c/source/i18n/ucol_wgt.h b/icu4c/source/i18n/ucol_wgt.h
deleted file mode 100644 (file)
index b3cb4c9..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*  
-*******************************************************************************
-*
-*   Copyright (C) 1999-2008, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-*******************************************************************************
-*   file name:  ucol_wgt.h
-*   encoding:   US-ASCII
-*   tab size:   8 (not used)
-*   indentation:4
-*
-*   created on: 2001mar08
-*   created by: Markus W. Scherer
-*/
-
-#ifndef UCOL_WGT_H
-#define UCOL_WGT_H
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION
-
-/* definitions for CE weights */
-
-typedef struct WeightRange {
-    uint32_t start, end;
-    int32_t length, count;
-    int32_t length2;
-    uint32_t count2;
-} WeightRange;
-
-/**
- * Determine heuristically
- * what ranges to use for a given number of weights between (excluding)
- * two limits.
- *
- * @param lowerLimit A collation element weight; the ranges will be filled to cover
- *                   weights greater than this one.
- * @param upperLimit A collation element weight; the ranges will be filled to cover
- *                   weights less than this one.
- * @param n          The number of collation element weights w necessary such that
- *                   lowerLimit<w<upperLimit in lexical order.
- * @param maxByte    The highest valid byte value.
- * @param ranges     An array that is filled in with one or more ranges to cover
- *                   n weights between the limits.
- * @return number of ranges, 0 if it is not possible to fit n elements between the limits
- */
-U_CFUNC int32_t
-ucol_allocWeights(uint32_t lowerLimit, uint32_t upperLimit,
-                  uint32_t n,
-                  uint32_t maxByte,
-                  WeightRange ranges[7]);
-
-/**
- * Given a set of ranges calculated by ucol_allocWeights(),
- * iterate through the weights.
- * The ranges are modified to keep the current iteration state.
- *
- * @param ranges The array of ranges that ucol_allocWeights() filled in.
- *               The ranges are modified.
- * @param pRangeCount The number of ranges. It will be decremented when necessary.
- * @return The next weight in the ranges, or 0xffffffff if there is none left.
- */
-U_CFUNC uint32_t
-ucol_nextWeight(WeightRange ranges[], int32_t *pRangeCount);
-
-#endif /* #if !UCONFIG_NO_COLLATION */
-
-#endif
index b822f207276a7127f075145043e6f2ba11e0f5fa..213038a7a65fd37d8142fc526ebd018b6a3904eb 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ******************************************************************************
-*   Copyright (C) 2001-2011, International Business Machines
+*   Copyright (C) 2001-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 ******************************************************************************
 *
 * Date        Name        Description
 * 02/15/2001  synwee      Modified all methods to process its own function 
 *                         instead of calling the equivalent c++ api (coleitr.h)
+* 2012-2014   markus      Rewritten in C++ again.
 ******************************************************************************/
 
 #include "unicode/utypes.h"
 
 #if !UCONFIG_NO_COLLATION
 
+#include "unicode/coleitr.h"
+#include "unicode/tblcoll.h"
 #include "unicode/ucoleitr.h"
 #include "unicode/ustring.h"
 #include "unicode/sortkey.h"
 #include "unicode/uobject.h"
-#include "ucol_imp.h"
 #include "cmemory.h"
+#include "usrchimp.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
 
 U_NAMESPACE_USE
 
@@ -41,8 +46,6 @@ U_NAMESPACE_USE
 
 #define DELETE_ARRAY(array) uprv_free((void *) (array))
 
-typedef struct icu::collIterate collIterator;
-
 struct RCEI
 {
     uint32_t ce;
@@ -71,7 +74,7 @@ RCEBuffer::RCEBuffer()
 {
     buffer = defaultBuffer;
     bufferIndex = 0;
-    bufferSize = DEFAULT_BUFFER_SIZE;
+    bufferSize = LENGTHOF(defaultBuffer);
 }
 
 RCEBuffer::~RCEBuffer()
@@ -117,34 +120,11 @@ const RCEI *RCEBuffer::get()
     return NULL;
 }
 
-struct PCEI
-{
-    uint64_t ce;
-    int32_t  low;
-    int32_t  high;
-};
-
-struct PCEBuffer
-{
-    PCEI    defaultBuffer[DEFAULT_BUFFER_SIZE];
-    PCEI   *buffer;
-    int32_t bufferIndex;
-    int32_t bufferSize;
-
-    PCEBuffer();
-    ~PCEBuffer();
-
-    void  reset();
-    UBool empty() const;
-    void  put(uint64_t ce, int32_t ixLow, int32_t ixHigh);
-    const PCEI *get();
-};
-
 PCEBuffer::PCEBuffer()
 {
     buffer = defaultBuffer;
     bufferIndex = 0;
-    bufferSize = DEFAULT_BUFFER_SIZE;
+    bufferSize = LENGTHOF(defaultBuffer);
 }
 
 PCEBuffer::~PCEBuffer()
@@ -195,43 +175,28 @@ const PCEI *PCEBuffer::get()
     return NULL;
 }
 
-/*
- * This inherits from UObject so that
- * it can be allocated by new and the
- * constructor for PCEBuffer is called.
- */
-struct UCollationPCE : public UObject
-{
-    PCEBuffer          pceBuffer;
-    UCollationStrength strength;
-    UBool              toShift;
-    UBool              isShifted;
-    uint32_t           variableTop;
-
-    UCollationPCE(UCollationElements *elems);
-    ~UCollationPCE();
-
-    void init(const UCollator *coll);
+UCollationPCE::UCollationPCE(UCollationElements *elems) { init(elems); }
 
-    virtual UClassID getDynamicClassID() const;
-    static UClassID getStaticClassID();
-};
+UCollationPCE::UCollationPCE(CollationElementIterator *iter) { init(iter); }
 
-UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UCollationPCE)
+void UCollationPCE::init(UCollationElements *elems) {
+    init(CollationElementIterator::fromUCollationElements(elems));
+}
 
-UCollationPCE::UCollationPCE(UCollationElements *elems)
+void UCollationPCE::init(CollationElementIterator *iter)
 {
-    init(elems->iteratordata_.coll);
+    cei = iter;
+    init(*iter->rbc_);
 }
 
-void UCollationPCE::init(const UCollator *coll)
+void UCollationPCE::init(const Collator &coll)
 {
     UErrorCode status = U_ZERO_ERROR;
 
-    strength    = ucol_getStrength(coll);
-    toShift     = ucol_getAttribute(coll, UCOL_ALTERNATE_HANDLING, &status) == UCOL_SHIFTED;
+    strength    = coll.getAttribute(UCOL_STRENGTH, status);
+    toShift     = coll.getAttribute(UCOL_ALTERNATE_HANDLING, status) == UCOL_SHIFTED;
     isShifted   = FALSE;
-    variableTop = coll->variableTopValue << 16;
+    variableTop = coll.getVariableTop(status);
 }
 
 UCollationPCE::~UCollationPCE()
@@ -239,18 +204,14 @@ UCollationPCE::~UCollationPCE()
     // nothing to do
 }
 
-
-U_NAMESPACE_END
-
-
-inline uint64_t processCE(UCollationElements *elems, uint32_t ce)
+uint64_t UCollationPCE::processCE(uint32_t ce)
 {
     uint64_t primary = 0, secondary = 0, tertiary = 0, quaternary = 0;
 
     // This is clean, but somewhat slow...
     // We could apply the mask to ce and then
     // just get all three orders...
-    switch(elems->pce->strength) {
+    switch(strength) {
     default:
         tertiary = ucol_tertiaryOrder(ce);
         /* note fall-through */
@@ -271,39 +232,31 @@ inline uint64_t processCE(UCollationElements *elems, uint32_t ce)
     // **** the *second* CE is marked as a continuation, so ****
     // **** we always have to peek ahead to know how long   ****
     // **** the primary is...                               ****
-    if ((elems->pce->toShift && elems->pce->variableTop > ce && primary != 0)
-                || (elems->pce->isShifted && primary == 0)) {
+    if ((toShift && variableTop > ce && primary != 0)
+                || (isShifted && primary == 0)) {
 
         if (primary == 0) {
             return UCOL_IGNORABLE;
         }
 
-        if (elems->pce->strength >= UCOL_QUATERNARY) {
+        if (strength >= UCOL_QUATERNARY) {
             quaternary = primary;
         }
 
         primary = secondary = tertiary = 0;
-        elems->pce->isShifted = TRUE;
+        isShifted = TRUE;
     } else {
-        if (elems->pce->strength >= UCOL_QUATERNARY) {
+        if (strength >= UCOL_QUATERNARY) {
             quaternary = 0xFFFF;
         }
 
-        elems->pce->isShifted = FALSE;
+        isShifted = FALSE;
     }
 
     return primary << 48 | secondary << 32 | tertiary << 16 | quaternary;
 }
 
-U_CAPI void U_EXPORT2
-uprv_init_pce(const UCollationElements *elems)
-{
-    if (elems->pce != NULL) {
-        elems->pce->init(elems->iteratordata_.coll);
-    }
-}
-
-
+U_NAMESPACE_END
 
 /* public methods ---------------------------------------------------- */
 
@@ -316,118 +269,58 @@ ucol_openElements(const UCollator  *coll,
     if (U_FAILURE(*status)) {
         return NULL;
     }
-
-    UCollationElements *result = new UCollationElements;
-    if (result == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
+    if (coll == NULL || (text == NULL && textLength != 0)) {
+        *status = U_ILLEGAL_ARGUMENT_ERROR;
+        return NULL;
+    }
+    const RuleBasedCollator *rbc = RuleBasedCollator::rbcFromUCollator(coll);
+    if (rbc == NULL) {
+        *status = U_UNSUPPORTED_ERROR;  // coll is a Collator but not a RuleBasedCollator
         return NULL;
     }
 
-    result->reset_ = TRUE;
-    result->isWritable = FALSE;
-    result->pce = NULL;
-
-    if (text == NULL) {
-        textLength = 0;
+    UnicodeString s((UBool)(textLength < 0), text, textLength);
+    CollationElementIterator *cei = rbc->createCollationElementIterator(s);
+    if (cei == NULL) {
+        *status = U_MEMORY_ALLOCATION_ERROR;
+        return NULL;
     }
-    uprv_init_collIterate(coll, text, textLength, &result->iteratordata_, status);
 
-    return result;
+    return cei->toUCollationElements();
 }
 
 
 U_CAPI void U_EXPORT2
 ucol_closeElements(UCollationElements *elems)
 {
-       if (elems != NULL) {
-         collIterate *ci = &elems->iteratordata_;
-
-         if (ci->extendCEs) {
-                 uprv_free(ci->extendCEs);
-         }
-
-         if (ci->offsetBuffer) {
-                 uprv_free(ci->offsetBuffer);
-         }
-
-         if (elems->isWritable && elems->iteratordata_.string != NULL)
-         {
-               uprv_free((UChar *)elems->iteratordata_.string);
-         }
-
-         if (elems->pce != NULL) {
-                 delete elems->pce;
-         }
-
-         delete elems;
-       }
+    delete CollationElementIterator::fromUCollationElements(elems);
 }
 
 U_CAPI void U_EXPORT2
 ucol_reset(UCollationElements *elems)
 {
-    collIterate *ci = &(elems->iteratordata_);
-    elems->reset_   = TRUE;
-    ci->pos         = ci->string;
-    if ((ci->flags & UCOL_ITER_HASLEN) == 0 || ci->endp == NULL) {
-        ci->endp      = ci->string + u_strlen(ci->string);
-    }
-    ci->CEpos       = ci->toReturn = ci->CEs;
-    ci->flags       = (ci->flags & UCOL_FORCE_HAN_IMPLICIT) | UCOL_ITER_HASLEN;
-    if (ci->coll->normalizationMode == UCOL_ON) {
-        ci->flags |= UCOL_ITER_NORM;
-    }
-
-    ci->writableBuffer.remove();
-    ci->fcdPosition = NULL;
-
-  //ci->offsetReturn = ci->offsetStore = NULL;
-       ci->offsetRepeatCount = ci->offsetRepeatValue = 0;
-}
-
-U_CAPI void U_EXPORT2
-ucol_forceHanImplicit(UCollationElements *elems, UErrorCode *status)
-{
-    if (U_FAILURE(*status)) {
-        return;
-    }
-
-    if (elems == NULL) {
-        *status = U_ILLEGAL_ARGUMENT_ERROR;
-        return;
-    }
-
-    elems->iteratordata_.flags |= UCOL_FORCE_HAN_IMPLICIT;
+    CollationElementIterator::fromUCollationElements(elems)->reset();
 }
 
 U_CAPI int32_t U_EXPORT2
 ucol_next(UCollationElements *elems, 
           UErrorCode         *status)
 {
-    int32_t result;
     if (U_FAILURE(*status)) {
         return UCOL_NULLORDER;
     }
 
-    elems->reset_ = FALSE;
-
-    result = (int32_t)ucol_getNextCE(elems->iteratordata_.coll,
-                                     &elems->iteratordata_, 
-                                     status);
-
-    if (result == UCOL_NO_MORE_CES) {
-        result = UCOL_NULLORDER;
-    }
-    return result;
+    return CollationElementIterator::fromUCollationElements(elems)->next(*status);
 }
 
-U_CAPI int64_t U_EXPORT2
-ucol_nextProcessed(UCollationElements *elems,
+U_NAMESPACE_BEGIN
+
+int64_t
+UCollationPCE::nextProcessed(
                    int32_t            *ixLow,
                    int32_t            *ixHigh,
                    UErrorCode         *status)
 {
-    const UCollator *coll = elems->iteratordata_.coll;
     int64_t result = UCOL_IGNORABLE;
     uint32_t low = 0, high = 0;
 
@@ -435,25 +328,19 @@ ucol_nextProcessed(UCollationElements *elems,
         return UCOL_PROCESSED_NULLORDER;
     }
 
-    if (elems->pce == NULL) {
-        elems->pce = new UCollationPCE(elems);
-    } else {
-        elems->pce->pceBuffer.reset();
-    }
-
-    elems->reset_ = FALSE;
+    pceBuffer.reset();
 
     do {
-        low = ucol_getOffset(elems);
-        uint32_t ce = (uint32_t) ucol_getNextCE(coll, &elems->iteratordata_, status);
-        high = ucol_getOffset(elems);
+        low = cei->getOffset();
+        int32_t ce = cei->next(*status);
+        high = cei->getOffset();
 
-        if (ce == UCOL_NO_MORE_CES) {
+        if (ce == UCOL_NULLORDER) {
              result = UCOL_PROCESSED_NULLORDER;
              break;
         }
 
-        result = processCE(elems, ce);
+        result = processCE((uint32_t)ce);
     } while (result == UCOL_IGNORABLE);
 
     if (ixLow != NULL) {
@@ -467,6 +354,8 @@ ucol_nextProcessed(UCollationElements *elems,
     return result;
 }
 
+U_NAMESPACE_END
+
 U_CAPI int32_t U_EXPORT2
 ucol_previous(UCollationElements *elems,
               UErrorCode         *status)
@@ -474,84 +363,38 @@ ucol_previous(UCollationElements *elems,
     if(U_FAILURE(*status)) {
         return UCOL_NULLORDER;
     }
-    else
-    {
-        int32_t result;
-
-        if (elems->reset_ && (elems->iteratordata_.pos == elems->iteratordata_.string)) {
-            if (elems->iteratordata_.endp == NULL) {
-                elems->iteratordata_.endp = elems->iteratordata_.string + 
-                                            u_strlen(elems->iteratordata_.string);
-                elems->iteratordata_.flags |= UCOL_ITER_HASLEN;
-            }
-            elems->iteratordata_.pos = elems->iteratordata_.endp;
-            elems->iteratordata_.fcdPosition = elems->iteratordata_.endp;
-        }
-
-        elems->reset_ = FALSE;
-
-        result = (int32_t)ucol_getPrevCE(elems->iteratordata_.coll,
-                                         &(elems->iteratordata_), 
-                                         status);
-
-        if (result == UCOL_NO_MORE_CES) {
-            result = UCOL_NULLORDER;
-        }
-
-        return result;
-    }
+    return CollationElementIterator::fromUCollationElements(elems)->previous(*status);
 }
 
-U_CAPI int64_t U_EXPORT2
-ucol_previousProcessed(UCollationElements *elems,
+U_NAMESPACE_BEGIN
+
+int64_t
+UCollationPCE::previousProcessed(
                    int32_t            *ixLow,
                    int32_t            *ixHigh,
                    UErrorCode         *status)
 {
-    const UCollator *coll = elems->iteratordata_.coll;
     int64_t result = UCOL_IGNORABLE;
- // int64_t primary = 0, secondary = 0, tertiary = 0, quaternary = 0;
- // UCollationStrength strength = ucol_getStrength(coll);
- //  UBool toShift   = ucol_getAttribute(coll, UCOL_ALTERNATE_HANDLING, status) ==  UCOL_SHIFTED;
- // uint32_t variableTop = coll->variableTopValue;
     int32_t  low = 0, high = 0;
 
     if (U_FAILURE(*status)) {
         return UCOL_PROCESSED_NULLORDER;
     }
 
-    if (elems->reset_ && 
-        (elems->iteratordata_.pos == elems->iteratordata_.string)) {
-        if (elems->iteratordata_.endp == NULL) {
-            elems->iteratordata_.endp = elems->iteratordata_.string + 
-                                        u_strlen(elems->iteratordata_.string);
-            elems->iteratordata_.flags |= UCOL_ITER_HASLEN;
-        }
-
-        elems->iteratordata_.pos = elems->iteratordata_.endp;
-        elems->iteratordata_.fcdPosition = elems->iteratordata_.endp;
-    }
-
-    if (elems->pce == NULL) {
-        elems->pce = new UCollationPCE(elems);
-    } else {
-      //elems->pce->pceBuffer.reset();
-    }
+    // pceBuffer.reset();
 
-    elems->reset_ = FALSE;
-
-    while (elems->pce->pceBuffer.empty()) {
+    while (pceBuffer.empty()) {
         // buffer raw CEs up to non-ignorable primary
         RCEBuffer rceb;
-        uint32_t ce;
+        int32_t ce;
         
         // **** do we need to reset rceb, or will it always be empty at this point ****
         do {
-            high = ucol_getOffset(elems);
-            ce   = ucol_getPrevCE(coll, &elems->iteratordata_, status);
-            low  = ucol_getOffset(elems);
+            high = cei->getOffset();
+            ce   = cei->previous(*status);
+            low  = cei->getOffset();
 
-            if (ce == UCOL_NO_MORE_CES) {
+            if (ce == UCOL_NULLORDER) {
                 if (! rceb.empty()) {
                     break;
                 }
@@ -559,23 +402,23 @@ ucol_previousProcessed(UCollationElements *elems,
                 goto finish;
             }
 
-            rceb.put(ce, low, high);
-        } while ((ce & UCOL_PRIMARYMASK) == 0);
+            rceb.put((uint32_t)ce, low, high);
+        } while ((ce & UCOL_PRIMARYORDERMASK) == 0 || isContinuation(ce));
 
         // process the raw CEs
         while (! rceb.empty()) {
             const RCEI *rcei = rceb.get();
 
-            result = processCE(elems, rcei->ce);
+            result = processCE(rcei->ce);
 
             if (result != UCOL_IGNORABLE) {
-                elems->pce->pceBuffer.put(result, rcei->low, rcei->high);
+                pceBuffer.put(result, rcei->low, rcei->high);
             }
         }
     }
 
 finish:
-    if (elems->pce->pceBuffer.empty()) {
+    if (pceBuffer.empty()) {
         // **** Is -1 the right value for ixLow, ixHigh? ****
        if (ixLow != NULL) {
                *ixLow = -1;
@@ -588,7 +431,7 @@ finish:
         return UCOL_PROCESSED_NULLORDER;
     }
 
-    const PCEI *pcei = elems->pce->pceBuffer.get();
+    const PCEI *pcei = pceBuffer.get();
 
     if (ixLow != NULL) {
         *ixLow = pcei->low;
@@ -601,66 +444,23 @@ finish:
     return pcei->ce;
 }
 
+U_NAMESPACE_END
+
 U_CAPI int32_t U_EXPORT2
 ucol_getMaxExpansion(const UCollationElements *elems,
                            int32_t            order)
 {
-    uint8_t result;
-
-#if 0
-    UCOL_GETMAXEXPANSION(elems->iteratordata_.coll, (uint32_t)order, result);
-#else
-    const UCollator *coll = elems->iteratordata_.coll;
-    const uint32_t *start;
-    const uint32_t *limit;
-    const uint32_t *mid;
-          uint32_t strengthMask = 0;
-          uint32_t mOrder = (uint32_t) order;
-
-    switch (coll->strength) 
-    {
-    default:
-        strengthMask |= UCOL_TERTIARYORDERMASK;
-        /* fall through */
+    return CollationElementIterator::fromUCollationElements(elems)->getMaxExpansion(order);
 
-    case UCOL_SECONDARY:
-        strengthMask |= UCOL_SECONDARYORDERMASK;
-        /* fall through */
-
-    case UCOL_PRIMARY:
-        strengthMask |= UCOL_PRIMARYORDERMASK;
-    }
-
-    mOrder &= strengthMask;
-    start = (coll)->endExpansionCE;
-    limit = (coll)->lastEndExpansionCE;
-
-    while (start < limit - 1) {
-        mid = start + ((limit - start) >> 1);
-        if (mOrder <= (*mid & strengthMask)) {
-          limit = mid;
-        } else {
-          start = mid;
-        }
-    }
+    // TODO: The old code masked the order according to strength and then did a binary search.
+    // However this was probably at least partially broken because of the following comment.
+    // Still, it might have found a match when this version may not.
 
     // FIXME: with a masked search, there might be more than one hit,
     // so we need to look forward and backward from the match to find all
     // of the hits...
-    if ((*start & strengthMask) == mOrder) {
-        result = *((coll)->expansionCESize + (start - (coll)->endExpansionCE));
-    } else if ((*limit & strengthMask) == mOrder) {
-         result = *(coll->expansionCESize + (limit - coll->endExpansionCE));
-   } else if ((mOrder & 0xFFFF) == 0x00C0) {
-        result = 2;
-   } else {
-       result = 1;
-   }
-#endif
-
-    return result;
 }
+
 U_CAPI void U_EXPORT2
 ucol_setText(      UCollationElements *elems,
              const UChar              *text,
@@ -671,56 +471,18 @@ ucol_setText(      UCollationElements *elems,
         return;
     }
 
-    if (elems->isWritable && elems->iteratordata_.string != NULL)
-    {
-        uprv_free((UChar *)elems->iteratordata_.string);
-    }
-
-    if (text == NULL) {
-        textLength = 0;
-    }
-
-    elems->isWritable = FALSE;
-    
-    /* free offset buffer to avoid memory leak before initializing. */
-    ucol_freeOffsetBuffer(&(elems->iteratordata_));
-    /* Ensure that previously allocated extendCEs is freed before setting to NULL. */
-    if (elems->iteratordata_.extendCEs != NULL) {
-        uprv_free(elems->iteratordata_.extendCEs);
+    if ((text == NULL && textLength != 0)) {
+        *status = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
     }
-    uprv_init_collIterate(elems->iteratordata_.coll, text, textLength, 
-                          &elems->iteratordata_, status);
-
-    elems->reset_   = TRUE;
+    UnicodeString s((UBool)(textLength < 0), text, textLength);
+    return CollationElementIterator::fromUCollationElements(elems)->setText(s, *status);
 }
 
 U_CAPI int32_t U_EXPORT2
 ucol_getOffset(const UCollationElements *elems)
 {
-  const collIterate *ci = &(elems->iteratordata_);
-
-  if (ci->offsetRepeatCount > 0 && ci->offsetRepeatValue != 0) {
-      return ci->offsetRepeatValue;
-  }
-
-  if (ci->offsetReturn != NULL) {
-      return *ci->offsetReturn;
-  }
-
-  // while processing characters in normalization buffer getOffset will 
-  // return the next non-normalized character. 
-  // should be inline with the old implementation since the old codes uses
-  // nextDecomp in normalizer which also decomposes the string till the 
-  // first base character is found.
-  if (ci->flags & UCOL_ITER_INNORMBUF) {
-      if (ci->fcdPosition == NULL) {
-        return 0;
-      }
-      return (int32_t)(ci->fcdPosition - ci->string);
-  }
-  else {
-      return (int32_t)(ci->pos - ci->string);
-  }
+    return CollationElementIterator::fromUCollationElements(elems)->getOffset();
 }
 
 U_CAPI void U_EXPORT2
@@ -732,53 +494,25 @@ ucol_setOffset(UCollationElements    *elems,
         return;
     }
 
-    // this methods will clean up any use of the writable buffer and points to 
-    // the original string
-    collIterate *ci = &(elems->iteratordata_);
-    ci->pos         = ci->string + offset;
-    ci->CEpos       = ci->toReturn = ci->CEs;
-    if (ci->flags & UCOL_ITER_INNORMBUF) {
-        ci->flags = ci->origFlags;
-    }
-    if ((ci->flags & UCOL_ITER_HASLEN) == 0) {
-        ci->endp  = ci->string + u_strlen(ci->string);
-        ci->flags |= UCOL_ITER_HASLEN;
-    }
-    ci->fcdPosition = NULL;
-    elems->reset_ = FALSE;
-
-       ci->offsetReturn = NULL;
-    ci->offsetStore = ci->offsetBuffer;
-       ci->offsetRepeatCount = ci->offsetRepeatValue = 0;
+    CollationElementIterator::fromUCollationElements(elems)->setOffset(offset, *status);
 }
 
 U_CAPI int32_t U_EXPORT2
 ucol_primaryOrder (int32_t order) 
 {
-    order &= UCOL_PRIMARYMASK;
-    return (order >> UCOL_PRIMARYORDERSHIFT);
+    return (order >> 16) & 0xffff;
 }
 
 U_CAPI int32_t U_EXPORT2
 ucol_secondaryOrder (int32_t order) 
 {
-    order &= UCOL_SECONDARYMASK;
-    return (order >> UCOL_SECONDARYORDERSHIFT);
+    return (order >> 8) & 0xff;
 }
 
 U_CAPI int32_t U_EXPORT2
 ucol_tertiaryOrder (int32_t order) 
 {
-    return (order & UCOL_TERTIARYMASK);
-}
-
-
-void ucol_freeOffsetBuffer(collIterate *s) {
-    if (s != NULL && s->offsetBuffer != NULL) {
-        uprv_free(s->offsetBuffer);
-        s->offsetBuffer = NULL;
-        s->offsetBufferSize = 0;
-    }
+    return order & 0xff;
 }
 
 #endif /* #if !UCONFIG_NO_COLLATION */
diff --git a/icu4c/source/i18n/uitercollationiterator.cpp b/icu4c/source/i18n/uitercollationiterator.cpp
new file mode 100644 (file)
index 0000000..f717282
--- /dev/null
@@ -0,0 +1,448 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* uitercollationiterator.cpp
+*
+* created on: 2012sep23 (from utf16collationiterator.cpp)
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/uiter.h"
+#include "charstr.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationfcd.h"
+#include "collationiterator.h"
+#include "normalizer2impl.h"
+#include "uassert.h"
+#include "uitercollationiterator.h"
+
+U_NAMESPACE_BEGIN
+
+UIterCollationIterator::~UIterCollationIterator() {}
+
+void
+UIterCollationIterator::resetToOffset(int32_t newOffset) {
+    reset();
+    iter.move(&iter, newOffset, UITER_START);
+}
+
+int32_t
+UIterCollationIterator::getOffset() const {
+    return iter.getIndex(&iter, UITER_CURRENT);
+}
+
+uint32_t
+UIterCollationIterator::handleNextCE32(UChar32 &c, UErrorCode & /*errorCode*/) {
+    c = iter.next(&iter);
+    if(c < 0) {
+        return Collation::FALLBACK_CE32;
+    }
+    return UTRIE2_GET32_FROM_U16_SINGLE_LEAD(trie, c);
+}
+
+UChar
+UIterCollationIterator::handleGetTrailSurrogate() {
+    UChar32 trail = iter.next(&iter);
+    if(!U16_IS_TRAIL(trail) && trail >= 0) { iter.previous(&iter); }
+    return (UChar)trail;
+}
+
+UChar32
+UIterCollationIterator::nextCodePoint(UErrorCode & /*errorCode*/) {
+    return uiter_next32(&iter);
+}
+
+UChar32
+UIterCollationIterator::previousCodePoint(UErrorCode & /*errorCode*/) {
+    return uiter_previous32(&iter);
+}
+
+void
+UIterCollationIterator::forwardNumCodePoints(int32_t num, UErrorCode & /*errorCode*/) {
+    while(num > 0 && (uiter_next32(&iter)) >= 0) {
+        --num;
+    }
+}
+
+void
+UIterCollationIterator::backwardNumCodePoints(int32_t num, UErrorCode & /*errorCode*/) {
+    while(num > 0 && (uiter_previous32(&iter)) >= 0) {
+        --num;
+    }
+}
+
+// FCDUIterCollationIterator ----------------------------------------------- ***
+
+FCDUIterCollationIterator::~FCDUIterCollationIterator() {}
+
+void
+FCDUIterCollationIterator::resetToOffset(int32_t newOffset) {
+    UIterCollationIterator::resetToOffset(newOffset);
+    start = newOffset;
+    state = ITER_CHECK_FWD;
+}
+
+int32_t
+FCDUIterCollationIterator::getOffset() const {
+    if(state <= ITER_CHECK_BWD) {
+        return iter.getIndex(&iter, UITER_CURRENT);
+    } else if(state == ITER_IN_FCD_SEGMENT) {
+        return pos;
+    } else if(pos == 0) {
+        return start;
+    } else {
+        return limit;
+    }
+}
+
+uint32_t
+FCDUIterCollationIterator::handleNextCE32(UChar32 &c, UErrorCode &errorCode) {
+    for(;;) {
+        if(state == ITER_CHECK_FWD) {
+            c = iter.next(&iter);
+            if(c < 0) {
+                return Collation::FALLBACK_CE32;
+            }
+            if(CollationFCD::hasTccc(c)) {
+                if(CollationFCD::maybeTibetanCompositeVowel(c) ||
+                        CollationFCD::hasLccc(iter.current(&iter))) {
+                    iter.previous(&iter);
+                    if(!nextSegment(errorCode)) {
+                        c = U_SENTINEL;
+                        return Collation::FALLBACK_CE32;
+                    }
+                    continue;
+                }
+            }
+            break;
+        } else if(state == ITER_IN_FCD_SEGMENT && pos != limit) {
+            c = iter.next(&iter);
+            ++pos;
+            U_ASSERT(c >= 0);
+            break;
+        } else if(state >= IN_NORM_ITER_AT_LIMIT && pos != normalized.length()) {
+            c = normalized[pos++];
+            break;
+        } else {
+            switchToForward();
+        }
+    }
+    return UTRIE2_GET32_FROM_U16_SINGLE_LEAD(trie, c);
+}
+
+UChar
+FCDUIterCollationIterator::handleGetTrailSurrogate() {
+    if(state <= ITER_IN_FCD_SEGMENT) {
+        UChar32 trail = iter.next(&iter);
+        if(U16_IS_TRAIL(trail)) {
+            if(state == ITER_IN_FCD_SEGMENT) { ++pos; }
+        } else if(trail >= 0) {
+            iter.previous(&iter);
+        }
+        return (UChar)trail;
+    } else {
+        U_ASSERT(pos < normalized.length());
+        UChar trail;
+        if(U16_IS_TRAIL(trail = normalized[pos])) { ++pos; }
+        return trail;
+    }
+}
+
+UChar32
+FCDUIterCollationIterator::nextCodePoint(UErrorCode &errorCode) {
+    UChar32 c;
+    for(;;) {
+        if(state == ITER_CHECK_FWD) {
+            c = iter.next(&iter);
+            if(c < 0) {
+                return c;
+            }
+            if(CollationFCD::hasTccc(c)) {
+                if(CollationFCD::maybeTibetanCompositeVowel(c) ||
+                        CollationFCD::hasLccc(iter.current(&iter))) {
+                    iter.previous(&iter);
+                    if(!nextSegment(errorCode)) {
+                        return U_SENTINEL;
+                    }
+                    continue;
+                }
+            }
+            if(U16_IS_LEAD(c)) {
+                UChar32 trail = iter.next(&iter);
+                if(U16_IS_TRAIL(trail)) {
+                    return U16_GET_SUPPLEMENTARY(c, trail);
+                } else if(trail >= 0) {
+                    iter.previous(&iter);
+                }
+            }
+            return c;
+        } else if(state == ITER_IN_FCD_SEGMENT && pos != limit) {
+            c = uiter_next32(&iter);
+            pos += U16_LENGTH(c);
+            U_ASSERT(c >= 0);
+            return c;
+        } else if(state >= IN_NORM_ITER_AT_LIMIT && pos != normalized.length()) {
+            c = normalized.char32At(pos);
+            pos += U16_LENGTH(c);
+            return c;
+        } else {
+            switchToForward();
+        }
+    }
+}
+
+UChar32
+FCDUIterCollationIterator::previousCodePoint(UErrorCode &errorCode) {
+    UChar32 c;
+    for(;;) {
+        if(state == ITER_CHECK_BWD) {
+            c = iter.previous(&iter);
+            if(c < 0) {
+                start = pos = 0;
+                state = ITER_IN_FCD_SEGMENT;
+                return U_SENTINEL;
+            }
+            if(CollationFCD::hasLccc(c)) {
+                UChar32 prev = U_SENTINEL;
+                if(CollationFCD::maybeTibetanCompositeVowel(c) ||
+                        CollationFCD::hasTccc(prev = iter.previous(&iter))) {
+                    iter.next(&iter);
+                    if(prev >= 0) {
+                        iter.next(&iter);
+                    }
+                    if(!previousSegment(errorCode)) {
+                        return U_SENTINEL;
+                    }
+                    continue;
+                }
+                // hasLccc(trail)=true for all trail surrogates
+                if(U16_IS_TRAIL(c)) {
+                    if(prev < 0) {
+                        prev = iter.previous(&iter);
+                    }
+                    if(U16_IS_LEAD(prev)) {
+                        return U16_GET_SUPPLEMENTARY(prev, c);
+                    }
+                }
+                if(prev >= 0) {
+                    iter.next(&iter);
+                }
+            }
+            return c;
+        } else if(state == ITER_IN_FCD_SEGMENT && pos != start) {
+            c = uiter_previous32(&iter);
+            pos -= U16_LENGTH(c);
+            U_ASSERT(c >= 0);
+            return c;
+        } else if(state >= IN_NORM_ITER_AT_LIMIT && pos != 0) {
+            c = normalized.char32At(pos - 1);
+            pos -= U16_LENGTH(c);
+            return c;
+        } else {
+            switchToBackward();
+        }
+    }
+}
+
+void
+FCDUIterCollationIterator::forwardNumCodePoints(int32_t num, UErrorCode &errorCode) {
+    // Specify the class to avoid a virtual-function indirection.
+    // In Java, we would declare this class final.
+    while(num > 0 && FCDUIterCollationIterator::nextCodePoint(errorCode) >= 0) {
+        --num;
+    }
+}
+
+void
+FCDUIterCollationIterator::backwardNumCodePoints(int32_t num, UErrorCode &errorCode) {
+    // Specify the class to avoid a virtual-function indirection.
+    // In Java, we would declare this class final.
+    while(num > 0 && FCDUIterCollationIterator::previousCodePoint(errorCode) >= 0) {
+        --num;
+    }
+}
+
+void
+FCDUIterCollationIterator::switchToForward() {
+    U_ASSERT(state == ITER_CHECK_BWD ||
+             (state == ITER_IN_FCD_SEGMENT && pos == limit) ||
+             (state >= IN_NORM_ITER_AT_LIMIT && pos == normalized.length()));
+    if(state == ITER_CHECK_BWD) {
+        // Turn around from backward checking.
+        start = pos = iter.getIndex(&iter, UITER_CURRENT);
+        if(pos == limit) {
+            state = ITER_CHECK_FWD;  // Check forward.
+        } else {  // pos < limit
+            state = ITER_IN_FCD_SEGMENT;  // Stay in FCD segment.
+        }
+    } else {
+        // Reached the end of the FCD segment.
+        if(state == ITER_IN_FCD_SEGMENT) {
+            // The input text segment is FCD, extend it forward.
+        } else {
+            // The input text segment needed to be normalized.
+            // Switch to checking forward from it.
+            if(state == IN_NORM_ITER_AT_START) {
+                iter.move(&iter, limit - start, UITER_CURRENT);
+            }
+            start = limit;
+        }
+        state = ITER_CHECK_FWD;
+    }
+}
+
+UBool
+FCDUIterCollationIterator::nextSegment(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    U_ASSERT(state == ITER_CHECK_FWD);
+    // The input text [start..(iter index)[ passes the FCD check.
+    pos = iter.getIndex(&iter, UITER_CURRENT);
+    // Collect the characters being checked, in case they need to be normalized.
+    UnicodeString s;
+    uint8_t prevCC = 0;
+    for(;;) {
+        // Fetch the next character and its fcd16 value.
+        UChar32 c = uiter_next32(&iter);
+        if(c < 0) { break; }
+        uint16_t fcd16 = nfcImpl.getFCD16(c);
+        uint8_t leadCC = (uint8_t)(fcd16 >> 8);
+        if(leadCC == 0 && !s.isEmpty()) {
+            // FCD boundary before this character.
+            uiter_previous32(&iter);
+            break;
+        }
+        s.append(c);
+        if(leadCC != 0 && (prevCC > leadCC || CollationFCD::isFCD16OfTibetanCompositeVowel(fcd16))) {
+            // Fails FCD check. Find the next FCD boundary and normalize.
+            for(;;) {
+                c = uiter_next32(&iter);
+                if(c < 0) { break; }
+                if(nfcImpl.getFCD16(c) <= 0xff) {
+                    uiter_previous32(&iter);
+                    break;
+                }
+                s.append(c);
+            }
+            if(!normalize(s, errorCode)) { return FALSE; }
+            start = pos;
+            limit = pos + s.length();
+            state = IN_NORM_ITER_AT_LIMIT;
+            pos = 0;
+            return TRUE;
+        }
+        prevCC = (uint8_t)fcd16;
+        if(prevCC == 0) {
+            // FCD boundary after the last character.
+            break;
+        }
+    }
+    limit = pos + s.length();
+    U_ASSERT(pos != limit);
+    iter.move(&iter, -s.length(), UITER_CURRENT);
+    state = ITER_IN_FCD_SEGMENT;
+    return TRUE;
+}
+
+void
+FCDUIterCollationIterator::switchToBackward() {
+    U_ASSERT(state == ITER_CHECK_FWD ||
+             (state == ITER_IN_FCD_SEGMENT && pos == start) ||
+             (state >= IN_NORM_ITER_AT_LIMIT && pos == 0));
+    if(state == ITER_CHECK_FWD) {
+        // Turn around from forward checking.
+        limit = pos = iter.getIndex(&iter, UITER_CURRENT);
+        if(pos == start) {
+            state = ITER_CHECK_BWD;  // Check backward.
+        } else {  // pos > start
+            state = ITER_IN_FCD_SEGMENT;  // Stay in FCD segment.
+        }
+    } else {
+        // Reached the start of the FCD segment.
+        if(state == ITER_IN_FCD_SEGMENT) {
+            // The input text segment is FCD, extend it backward.
+        } else {
+            // The input text segment needed to be normalized.
+            // Switch to checking backward from it.
+            if(state == IN_NORM_ITER_AT_LIMIT) {
+                iter.move(&iter, start - limit, UITER_CURRENT);
+            }
+            limit = start;
+        }
+        state = ITER_CHECK_BWD;
+    }
+}
+
+UBool
+FCDUIterCollationIterator::previousSegment(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    U_ASSERT(state == ITER_CHECK_BWD);
+    // The input text [(iter index)..limit[ passes the FCD check.
+    pos = iter.getIndex(&iter, UITER_CURRENT);
+    // Collect the characters being checked, in case they need to be normalized.
+    UnicodeString s;
+    uint8_t nextCC = 0;
+    for(;;) {
+        // Fetch the previous character and its fcd16 value.
+        UChar32 c = uiter_previous32(&iter);
+        if(c < 0) { break; }
+        uint16_t fcd16 = nfcImpl.getFCD16(c);
+        uint8_t trailCC = (uint8_t)fcd16;
+        if(trailCC == 0 && !s.isEmpty()) {
+            // FCD boundary after this character.
+            uiter_next32(&iter);
+            break;
+        }
+        s.append(c);
+        if(trailCC != 0 && ((nextCC != 0 && trailCC > nextCC) ||
+                            CollationFCD::isFCD16OfTibetanCompositeVowel(fcd16))) {
+            // Fails FCD check. Find the previous FCD boundary and normalize.
+            while(fcd16 > 0xff) {
+                c = uiter_previous32(&iter);
+                if(c < 0) { break; }
+                fcd16 = nfcImpl.getFCD16(c);
+                if(fcd16 == 0) {
+                    (void)uiter_next32(&iter);
+                    break;
+                }
+                s.append(c);
+            }
+            s.reverse();
+            if(!normalize(s, errorCode)) { return FALSE; }
+            limit = pos;
+            start = pos - s.length();
+            state = IN_NORM_ITER_AT_START;
+            pos = normalized.length();
+            return TRUE;
+        }
+        nextCC = (uint8_t)(fcd16 >> 8);
+        if(nextCC == 0) {
+            // FCD boundary before the following character.
+            break;
+        }
+    }
+    start = pos - s.length();
+    U_ASSERT(pos != start);
+    iter.move(&iter, s.length(), UITER_CURRENT);
+    state = ITER_IN_FCD_SEGMENT;
+    return TRUE;
+}
+
+UBool
+FCDUIterCollationIterator::normalize(const UnicodeString &s, UErrorCode &errorCode) {
+    // NFD without argument checking.
+    U_ASSERT(U_SUCCESS(errorCode));
+    nfcImpl.decompose(s, normalized, errorCode);
+    return U_SUCCESS(errorCode);
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/uitercollationiterator.h b/icu4c/source/i18n/uitercollationiterator.h
new file mode 100644 (file)
index 0000000..b1100c8
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* uitercollationiterator.h
+*
+* created on: 2012sep23 (from utf16collationiterator.h)
+* created by: Markus W. Scherer
+*/
+
+#ifndef __UITERCOLLATIONITERATOR_H__
+#define __UITERCOLLATIONITERATOR_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/uiter.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "normalizer2impl.h"
+
+U_NAMESPACE_BEGIN
+
+/**
+ * UCharIterator-based collation element and character iterator.
+ * Handles normalized text inline, with length or NUL-terminated.
+ * Unnormalized text is handled by a subclass.
+ */
+class U_I18N_API UIterCollationIterator : public CollationIterator {
+public:
+    UIterCollationIterator(const CollationData *d, UBool numeric, UCharIterator &ui)
+            : CollationIterator(d, numeric), iter(ui) {}
+
+    virtual ~UIterCollationIterator();
+
+    virtual void resetToOffset(int32_t newOffset);
+
+    virtual int32_t getOffset() const;
+
+    virtual UChar32 nextCodePoint(UErrorCode &errorCode);
+
+    virtual UChar32 previousCodePoint(UErrorCode &errorCode);
+
+protected:
+    virtual uint32_t handleNextCE32(UChar32 &c, UErrorCode &errorCode);
+
+    virtual UChar handleGetTrailSurrogate();
+
+    virtual void forwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+
+    virtual void backwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+
+    UCharIterator &iter;
+};
+
+/**
+ * Incrementally checks the input text for FCD and normalizes where necessary.
+ */
+class U_I18N_API FCDUIterCollationIterator : public UIterCollationIterator {
+public:
+    FCDUIterCollationIterator(const CollationData *data, UBool numeric, UCharIterator &ui, int32_t startIndex)
+            : UIterCollationIterator(data, numeric, ui),
+              state(ITER_CHECK_FWD), start(startIndex),
+              nfcImpl(data->nfcImpl) {}
+
+    virtual ~FCDUIterCollationIterator();
+
+    virtual void resetToOffset(int32_t newOffset);
+
+    virtual int32_t getOffset() const;
+
+    virtual UChar32 nextCodePoint(UErrorCode &errorCode);
+
+    virtual UChar32 previousCodePoint(UErrorCode &errorCode);
+
+protected:
+    virtual uint32_t handleNextCE32(UChar32 &c, UErrorCode &errorCode);
+
+    virtual UChar handleGetTrailSurrogate();
+
+    virtual void forwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+
+    virtual void backwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+
+private:
+    /**
+     * Switches to forward checking if possible.
+     */
+    void switchToForward();
+
+    /**
+     * Extends the FCD text segment forward or normalizes around pos.
+     * @return TRUE if success
+     */
+    UBool nextSegment(UErrorCode &errorCode);
+
+    /**
+     * Switches to backward checking.
+     */
+    void switchToBackward();
+
+    /**
+     * Extends the FCD text segment backward or normalizes around pos.
+     * @return TRUE if success
+     */
+    UBool previousSegment(UErrorCode &errorCode);
+
+    UBool normalize(const UnicodeString &s, UErrorCode &errorCode);
+
+    enum State {
+        /**
+         * The input text [start..(iter index)[ passes the FCD check.
+         * Moving forward checks incrementally.
+         * pos & limit are undefined.
+         */
+        ITER_CHECK_FWD,
+        /**
+         * The input text [(iter index)..limit[ passes the FCD check.
+         * Moving backward checks incrementally.
+         * start & pos are undefined.
+         */
+        ITER_CHECK_BWD,
+        /**
+         * The input text [start..limit[ passes the FCD check.
+         * pos tracks the current text index.
+         */
+        ITER_IN_FCD_SEGMENT,
+        /**
+         * The input text [start..limit[ failed the FCD check and was normalized.
+         * pos tracks the current index in the normalized string.
+         * The text iterator is at the limit index.
+         */
+        IN_NORM_ITER_AT_LIMIT,
+        /**
+         * The input text [start..limit[ failed the FCD check and was normalized.
+         * pos tracks the current index in the normalized string.
+         * The text iterator is at the start index.
+         */
+        IN_NORM_ITER_AT_START
+    };
+
+    State state;
+
+    int32_t start;
+    int32_t pos;
+    int32_t limit;
+
+    const Normalizer2Impl &nfcImpl;
+    UnicodeString normalized;
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __UITERCOLLATIONITERATOR_H__
index 64e2f5434bafd8e021120c4779e1b2c509477a9a..fd05657d82f6edbc591f6c5ead575890a77a8b7a 100644 (file)
@@ -1,7 +1,7 @@
 /*
 *******************************************************************************
 *
-*   Copyright (C) 2011-2013 International Business Machines
+*   Copyright (C) 2011-2014 International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
@@ -14,8 +14,7 @@
 #include "unicode/uobject.h"
 #include "unicode/locid.h"
 
-
-#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_NORMALIZATION
+#if !UCONFIG_NO_COLLATION
 
 /**
  * \file
@@ -757,5 +756,5 @@ private:
 
 U_NAMESPACE_END
 
-#endif /* UCONFIG_NO_COLLATION / UCONFIG_NO_NORMALIZATION */
+#endif  // !UCONFIG_NO_COLLATION
 #endif
index b7d95740c12a69ee99e2de82fc5c935f3ccceab3..d4beb3205676290e11449ab4428e054be061e864 100644 (file)
@@ -1,6 +1,6 @@
 /*
  ******************************************************************************
- *   Copyright (C) 1997-2013, International Business Machines
+ *   Copyright (C) 1997-2014, International Business Machines
  *   Corporation and others.  All Rights Reserved.
  ******************************************************************************
  */
@@ -13,8 +13,6 @@
 /**
 * File coleitr.h
 *
-* 
-*
 * Created by: Helena Shih
 *
 * Modification History:
@@ -27,6 +25,7 @@
 * 01/25/01    swquek      Modified into a C++ wrapper calling C APIs (ucoliter.h)
 * 02/19/01    swquek      Removed CollationElementsIterator() since it is 
 *                         private constructor and no calls are made to it
+* 2012-2014   markus      Rewritten in C++ again.
 */
 
 #ifndef COLEITR_H
 
 #include "unicode/utypes.h"
 
 #if !UCONFIG_NO_COLLATION
 
+#include "unicode/unistr.h"
 #include "unicode/uobject.h"
-#include "unicode/tblcoll.h"
-#include "unicode/ucoleitr.h"
 
-/** 
- * The UCollationElements struct.
- * For usage in C programs.
- * @stable ICU 2.0
- */
-typedef struct UCollationElements UCollationElements;
+struct UCollationElements;
+struct UHashtable;
 
 U_NAMESPACE_BEGIN
 
+struct CollationData;
+
+class CollationIterator;
+class RuleBasedCollator;
+class UCollationPCE;
+class UVector32;
+
 /**
 * The CollationElementIterator class is used as an iterator to walk through     
 * each character of an international string. Use the iterator to return the
 * ordering priority of the positioned character. The ordering priority of a 
 * character, which we refer to as a key, defines how a character is collated in 
 * the given collation object.
-* For example, consider the following in Spanish:
+* For example, consider the following in Slovak and in traditional Spanish collation:
 * <pre>
 *        "ca" -> the first key is key('c') and second key is key('a').
 *        "cha" -> the first key is key('ch') and second key is key('a').</pre>
-* And in German,
+* And in German phonebook collation,
 * <pre> \htmlonly       "&#x00E6;b"-> the first key is key('a'), the second key is key('e'), and
 *        the third key is key('b'). \endhtmlonly </pre>
 * The key of a character, is an integer composed of primary order(short),
@@ -103,10 +103,10 @@ U_NAMESPACE_BEGIN
 * <p>
 * The result of a forward iterate (next()) and reversed result of the backward
 * iterate (previous()) on the same string are equivalent, if collation orders
-* with the value UCOL_IGNORABLE are ignored.
+* with the value 0 are ignored.
 * Character based on the comparison level of the collator.  A collation order 
 * consists of primary order, secondary order and tertiary order.  The data 
-* type of the collation order is <strong>t_int32</strong>. 
+* type of the collation order is <strong>int32_t</strong>. 
 *
 * Note, CollationElementIterator should not be subclassed.
 * @see     Collator
@@ -283,8 +283,28 @@ public:
     */
     static UClassID U_EXPORT2 getStaticClassID();
 
+#ifndef U_HIDE_INTERNAL_API
+    /** @internal */
+    static inline CollationElementIterator *fromUCollationElements(UCollationElements *uc) {
+        return reinterpret_cast<CollationElementIterator *>(uc);
+    }
+    /** @internal */
+    static inline const CollationElementIterator *fromUCollationElements(const UCollationElements *uc) {
+        return reinterpret_cast<const CollationElementIterator *>(uc);
+    }
+    /** @internal */
+    inline UCollationElements *toUCollationElements() {
+        return reinterpret_cast<UCollationElements *>(this);
+    }
+    /** @internal */
+    inline const UCollationElements *toUCollationElements() const {
+        return reinterpret_cast<const UCollationElements *>(this);
+    }
+#endif  // U_HIDE_INTERNAL_API
+
 private:
     friend class RuleBasedCollator;
+    friend class UCollationPCE;
 
     /**
     * CollationElementIterator constructor. This takes the source string and the 
@@ -297,6 +317,14 @@ private:
     */
     CollationElementIterator(const UnicodeString& sourceText,
         const RuleBasedCollator* order, UErrorCode& status);
+    // Note: The constructors should take settings & tailoring, not a collator,
+    // to avoid circular dependencies.
+    // However, for operator==() we would need to be able to compare tailoring data for equality
+    // without making CollationData or CollationTailoring depend on TailoredSet.
+    // (See the implementation of RuleBasedCollator::operator==().)
+    // That might require creating an intermediate class that would be used
+    // by both CollationElementIterator and RuleBasedCollator
+    // but only contain the part of RBC== related to data and rules.
 
     /**
     * CollationElementIterator constructor. This takes the source string and the 
@@ -320,61 +348,53 @@ private:
 
     CollationElementIterator(); // default constructor not implemented
 
+    /** Normalizes dir_=1 (just after setOffset()) to dir_=0 (just after reset()). */
+    inline int8_t normalizeDir() const { return dir_ == 1 ? 0 : dir_; }
+
+    static UHashtable *computeMaxExpansions(const CollationData *data, UErrorCode &errorCode);
+
+    static int32_t getMaxExpansion(const UHashtable *maxExpansions, int32_t order);
+
     // CollationElementIterator private data members ----------------------------
 
+    CollationIterator *iter_;  // owned
+    const RuleBasedCollator *rbc_;  // aliased
+    uint32_t otherHalf_;
     /**
-    * Data wrapper for collation elements
-    */
-    UCollationElements *m_data_;
-
+     * <0: backwards; 0: just after reset() (previous() begins from end);
+     * 1: just after setOffset(); >1: forward
+     */
+    int8_t dir_;
     /**
-    * Indicates if m_data_ belongs to this object.
-    */
-    UBool isDataOwned_;
+     * Stores offsets from expansions and from unsafe-backwards iteration,
+     * so that getOffset() returns intermediate offsets for the CEs
+     * that are consistent with forward iteration.
+     */
+    UVector32 *offsets_;
+
+    UnicodeString string_;
 };
 
-// CollationElementIterator inline method defination --------------------------
+// CollationElementIterator inline method definitions --------------------------
 
-/**
-* Get the primary order of a collation order.
-* @param order the collation order
-* @return the primary order of a collation order.
-*/
 inline int32_t CollationElementIterator::primaryOrder(int32_t order)
 {
-    order &= RuleBasedCollator::PRIMARYORDERMASK;
-    return (order >> RuleBasedCollator::PRIMARYORDERSHIFT);
+    return (order >> 16) & 0xffff;
 }
 
-/**
-* Get the secondary order of a collation order.
-* @param order the collation order
-* @return the secondary order of a collation order.
-*/
 inline int32_t CollationElementIterator::secondaryOrder(int32_t order)
 {
-    order = order & RuleBasedCollator::SECONDARYORDERMASK;
-    return (order >> RuleBasedCollator::SECONDARYORDERSHIFT);
+    return (order >> 8) & 0xff;
 }
 
-/**
-* Get the tertiary order of a collation order.
-* @param order the collation order
-* @return the tertiary order of a collation order.
-*/
 inline int32_t CollationElementIterator::tertiaryOrder(int32_t order)
 {
-    return (order &= RuleBasedCollator::TERTIARYORDERMASK);
-}
-
-inline int32_t CollationElementIterator::getMaxExpansion(int32_t order) const
-{
-    return ucol_getMaxExpansion(m_data_, (uint32_t)order);
+    return order & 0xff;
 }
 
 inline UBool CollationElementIterator::isIgnorable(int32_t order)
 {
-    return (primaryOrder(order) == RuleBasedCollator::PRIMIGNORABLE);
+    return (order & 0xffff0000) == 0;
 }
 
 U_NAMESPACE_END
index e0f0a901e606922e4365e8536b3f932842541950..92bf7a9c0f40fdb41207808cb70dfc5fe5d868ef 100644 (file)
@@ -1,7 +1,7 @@
 /*
 ******************************************************************************
-*   Copyright (C) 1996-2014, International Business Machines                 *
-*   Corporation and others.  All Rights Reserved.                            *
+*   Copyright (C) 1996-2014, International Business Machines
+*   Corporation and others.  All Rights Reserved.
 ******************************************************************************
 */
 
@@ -43,7 +43,8 @@
 *                          critical accessors.
 * 05/15/00     helena      Added version information API.
 * 01/29/01     synwee      Modified into a C++ wrapper which calls C apis
-*                          (ucoll.h).
+*                          (ucol.h).
+* 2012-2014    markus      Rewritten in C++ again.
 */
 
 #ifndef COLL_H
@@ -82,12 +83,7 @@ class CollationKey;
 * The <code>Collator</code> class performs locale-sensitive string
 * comparison.<br>
 * You use this class to build searching and sorting routines for natural
-* language text.<br>
-* <em>Important: </em>The ICU collation service has been reimplemented
-* in order to achieve better performance and UCA compliance.
-* For details, see the
-* <a href="http://source.icu-project.org/repos/icu/icuhtml/trunk/design/collation/ICU_collation_design.htm">
-* collation design document</a>.
+* language text.
 * <p>
 * <code>Collator</code> is an abstract base class. Subclasses implement
 * specific collation strategies. One subclass,
@@ -118,11 +114,11 @@ class CollationKey;
 * </pre>
 * \htmlonly</blockquote>\endhtmlonly
 * <p>
-* You can set a <code>Collator</code>'s <em>strength</em> property to
+* You can set a <code>Collator</code>'s <em>strength</em> attribute to
 * determine the level of difference considered significant in comparisons.
 * Five strengths are provided: <code>PRIMARY</code>, <code>SECONDARY</code>,
 * <code>TERTIARY</code>, <code>QUATERNARY</code> and <code>IDENTICAL</code>.
-* The exact assignment of strengths to language features is locale dependant.
+* The exact assignment of strengths to language features is locale dependent.
 * For example, in Czech, "e" and "f" are considered primary differences,
 * while "e" and "\u00EA" are secondary differences, "e" and "E" are tertiary
 * differences and "e" and "e" are identical. The following shows how both case
@@ -132,7 +128,7 @@ class CollationKey;
 * \code
 * //Get the Collator for US English and set its strength to PRIMARY
 * UErrorCode success = U_ZERO_ERROR;
-* Collator* usCollator = Collator::createInstance(Locale::US, success);
+* Collator* usCollator = Collator::createInstance(Locale::getUS(), success);
 * usCollator->setStrength(Collator::PRIMARY);
 * if (usCollator->compare("abc", "ABC") == 0)
 *     cout << "'abc' and 'ABC' strings are equivalent with strength PRIMARY" << endl;
@@ -153,10 +149,8 @@ class CollationKey;
 * bytes but not zero bytes.
 * </p>
 * <p>
-* An older set of APIs returns a <code>CollationKey</code> object that wraps
+* Another set of APIs returns a <code>CollationKey</code> object that wraps
 * the sort key bytes instead of returning the bytes themselves.
-* Its use is deprecated, but it is still available for compatibility with
-* Java.
 * </p>
 * <p>
 * <strong>Note:</strong> <code>Collator</code>s with different Locale,
@@ -299,8 +293,8 @@ public:
 
     /**
      * Gets the table-based collation object for the desired locale. The
-     * resource of the desired locale will be loaded by ResourceLoader.
-     * Locale::ENGLISH is the base collation table and all other languages are
+     * resource of the desired locale will be loaded.
+     * Locale::getRoot() is the base collation table and all other languages are
      * built on top of it with additional language-specific modifications.
      * The UErrorCode& err parameter is used to return status information to the user.
      * To check whether the construction succeeded or not, you should check
@@ -322,33 +316,6 @@ public:
      */
     static Collator* U_EXPORT2 createInstance(const Locale& loc, UErrorCode& err);
 
-#ifdef U_USE_COLLATION_OBSOLETE_2_6
-    /**
-     * Create a Collator with a specific version.
-     * This is the same as createInstance(loc, err) except that getVersion() of
-     * the returned object is guaranteed to be the same as the version
-     * parameter.
-     * This is designed to be used to open the same collator for a given
-     * locale even when ICU is updated.
-     * The same locale and version guarantees the same sort keys and
-     * comparison results.
-     * <p>
-     * Note: this API will be removed in a future release.  Use
-     * <tt>createInstance(const Locale&, UErrorCode&) instead.</tt></p>
-     *
-     * @param loc The locale ID for which to open a collator.
-     * @param version The requested collator version.
-     * @param err A reference to a UErrorCode,
-     *            must not indicate a failure before calling this function.
-     * @return A pointer to a Collator, or 0 if an error occurred
-     *         or a collator with the requested version is not available.
-     *
-     * @see getVersion
-     * @obsolete ICU 2.6
-     */
-    static Collator *createInstance(const Locale &loc, UVersionInfo version, UErrorCode &err);
-#endif
-
     /**
      * The comparison function compares the character data stored in two
      * different strings. Returns information about whether a string is less
@@ -423,7 +390,7 @@ public:
      * .       UChar abc[] = {0x61, 0x62, 0x63, 0};  // = "abc"
      * .       UErrorCode status = U_ZERO_ERROR;
      * .       Collator *myCollation =
-     * .                         Collator::createInstance(Locale::US, status);
+     * .                         Collator::createInstance(Locale::getUS(), status);
      * .       if (U_FAILURE(status)) return;
      * .       myCollation->setStrength(Collator::PRIMARY);
      * .       // result would be Collator::EQUAL ("abc" == "ABC")
@@ -614,7 +581,7 @@ public:
      * <pre>
      *  \code
      *  UErrorCode status = U_ZERO_ERROR;
-     *  Collator*myCollation = Collator::createInstance(Locale::US, status);
+     *  Collator*myCollation = Collator::createInstance(Locale::getUS(), status);
      *  if (U_FAILURE(status)) return;
      *  myCollation->setStrength(Collator::PRIMARY);
      *  // result will be "abc" == "ABC"
@@ -669,7 +636,7 @@ public:
      * Retrieves the reorder codes that are grouped with the given reorder code. Some reorder
      * codes will be grouped and must reorder together.
      * @param reorderCode The reorder code to determine equivalence for. 
-     * @param dest The array to fill with the script equivalene reordering codes.
+     * @param dest The array to fill with the script equivalence reordering codes.
      * @param destCapacity The length of dest. 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 (pre-flighting).
@@ -791,7 +758,7 @@ public:
      * applications who wish to cache collators, or otherwise reuse
      * collators when possible.  The functional equivalent may change
      * over time.  For more information, please see the <a
-     * href="http://icu-project.org/userguide/locale.html#services">
+     * href="http://userguide.icu-project.org/locale#TOC-Locales-and-Services">
      * Locales and Services</a> section of the ICU User Guide.
      * @param keyword a particular keyword as enumerated by
      * ucol_getKeywords.
@@ -892,52 +859,99 @@ public:
                                             UErrorCode &status) const = 0;
 
     /**
-     * Sets the variable top to a collation element value of a string supplied.
+     * Sets the variable top to the top of the specified reordering group.
+     * The variable top determines the highest-sorting character
+     * which is affected by UCOL_ALTERNATE_HANDLING.
+     * If that attribute is set to UCOL_NON_IGNORABLE, then the variable top has no effect.
+     *
+     * The base class implementation sets U_UNSUPPORTED_ERROR.
+     * @param group one of UCOL_REORDER_CODE_SPACE, UCOL_REORDER_CODE_PUNCTUATION,
+     *              UCOL_REORDER_CODE_SYMBOL, UCOL_REORDER_CODE_CURRENCY;
+     *              or UCOL_REORDER_CODE_DEFAULT to restore the default max variable group
+     * @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 *this
+     * @see getMaxVariable
+     * @draft ICU 53
+     */
+    virtual Collator &setMaxVariable(UColReorderCode group, UErrorCode &errorCode);
+
+    /**
+     * Returns the maximum reordering group whose characters are affected by UCOL_ALTERNATE_HANDLING.
+     *
+     * The base class implementation returns UCOL_REORDER_CODE_PUNCTUATION.
+     * @return the maximum variable reordering group.
+     * @see setMaxVariable
+     * @draft ICU 53
+     */
+    virtual UColReorderCode getMaxVariable() const;
+
+    /**
+     * Sets the variable top to the primary weight of the specified string.
+     *
+     * Beginning with ICU 53, the variable top is pinned to
+     * the top of one of the supported reordering groups,
+     * and it must not be beyond the last of those groups.
+     * See setMaxVariable().
      * @param varTop one or more (if contraction) UChars to which the variable top should be set
      * @param len length of variable top string. If -1 it is considered to be zero terminated.
      * @param status error code. If error code is set, the return value is undefined. Errors set by this function are: <br>
-     *    U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such a contraction<br>
-     *    U_PRIMARY_TOO_LONG_ERROR if the primary for the variable top has more than two bytes
-     * @return a 32 bit value containing the value of the variable top in upper 16 bits. Lower 16 bits are undefined
-     * @stable ICU 2.0
+     *    U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such contraction<br>
+     *    U_ILLEGAL_ARGUMENT_ERROR if the variable top is beyond
+     *    the last reordering group supported by setMaxVariable()
+     * @return variable top primary weight
+     * @deprecated ICU 53 Call setMaxVariable() instead.
      */
     virtual uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status) = 0;
 
     /**
-     * Sets the variable top to a collation element value of a string supplied.
-     * @param varTop an UnicodeString size 1 or more (if contraction) of UChars to which the variable top should be set
+     * Sets the variable top to the primary weight of the specified string.
+     *
+     * Beginning with ICU 53, the variable top is pinned to
+     * the top of one of the supported reordering groups,
+     * and it must not be beyond the last of those groups.
+     * See setMaxVariable().
+     * @param varTop a UnicodeString size 1 or more (if contraction) of UChars to which the variable top should be set
      * @param status error code. If error code is set, the return value is undefined. Errors set by this function are: <br>
-     *    U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such a contraction<br>
-     *    U_PRIMARY_TOO_LONG_ERROR if the primary for the variable top has more than two bytes
-     * @return a 32 bit value containing the value of the variable top in upper 16 bits. Lower 16 bits are undefined
-     * @stable ICU 2.0
+     *    U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such contraction<br>
+     *    U_ILLEGAL_ARGUMENT_ERROR if the variable top is beyond
+     *    the last reordering group supported by setMaxVariable()
+     * @return variable top primary weight
+     * @deprecated ICU 53 Call setMaxVariable() instead.
      */
     virtual uint32_t setVariableTop(const UnicodeString &varTop, UErrorCode &status) = 0;
 
     /**
-     * Sets the variable top to a collation element value supplied. Variable top is set to the upper 16 bits.
-     * Lower 16 bits are ignored.
-     * @param varTop CE value, as returned by setVariableTop or ucol)getVariableTop
-     * @param status error code (not changed by function)
-     * @stable ICU 2.0
+     * Sets the variable top to the specified primary weight.
+     *
+     * Beginning with ICU 53, the variable top is pinned to
+     * the top of one of the supported reordering groups,
+     * and it must not be beyond the last of those groups.
+     * See setMaxVariable().
+     * @param varTop primary weight, as returned by setVariableTop or ucol_getVariableTop
+     * @param status error code
+     * @deprecated ICU 53 Call setMaxVariable() instead.
      */
     virtual void setVariableTop(uint32_t varTop, UErrorCode &status) = 0;
 
     /**
      * Gets the variable top value of a Collator.
-     * Lower 16 bits are undefined and should be ignored.
      * @param status error code (not changed by function). If error code is set, the return value is undefined.
+     * @return the variable top primary weight
+     * @see getMaxVariable
      * @stable ICU 2.0
      */
     virtual uint32_t getVariableTop(UErrorCode &status) const = 0;
 
     /**
-     * Get an UnicodeSet that contains all the characters and sequences
+     * Get a UnicodeSet that contains all the characters and sequences
      * tailored in this collator.
      * @param status      error code of the operation
      * @return a pointer to a UnicodeSet object containing all the
      *         code points and sequences that may sort differently than
-     *         in the UCA. The object must be disposed of by using delete
+     *         in the root collator. The object must be disposed of by using delete
      * @stable ICU 2.4
      */
     virtual UnicodeSet *getTailoredSet(UErrorCode &status) const;
@@ -952,7 +966,7 @@ public:
     virtual Collator* safeClone(void) const;
 
     /**
-     * Get the sort key as an array of bytes from an UnicodeString.
+     * Get the sort key as an array of bytes from a UnicodeString.
      * Sort key byte arrays are zero-terminated and can be compared using
      * strcmp().
      * @param source string to be processed.
@@ -968,7 +982,7 @@ public:
                               int32_t resultLength) const = 0;
 
     /**
-     * Get the sort key as an array of bytes from an UChar buffer.
+     * Get the sort key as an array of bytes from a UChar buffer.
      * Sort key byte arrays are zero-terminated and can be compared using
      * strcmp().
      * @param source string to be processed.
@@ -1067,11 +1081,9 @@ protected:
     */
     Collator(const Collator& other);
 
-    // Collator protected methods -----------------------------------------
-
-
+public:
    /**
-    * Used internally by registraton to define the requested and valid locales.
+    * Used internally by registration to define the requested and valid locales.
     * @param requestedLocale the requested locale
     * @param validLocale the valid locale
     * @param actualLocale the actual locale
@@ -1079,24 +1091,13 @@ protected:
     */
     virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale, const Locale& actualLocale);
 
-public:
-#if !UCONFIG_NO_SERVICE
-#ifndef U_HIDE_INTERNAL_API
-    /**
-     * used only by ucol_open, not for public use
-     * @internal
-     */
-    static UCollator* createUCollator(const char* loc, UErrorCode* status);
-#endif  /* U_HIDE_INTERNAL_API */
-#endif
-
     /** Get the short definition string for a collator. This internal API harvests the collator's
      *  locale and the attribute set and produces a string that can be used for opening 
-     *  a collator with the same properties using the ucol_openFromShortString API.
+     *  a collator with the same attributes using the ucol_openFromShortString API.
      *  This string will be normalized.
      *  The structure and the syntax of the string is defined in the "Naming collators"
      *  section of the users guide: 
-     *  http://icu-project.org/userguide/Collate_Concepts.html#Naming_Collators
+     *  http://userguide.icu-project.org/collation/concepts#TOC-Collator-naming-scheme
      *  This function supports preflighting.
      * 
      *  This is internal, and intended to be used with delegate converters.
@@ -1117,10 +1118,47 @@ public:
                                                      char *buffer,
                                                      int32_t capacity,
                                                      UErrorCode &status) const;
+
+    /**
+     * Implements ucol_strcollUTF8().
+     * @internal
+     */
+    virtual UCollationResult internalCompareUTF8(
+            const char *left, int32_t leftLength,
+            const char *right, int32_t rightLength,
+            UErrorCode &errorCode) const;
+
+    /**
+     * Implements ucol_nextSortKeyPart().
+     * @internal
+     */
+    virtual int32_t
+    internalNextSortKeyPart(
+            UCharIterator *iter, uint32_t state[2],
+            uint8_t *dest, int32_t count, UErrorCode &errorCode) const;
+
+#ifndef U_HIDE_INTERNAL_API
+    /** @internal */
+    static inline Collator *fromUCollator(UCollator *uc) {
+        return reinterpret_cast<Collator *>(uc);
+    }
+    /** @internal */
+    static inline const Collator *fromUCollator(const UCollator *uc) {
+        return reinterpret_cast<const Collator *>(uc);
+    }
+    /** @internal */
+    inline UCollator *toUCollator() {
+        return reinterpret_cast<UCollator *>(this);
+    }
+    /** @internal */
+    inline const UCollator *toUCollator() const {
+        return reinterpret_cast<const UCollator *>(this);
+    }
+#endif  // U_HIDE_INTERNAL_API
+
 private:
     /**
      * Assignment operator. Private for now.
-     * @internal
      */
     Collator& operator=(const Collator& other);
 
@@ -1130,16 +1168,6 @@ private:
     friend class ICUCollatorService;
     static Collator* makeInstance(const Locale& desiredLocale,
                                   UErrorCode& status);
-
-    // Collator private data members ---------------------------------------
-
-    /*
-    synwee : removed as attributes to be handled by child class
-    UCollationStrength  strength;
-    Normalizer::EMode  decmp;
-    */
-    /* This is useless information */
-/*  static const UVersionInfo fVersion;*/
 };
 
 #if !UCONFIG_NO_SERVICE
index d3a4e7d02f68d8f9e5172ed89994f8c5b7643408..d376a644a184dac5b2ade8ab60ecd0d52a6733ef 100644 (file)
@@ -27,7 +27,6 @@
 #else
 #define U_HAVE_RBNF 1
 
-#include "unicode/coll.h"
 #include "unicode/dcfmtsym.h"
 #include "unicode/fmtable.h"
 #include "unicode/locid.h"
@@ -40,6 +39,7 @@ U_NAMESPACE_BEGIN
 
 class NFRuleSet;
 class LocalizationInfo;
+class RuleBasedCollator;
 
 /**
  * Tags for the predefined rulesets.
@@ -54,10 +54,6 @@ enum URBNFRuleSetTag {
     URBNF_COUNT
 };
 
-#if UCONFIG_NO_COLLATION
-class Collator;
-#endif
-
 /**
  * The RuleBasedNumberFormat class formats numbers according to a set of rules. This number formatter is
  * typically used for spelling out numeric values in words (e.g., 25,3476 as
@@ -966,7 +962,7 @@ private:
     friend class FractionalPartSubstitution;
 
     inline NFRuleSet * getDefaultRuleSet() const;
-    Collator * getCollator() const;
+    const RuleBasedCollator * getCollator() const;
     DecimalFormatSymbols * getDecimalFormatSymbols() const;
     UnicodeString& adjustForCapitalizationContext(int32_t startPos, UnicodeString& currentResult) const;
 
@@ -976,7 +972,7 @@ private:
     int32_t numRuleSets;
     NFRuleSet *defaultRuleSet;
     Locale locale;
-    Collator* collator;
+    RuleBasedCollator* collator;
     DecimalFormatSymbols* decimalFormatSymbols;
     UBool lenient;
     UnicodeString* lenientParseRules;
index 94b459a0c4e9c3456ea31fc1cd551018eb6a5d3c..c125eeecf00980cf452148874bd3d77521e0d76f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *****************************************************************************
- * Copyright (C) 1996-2013, International Business Machines Corporation and others.
+ * Copyright (C) 1996-2014, International Business Machines Corporation and others.
  * All Rights Reserved.
  *****************************************************************************
  *
@@ -38,6 +38,7 @@ U_NAMESPACE_BEGIN
 
 /* forward declaration */
 class RuleBasedCollator;
+class CollationKeyByteSink;
 
 /**
  *
index 8499752e6d0d6ca9cc7052b9c862a7c64eda9f29..75f1629a5ecc3610d942ac871d49c9462aa3aba1 100644 (file)
@@ -1,6 +1,6 @@
 /*
 **********************************************************************
-*   Copyright (C) 2001-2008 IBM and others. All rights reserved.
+*   Copyright (C) 2001-2014 IBM and others. All rights reserved.
 **********************************************************************
 *   Date        Name        Description
 *  03/22/2000   helena      Creation.
@@ -492,11 +492,6 @@ private :
 
     // private data members ----------------------------------------------
 
-    /**
-    * RuleBasedCollator, contains exactly the same UCollator * in m_strsrch_
-    * @stable ICU 2.0
-    */
-    RuleBasedCollator  m_collator_;
     /**
     * Pattern text
     * @stable ICU 2.0
index 367df52c6dc95765789d512c7d830270cfbaa562..cdd5e8e8fca2e2f66a857f93647aa216d507e76d 100644 (file)
@@ -1,13 +1,13 @@
 /*
 ******************************************************************************
-* Copyright (C) 1996-2013, International Business Machines Corporation and
+* Copyright (C) 1996-2014, International Business Machines Corporation and
 * others. All Rights Reserved.
 ******************************************************************************
 */
 
 /**
  * \file 
- * \brief C++ API: RuleBasedCollator class provides the simple implementation of Collator.
+ * \brief C++ API: The RuleBasedCollator class implements the Collator abstract base class.
  */
 
 /**
@@ -54,6 +54,7 @@
 *                          to implementation file.
 * 01/29/01     synwee      Modified into a C++ wrapper which calls C API
 *                          (ucol.h)
+* 2012-2014    markus      Rewritten in C++ again.
 */
 
 #ifndef TBLCOLL_H
 
 #include "unicode/utypes.h"
 
 #if !UCONFIG_NO_COLLATION
 
 #include "unicode/coll.h"
+#include "unicode/locid.h"
+#include "unicode/uiter.h"
 #include "unicode/ucol.h"
-#include "unicode/sortkey.h"
-#include "unicode/normlzr.h"
 
 U_NAMESPACE_BEGIN
 
+struct CollationData;
+struct CollationSettings;
+struct CollationTailoring;
 /**
 * @stable ICU 2.0
 */
@@ -79,41 +82,33 @@ class StringSearch;
 * @stable ICU 2.0
 */
 class CollationElementIterator;
+class CollationKey;
+class SortKeyByteSink;
+class UnicodeSet;
+class UnicodeString;
+class UVector64;
 
 /**
- * The RuleBasedCollator class provides the simple implementation of
+ * The RuleBasedCollator class provides the implementation of
  * Collator, using data-driven tables. The user can create a customized
  * table-based collation.
- * <P>
- * <em>Important: </em>The ICU collation service has been reimplemented 
- * in order to achieve better performance and UCA compliance. 
- * For details, see the 
- * <a href="http://source.icu-project.org/repos/icu/icuhtml/trunk/design/collation/ICU_collation_design.htm">
- * collation design document</a>.
- * <p>
- * RuleBasedCollator is a thin C++ wrapper over the C implementation.
  * <p>
  * For more information about the collation service see 
- * <a href="http://icu-project.org/userguide/Collate_Intro.html">the users guide</a>.
+ * <a href="http://userguide.icu-project.org/collation">the User Guide</a>.
  * <p>
  * Collation service provides correct sorting orders for most locales supported in ICU. 
  * If specific data for a locale is not available, the orders eventually falls back
- * to the <a href="http://www.unicode.org/unicode/reports/tr10/">UCA sort order</a>. 
+ * to the <a href="http://www.unicode.org/reports/tr35/tr35-collation.html#Root_Collation">CLDR root sort order</a>. 
  * <p>
  * Sort ordering may be customized by providing your own set of rules. For more on
- * this subject see the <a href="http://icu-project.org/userguide/Collate_Customization.html">
- * Collation customization</a> section of the users guide.
+ * this subject see the <a href="http://userguide.icu-project.org/collation/customization">
+ * Collation Customization</a> section of the User Guide.
  * <p>
  * Note, RuleBasedCollator is not to be subclassed.
  * @see        Collator
- * @version    2.0 11/15/2001
  */
-class U_I18N_API RuleBasedCollator : public Collator
-{
+class U_I18N_API RuleBasedCollator : public Collator {
 public:
-
-  // constructor -------------------------------------------------------------
-
     /**
      * RuleBasedCollator constructor. This takes the table rules and builds a
      * collation table out of them. Please see RuleBasedCollator class
@@ -169,6 +164,14 @@ public:
                     UColAttributeValue decompositionMode,
                     UErrorCode& status);
 
+    /**
+     * TODO: document & propose as public API
+     * @internal
+     */
+    RuleBasedCollator(const UnicodeString &rules,
+                      UParseError &parseError, UnicodeString &reason,
+                      UErrorCode &errorCode);
+
     /**
      * Copy constructor.
      * @param other the RuleBasedCollator object to be copied
@@ -182,12 +185,12 @@ public:
     *  cloneBinary. Binary image used in instantiation of the 
     *  collator remains owned by the user and should stay around for 
     *  the lifetime of the collator. The API also takes a base collator
-    *  which usualy should be UCA.
+    *  which usually should be the root collator.
     *  @param bin binary image owned by the user and required through the
     *             lifetime of the collator
     *  @param length size of the image. If negative, the API will try to
     *                figure out the length of the image
-    *  @param base fallback collator, usually UCA. Base is required to be
+    *  @param base fallback collator, usually root. The base is required to be
     *              present through the lifetime of the collator. Currently 
     *              it cannot be NULL.
     *  @param status for catching errors
@@ -198,7 +201,6 @@ public:
     RuleBasedCollator(const uint8_t *bin, int32_t length, 
                     const RuleBasedCollator *base, 
                     UErrorCode &status);
-    // destructor --------------------------------------------------------------
 
     /**
      * Destructor.
@@ -206,11 +208,9 @@ public:
      */
     virtual ~RuleBasedCollator();
 
-    // public methods ----------------------------------------------------------
-
     /**
      * Assignment operator.
-     * @param other other RuleBasedCollator object to compare with.
+     * @param other other RuleBasedCollator object to copy from.
      * @stable ICU 2.0
      */
     RuleBasedCollator& operator=(const RuleBasedCollator& other);
@@ -271,8 +271,8 @@ public:
     * @stable ICU 2.6
     **/
     virtual UCollationResult compare(const UnicodeString& source,
-                                      const UnicodeString& target,
-                                      UErrorCode &status) const;
+                                     const UnicodeString& target,
+                                     UErrorCode &status) const;
 
     /**
     * Does the same thing as compare but limits the comparison to a specified 
@@ -288,9 +288,9 @@ public:
     * @stable ICU 2.6
     */
     virtual UCollationResult compare(const UnicodeString& source,
-                                      const UnicodeString& target,
-                                      int32_t length,
-                                      UErrorCode &status) const;
+                                     const UnicodeString& target,
+                                     int32_t length,
+                                     UErrorCode &status) const;
 
     /**
     * The comparison function compares the character data stored in two
@@ -309,8 +309,8 @@ public:
     * @stable ICU 2.6
     */
     virtual UCollationResult compare(const UChar* source, int32_t sourceLength,
-                                      const UChar* target, int32_t targetLength,
-                                      UErrorCode &status) const;
+                                     const UChar* target, int32_t targetLength,
+                                     UErrorCode &status) const;
 
     /**
      * Compares two strings using the Collator.
@@ -327,6 +327,23 @@ public:
                                      UCharIterator &tIter,
                                      UErrorCode &status) const;
 
+    /**
+     * Compares two UTF-8 strings using the Collator.
+     * Returns whether the first one compares less than/equal to/greater than
+     * the second one.
+     * This version takes UTF-8 input.
+     * Note that a StringPiece can be implicitly constructed
+     * from a std::string or a NUL-terminated const char * string.
+     * @param source the first UTF-8 string
+     * @param target the second UTF-8 string
+     * @param status ICU status
+     * @return UCOL_LESS, UCOL_EQUAL or UCOL_GREATER
+     * @draft ICU 51
+     */
+    virtual UCollationResult compareUTF8(const StringPiece &source,
+                                         const StringPiece &target,
+                                         UErrorCode &status) const;
+
     /**
     * Transforms a specified region of the string into a series of characters
     * that can be compared with CollationKey.compare. Use a CollationKey when
@@ -366,7 +383,7 @@ public:
      * @return the hash code.
      * @stable ICU 2.0
      */
-    virtual int32_t hashCode(void) const;
+    virtual int32_t hashCode() const;
 
     /**
     * Gets the locale of the Collator
@@ -385,7 +402,7 @@ public:
      * @return the collation tailoring from which this collator was created
      * @stable ICU 2.0
      */
-    const UnicodeString& getRules(void) const;
+    const UnicodeString& getRules() const;
 
     /**
      * Gets the version information for a Collator.
@@ -450,7 +467,7 @@ public:
      * @return memory, owned by the caller, of size 'length' bytes.
      * @deprecated ICU 52. Use cloneBinary() instead.
      */
-    uint8_t *cloneRuleData(int32_t &length, UErrorCode &status);
+    uint8_t *cloneRuleData(int32_t &length, UErrorCode &status) const;
 #endif  /* U_HIDE_DEPRECATED_API */
 
     /** Creates a binary image of a collator. This binary image can be stored and 
@@ -463,7 +480,7 @@ public:
     *  @see ucol_openBinary
     *  @stable ICU 3.4
     */
-    int32_t cloneBinary(uint8_t *buffer, int32_t capacity, UErrorCode &status);
+    int32_t cloneBinary(uint8_t *buffer, int32_t capacity, UErrorCode &status) const;
 
     /**
      * Returns current rules. Delta defines whether full rules are returned or
@@ -476,7 +493,7 @@ public:
      * @stable ICU 2.2
      * @see UCOL_FULL_RULES
      */
-    void getRules(UColRuleOption delta, UnicodeString &buffer);
+    void getRules(UColRuleOption delta, UnicodeString &buffer) const;
 
     /**
      * Universal attribute setter
@@ -499,58 +516,101 @@ public:
                                             UErrorCode &status) const;
 
     /**
-     * Sets the variable top to a collation element value of a string supplied.
+     * Sets the variable top to the top of the specified reordering group.
+     * The variable top determines the highest-sorting character
+     * which is affected by UCOL_ALTERNATE_HANDLING.
+     * If that attribute is set to UCOL_NON_IGNORABLE, then the variable top has no effect.
+     * @param group one of UCOL_REORDER_CODE_SPACE, UCOL_REORDER_CODE_PUNCTUATION,
+     *              UCOL_REORDER_CODE_SYMBOL, UCOL_REORDER_CODE_CURRENCY;
+     *              or UCOL_REORDER_CODE_DEFAULT to restore the default max variable group
+     * @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 *this
+     * @see getMaxVariable
+     * @draft ICU 53
+     */
+    virtual Collator &setMaxVariable(UColReorderCode group, UErrorCode &errorCode);
+
+    /**
+     * Returns the maximum reordering group whose characters are affected by UCOL_ALTERNATE_HANDLING.
+     * @return the maximum variable reordering group.
+     * @see setMaxVariable
+     * @draft ICU 53
+     */
+    virtual UColReorderCode getMaxVariable() const;
+
+    /**
+     * Sets the variable top to the primary weight of the specified string.
+     *
+     * Beginning with ICU 53, the variable top is pinned to
+     * the top of one of the supported reordering groups,
+     * and it must not be beyond the last of those groups.
+     * See setMaxVariable().
      * @param varTop one or more (if contraction) UChars to which the variable top should be set
      * @param len length of variable top string. If -1 it is considered to be zero terminated.
      * @param status error code. If error code is set, the return value is undefined. Errors set by this function are: <br>
-     *    U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such a contraction<br>
-     *    U_PRIMARY_TOO_LONG_ERROR if the primary for the variable top has more than two bytes
-     * @return a 32 bit value containing the value of the variable top in upper 16 bits. Lower 16 bits are undefined
-     * @stable ICU 2.0
+     *    U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such contraction<br>
+     *    U_ILLEGAL_ARGUMENT_ERROR if the variable top is beyond
+     *    the last reordering group supported by setMaxVariable()
+     * @return variable top primary weight
+     * @deprecated ICU 53 Call setMaxVariable() instead.
      */
     virtual uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status);
 
     /**
-     * Sets the variable top to a collation element value of a string supplied.
-     * @param varTop an UnicodeString size 1 or more (if contraction) of UChars to which the variable top should be set
+     * Sets the variable top to the primary weight of the specified string.
+     *
+     * Beginning with ICU 53, the variable top is pinned to
+     * the top of one of the supported reordering groups,
+     * and it must not be beyond the last of those groups.
+     * See setMaxVariable().
+     * @param varTop a UnicodeString size 1 or more (if contraction) of UChars to which the variable top should be set
      * @param status error code. If error code is set, the return value is undefined. Errors set by this function are: <br>
-     *    U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such a contraction<br>
-     *    U_PRIMARY_TOO_LONG_ERROR if the primary for the variable top has more than two bytes
-     * @return a 32 bit value containing the value of the variable top in upper 16 bits. Lower 16 bits are undefined
-     * @stable ICU 2.0
+     *    U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such contraction<br>
+     *    U_ILLEGAL_ARGUMENT_ERROR if the variable top is beyond
+     *    the last reordering group supported by setMaxVariable()
+     * @return variable top primary weight
+     * @deprecated ICU 53 Call setMaxVariable() instead.
      */
     virtual uint32_t setVariableTop(const UnicodeString &varTop, UErrorCode &status);
 
     /**
-     * Sets the variable top to a collation element value supplied. Variable top is set to the upper 16 bits.
-     * Lower 16 bits are ignored.
-     * @param varTop CE value, as returned by setVariableTop or ucol)getVariableTop
-     * @param status error code (not changed by function)
-     * @stable ICU 2.0
+     * Sets the variable top to the specified primary weight.
+     *
+     * Beginning with ICU 53, the variable top is pinned to
+     * the top of one of the supported reordering groups,
+     * and it must not be beyond the last of those groups.
+     * See setMaxVariable().
+     * @param varTop primary weight, as returned by setVariableTop or ucol_getVariableTop
+     * @param status error code
+     * @deprecated ICU 53 Call setMaxVariable() instead.
      */
     virtual void setVariableTop(uint32_t varTop, UErrorCode &status);
 
     /**
      * Gets the variable top value of a Collator.
-     * Lower 16 bits are undefined and should be ignored.
      * @param status error code (not changed by function). If error code is set, the return value is undefined.
+     * @return the variable top primary weight
+     * @see getMaxVariable
      * @stable ICU 2.0
      */
     virtual uint32_t getVariableTop(UErrorCode &status) const;
 
     /**
-     * Get an UnicodeSet that contains all the characters and sequences tailored in 
+     * Get a UnicodeSet that contains all the characters and sequences tailored in 
      * this collator.
      * @param status      error code of the operation
      * @return a pointer to a UnicodeSet object containing all the 
      *         code points and sequences that may sort differently than
-     *         in the UCA. The object must be disposed of by using delete
+     *         in the root collator. The object must be disposed of by using delete
      * @stable ICU 2.4
      */
     virtual UnicodeSet *getTailoredSet(UErrorCode &status) const;
 
     /**
-     * Get the sort key as an array of bytes from an UnicodeString.
+     * Get the sort key as an array of bytes from a UnicodeString.
      * @param source string to be processed.
      * @param result buffer to store result in. If NULL, number of bytes needed
      *        will be returned.
@@ -563,7 +623,7 @@ public:
                                int32_t resultLength) const;
 
     /**
-     * Get the sort key as an array of bytes from an UChar buffer.
+     * Get the sort key as an array of bytes from a UChar buffer.
      * @param source string to be processed.
      * @param sourceLength length of string to be processed. If -1, the string
      *        is 0 terminated and length will be decided by the function.
@@ -609,179 +669,119 @@ public:
                                   UErrorCode& status) ;
 
     /**
-     * Retrieves the reorder codes that are grouped with the given reorder code. Some reorder
-     * codes will be grouped and must reorder together.
-     * @param reorderCode The reorder code to determine equivalence for. 
-     * @param dest The array to fill with the script equivalene reordering codes.
-     * @param destCapacity The length of dest. 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 (pre-flighting).
-     * @param status A reference to an error code value, which must not indicate 
-     * a failure before the function call.
-     * @return The length of the of the reordering code equivalence array.
-     * @see ucol_setReorderCodes
-     * @see Collator#getReorderCodes
-     * @see Collator#setReorderCodes
-     * @stable ICU 4.8 
+     * Implements ucol_strcollUTF8().
+     * @internal
      */
-    static int32_t U_EXPORT2 getEquivalentReorderCodes(int32_t reorderCode,
-                                int32_t* dest,
-                                int32_t destCapacity,
-                                UErrorCode& status);
-
-private:
+    virtual UCollationResult internalCompareUTF8(
+            const char *left, int32_t leftLength,
+            const char *right, int32_t rightLength,
+            UErrorCode &errorCode) const;
 
-    // private static constants -----------------------------------------------
-
-    enum {
-        /* need look up in .commit() */
-        CHARINDEX = 0x70000000,
-        /* Expand index follows */
-        EXPANDCHARINDEX = 0x7E000000,
-        /* contract indexes follows */
-        CONTRACTCHARINDEX = 0x7F000000,
-        /* unmapped character values */
-        UNMAPPED = 0xFFFFFFFF,
-        /* primary strength increment */
-        PRIMARYORDERINCREMENT = 0x00010000,
-        /* secondary strength increment */
-        SECONDARYORDERINCREMENT = 0x00000100,
-        /* tertiary strength increment */
-        TERTIARYORDERINCREMENT = 0x00000001,
-        /* mask off anything but primary order */
-        PRIMARYORDERMASK = 0xffff0000,
-        /* mask off anything but secondary order */
-        SECONDARYORDERMASK = 0x0000ff00,
-        /* mask off anything but tertiary order */
-        TERTIARYORDERMASK = 0x000000ff,
-        /* mask off ignorable char order */
-        IGNORABLEMASK = 0x0000ffff,
-        /* use only the primary difference */
-        PRIMARYDIFFERENCEONLY = 0xffff0000,
-        /* use only the primary and secondary difference */
-        SECONDARYDIFFERENCEONLY = 0xffffff00,
-        /* primary order shift */
-        PRIMARYORDERSHIFT = 16,
-        /* secondary order shift */
-        SECONDARYORDERSHIFT = 8,
-        /* starting value for collation elements */
-        COLELEMENTSTART = 0x02020202,
-        /* testing mask for primary low element */
-        PRIMARYLOWZEROMASK = 0x00FF0000,
-        /* reseting value for secondaries and tertiaries */
-        RESETSECONDARYTERTIARY = 0x00000202,
-        /* reseting value for tertiaries */
-        RESETTERTIARY = 0x00000002,
-
-        PRIMIGNORABLE = 0x0202
-    };
-
-    // private data members ---------------------------------------------------
-
-    UBool dataIsOwned;
-
-    UBool isWriteThroughAlias;
-
-    /**
-    * c struct for collation. All initialisation for it has to be done through
-    * setUCollator().
-    */
-    UCollator *ucollator;
-
-    /**
-    * Rule UnicodeString
-    */
-    UnicodeString urulestring;
-
-    // friend classes --------------------------------------------------------
-
-    /**
-    * Used to iterate over collation elements in a character source.
-    */
-    friend class CollationElementIterator;
-
-    /**
-    * Collator ONLY needs access to RuleBasedCollator(const Locale&,
-    *                                                       UErrorCode&)
-    */
-    friend class Collator;
+    /** Get the short definition string for a collator. This internal API harvests the collator's
+     *  locale and the attribute set and produces a string that can be used for opening 
+     *  a collator with the same attributes using the ucol_openFromShortString API.
+     *  This string will be normalized.
+     *  The structure and the syntax of the string is defined in the "Naming collators"
+     *  section of the users guide: 
+     *  http://userguide.icu-project.org/collation/concepts#TOC-Collator-naming-scheme
+     *  This function supports preflighting.
+     * 
+     *  This is internal, and intended to be used with delegate converters.
+     *
+     *  @param locale a locale that will appear as a collators locale in the resulting
+     *                short string definition. If NULL, the locale will be harvested 
+     *                from the collator.
+     *  @param buffer space to hold the resulting string
+     *  @param capacity capacity of the buffer
+     *  @param status for returning errors. All the preflighting errors are featured
+     *  @return length of the resulting string
+     *  @see ucol_openFromShortString
+     *  @see ucol_normalizeShortDefinitionString
+     *  @see ucol_getShortDefinitionString
+     *  @internal
+     */
+    virtual int32_t internalGetShortDefinitionString(const char *locale,
+                                                     char *buffer,
+                                                     int32_t capacity,
+                                                     UErrorCode &status) const;
 
     /**
-    * Searching over collation elements in a character source
-    */
-    friend class StringSearch;
-
-    // private constructors --------------------------------------------------
+     * Implements ucol_nextSortKeyPart().
+     * @internal
+     */
+    virtual int32_t internalNextSortKeyPart(
+            UCharIterator *iter, uint32_t state[2],
+            uint8_t *dest, int32_t count, UErrorCode &errorCode) const;
 
+#ifndef U_HIDE_INTERNAL_API
     /**
-     * Default constructor
+     * Only for use in ucol_openRules().
+     * @internal
      */
     RuleBasedCollator();
 
     /**
-     * RuleBasedCollator constructor. This constructor takes a locale. The
-     * only caller of this class should be Collator::createInstance(). If
-     * createInstance() happens to know that the requested locale's collation is
-     * implemented as a RuleBasedCollator, it can then call this constructor.
-     * OTHERWISE IT SHOULDN'T, since this constructor ALWAYS RETURNS A VALID
-     * COLLATION TABLE. It does this by falling back to defaults.
-     * @param desiredLocale locale used
-     * @param status error code status
+     * Implements ucol_getLocaleByType().
+     * Needed because the lifetime of the locale ID string must match that of the collator.
+     * getLocale() returns a copy of a Locale, with minimal lifetime in a C wrapper.
+     * @internal
      */
-    RuleBasedCollator(const Locale& desiredLocale, UErrorCode& status);
+    const char *internalGetLocaleID(ULocDataLocaleType type, UErrorCode &errorCode) const;
 
     /**
-     * common constructor implementation
-     *
-     * @param rules the collation rules to build the collation table from.
-     * @param collationStrength default strength for comparison
-     * @param decompositionMode the normalisation mode
-     * @param status reporting a success or an error.
+     * Implements ucol_getContractionsAndExpansions().
+     * Gets this collator's sets of contraction strings and/or
+     * characters and strings that map to multiple collation elements (expansions).
+     * If addPrefixes is TRUE, then contractions that are expressed as
+     * prefix/pre-context rules are included.
+     * @param contractions if not NULL, the set to hold the contractions
+     * @param expansions if not NULL, the set to hold the expansions
+     * @param addPrefixes include prefix contextual mappings
+     * @param errorCode in/out ICU error code
+     * @internal
      */
-    void
-    construct(const UnicodeString& rules,
-              UColAttributeValue collationStrength,
-              UColAttributeValue decompositionMode,
-              UErrorCode& status);
-
-    // private methods -------------------------------------------------------
+    void internalGetContractionsAndExpansions(
+            UnicodeSet *contractions, UnicodeSet *expansions,
+            UBool addPrefixes, UErrorCode &errorCode) const;
 
     /**
-    * Creates the c struct for ucollator
-    * @param locale desired locale
-    * @param status error status
-    */
-    void setUCollator(const Locale& locale, UErrorCode& status);
+     * Adds the contractions that start with character c to the set.
+     * Ignores prefixes. Used by AlphabeticIndex.
+     * @internal
+     */
+    void internalAddContractions(UChar32 c, UnicodeSet &set, UErrorCode &errorCode) const;
 
     /**
-    * Creates the c struct for ucollator
-    * @param locale desired locale name
-    * @param status error status
-    */
-    void setUCollator(const char* locale, UErrorCode& status);
+     * Implements from-rule constructors, and ucol_openRules().
+     * @internal
+     */
+    void internalBuildTailoring(
+            const UnicodeString &rules,
+            int32_t strength,
+            UColAttributeValue decompositionMode,
+            UParseError *outParseError, UnicodeString *outReason,
+            UErrorCode &errorCode);
 
-    /**
-    * Creates the c struct for ucollator. This used internally by StringSearch.
-    * Hence the responsibility of cleaning up the ucollator is not done by
-    * this RuleBasedCollator. The isDataOwned flag is set to FALSE.
-    * @param collator new ucollator data
-    */
-    void setUCollator(UCollator *collator);
+    /** @internal */
+    static inline RuleBasedCollator *rbcFromUCollator(UCollator *uc) {
+        return dynamic_cast<RuleBasedCollator *>(fromUCollator(uc));
+    }
+    /** @internal */
+    static inline const RuleBasedCollator *rbcFromUCollator(const UCollator *uc) {
+        return dynamic_cast<const RuleBasedCollator *>(fromUCollator(uc));
+    }
 
-public:
-#ifndef U_HIDE_INTERNAL_API
     /**
-    * Get UCollator data struct. Used only by StringSearch & intltest.
-    * @return UCollator data struct
-    * @internal
-    */
-    const UCollator * getUCollator();
-#endif  /* U_HIDE_INTERNAL_API */
+     * Appends the CEs for the string to the vector.
+     * @internal for tests & tools
+     */
+    void internalGetCEs(const UnicodeString &str, UVector64 &ces, UErrorCode &errorCode) const;
+#endif  // U_HIDE_INTERNAL_API
 
 protected:
    /**
-    * Used internally by registraton to define the requested and valid locales.
-    * @param requestedLocale the requsted locale
+    * Used internally by registration to define the requested and valid locales.
+    * @param requestedLocale the requested locale
     * @param validLocale the valid locale
     * @param actualLocale the actual locale
     * @internal
@@ -789,72 +789,74 @@ protected:
     virtual void setLocales(const Locale& requestedLocale, const Locale& validLocale, const Locale& actualLocale);
 
 private:
-    // if not owned and not a write through alias, copy the ucollator
-    void checkOwned(void);
+    friend class CollationElementIterator;
+    friend class Collator;
 
-    // utility to init rule string used by checkOwned and construct
-    void setRuleStringFromCollator();
+    RuleBasedCollator(const CollationTailoring *t, const Locale &vl);
 
-public:
-    /** Get the short definition string for a collator. This internal API harvests the collator's
-     *  locale and the attribute set and produces a string that can be used for opening 
-     *  a collator with the same properties using the ucol_openFromShortString API.
-     *  This string will be normalized.
-     *  The structure and the syntax of the string is defined in the "Naming collators"
-     *  section of the users guide: 
-     *  http://icu-project.org/userguide/Collate_Concepts.html#Naming_Collators
-     *  This function supports preflighting.
-     * 
-     *  This is internal, and intended to be used with delegate converters.
-     *
-     *  @param locale a locale that will appear as a collators locale in the resulting
-     *                short string definition. If NULL, the locale will be harvested 
-     *                from the collator.
-     *  @param buffer space to hold the resulting string
-     *  @param capacity capacity of the buffer
-     *  @param status for returning errors. All the preflighting errors are featured
-     *  @return length of the resulting string
-     *  @see ucol_openFromShortString
-     *  @see ucol_normalizeShortDefinitionString
-     *  @see ucol_getShortDefinitionString
-     *  @internal
+    /**
+     * Enumeration of attributes that are relevant for short definition strings
+     * (e.g., ucol_getShortDefinitionString()).
+     * Effectively extends UColAttribute.
      */
-    virtual int32_t internalGetShortDefinitionString(const char *locale,
-                                                     char *buffer,
-                                                     int32_t capacity,
-                                                     UErrorCode &status) const;
-};
+    enum Attributes {
+        ATTR_VARIABLE_TOP = UCOL_ATTRIBUTE_COUNT,
+        ATTR_LIMIT
+    };
 
-// inline method implementation ---------------------------------------------
+    void adoptTailoring(CollationTailoring *t);
 
-inline void RuleBasedCollator::setUCollator(const Locale &locale,
-                                               UErrorCode &status)
-{
-    setUCollator(locale.getName(), status);
-}
+    // Both lengths must be <0 or else both must be >=0.
+    UCollationResult doCompare(const UChar *left, int32_t leftLength,
+                               const UChar *right, int32_t rightLength,
+                               UErrorCode &errorCode) const;
+    UCollationResult doCompare(const uint8_t *left, int32_t leftLength,
+                               const uint8_t *right, int32_t rightLength,
+                               UErrorCode &errorCode) const;
 
+    void writeSortKey(const UChar *s, int32_t length,
+                      SortKeyByteSink &sink, UErrorCode &errorCode) const;
 
-inline void RuleBasedCollator::setUCollator(UCollator     *collator)
-{
+    void writeIdenticalLevel(const UChar *s, const UChar *limit,
+                             SortKeyByteSink &sink, UErrorCode &errorCode) const;
 
-    if (ucollator && dataIsOwned) {
-        ucol_close(ucollator);
+    const CollationSettings &getDefaultSettings() const;
+
+    void setAttributeDefault(int32_t attribute) {
+        explicitlySetAttributes &= ~((uint32_t)1 << attribute);
+    }
+    void setAttributeExplicitly(int32_t attribute) {
+        explicitlySetAttributes |= (uint32_t)1 << attribute;
+    }
+    UBool attributeHasBeenSetExplicitly(int32_t attribute) const {
+        // assert(0 <= attribute < ATTR_LIMIT);
+        return (UBool)((explicitlySetAttributes & ((uint32_t)1 << attribute)) != 0);
     }
-    ucollator   = collator;
-    dataIsOwned = FALSE;
-    isWriteThroughAlias = TRUE;
-    setRuleStringFromCollator();
-}
 
-#ifndef U_HIDE_INTERNAL_API
-inline const UCollator * RuleBasedCollator::getUCollator()
-{
-    return ucollator;
-}
-#endif  /* U_HIDE_INTERNAL_API */
+    /**
+     * Tests whether a character is "unsafe" for use as a collation starting point.
+     *
+     * @param c code point or code unit
+     * @return TRUE if c is unsafe
+     * @see CollationElementIterator#setOffset(int)
+     */
+    UBool isUnsafe(UChar32 c) const;
 
-U_NAMESPACE_END
+    static void computeMaxExpansions(const CollationTailoring *t, UErrorCode &errorCode);
+    UBool initMaxExpansions(UErrorCode &errorCode) const;
+
+    void setFastLatinOptions(CollationSettings &ownedSettings) const;
 
-#endif /* #if !UCONFIG_NO_COLLATION */
+    const CollationData *data;
+    const CollationSettings *settings;  // reference-counted
+    const CollationTailoring *tailoring;  // reference-counted
+    Locale validLocale;
+    uint32_t explicitlySetAttributes;
+
+    UBool actualLocaleIsSameAsValid;
+};
+
+U_NAMESPACE_END
 
-#endif
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // TBLCOLL_H
index 5a459b52af4a9fd7684005c789ac3543e928d939..871eb467e6c6b7a83823fbdb978a7a8c11f6bb05 100644 (file)
@@ -1,6 +1,6 @@
 /*
 *******************************************************************************
-* Copyright (c) 1996-2013, International Business Machines Corporation and others.
+* Copyright (c) 1996-2014, International Business Machines Corporation and others.
 * All Rights Reserved.
 *******************************************************************************
 */
  * The C API for Collator performs locale-sensitive
  * string comparison. You use this service to build
  * searching and sorting routines for natural language text.
- * <em>Important: </em>The ICU collation service has been reimplemented 
- * in order to achieve better performance and UCA compliance. 
- * For details, see the 
- * <a href="http://source.icu-project.org/repos/icu/icuhtml/trunk/design/collation/ICU_collation_design.htm">
- * collation design document</a>.
  * <p>
  * For more information about the collation service see 
- * <a href="http://icu-project.org/userguide/Collate_Intro.html">the users guide</a>.
+ * <a href="http://userguide.icu-project.org/collation">the User Guide</a>.
  * <p>
  * Collation service provides correct sorting orders for most locales supported in ICU. 
  * If specific data for a locale is not available, the orders eventually falls back
- * to the <a href="http://www.unicode.org/unicode/reports/tr10/">UCA sort order</a>. 
+ * to the <a href="http://www.unicode.org/reports/tr35/tr35-collation.html#Root_Collation">CLDR root sort order</a>. 
  * <p>
  * Sort ordering may be customized by providing your own set of rules. For more on
- * this subject see the 
- * <a href="http://icu-project.org/userguide/Collate_Customization.html">
- * Collation customization</a> section of the users guide.
+ * this subject see the <a href="http://userguide.icu-project.org/collation/customization">
+ * Collation Customization</a> section of the User Guide.
  * <p>
  * @see         UCollationResult
  * @see         UNormalizationMode
@@ -361,8 +355,8 @@ typedef enum {
  *            Special values for locales can be passed in - 
  *            if NULL is passed for the locale, the default locale
  *            collation rules will be used. If empty string ("") or
- *            "root" are passed, UCA rules will be used.
- * @param status A pointer to an UErrorCode to receive any errors
+ *            "root" are passed, the root collator will be returned.
+ * @param status A pointer to a UErrorCode to receive any errors
  * @return A pointer to a UCollator, or 0 if an error occurred.
  * @see ucol_openRules
  * @see ucol_safeClone
@@ -373,7 +367,7 @@ U_STABLE UCollator* U_EXPORT2
 ucol_open(const char *loc, UErrorCode *status);
 
 /**
- * Produce an UCollator instance according to the rules supplied.
+ * Produce a UCollator instance according to the rules supplied.
  * The rules are used to change the default ordering, defined in the
  * UCA in a process called tailoring. The resulting UCollator pointer
  * can be used in the same way as the one obtained by {@link #ucol_strcoll }.
@@ -389,7 +383,7 @@ ucol_open(const char *loc, UErrorCode *status);
  * @param parseError  A pointer to UParseError to recieve information about errors
  *                    occurred during parsing. This argument can currently be set
  *                    to NULL, but at users own risk. Please provide a real structure.
- * @param status A pointer to an UErrorCode to receive any errors
+ * @param status A pointer to a UErrorCode to receive any errors
  * @return A pointer to a UCollator. It is not guaranteed that NULL be returned in case
  *         of error - please use status argument to check for errors.
  * @see ucol_open
@@ -409,7 +403,7 @@ ucol_openRules( const UChar        *rules,
  * Open a collator defined by a short form string.
  * The structure and the syntax of the string is defined in the "Naming collators"
  * section of the users guide: 
- * http://icu-project.org/userguide/Collate_Concepts.html#Naming_Collators
+ * http://userguide.icu-project.org/collation/concepts#TOC-Collator-naming-scheme
  * Attributes are overriden by the subsequent attributes. So, for "S2_S3", final
  * strength will be 3. 3066bis locale overrides individual locale parts.
  * The call to this function is equivalent to a call to ucol_open, followed by a 
@@ -448,9 +442,9 @@ ucol_openFromShortString( const char *definition,
 #ifndef U_HIDE_DEPRECATED_API
 /**
  * Get a set containing the contractions defined by the collator. The set includes
- * both the UCA contractions and the contractions defined by the collator. This set
+ * both the root collator's contractions and the contractions defined by the collator. This set
  * will contain only strings. If a tailoring explicitly suppresses contractions from 
- * the UCA (like Russian), removed contractions will not be in the resulting set.
+ * the root collator (like Russian), removed contractions will not be in the resulting set.
  * @param coll collator 
  * @param conts the set to hold the result. It gets emptied before
  *              contractions are added. 
@@ -467,7 +461,7 @@ ucol_getContractions( const UCollator *coll,
 
 /**
  * Get a set containing the expansions defined by the collator. The set includes
- * both the UCA expansions and the expansions defined by the tailoring
+ * both the root collator's expansions and the expansions defined by the tailoring
  * @param coll collator
  * @param contractions if not NULL, the set to hold the contractions
  * @param expansions if not NULL, the set to hold the expansions
@@ -545,7 +539,7 @@ ucol_strcoll(    const    UCollator    *coll,
 * @param sourceLength The length of source, or -1 if null-terminated. 
 * @param target The target UTF-8 string. 
 * @param targetLength The length of target, or -1 if null-terminated. 
-* @param status A pointer to an UErrorCode to receive any errors 
+* @param status A pointer to a UErrorCode to receive any errors 
 * @return The result of comparing the strings; one of UCOL_EQUAL, 
 * UCOL_GREATER, UCOL_LESS 
 * @see ucol_greater 
@@ -627,7 +621,7 @@ ucol_equal(const UCollator *coll,
  * @param tIter The target string iterator.
  * @return The result of comparing the strings; one of UCOL_EQUAL,
  * UCOL_GREATER, UCOL_LESS
- * @param status A pointer to an UErrorCode to receive any errors
+ * @param status A pointer to a UErrorCode to receive any errors
  * @see ucol_strcoll
  * @stable ICU 2.6
  */
@@ -702,7 +696,7 @@ ucol_getReorderCodes(const UCollator* coll,
  * to the default for this collator. The default reordering may be the DUCET/CLDR order or may be a reordering that
  * was specified when this collator was created from resource data or from rules. The 
  * DEFAULT code <b>must</b> be the sole code supplied when it used. If not
- * that will result in an U_ILLEGAL_ARGUMENT_ERROR being set.
+ * that will result in a U_ILLEGAL_ARGUMENT_ERROR being set.
  * <p>The special reorder code NONE will remove any reordering for this collator.
  * The result of setting no reordering will be to have the DUCET/CLDR ordering used. The 
  * NONE code <b>must</b> be the sole code supplied when it used.
@@ -753,7 +747,7 @@ ucol_getEquivalentReorderCodes(int32_t reorderCode,
  * @param dispLoc The locale for display.
  * @param result A pointer to a buffer to receive the attribute.
  * @param resultLength The maximum size of result.
- * @param status A pointer to an UErrorCode to receive any errors
+ * @param status A pointer to a UErrorCode to receive any errors
  * @return The total buffer size needed; if greater than resultLength,
  * the output was truncated.
  * @stable ICU 2.0
@@ -862,7 +856,7 @@ ucol_getKeywordValuesForLocale(const char* key,
  * applications who wish to cache collators, or otherwise reuse
  * collators when possible.  The functional equivalent may change
  * over time.  For more information, please see the <a
- * href="http://icu-project.org/userguide/locale.html#services">
+ * href="http://userguide.icu-project.org/locale#TOC-Locales-and-Services">
  * Locales and Services</a> section of the ICU User Guide.
  * @param result fillin for the functionally equivalent locale
  * @param resultCapacity capacity of the fillin buffer
@@ -898,11 +892,11 @@ ucol_getRules(    const    UCollator    *coll,
 
 /** Get the short definition string for a collator. This API harvests the collator's
  *  locale and the attribute set and produces a string that can be used for opening 
- *  a collator with the same properties using the ucol_openFromShortString API.
+ *  a collator with the same attributes using the ucol_openFromShortString API.
  *  This string will be normalized.
  *  The structure and the syntax of the string is defined in the "Naming collators"
  *  section of the users guide: 
- *  http://icu-project.org/userguide/Collate_Concepts.html#Naming_Collators
+ *  http://userguide.icu-project.org/collation/concepts#TOC-Collator-naming-scheme
  *  This API supports preflighting.
  *  @param coll a collator
  *  @param locale a locale that will appear as a collators locale in the resulting
@@ -1158,55 +1152,91 @@ ucol_setAttribute(UCollator *coll, UColAttribute attr, UColAttributeValue value,
 U_STABLE UColAttributeValue  U_EXPORT2 
 ucol_getAttribute(const UCollator *coll, UColAttribute attr, UErrorCode *status);
 
-/** Variable top
- * is a two byte primary value which causes all the codepoints with primary values that
- * are less or equal than the variable top to be shifted when alternate handling is set
- * to UCOL_SHIFTED.
- * Sets the variable top to a collation element value of a string supplied. 
- * @param coll collator which variable top needs to be changed
+#ifndef U_HIDE_DRAFT_API
+
+/**
+ * Sets the variable top to the top of the specified reordering group.
+ * The variable top determines the highest-sorting character
+ * which is affected by UCOL_ALTERNATE_HANDLING.
+ * If that attribute is set to UCOL_NON_IGNORABLE, then the variable top has no effect.
+ * @param coll the collator
+ * @param group one of UCOL_REORDER_CODE_SPACE, UCOL_REORDER_CODE_PUNCTUATION,
+ *              UCOL_REORDER_CODE_SYMBOL, UCOL_REORDER_CODE_CURRENCY;
+ *              or UCOL_REORDER_CODE_DEFAULT to restore the default max variable group
+ * @param pErrorCode 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.)
+ * @see ucol_getMaxVariable
+ * @draft ICU 53
+ */
+U_DRAFT void U_EXPORT2
+ucol_setMaxVariable(UCollator *coll, UColReorderCode group, UErrorCode *pErrorCode);
+
+/**
+ * Returns the maximum reordering group whose characters are affected by UCOL_ALTERNATE_HANDLING.
+ * @param coll the collator
+ * @return the maximum variable reordering group.
+ * @see ucol_setMaxVariable
+ * @draft ICU 53
+ */
+U_DRAFT UColReorderCode U_EXPORT2
+ucol_getMaxVariable(const UCollator *coll);
+
+#endif  /* U_HIDE_DRAFT_API */
+
+/**
+ * Sets the variable top to the primary weight of the specified string.
+ *
+ * Beginning with ICU 53, the variable top is pinned to
+ * the top of one of the supported reordering groups,
+ * and it must not be beyond the last of those groups.
+ * See ucol_setMaxVariable().
+ * @param coll the collator
  * @param varTop one or more (if contraction) UChars to which the variable top should be set
  * @param len length of variable top string. If -1 it is considered to be zero terminated.
- * @param status error code. If error code is set, the return value is undefined. 
- *               Errors set by this function are: <br>
- *    U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such 
- *    a contraction<br>
- *    U_PRIMARY_TOO_LONG_ERROR if the primary for the variable top has more than two bytes
- * @return a 32 bit value containing the value of the variable top in upper 16 bits. 
- *         Lower 16 bits are undefined
+ * @param status error code. If error code is set, the return value is undefined.
+ *               Errors set by this function are:<br>
+ *    U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such contraction<br>
+ *    U_ILLEGAL_ARGUMENT_ERROR if the variable top is beyond
+ *    the last reordering group supported by ucol_setMaxVariable()
+ * @return variable top primary weight
  * @see ucol_getVariableTop
  * @see ucol_restoreVariableTop
- * @stable ICU 2.0
+ * @deprecated ICU 53 Call ucol_setMaxVariable() instead.
  */
-U_STABLE uint32_t U_EXPORT2 
+U_DEPRECATED uint32_t U_EXPORT2 
 ucol_setVariableTop(UCollator *coll, 
                     const UChar *varTop, int32_t len, 
                     UErrorCode *status);
 
 /** 
  * Gets the variable top value of a Collator. 
- * Lower 16 bits are undefined and should be ignored.
  * @param coll collator which variable top needs to be retrieved
  * @param status error code (not changed by function). If error code is set, 
  *               the return value is undefined.
- * @return the variable top value of a Collator.
+ * @return the variable top primary weight
+ * @see ucol_getMaxVariable
  * @see ucol_setVariableTop
  * @see ucol_restoreVariableTop
  * @stable ICU 2.0
  */
 U_STABLE uint32_t U_EXPORT2 ucol_getVariableTop(const UCollator *coll, UErrorCode *status);
 
-/** 
- * Sets the variable top to a collation element value supplied. Variable top is 
- * set to the upper 16 bits. 
- * Lower 16 bits are ignored.
- * @param coll collator which variable top needs to be changed
- * @param varTop CE value, as returned by ucol_setVariableTop or ucol)getVariableTop
- * @param status error code (not changed by function)
+/**
+ * Sets the variable top to the specified primary weight.
+ *
+ * Beginning with ICU 53, the variable top is pinned to
+ * the top of one of the supported reordering groups,
+ * and it must not be beyond the last of those groups.
+ * See ucol_setMaxVariable().
+ * @param varTop primary weight, as returned by ucol_setVariableTop or ucol_getVariableTop
+ * @param status error code
  * @see ucol_getVariableTop
  * @see ucol_setVariableTop
- * @stable ICU 2.0
+ * @deprecated ICU 53 Call ucol_setMaxVariable() instead.
  */
-U_STABLE void U_EXPORT2 
+U_DEPRECATED void U_EXPORT2 
 ucol_restoreVariableTop(UCollator *coll, const uint32_t varTop, UErrorCode *status);
 
 /**
@@ -1302,7 +1332,7 @@ U_STABLE const char * U_EXPORT2
 ucol_getLocaleByType(const UCollator *coll, ULocDataLocaleType type, UErrorCode *status);
 
 /**
- * Get an Unicode set that contains all the characters and sequences tailored in 
+ * Get a Unicode set that contains all the characters and sequences tailored in 
  * this collator. The result must be disposed of by using uset_close.
  * @param coll        The UCollator for which we want to get tailored chars
  * @param status      error code of the operation
@@ -1315,31 +1345,6 @@ U_STABLE USet * U_EXPORT2
 ucol_getTailoredSet(const UCollator *coll, UErrorCode *status);
 
 #ifndef U_HIDE_INTERNAL_API
-/**
- * Universal attribute getter that returns UCOL_DEFAULT if the value is default
- * @param coll collator which attributes are to be changed
- * @param attr attribute type
- * @return attribute value or UCOL_DEFAULT if the value is default
- * @param status to indicate whether the operation went on smoothly or there were errors
- * @see UColAttribute
- * @see UColAttributeValue
- * @see ucol_setAttribute
- * @internal ICU 3.0
- */
-U_INTERNAL UColAttributeValue  U_EXPORT2
-ucol_getAttributeOrDefault(const UCollator *coll, UColAttribute attr, UErrorCode *status);
-
-/** Check whether two collators are equal. Collators are considered equal if they
- *  will sort strings the same. This means that both the current attributes and the
- *  rules must be equivalent. Currently used for RuleBasedCollator::operator==.
- *  @param source first collator
- *  @param target second collator
- *  @return TRUE or FALSE
- *  @internal ICU 3.0
- */
-U_INTERNAL UBool U_EXPORT2
-ucol_equals(const UCollator *source, const UCollator *target);
-
 /** Calculates the set of unsafe code points, given a collator.
  *   A character is unsafe if you could append any character and cause the ordering to alter significantly.
  *   Collation sorts in normalized order, so anything that rearranges in normalization can cause this.
@@ -1356,12 +1361,6 @@ ucol_getUnsafeSet( const UCollator *coll,
                   USet *unsafe,
                   UErrorCode *status);
 
-/** Reset UCA's static pointers. You don't want to use this, unless your static memory can go away.
- * @internal ICU 3.2.1
- */
-U_INTERNAL void U_EXPORT2
-ucol_forgetUCA(void);
-
 /** Touches all resources needed for instantiating a collator from a short string definition,
  *  thus filling up the cache.
  * @param definition A short string containing a locale and a set of attributes. 
@@ -1409,12 +1408,12 @@ ucol_cloneBinary(const UCollator *coll,
  *  ucol_cloneBinary. Binary image used in instantiation of the 
  *  collator remains owned by the user and should stay around for 
  *  the lifetime of the collator. The API also takes a base collator
- *  which usualy should be UCA.
+ *  which usually should be the root collator.
  *  @param bin binary image owned by the user and required through the
  *             lifetime of the collator
  *  @param length size of the image. If negative, the API will try to
  *                figure out the length of the image
- *  @param base fallback collator, usually UCA. Base is required to be
+ *  @param base fallback collator, usually the root collator. Base is required to be
  *              present through the lifetime of the collator. Currently 
  *              it cannot be NULL.
  *  @param status for catching errors
index cf730f95b51b1684d2a49e56368396c863971f74..f987624056727c44f67ca10572f7a8dde96bab3f 100644 (file)
@@ -1,10 +1,10 @@
 /*
 *******************************************************************************
-*   Copyright (C) 2001-2011, International Business Machines
+*   Copyright (C) 2001-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
 *
-* File ucoleitr.cpp
+* File ucoleitr.h
 *
 * Modification History:
 *
  */
 #define UCOL_NULLORDER        ((int32_t)0xFFFFFFFF)
 
-#ifndef U_HIDE_INTERNAL_API
-/**
- * This indicates an error has occured during processing or there are no more CEs 
- * to be returned.
- *
- * @internal
- */
-#define UCOL_PROCESSED_NULLORDER        ((int64_t)U_INT64_MAX)
-#endif  /* U_HIDE_INTERNAL_API */
-
 #include "unicode/ucol.h"
 
 /** 
@@ -55,12 +45,12 @@ typedef struct UCollationElements UCollationElements;
  * ordering priority of the positioned character. The ordering priority of a 
  * character, which we refer to as a key, defines how a character is collated 
  * in the given collation object.
- * For example, consider the following in Spanish:
+ * For example, consider the following in Slovak and in traditional Spanish collation:
  * <pre>
  * .       "ca" -> the first key is key('c') and second key is key('a').
  * .       "cha" -> the first key is key('ch') and second key is key('a').
  * </pre>
- * And in German,
+ * And in German phonebook collation,
  * <pre>
  * .       "<ae ligature>b"-> the first key is key('a'), the second key is key('e'), and
  * .       the third key is key('b').
@@ -99,10 +89,10 @@ typedef struct UCollationElements UCollationElements;
  * undefined.
  * The result of a forward iterate (ucol_next) and reversed result of the  
  * backward iterate (ucol_prev) on the same string are equivalent, if 
- * collation orders with the value UCOL_IGNORABLE are ignored.
+ * collation orders with the value 0 are ignored.
  * Character based on the comparison level of the collator.  A collation order 
  * consists of primary order, secondary order and tertiary order.  The data 
- * type of the collation order is <strong>t_int32</strong>. 
+ * type of the collation order is <strong>int32_t</strong>. 
  *
  * @see UCollator
  */
@@ -113,7 +103,7 @@ typedef struct UCollationElements UCollationElements;
  * @param coll The collator containing the desired collation rules.
  * @param text The text to iterate over.
  * @param textLength The number of characters in text, or -1 if null-terminated
- * @param status A pointer to an UErrorCode to receive any errors.
+ * @param status A pointer to a UErrorCode to receive any errors.
  * @return a struct containing collation element information
  * @stable ICU 2.0
  */
@@ -155,27 +145,11 @@ ucol_closeElements(UCollationElements *elems);
 U_STABLE void U_EXPORT2 
 ucol_reset(UCollationElements *elems);
 
-#ifndef U_HIDE_INTERNAL_API
-/**
- * Set the collation elements to use implicit ordering for Han
- * even if they've been tailored. This will also force Hangul
- * syllables to be ordered by decomposing them to their component
- * Jamo.
- *
- * @param elems The UCollationElements containing the text.
- * @param status A pointer to a UErrorCode to reveive any errors.
- *
- * @internal
- */
-U_INTERNAL void U_EXPORT2
-ucol_forceHanImplicit(UCollationElements *elems, UErrorCode *status);
-#endif  /* U_HIDE_INTERNAL_API */
-
 /**
  * Get the ordering priority of the next collation element in the text.
  * A single character may contain more than one collation element.
  * @param elems The UCollationElements containing the text.
- * @param status A pointer to an UErrorCode to receive any errors.
+ * @param status A pointer to a UErrorCode to receive any errors.
  * @return The next collation elements ordering, otherwise returns NULLORDER 
  *         if an error has occured or if the end of string has been reached
  * @stable ICU 2.0
@@ -187,11 +161,8 @@ ucol_next(UCollationElements *elems, UErrorCode *status);
  * Get the ordering priority of the previous collation element in the text.
  * A single character may contain more than one collation element.
  * Note that internally a stack is used to store buffered collation elements. 
- * It is very rare that the stack will overflow, however if such a case is 
- * encountered, the problem can be solved by increasing the size 
- * UCOL_EXPAND_CE_BUFFER_SIZE in ucol_imp.h.
  * @param elems The UCollationElements containing the text.
- * @param status A pointer to an UErrorCode to receive any errors. Noteably 
+ * @param status A pointer to a UErrorCode to receive any errors. Noteably 
  *               a U_BUFFER_OVERFLOW_ERROR is returned if the internal stack
  *               buffer has been exhausted.
  * @return The previous collation elements ordering, otherwise returns 
@@ -202,47 +173,6 @@ ucol_next(UCollationElements *elems, UErrorCode *status);
 U_STABLE int32_t U_EXPORT2 
 ucol_previous(UCollationElements *elems, UErrorCode *status);
 
-#ifndef U_HIDE_INTERNAL_API
-/**
- * Get the processed ordering priority of the next collation element in the text.
- * A single character may contain more than one collation element.
- *
- * @param elems The UCollationElements containing the text.
- * @param ixLow a pointer to an int32_t to receive the iterator index before fetching the CE.
- * @param ixHigh a pointer to an int32_t to receive the iterator index after fetching the CE.
- * @param status A pointer to an UErrorCode to receive any errors.
- * @return The next collation elements ordering, otherwise returns UCOL_PROCESSED_NULLORDER 
- *         if an error has occured or if the end of string has been reached
- *
- * @internal
- */
-U_INTERNAL int64_t U_EXPORT2
-ucol_nextProcessed(UCollationElements *elems, int32_t *ixLow, int32_t *ixHigh, UErrorCode *status);
-
-/**
- * Get the processed ordering priority of the previous collation element in the text.
- * A single character may contain more than one collation element.
- * Note that internally a stack is used to store buffered collation elements. 
- * It is very rare that the stack will overflow, however if such a case is 
- * encountered, the problem can be solved by increasing the size 
- * UCOL_EXPAND_CE_BUFFER_SIZE in ucol_imp.h.
- *
- * @param elems The UCollationElements containing the text.
- * @param ixLow A pointer to an int32_t to receive the iterator index after fetching the CE
- * @param ixHigh A pointer to an int32_t to receiver the iterator index before fetching the CE
- * @param status A pointer to an UErrorCode to receive any errors. Noteably 
- *               a U_BUFFER_OVERFLOW_ERROR is returned if the internal stack
- *               buffer has been exhausted.
- * @return The previous collation elements ordering, otherwise returns 
- *         UCOL_PROCESSED_NULLORDER if an error has occured or if the start of
- *         string has been reached.
- *
- * @internal
- */
-U_INTERNAL int64_t U_EXPORT2
-ucol_previousProcessed(UCollationElements *elems, int32_t *ixLow, int32_t *ixHigh, UErrorCode *status);
-#endif  /* U_HIDE_INTERNAL_API */
-
 /**
  * Get the maximum length of any expansion sequences that end with the 
  * specified comparison order.
@@ -265,7 +195,7 @@ ucol_getMaxExpansion(const UCollationElements *elems, int32_t order);
  * @param elems The UCollationElements to set.
  * @param text The source text containing the collation elements.
  * @param textLength The length of text, or -1 if null-terminated.
- * @param status A pointer to an UErrorCode to receive any errors.
+ * @param status A pointer to a UErrorCode to receive any errors.
  * @see ucol_getText
  * @stable ICU 2.0
  */
@@ -295,7 +225,7 @@ ucol_getOffset(const UCollationElements *elems);
  * the API reset() has to be called.
  * @param elems The UCollationElements to set.
  * @param offset The desired character offset.
- * @param status A pointer to an UErrorCode to receive any errors.
+ * @param status A pointer to a UErrorCode to receive any errors.
  * @see ucol_getOffset
  * @stable ICU 2.0
  */
index ba463e606c2011950f30154a7821f0d6cf93c20f..9983e5a5fa8ed44a42beb4a61d1564104e590bb3 100644 (file)
@@ -1,6 +1,6 @@
 /*
 **********************************************************************
-*   Copyright (C) 2001-2011 IBM and others. All rights reserved.
+*   Copyright (C) 2001-2014 IBM and others. All rights reserved.
 **********************************************************************
 *   Date        Name        Description
 *  07/02/2001   synwee      Creation.
@@ -16,7 +16,6 @@
 #include "unicode/uchar.h"
 #include "unicode/utf16.h"
 #include "normalizer2impl.h"
-#include "ucol_imp.h"
 #include "usrchimp.h"
 #include "cmemory.h"
 #include "ucln_in.h"
@@ -51,17 +50,10 @@ static
 inline void setColEIterOffset(UCollationElements *elems,
                       int32_t             offset)
 {
-    collIterate *ci = &(elems->iteratordata_);
-    ci->pos         = ci->string + offset;
-    ci->CEpos       = ci->toReturn = ci->extendCEs ? ci->extendCEs : ci->CEs;
-    if (ci->flags & UCOL_ITER_INNORMBUF) {
-        ci->flags = ci->origFlags;
-    }
-    ci->fcdPosition = NULL;
-
-    ci->offsetReturn = NULL;
-    ci->offsetStore  = ci->offsetBuffer;
-    ci->offsetRepeatCount = ci->offsetRepeatValue = 0;
+    // Note: Not "fast" any more after the 2013 collation rewrite.
+    // We do not want to expose more internals than necessary.
+    UErrorCode status = U_ZERO_ERROR;
+    ucol_setOffset(elems, offset, &status);
 }
 
 /**
@@ -311,10 +303,7 @@ inline uint16_t initializePatternCETable(UStringSearch *strsrch,
         strsrch->utilIter = coleiter;
     }
     else {
-        uprv_init_collIterate(strsrch->collator, pattern->text,
-                         pattern->textLength,
-                         &coleiter->iteratordata_,
-                         status);
+        ucol_setText(coleiter, pattern->text, pattern->textLength, status);
     }
     if(U_FAILURE(*status)) {
         return 0;
@@ -385,10 +374,7 @@ inline uint16_t initializePatternPCETable(UStringSearch *strsrch,
         // returned.
         strsrch->utilIter = coleiter;
     } else {
-        uprv_init_collIterate(strsrch->collator, pattern->text,
-                              pattern->textLength,
-                              &coleiter->iteratordata_,
-                              status);
+        ucol_setText(coleiter, pattern->text, pattern->textLength, status);
     }
     if(U_FAILURE(*status)) {
         return 0;
@@ -402,12 +388,12 @@ inline uint16_t initializePatternPCETable(UStringSearch *strsrch,
     uint16_t  result = 0;
     int64_t   pce;
 
-    uprv_init_pce(coleiter);
+    icu::UCollationPCE iter(coleiter);
 
     // ** Should processed CEs be signed or unsigned?
     // ** (the rest of the code in this file seems to play fast-and-loose with
     // **  whether a CE is signed or unsigned. For example, look at routine above this one.)
-    while ((pce = ucol_nextProcessed(coleiter, NULL, NULL, status)) != UCOL_PROCESSED_NULLORDER &&
+    while ((pce = iter.nextProcessed(NULL, NULL, status)) != UCOL_PROCESSED_NULLORDER &&
            U_SUCCESS(*status)) {
         int64_t *temp = addTouint64_tArray(pcetable, offset, &pcetablesize,
                               pce,
@@ -446,6 +432,7 @@ inline uint16_t initializePatternPCETable(UStringSearch *strsrch,
 static
 inline int16_t initializePattern(UStringSearch *strsrch, UErrorCode *status)
 {
+    if (U_FAILURE(*status)) { return 0; }
           UPattern   *pattern     = &(strsrch->pattern);
     const UChar      *patterntext = pattern->text;
           int32_t     length      = pattern->textLength;
@@ -2736,6 +2723,7 @@ U_CAPI UStringSearch * U_EXPORT2 usearch_openFromCollator(
         result->utilIter              = NULL;
         result->textIter              = ucol_openElements(collator, text,
                                                           textlength, status);
+        result->textProcessedIter     = NULL;
         if (U_FAILURE(*status)) {
             usearch_close(result);
             return NULL;
@@ -2772,6 +2760,7 @@ U_CAPI void U_EXPORT2 usearch_close(UStringSearch *strsrch)
             uprv_free(strsrch->pattern.PCE);
         }
 
+        delete strsrch->textProcessedIter;
         ucol_closeElements(strsrch->textIter);
         ucol_closeElements(strsrch->utilIter);
 
@@ -2790,6 +2779,24 @@ U_CAPI void U_EXPORT2 usearch_close(UStringSearch *strsrch)
     }
 }
 
+namespace {
+
+UBool initTextProcessedIter(UStringSearch *strsrch, UErrorCode *status) {
+    if (U_FAILURE(*status)) { return FALSE; }
+    if (strsrch->textProcessedIter == NULL) {
+        strsrch->textProcessedIter = new icu::UCollationPCE(strsrch->textIter);
+        if (strsrch->textProcessedIter == NULL) {
+            *status = U_MEMORY_ALLOCATION_ERROR;
+            return FALSE;
+        }
+    } else {
+        strsrch->textProcessedIter->init(strsrch->textIter);
+    }
+    return TRUE;
+}
+
+}
+
 // set and get methods --------------------------------------------------
 
 U_CAPI void U_EXPORT2 usearch_setOffset(UStringSearch *strsrch,
@@ -3010,6 +3017,11 @@ U_CAPI void U_EXPORT2 usearch_setCollator(      UStringSearch *strsrch,
         }
 
         if (strsrch) {
+            delete strsrch->textProcessedIter;
+            strsrch->textProcessedIter = NULL;
+            ucol_closeElements(strsrch->textIter);
+            ucol_closeElements(strsrch->utilIter);
+            strsrch->textIter = strsrch->utilIter = NULL;
             if (strsrch->ownCollator && (strsrch->collator != collator)) {
                 ucol_close((UCollator *)strsrch->collator);
                 strsrch->ownCollator = FALSE;
@@ -3028,18 +3040,14 @@ U_CAPI void U_EXPORT2 usearch_setCollator(      UStringSearch *strsrch,
                                                                 UCOL_SHIFTED;
             // if status is a failure, ucol_getVariableTop returns 0
             strsrch->variableTop = ucol_getVariableTop(collator, status);
-            if (U_SUCCESS(*status)) {
-                initialize(strsrch, status);
-                if (U_SUCCESS(*status)) {
-                    /* free offset buffer to avoid memory leak before initializing. */
-                    ucol_freeOffsetBuffer(&(strsrch->textIter->iteratordata_));
-                    uprv_init_collIterate(collator, strsrch->search->text,
-                                          strsrch->search->textLength,
-                                          &(strsrch->textIter->iteratordata_),
-                                          status);
-                    strsrch->utilIter->iteratordata_.coll = collator;
-                }
-            }
+            strsrch->textIter = ucol_openElements(collator,
+                                      strsrch->search->text,
+                                      strsrch->search->textLength,
+                                      status);
+            strsrch->utilIter = ucol_openElements(
+                    collator, strsrch->pattern.text, strsrch->pattern.textLength, status);
+            // initialize() _after_ setting the iterators for the new collator.
+            initialize(strsrch, status);
         }
 
         // **** are these calls needed?
@@ -3416,11 +3424,8 @@ U_CAPI void U_EXPORT2 usearch_reset(UStringSearch *strsrch)
         if (!sameCollAttribute) {
             initialize(strsrch, &status);
         }
-        /* free offset buffer to avoid memory leak before initializing. */
-        ucol_freeOffsetBuffer(&(strsrch->textIter->iteratordata_));
-        uprv_init_collIterate(strsrch->collator, strsrch->search->text,
+        ucol_setText(strsrch->textIter, strsrch->search->text,
                               strsrch->search->textLength,
-                              &(strsrch->textIter->iteratordata_),
                               &status);
         strsrch->search->matchedLength      = 0;
         strsrch->search->matchedIndex       = USEARCH_DONE;
@@ -3444,7 +3449,7 @@ struct  CEI {
 
 U_NAMESPACE_BEGIN
 
-
+namespace {
 //
 //  CEBuffer   A circular buffer of CEs from the text being searched.
 //
@@ -3496,7 +3501,7 @@ CEBuffer::CEBuffer(UStringSearch *ss, UErrorCode *status) {
     firstIx = 0;
     limitIx = 0;
 
-    uprv_init_pce(ceIter);
+    if (!initTextProcessedIter(ss, status)) { return; }
 
     if (bufSize>DEFAULT_CEBUFFER_SIZE) {
         buf = (CEI *)uprv_malloc(bufSize * sizeof(CEI));
@@ -3550,7 +3555,7 @@ const CEI *CEBuffer::get(int32_t index) {
 
     UErrorCode status = U_ZERO_ERROR;
 
-    buf[i].ce = ucol_nextProcessed(ceIter, &buf[i].lowIndex, &buf[i].highIndex, &status);
+    buf[i].ce = strSearch->textProcessedIter->nextProcessed(&buf[i].lowIndex, &buf[i].highIndex, &status);
 
     return &buf[i];
 }
@@ -3589,11 +3594,13 @@ const CEI *CEBuffer::getPrevious(int32_t index) {
 
     UErrorCode status = U_ZERO_ERROR;
 
-    buf[i].ce = ucol_previousProcessed(ceIter, &buf[i].lowIndex, &buf[i].highIndex, &status);
+    buf[i].ce = strSearch->textProcessedIter->previousProcessed(&buf[i].lowIndex, &buf[i].highIndex, &status);
 
     return &buf[i];
 }
 
+}
+
 U_NAMESPACE_END
 
 
@@ -4659,8 +4666,12 @@ UBool usearch_handlePreviousExact(UStringSearch *strsrch, UErrorCode *status)
         } else {
             // move the start position at the end of possible match
             initializePatternPCETable(strsrch, status);
+            if (!initTextProcessedIter(strsrch, status)) {
+                setMatchNotFound(strsrch);
+                return FALSE;
+            }
             for (int32_t nPCEs = 0; nPCEs < strsrch->pattern.PCELength - 1; nPCEs++) {
-                int64_t pce = ucol_nextProcessed(strsrch->textIter, NULL, NULL, status);
+                int64_t pce = strsrch->textProcessedIter->nextProcessed(NULL, NULL, status);
                 if (pce == UCOL_PROCESSED_NULLORDER) {
                     // at the end of the text
                     break;
@@ -4808,8 +4819,12 @@ UBool usearch_handlePreviousCanonical(UStringSearch *strsrch,
         } else {
             // move the start position at the end of possible match
             initializePatternPCETable(strsrch, status);
+            if (!initTextProcessedIter(strsrch, status)) {
+                setMatchNotFound(strsrch);
+                return FALSE;
+            }
             for (int32_t nPCEs = 0; nPCEs < strsrch->pattern.PCELength - 1; nPCEs++) {
-                int64_t pce = ucol_nextProcessed(strsrch->textIter, NULL, NULL, status);
+                int64_t pce = strsrch->textProcessedIter->nextProcessed(NULL, NULL, status);
                 if (pce == UCOL_PROCESSED_NULLORDER) {
                     // at the end of the text
                     break;
index 2f597e90334000b493f1762410f5239404825107..9b7dd7388aab7de0a1703abe22930727baad5be3 100644 (file)
@@ -1,6 +1,6 @@
 /*
 **********************************************************************
-*   Copyright (C) 2001-2011 IBM and others. All rights reserved.
+*   Copyright (C) 2001-2014 IBM and others. All rights reserved.
 **********************************************************************
 *   Date        Name        Description
 *  08/13/2001   synwee      Creation.
 #include "unicode/ucoleitr.h"
 #include "unicode/ubrk.h"
 
+/* mask off anything but primary order */
+#define UCOL_PRIMARYORDERMASK 0xffff0000
+/* mask off anything but secondary order */
+#define UCOL_SECONDARYORDERMASK 0x0000ff00
+/* mask off anything but tertiary order */
+#define UCOL_TERTIARYORDERMASK 0x000000ff
+/* primary order shift */
+#define UCOL_PRIMARYORDERSHIFT 16
+/* secondary order shift */
+#define UCOL_SECONDARYORDERSHIFT 8
+
+#define UCOL_IGNORABLE 0
+
+/* get weights from a CE */
+#define UCOL_PRIMARYORDER(order) (((order) >> 16) & 0xffff)
+#define UCOL_SECONDARYORDER(order) (((order) & UCOL_SECONDARYORDERMASK)>> UCOL_SECONDARYORDERSHIFT)
+#define UCOL_TERTIARYORDER(order) ((order) & UCOL_TERTIARYORDERMASK)
+
+#define UCOL_CONTINUATION_MARKER 0xC0
+
+#define isContinuation(CE) (((CE) & UCOL_CONTINUATION_MARKER) == UCOL_CONTINUATION_MARKER)
+
+/**
+ * This indicates an error has occured during processing or there are no more CEs 
+ * to be returned.
+ */
+#define UCOL_PROCESSED_NULLORDER        ((int64_t)U_INT64_MAX)
+
+U_NAMESPACE_BEGIN
+
+class CollationElementIterator;
+class Collator;
+
+struct PCEI
+{
+    uint64_t ce;
+    int32_t  low;
+    int32_t  high;
+};
+
+struct PCEBuffer
+{
+    PCEI    defaultBuffer[16];
+    PCEI   *buffer;
+    int32_t bufferIndex;
+    int32_t bufferSize;
+
+    PCEBuffer();
+    ~PCEBuffer();
+
+    void  reset();
+    UBool empty() const;
+    void  put(uint64_t ce, int32_t ixLow, int32_t ixHigh);
+    const PCEI *get();
+};
+
+class UCollationPCE : public UMemory {
+private:
+    PCEBuffer          pceBuffer;
+    CollationElementIterator *cei;
+    UCollationStrength strength;
+    UBool              toShift;
+    UBool              isShifted;
+    uint32_t           variableTop;
+
+public:
+    UCollationPCE(UCollationElements *elems);
+    UCollationPCE(CollationElementIterator *iter);
+    ~UCollationPCE();
+
+    void init(UCollationElements *elems);
+    void init(CollationElementIterator *iter);
+
+    /**
+     * Get the processed ordering priority of the next collation element in the text.
+     * A single character may contain more than one collation element.
+     *
+     * @param ixLow a pointer to an int32_t to receive the iterator index before fetching the CE.
+     * @param ixHigh a pointer to an int32_t to receive the iterator index after fetching the CE.
+     * @param status A pointer to an UErrorCode to receive any errors.
+     * @return The next collation elements ordering, otherwise returns UCOL_PROCESSED_NULLORDER 
+     *         if an error has occured or if the end of string has been reached
+     */
+    int64_t nextProcessed(int32_t *ixLow, int32_t *ixHigh, UErrorCode *status);
+    /**
+     * Get the processed ordering priority of the previous collation element in the text.
+     * A single character may contain more than one collation element.
+     *
+     * @param ixLow A pointer to an int32_t to receive the iterator index after fetching the CE
+     * @param ixHigh A pointer to an int32_t to receiver the iterator index before fetching the CE
+     * @param status A pointer to an UErrorCode to receive any errors. Noteably 
+     *               a U_BUFFER_OVERFLOW_ERROR is returned if the internal stack
+     *               buffer has been exhausted.
+     * @return The previous collation elements ordering, otherwise returns 
+     *         UCOL_PROCESSED_NULLORDER if an error has occured or if the start of
+     *         string has been reached.
+     */
+    int64_t previousProcessed(int32_t *ixLow, int32_t *ixHigh, UErrorCode *status);
+
+private:
+    void init(const Collator &coll);
+    uint64_t processCE(uint32_t ce);
+};
+
+U_NAMESPACE_END
+
 #define INITIAL_ARRAY_SIZE_       256
 #define MAX_TABLE_SIZE_           257
 
@@ -65,6 +171,7 @@ struct UStringSearch {
     // positions within the collation element iterator is used to determine
     // if we are at the start of the text.
            UCollationElements *textIter;
+           icu::UCollationPCE *textProcessedIter;
     // utility collation element, used throughout program for temporary 
     // iteration.
            UCollationElements *utilIter;
diff --git a/icu4c/source/i18n/utf16collationiterator.cpp b/icu4c/source/i18n/utf16collationiterator.cpp
new file mode 100644 (file)
index 0000000..559ea91
--- /dev/null
@@ -0,0 +1,492 @@
+/*
+*******************************************************************************
+* Copyright (C) 2010-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* utf16collationiterator.cpp
+*
+* created on: 2010oct27
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "charstr.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationfcd.h"
+#include "collationiterator.h"
+#include "normalizer2impl.h"
+#include "uassert.h"
+#include "utf16collationiterator.h"
+
+U_NAMESPACE_BEGIN
+
+UTF16CollationIterator::UTF16CollationIterator(const UTF16CollationIterator &other,
+                                               const UChar *newText)
+        : CollationIterator(other),
+          start(newText),
+          pos(newText + (other.pos - other.start)),
+          limit(other.limit == NULL ? NULL : newText + (other.limit - other.start)) {
+}
+
+UTF16CollationIterator::~UTF16CollationIterator() {}
+
+UBool
+UTF16CollationIterator::operator==(const CollationIterator &other) const {
+    if(!CollationIterator::operator==(other)) { return FALSE; }
+    const UTF16CollationIterator &o = static_cast<const UTF16CollationIterator &>(other);
+    // Compare the iterator state but not the text: Assume that the caller does that.
+    return (pos - start) == (o.pos - o.start);
+}
+
+void
+UTF16CollationIterator::resetToOffset(int32_t newOffset) {
+    reset();
+    pos = start + newOffset;
+}
+
+int32_t
+UTF16CollationIterator::getOffset() const {
+    return (int32_t)(pos - start);
+}
+
+uint32_t
+UTF16CollationIterator::handleNextCE32(UChar32 &c, UErrorCode & /*errorCode*/) {
+    if(pos == limit) {
+        c = U_SENTINEL;
+        return Collation::FALLBACK_CE32;
+    }
+    c = *pos++;
+    return UTRIE2_GET32_FROM_U16_SINGLE_LEAD(trie, c);
+}
+
+UChar
+UTF16CollationIterator::handleGetTrailSurrogate() {
+    if(pos == limit) { return 0; }
+    UChar trail;
+    if(U16_IS_TRAIL(trail = *pos)) { ++pos; }
+    return trail;
+}
+
+UBool
+UTF16CollationIterator::foundNULTerminator() {
+    if(limit == NULL) {
+        limit = --pos;
+        return TRUE;
+    } else {
+        return FALSE;
+    }
+}
+
+UChar32
+UTF16CollationIterator::nextCodePoint(UErrorCode & /*errorCode*/) {
+    if(pos == limit) {
+        return U_SENTINEL;
+    }
+    UChar32 c = *pos;
+    if(c == 0 && limit == NULL) {
+        limit = pos;
+        return U_SENTINEL;
+    }
+    ++pos;
+    UChar trail;
+    if(U16_IS_LEAD(c) && pos != limit && U16_IS_TRAIL(trail = *pos)) {
+        ++pos;
+        return U16_GET_SUPPLEMENTARY(c, trail);
+    } else {
+        return c;
+    }
+}
+
+UChar32
+UTF16CollationIterator::previousCodePoint(UErrorCode & /*errorCode*/) {
+    if(pos == start) {
+        return U_SENTINEL;
+    }
+    UChar32 c = *--pos;
+    UChar lead;
+    if(U16_IS_TRAIL(c) && pos != start && U16_IS_LEAD(lead = *(pos - 1))) {
+        --pos;
+        return U16_GET_SUPPLEMENTARY(lead, c);
+    } else {
+        return c;
+    }
+}
+
+void
+UTF16CollationIterator::forwardNumCodePoints(int32_t num, UErrorCode & /*errorCode*/) {
+    while(num > 0 && pos != limit) {
+        UChar32 c = *pos;
+        if(c == 0 && limit == NULL) {
+            limit = pos;
+            break;
+        }
+        ++pos;
+        --num;
+        if(U16_IS_LEAD(c) && pos != limit && U16_IS_TRAIL(*pos)) {
+            ++pos;
+        }
+    }
+}
+
+void
+UTF16CollationIterator::backwardNumCodePoints(int32_t num, UErrorCode & /*errorCode*/) {
+    while(num > 0 && pos != start) {
+        UChar32 c = *--pos;
+        --num;
+        if(U16_IS_TRAIL(c) && pos != start && U16_IS_LEAD(*(pos-1))) {
+            --pos;
+        }
+    }
+}
+
+// FCDUTF16CollationIterator ----------------------------------------------- ***
+
+FCDUTF16CollationIterator::FCDUTF16CollationIterator(const FCDUTF16CollationIterator &other,
+                                                     const UChar *newText)
+        : UTF16CollationIterator(other),
+          rawStart(newText),
+          segmentStart(newText + (other.segmentStart - other.rawStart)),
+          segmentLimit(other.segmentLimit == NULL ? NULL : newText + (other.segmentLimit - other.rawStart)),
+          rawLimit(other.rawLimit == NULL ? NULL : newText + (other.rawLimit - other.rawStart)),
+          nfcImpl(other.nfcImpl),
+          normalized(other.normalized),
+          checkDir(other.checkDir) {
+    if(checkDir != 0 || other.start == other.segmentStart) {
+        start = newText + (other.start - other.rawStart);
+        pos = newText + (other.pos - other.rawStart);
+        limit = other.limit == NULL ? NULL : newText + (other.limit - other.rawStart);
+    } else {
+        start = normalized.getBuffer();
+        pos = start + (other.pos - other.start);
+        limit = start + normalized.length();
+    }
+}
+
+FCDUTF16CollationIterator::~FCDUTF16CollationIterator() {}
+
+UBool
+FCDUTF16CollationIterator::operator==(const CollationIterator &other) const {
+    // Skip the UTF16CollationIterator and call its parent.
+    if(!CollationIterator::operator==(other)) { return FALSE; }
+    const FCDUTF16CollationIterator &o = static_cast<const FCDUTF16CollationIterator &>(other);
+    // Compare the iterator state but not the text: Assume that the caller does that.
+    if(checkDir != o.checkDir) { return FALSE; }
+    if(checkDir == 0 && (start == segmentStart) != (o.start == o.segmentStart)) { return FALSE; }
+    if(checkDir != 0 || start == segmentStart) {
+        return (pos - rawStart) == (o.pos - o.rawStart);
+    } else {
+        return (segmentStart - rawStart) == (o.segmentStart - o.rawStart) &&
+                (pos - start) == (o.pos - o.start);
+    }
+}
+
+void
+FCDUTF16CollationIterator::resetToOffset(int32_t newOffset) {
+    reset();
+    start = segmentStart = pos = rawStart + newOffset;
+    limit = rawLimit;
+    checkDir = 1;
+}
+
+int32_t
+FCDUTF16CollationIterator::getOffset() const {
+    if(checkDir != 0 || start == segmentStart) {
+        return (int32_t)(pos - rawStart);
+    } else if(pos == start) {
+        return (int32_t)(segmentStart - rawStart);
+    } else {
+        return (int32_t)(segmentLimit - rawStart);
+    }
+}
+
+uint32_t
+FCDUTF16CollationIterator::handleNextCE32(UChar32 &c, UErrorCode &errorCode) {
+    for(;;) {
+        if(checkDir > 0) {
+            if(pos == limit) {
+                c = U_SENTINEL;
+                return Collation::FALLBACK_CE32;
+            }
+            c = *pos++;
+            if(CollationFCD::hasTccc(c)) {
+                if(CollationFCD::maybeTibetanCompositeVowel(c) ||
+                        (pos != limit && CollationFCD::hasLccc(*pos))) {
+                    --pos;
+                    if(!nextSegment(errorCode)) {
+                        c = U_SENTINEL;
+                        return Collation::FALLBACK_CE32;
+                    }
+                    c = *pos++;
+                }
+            }
+            break;
+        } else if(checkDir == 0 && pos != limit) {
+            c = *pos++;
+            break;
+        } else {
+            switchToForward();
+        }
+    }
+    return UTRIE2_GET32_FROM_U16_SINGLE_LEAD(trie, c);
+}
+
+UBool
+FCDUTF16CollationIterator::foundNULTerminator() {
+    if(limit == NULL) {
+        limit = rawLimit = --pos;
+        return TRUE;
+    } else {
+        return FALSE;
+    }
+}
+
+UChar32
+FCDUTF16CollationIterator::nextCodePoint(UErrorCode &errorCode) {
+    UChar32 c;
+    for(;;) {
+        if(checkDir > 0) {
+            if(pos == limit) {
+                return U_SENTINEL;
+            }
+            c = *pos++;
+            if(CollationFCD::hasTccc(c)) {
+                if(CollationFCD::maybeTibetanCompositeVowel(c) ||
+                        (pos != limit && CollationFCD::hasLccc(*pos))) {
+                    --pos;
+                    if(!nextSegment(errorCode)) {
+                        return U_SENTINEL;
+                    }
+                    c = *pos++;
+                }
+            } else if(c == 0 && limit == NULL) {
+                limit = rawLimit = --pos;
+                return U_SENTINEL;
+            }
+            break;
+        } else if(checkDir == 0 && pos != limit) {
+            c = *pos++;
+            break;
+        } else {
+            switchToForward();
+        }
+    }
+    UChar trail;
+    if(U16_IS_LEAD(c) && pos != limit && U16_IS_TRAIL(trail = *pos)) {
+        ++pos;
+        return U16_GET_SUPPLEMENTARY(c, trail);
+    } else {
+        return c;
+    }
+}
+
+UChar32
+FCDUTF16CollationIterator::previousCodePoint(UErrorCode &errorCode) {
+    UChar32 c;
+    for(;;) {
+        if(checkDir < 0) {
+            if(pos == start) {
+                return U_SENTINEL;
+            }
+            c = *--pos;
+            if(CollationFCD::hasLccc(c)) {
+                if(CollationFCD::maybeTibetanCompositeVowel(c) ||
+                        (pos != start && CollationFCD::hasTccc(*(pos - 1)))) {
+                    ++pos;
+                    if(!previousSegment(errorCode)) {
+                        return U_SENTINEL;
+                    }
+                    c = *--pos;
+                }
+            }
+            break;
+        } else if(checkDir == 0 && pos != start) {
+            c = *--pos;
+            break;
+        } else {
+            switchToBackward();
+        }
+    }
+    UChar lead;
+    if(U16_IS_TRAIL(c) && pos != start && U16_IS_LEAD(lead = *(pos - 1))) {
+        --pos;
+        return U16_GET_SUPPLEMENTARY(lead, c);
+    } else {
+        return c;
+    }
+}
+
+void
+FCDUTF16CollationIterator::forwardNumCodePoints(int32_t num, UErrorCode &errorCode) {
+    // Specify the class to avoid a virtual-function indirection.
+    // In Java, we would declare this class final.
+    while(num > 0 && FCDUTF16CollationIterator::nextCodePoint(errorCode) >= 0) {
+        --num;
+    }
+}
+
+void
+FCDUTF16CollationIterator::backwardNumCodePoints(int32_t num, UErrorCode &errorCode) {
+    // Specify the class to avoid a virtual-function indirection.
+    // In Java, we would declare this class final.
+    while(num > 0 && FCDUTF16CollationIterator::previousCodePoint(errorCode) >= 0) {
+        --num;
+    }
+}
+
+void
+FCDUTF16CollationIterator::switchToForward() {
+    U_ASSERT(checkDir < 0 || (checkDir == 0 && pos == limit));
+    if(checkDir < 0) {
+        // Turn around from backward checking.
+        start = segmentStart = pos;
+        if(pos == segmentLimit) {
+            limit = rawLimit;
+            checkDir = 1;  // Check forward.
+        } else {  // pos < segmentLimit
+            checkDir = 0;  // Stay in FCD segment.
+        }
+    } else {
+        // Reached the end of the FCD segment.
+        if(start == segmentStart) {
+            // The input text segment is FCD, extend it forward.
+        } else {
+            // The input text segment needed to be normalized.
+            // Switch to checking forward from it.
+            pos = start = segmentStart = segmentLimit;
+            // Note: If this segment is at the end of the input text,
+            // then it might help to return FALSE to indicate that, so that
+            // we do not have to re-check and normalize when we turn around and go backwards.
+            // However, that would complicate the call sites for an optimization of an unusual case.
+        }
+        limit = rawLimit;
+        checkDir = 1;
+    }
+}
+
+UBool
+FCDUTF16CollationIterator::nextSegment(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    U_ASSERT(checkDir > 0 && pos != limit);
+    // The input text [segmentStart..pos[ passes the FCD check.
+    const UChar *p = pos;
+    uint8_t prevCC = 0;
+    for(;;) {
+        // Fetch the next character's fcd16 value.
+        const UChar *q = p;
+        uint16_t fcd16 = nfcImpl.nextFCD16(p, rawLimit);
+        uint8_t leadCC = (uint8_t)(fcd16 >> 8);
+        if(leadCC == 0 && q != pos) {
+            // FCD boundary before the [q, p[ character.
+            limit = segmentLimit = q;
+            break;
+        }
+        if(leadCC != 0 && (prevCC > leadCC || CollationFCD::isFCD16OfTibetanCompositeVowel(fcd16))) {
+            // Fails FCD check. Find the next FCD boundary and normalize.
+            do {
+                q = p;
+            } while(p != rawLimit && nfcImpl.nextFCD16(p, rawLimit) > 0xff);
+            if(!normalize(pos, q, errorCode)) { return FALSE; }
+            pos = start;
+            break;
+        }
+        prevCC = (uint8_t)fcd16;
+        if(p == rawLimit || prevCC == 0) {
+            // FCD boundary after the last character.
+            limit = segmentLimit = p;
+            break;
+        }
+    }
+    U_ASSERT(pos != limit);
+    checkDir = 0;
+    return TRUE;
+}
+
+void
+FCDUTF16CollationIterator::switchToBackward() {
+    U_ASSERT(checkDir > 0 || (checkDir == 0 && pos == start));
+    if(checkDir > 0) {
+        // Turn around from forward checking.
+        limit = segmentLimit = pos;
+        if(pos == segmentStart) {
+            start = rawStart;
+            checkDir = -1;  // Check backward.
+        } else {  // pos > segmentStart
+            checkDir = 0;  // Stay in FCD segment.
+        }
+    } else {
+        // Reached the start of the FCD segment.
+        if(start == segmentStart) {
+            // The input text segment is FCD, extend it backward.
+        } else {
+            // The input text segment needed to be normalized.
+            // Switch to checking backward from it.
+            pos = limit = segmentLimit = segmentStart;
+        }
+        start = rawStart;
+        checkDir = -1;
+    }
+}
+
+UBool
+FCDUTF16CollationIterator::previousSegment(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    U_ASSERT(checkDir < 0 && pos != start);
+    // The input text [pos..segmentLimit[ passes the FCD check.
+    const UChar *p = pos;
+    uint8_t nextCC = 0;
+    for(;;) {
+        // Fetch the previous character's fcd16 value.
+        const UChar *q = p;
+        uint16_t fcd16 = nfcImpl.previousFCD16(rawStart, p);
+        uint8_t trailCC = (uint8_t)fcd16;
+        if(trailCC == 0 && q != pos) {
+            // FCD boundary after the [p, q[ character.
+            start = segmentStart = q;
+            break;
+        }
+        if(trailCC != 0 && ((nextCC != 0 && trailCC > nextCC) ||
+                            CollationFCD::isFCD16OfTibetanCompositeVowel(fcd16))) {
+            // Fails FCD check. Find the previous FCD boundary and normalize.
+            do {
+                q = p;
+            } while(fcd16 > 0xff && p != rawStart &&
+                    (fcd16 = nfcImpl.previousFCD16(rawStart, p)) != 0);
+            if(!normalize(q, pos, errorCode)) { return FALSE; }
+            pos = limit;
+            break;
+        }
+        nextCC = (uint8_t)(fcd16 >> 8);
+        if(p == rawStart || nextCC == 0) {
+            // FCD boundary before the following character.
+            start = segmentStart = p;
+            break;
+        }
+    }
+    U_ASSERT(pos != start);
+    checkDir = 0;
+    return TRUE;
+}
+
+UBool
+FCDUTF16CollationIterator::normalize(const UChar *from, const UChar *to, UErrorCode &errorCode) {
+    // NFD without argument checking.
+    U_ASSERT(U_SUCCESS(errorCode));
+    nfcImpl.decompose(from, to, normalized, (int32_t)(to - from), errorCode);
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    // Switch collation processing into the FCD buffer
+    // with the result of normalizing [segmentStart, segmentLimit[.
+    segmentStart = from;
+    segmentLimit = to;
+    start = normalized.getBuffer();
+    limit = start + normalized.length();
+    return TRUE;
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/utf16collationiterator.h b/icu4c/source/i18n/utf16collationiterator.h
new file mode 100644 (file)
index 0000000..16de207
--- /dev/null
@@ -0,0 +1,184 @@
+/*
+*******************************************************************************
+* Copyright (C) 2010-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* utf16collationiterator.h
+*
+* created on: 2010oct27
+* created by: Markus W. Scherer
+*/
+
+#ifndef __UTF16COLLATIONITERATOR_H__
+#define __UTF16COLLATIONITERATOR_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationiterator.h"
+#include "normalizer2impl.h"
+
+U_NAMESPACE_BEGIN
+
+/**
+ * UTF-16 collation element and character iterator.
+ * Handles normalized UTF-16 text inline, with length or NUL-terminated.
+ * Unnormalized text is handled by a subclass.
+ */
+class U_I18N_API UTF16CollationIterator : public CollationIterator {
+public:
+    UTF16CollationIterator(const CollationData *d, UBool numeric,
+                           const UChar *s, const UChar *p, const UChar *lim)
+            : CollationIterator(d, numeric),
+              start(s), pos(p), limit(lim) {}
+
+    UTF16CollationIterator(const UTF16CollationIterator &other, const UChar *newText);
+
+    virtual ~UTF16CollationIterator();
+
+    virtual UBool operator==(const CollationIterator &other) const;
+
+    virtual void resetToOffset(int32_t newOffset);
+
+    virtual int32_t getOffset() const;
+
+    void setText(const UChar *s, const UChar *lim) {
+        reset();
+        start = pos = s;
+        limit = lim;
+    }
+
+    virtual UChar32 nextCodePoint(UErrorCode &errorCode);
+
+    virtual UChar32 previousCodePoint(UErrorCode &errorCode);
+
+protected:
+    // Copy constructor only for subclasses which set the pointers.
+    UTF16CollationIterator(const UTF16CollationIterator &other)
+            : CollationIterator(other),
+              start(NULL), pos(NULL), limit(NULL) {}
+
+    virtual uint32_t handleNextCE32(UChar32 &c, UErrorCode &errorCode);
+
+    virtual UChar handleGetTrailSurrogate();
+
+    virtual UBool foundNULTerminator();
+
+    virtual void forwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+
+    virtual void backwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+
+    // UTF-16 string pointers.
+    // limit can be NULL for NUL-terminated strings.
+    const UChar *start, *pos, *limit;
+};
+
+/**
+ * Incrementally checks the input text for FCD and normalizes where necessary.
+ */
+class U_I18N_API FCDUTF16CollationIterator : public UTF16CollationIterator {
+public:
+    FCDUTF16CollationIterator(const CollationData *data, UBool numeric,
+                              const UChar *s, const UChar *p, const UChar *lim)
+            : UTF16CollationIterator(data, numeric, s, p, lim),
+              rawStart(s), segmentStart(p), segmentLimit(NULL), rawLimit(lim),
+              nfcImpl(data->nfcImpl),
+              checkDir(1) {}
+
+    FCDUTF16CollationIterator(const FCDUTF16CollationIterator &other, const UChar *newText);
+
+    virtual ~FCDUTF16CollationIterator();
+
+    virtual UBool operator==(const CollationIterator &other) const;
+
+    virtual void resetToOffset(int32_t newOffset);
+
+    virtual int32_t getOffset() const;
+
+    virtual UChar32 nextCodePoint(UErrorCode &errorCode);
+
+    virtual UChar32 previousCodePoint(UErrorCode &errorCode);
+
+protected:
+    virtual uint32_t handleNextCE32(UChar32 &c, UErrorCode &errorCode);
+
+    virtual UBool foundNULTerminator();
+
+    virtual void forwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+
+    virtual void backwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+
+private:
+    /**
+     * Switches to forward checking if possible.
+     * To be called when checkDir < 0 || (checkDir == 0 && pos == limit).
+     * Returns with checkDir > 0 || (checkDir == 0 && pos != limit).
+     */
+    void switchToForward();
+
+    /**
+     * Extend the FCD text segment forward or normalize around pos.
+     * To be called when checkDir > 0 && pos != limit.
+     * @return TRUE if success, checkDir == 0 and pos != limit
+     */
+    UBool nextSegment(UErrorCode &errorCode);
+
+    /**
+     * Switches to backward checking.
+     * To be called when checkDir > 0 || (checkDir == 0 && pos == start).
+     * Returns with checkDir < 0 || (checkDir == 0 && pos != start).
+     */
+    void switchToBackward();
+
+    /**
+     * Extend the FCD text segment backward or normalize around pos.
+     * To be called when checkDir < 0 && pos != start.
+     * @return TRUE if success, checkDir == 0 and pos != start
+     */
+    UBool previousSegment(UErrorCode &errorCode);
+
+    UBool normalize(const UChar *from, const UChar *to, UErrorCode &errorCode);
+
+    // Text pointers: The input text is [rawStart, rawLimit[
+    // where rawLimit can be NULL for NUL-terminated text.
+    //
+    // checkDir > 0:
+    //
+    // The input text [segmentStart..pos[ passes the FCD check.
+    // Moving forward checks incrementally.
+    // segmentLimit is undefined. limit == rawLimit.
+    //
+    // checkDir < 0:
+    // The input text [pos..segmentLimit[ passes the FCD check.
+    // Moving backward checks incrementally.
+    // segmentStart is undefined, start == rawStart.
+    //
+    // checkDir == 0:
+    //
+    // The input text [segmentStart..segmentLimit[ is being processed.
+    // These pointers are at FCD boundaries.
+    // Either this text segment already passes the FCD check
+    // and segmentStart==start<=pos<=limit==segmentLimit,
+    // or the current segment had to be normalized so that
+    // [segmentStart..segmentLimit[ turned into the normalized string,
+    // corresponding to normalized.getBuffer()==start<=pos<=limit==start+normalized.length().
+    const UChar *rawStart;
+    const UChar *segmentStart;
+    const UChar *segmentLimit;
+    // rawLimit==NULL for a NUL-terminated string.
+    const UChar *rawLimit;
+
+    const Normalizer2Impl &nfcImpl;
+    UnicodeString normalized;
+    // Direction of incremental FCD check. See comments before rawStart.
+    int8_t checkDir;
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __UTF16COLLATIONITERATOR_H__
diff --git a/icu4c/source/i18n/utf8collationiterator.cpp b/icu4c/source/i18n/utf8collationiterator.cpp
new file mode 100644 (file)
index 0000000..ddb753f
--- /dev/null
@@ -0,0 +1,529 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* utf8collationiterator.cpp
+*
+* created on: 2012nov12 (from utf16collationiterator.cpp & uitercollationiterator.cpp)
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/utf8.h"
+#include "charstr.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationfcd.h"
+#include "collationiterator.h"
+#include "normalizer2impl.h"
+#include "uassert.h"
+#include "utf8collationiterator.h"
+
+U_NAMESPACE_BEGIN
+
+UTF8CollationIterator::~UTF8CollationIterator() {}
+
+void
+UTF8CollationIterator::resetToOffset(int32_t newOffset) {
+    reset();
+    pos = newOffset;
+}
+
+int32_t
+UTF8CollationIterator::getOffset() const {
+    return pos;
+}
+
+uint32_t
+UTF8CollationIterator::handleNextCE32(UChar32 &c, UErrorCode & /*errorCode*/) {
+    if(pos == length) {
+        c = U_SENTINEL;
+        return Collation::FALLBACK_CE32;
+    }
+    // Optimized combination of U8_NEXT_OR_FFFD() and UTRIE2_U8_NEXT32().
+    c = u8[pos++];
+    if(c < 0xc0) {
+        // ASCII 00..7F; trail bytes 80..BF map to error values.
+        return trie->data32[c];
+    }
+    uint8_t t1, t2;
+    if(c < 0xe0 && pos != length && (t1 = (u8[pos] - 0x80)) <= 0x3f) {
+        // U+0080..U+07FF; 00..7F map to error values.
+        uint32_t ce32 = trie->data32[trie->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET - 0xc0) + c] + t1];
+        c = ((c & 0x1f) << 6) | t1;
+        ++pos;
+        return ce32;
+    } else if(c <= 0xef &&
+              ((pos + 1) < length || length < 0) &&
+              (t1 = (u8[pos] - 0x80)) <= 0x3f && (c != 0xe0 || t1 >= 0x20) &&
+              (t2 = (u8[pos + 1] - 0x80)) <= 0x3f
+    ) {
+        // U+0800..U+FFFF; caller maps surrogates to error values.
+        c = (UChar)((c << 12) | (t1 << 6) | t2);
+        pos += 2;
+        return UTRIE2_GET32_FROM_U16_SINGLE_LEAD(trie, c);
+    } else {
+        // Function call for supplementary code points and error cases.
+        // Illegal byte sequences yield U+FFFD.
+        c = utf8_nextCharSafeBody(u8, &pos, length, c, -3);
+        return data->getCE32(c);
+    }
+}
+
+UBool
+UTF8CollationIterator::foundNULTerminator() {
+    if(length < 0) {
+        length = --pos;
+        return TRUE;
+    } else {
+        return FALSE;
+    }
+}
+
+UBool
+UTF8CollationIterator::forbidSurrogateCodePoints() const {
+    return TRUE;
+}
+
+UChar32
+UTF8CollationIterator::nextCodePoint(UErrorCode & /*errorCode*/) {
+    if(pos == length) {
+        return U_SENTINEL;
+    }
+    if(u8[pos] == 0 && length < 0) {
+        length = pos;
+        return U_SENTINEL;
+    }
+    UChar32 c;
+    U8_NEXT_OR_FFFD(u8, pos, length, c);
+    return c;
+}
+
+UChar32
+UTF8CollationIterator::previousCodePoint(UErrorCode & /*errorCode*/) {
+    if(pos == 0) {
+        return U_SENTINEL;
+    }
+    UChar32 c;
+    U8_PREV_OR_FFFD(u8, 0, pos, c);
+    return c;
+}
+
+void
+UTF8CollationIterator::forwardNumCodePoints(int32_t num, UErrorCode & /*errorCode*/) {
+    U8_FWD_N(u8, pos, length, num);
+}
+
+void
+UTF8CollationIterator::backwardNumCodePoints(int32_t num, UErrorCode & /*errorCode*/) {
+    U8_BACK_N(u8, 0, pos, num);
+}
+
+// FCDUTF8CollationIterator ------------------------------------------------ ***
+
+FCDUTF8CollationIterator::~FCDUTF8CollationIterator() {}
+
+void
+FCDUTF8CollationIterator::resetToOffset(int32_t newOffset) {
+    reset();
+    start = pos = newOffset;
+    state = CHECK_FWD;
+}
+
+int32_t
+FCDUTF8CollationIterator::getOffset() const {
+    if(state != IN_NORMALIZED) {
+        return pos;
+    } else if(pos == 0) {
+        return start;
+    } else {
+        return limit;
+    }
+}
+
+uint32_t
+FCDUTF8CollationIterator::handleNextCE32(UChar32 &c, UErrorCode &errorCode) {
+    for(;;) {
+        if(state == CHECK_FWD) {
+            // Combination of UTF8CollationIterator::handleNextCE32() with FCD check fastpath.
+            if(pos == length) {
+                c = U_SENTINEL;
+                return Collation::FALLBACK_CE32;
+            }
+            c = u8[pos++];
+            if(c < 0xc0) {
+                // ASCII 00..7F; trail bytes 80..BF map to error values.
+                return trie->data32[c];
+            }
+            uint8_t t1, t2;
+            if(c < 0xe0 && pos != length && (t1 = (u8[pos] - 0x80)) <= 0x3f) {
+                // U+0080..U+07FF; 00..7F map to error values.
+                uint32_t ce32 = trie->data32[trie->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET - 0xc0) + c] + t1];
+                c = ((c & 0x1f) << 6) | t1;
+                ++pos;
+                if(CollationFCD::hasTccc(c) && pos != length && nextHasLccc()) {
+                    pos -= 2;
+                } else {
+                    return ce32;
+                }
+            } else if(c <= 0xef &&
+                      ((pos + 1) < length || length < 0) &&
+                      (t1 = (u8[pos] - 0x80)) <= 0x3f && (c != 0xe0 || t1 >= 0x20) &&
+                      (t2 = (u8[pos + 1] - 0x80)) <= 0x3f
+            ) {
+                // U+0800..U+FFFF; caller maps surrogates to error values.
+                c = (UChar)((c << 12) | (t1 << 6) | t2);
+                pos += 2;
+                if(CollationFCD::hasTccc(c) &&
+                        (CollationFCD::maybeTibetanCompositeVowel(c) ||
+                            (pos != length && nextHasLccc()))) {
+                    pos -= 3;
+                } else {
+                    break;  // return CE32(BMP)
+                }
+            } else {
+                // Function call for supplementary code points and error cases.
+                // Illegal byte sequences yield U+FFFD.
+                c = utf8_nextCharSafeBody(u8, &pos, length, c, -3);
+                if(c == 0xfffd) {
+                    return Collation::FFFD_CE32;
+                } else {
+                    U_ASSERT(c > 0xffff);
+                    if(CollationFCD::hasTccc(U16_LEAD(c)) && pos != length && nextHasLccc()) {
+                        pos -= 4;
+                    } else {
+                        return data->getCE32FromSupplementary(c);
+                    }
+                }
+            }
+            if(!nextSegment(errorCode)) {
+                c = U_SENTINEL;
+                return Collation::FALLBACK_CE32;
+            }
+            continue;
+        } else if(state == IN_FCD_SEGMENT && pos != limit) {
+            return UTF8CollationIterator::handleNextCE32(c, errorCode);
+        } else if(state == IN_NORMALIZED && pos != normalized.length()) {
+            c = normalized[pos++];
+            break;
+        } else {
+            switchToForward();
+        }
+    }
+    return UTRIE2_GET32_FROM_U16_SINGLE_LEAD(trie, c);
+}
+
+UBool
+FCDUTF8CollationIterator::nextHasLccc() const {
+    U_ASSERT(state == CHECK_FWD && pos != length);
+    // The lowest code point with ccc!=0 is U+0300 which is CC 80 in UTF-8.
+    // CJK U+4000..U+DFFF except U+Axxx are also FCD-inert. (Lead bytes E4..ED except EA.)
+    UChar32 c = u8[pos];
+    if(c < 0xcc || (0xe4 <= c && c <= 0xed && c != 0xea)) { return FALSE; }
+    int32_t i = pos;
+    U8_NEXT_OR_FFFD(u8, i, length, c);
+    if(c > 0xffff) { c = U16_LEAD(c); }
+    return CollationFCD::hasLccc(c);
+}
+
+UBool
+FCDUTF8CollationIterator::previousHasTccc() const {
+    U_ASSERT(state == CHECK_BWD && pos != 0);
+    UChar32 c = u8[pos - 1];
+    if(c < 0x80) { return FALSE; }
+    int32_t i = pos;
+    U8_PREV_OR_FFFD(u8, 0, i, c);
+    if(c > 0xffff) { c = U16_LEAD(c); }
+    return CollationFCD::hasTccc(c);
+}
+
+UChar
+FCDUTF8CollationIterator::handleGetTrailSurrogate() {
+    if(state != IN_NORMALIZED) { return 0; }
+    U_ASSERT(pos < normalized.length());
+    UChar trail;
+    if(U16_IS_TRAIL(trail = normalized[pos])) { ++pos; }
+    return trail;
+}
+
+UBool
+FCDUTF8CollationIterator::foundNULTerminator() {
+    if(state == CHECK_FWD && length < 0) {
+        length = --pos;
+        return TRUE;
+    } else {
+        return FALSE;
+    }
+}
+
+UChar32
+FCDUTF8CollationIterator::nextCodePoint(UErrorCode &errorCode) {
+    UChar32 c;
+    for(;;) {
+        if(state == CHECK_FWD) {
+            if(pos == length || ((c = u8[pos]) == 0 && length < 0)) {
+                return U_SENTINEL;
+            }
+            if(c < 0x80) {
+                ++pos;
+                return c;
+            }
+            U8_NEXT_OR_FFFD(u8, pos, length, c);
+            if(CollationFCD::hasTccc(c <= 0xffff ? c : U16_LEAD(c)) &&
+                    (CollationFCD::maybeTibetanCompositeVowel(c) ||
+                        (pos != length && nextHasLccc()))) {
+                // c is not FCD-inert, therefore it is not U+FFFD and it has a valid byte sequence
+                // and we can use U8_LENGTH() rather than a previous-position variable.
+                pos -= U8_LENGTH(c);
+                if(!nextSegment(errorCode)) {
+                    return U_SENTINEL;
+                }
+                continue;
+            }
+            return c;
+        } else if(state == IN_FCD_SEGMENT && pos != limit) {
+            U8_NEXT_OR_FFFD(u8, pos, length, c);
+            return c;
+        } else if(state == IN_NORMALIZED && pos != normalized.length()) {
+            c = normalized.char32At(pos);
+            pos += U16_LENGTH(c);
+            return c;
+        } else {
+            switchToForward();
+        }
+    }
+}
+
+UChar32
+FCDUTF8CollationIterator::previousCodePoint(UErrorCode &errorCode) {
+    UChar32 c;
+    for(;;) {
+        if(state == CHECK_BWD) {
+            if(pos == 0) {
+                return U_SENTINEL;
+            }
+            if((c = u8[pos - 1]) < 0x80) {
+                --pos;
+                return c;
+            }
+            U8_PREV_OR_FFFD(u8, 0, pos, c);
+            if(CollationFCD::hasLccc(c <= 0xffff ? c : U16_LEAD(c)) &&
+                    (CollationFCD::maybeTibetanCompositeVowel(c) ||
+                        (pos != 0 && previousHasTccc()))) {
+                // c is not FCD-inert, therefore it is not U+FFFD and it has a valid byte sequence
+                // and we can use U8_LENGTH() rather than a previous-position variable.
+                pos += U8_LENGTH(c);
+                if(!previousSegment(errorCode)) {
+                    return U_SENTINEL;
+                }
+                continue;
+            }
+            return c;
+        } else if(state == IN_FCD_SEGMENT && pos != start) {
+            U8_PREV_OR_FFFD(u8, 0, pos, c);
+            return c;
+        } else if(state >= IN_NORMALIZED && pos != 0) {
+            c = normalized.char32At(pos - 1);
+            pos -= U16_LENGTH(c);
+            return c;
+        } else {
+            switchToBackward();
+        }
+    }
+}
+
+void
+FCDUTF8CollationIterator::forwardNumCodePoints(int32_t num, UErrorCode &errorCode) {
+    // Specify the class to avoid a virtual-function indirection.
+    // In Java, we would declare this class final.
+    while(num > 0 && FCDUTF8CollationIterator::nextCodePoint(errorCode) >= 0) {
+        --num;
+    }
+}
+
+void
+FCDUTF8CollationIterator::backwardNumCodePoints(int32_t num, UErrorCode &errorCode) {
+    // Specify the class to avoid a virtual-function indirection.
+    // In Java, we would declare this class final.
+    while(num > 0 && FCDUTF8CollationIterator::previousCodePoint(errorCode) >= 0) {
+        --num;
+    }
+}
+
+void
+FCDUTF8CollationIterator::switchToForward() {
+    U_ASSERT(state == CHECK_BWD ||
+             (state == IN_FCD_SEGMENT && pos == limit) ||
+             (state == IN_NORMALIZED && pos == normalized.length()));
+    if(state == CHECK_BWD) {
+        // Turn around from backward checking.
+        start = pos;
+        if(pos == limit) {
+            state = CHECK_FWD;  // Check forward.
+        } else {  // pos < limit
+            state = IN_FCD_SEGMENT;  // Stay in FCD segment.
+        }
+    } else {
+        // Reached the end of the FCD segment.
+        if(state == IN_FCD_SEGMENT) {
+            // The input text segment is FCD, extend it forward.
+        } else {
+            // The input text segment needed to be normalized.
+            // Switch to checking forward from it.
+            start = pos = limit;
+        }
+        state = CHECK_FWD;
+    }
+}
+
+UBool
+FCDUTF8CollationIterator::nextSegment(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    U_ASSERT(state == CHECK_FWD && pos != length);
+    // The input text [start..pos[ passes the FCD check.
+    int32_t segmentStart = pos;
+    // Collect the characters being checked, in case they need to be normalized.
+    UnicodeString s;
+    uint8_t prevCC = 0;
+    for(;;) {
+        // Fetch the next character and its fcd16 value.
+        int32_t cpStart = pos;
+        UChar32 c;
+        U8_NEXT_OR_FFFD(u8, pos, length, c);
+        uint16_t fcd16 = nfcImpl.getFCD16(c);
+        uint8_t leadCC = (uint8_t)(fcd16 >> 8);
+        if(leadCC == 0 && cpStart != segmentStart) {
+            // FCD boundary before this character.
+            pos = cpStart;
+            break;
+        }
+        s.append(c);
+        if(leadCC != 0 && (prevCC > leadCC || CollationFCD::isFCD16OfTibetanCompositeVowel(fcd16))) {
+            // Fails FCD check. Find the next FCD boundary and normalize.
+            while(pos != length) {
+                cpStart = pos;
+                U8_NEXT_OR_FFFD(u8, pos, length, c);
+                if(nfcImpl.getFCD16(c) <= 0xff) {
+                    pos = cpStart;
+                    break;
+                }
+                s.append(c);
+            }
+            if(!normalize(s, errorCode)) { return FALSE; }
+            start = segmentStart;
+            limit = pos;
+            state = IN_NORMALIZED;
+            pos = 0;
+            return TRUE;
+        }
+        prevCC = (uint8_t)fcd16;
+        if(pos == length || prevCC == 0) {
+            // FCD boundary after the last character.
+            break;
+        }
+    }
+    limit = pos;
+    pos = segmentStart;
+    U_ASSERT(pos != limit);
+    state = IN_FCD_SEGMENT;
+    return TRUE;
+}
+
+void
+FCDUTF8CollationIterator::switchToBackward() {
+    U_ASSERT(state == CHECK_FWD ||
+             (state == IN_FCD_SEGMENT && pos == start) ||
+             (state >= IN_NORMALIZED && pos == 0));
+    if(state == CHECK_FWD) {
+        // Turn around from forward checking.
+        limit = pos;
+        if(pos == start) {
+            state = CHECK_BWD;  // Check backward.
+        } else {  // pos > start
+            state = IN_FCD_SEGMENT;  // Stay in FCD segment.
+        }
+    } else {
+        // Reached the start of the FCD segment.
+        if(state == IN_FCD_SEGMENT) {
+            // The input text segment is FCD, extend it backward.
+        } else {
+            // The input text segment needed to be normalized.
+            // Switch to checking backward from it.
+            limit = pos = start;
+        }
+        state = CHECK_BWD;
+    }
+}
+
+UBool
+FCDUTF8CollationIterator::previousSegment(UErrorCode &errorCode) {
+    if(U_FAILURE(errorCode)) { return FALSE; }
+    U_ASSERT(state == CHECK_BWD && pos != 0);
+    // The input text [pos..limit[ passes the FCD check.
+    int32_t segmentLimit = pos;
+    // Collect the characters being checked, in case they need to be normalized.
+    UnicodeString s;
+    uint8_t nextCC = 0;
+    for(;;) {
+        // Fetch the previous character and its fcd16 value.
+        int32_t cpLimit = pos;
+        UChar32 c;
+        U8_PREV_OR_FFFD(u8, 0, pos, c);
+        uint16_t fcd16 = nfcImpl.getFCD16(c);
+        uint8_t trailCC = (uint8_t)fcd16;
+        if(trailCC == 0 && cpLimit != segmentLimit) {
+            // FCD boundary after this character.
+            pos = cpLimit;
+            break;
+        }
+        s.append(c);
+        if(trailCC != 0 && ((nextCC != 0 && trailCC > nextCC) ||
+                            CollationFCD::isFCD16OfTibetanCompositeVowel(fcd16))) {
+            // Fails FCD check. Find the previous FCD boundary and normalize.
+            while(fcd16 > 0xff && pos != 0) {
+                cpLimit = pos;
+                U8_PREV_OR_FFFD(u8, 0, pos, c);
+                fcd16 = nfcImpl.getFCD16(c);
+                if(fcd16 == 0) {
+                    pos = cpLimit;
+                    break;
+                }
+                s.append(c);
+            }
+            s.reverse();
+            if(!normalize(s, errorCode)) { return FALSE; }
+            limit = segmentLimit;
+            start = pos;
+            state = IN_NORMALIZED;
+            pos = normalized.length();
+            return TRUE;
+        }
+        nextCC = (uint8_t)(fcd16 >> 8);
+        if(pos == 0 || nextCC == 0) {
+            // FCD boundary before the following character.
+            break;
+        }
+    }
+    start = pos;
+    pos = segmentLimit;
+    U_ASSERT(pos != start);
+    state = IN_FCD_SEGMENT;
+    return TRUE;
+}
+
+UBool
+FCDUTF8CollationIterator::normalize(const UnicodeString &s, UErrorCode &errorCode) {
+    // NFD without argument checking.
+    U_ASSERT(U_SUCCESS(errorCode));
+    nfcImpl.decompose(s, normalized, errorCode);
+    return U_SUCCESS(errorCode);
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/i18n/utf8collationiterator.h b/icu4c/source/i18n/utf8collationiterator.h
new file mode 100644 (file)
index 0000000..3ec348d
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* utf8collationiterator.h
+*
+* created on: 2012nov12 (from utf16collationiterator.h & uitercollationiterator.h)
+* created by: Markus W. Scherer
+*/
+
+#ifndef __UTF8COLLATIONITERATOR_H__
+#define __UTF8COLLATIONITERATOR_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "normalizer2impl.h"
+
+U_NAMESPACE_BEGIN
+
+/**
+ * UTF-8 collation element and character iterator.
+ * Handles normalized UTF-8 text inline, with length or NUL-terminated.
+ * Unnormalized text is handled by a subclass.
+ */
+class U_I18N_API UTF8CollationIterator : public CollationIterator {
+public:
+    UTF8CollationIterator(const CollationData *d, UBool numeric,
+                          const uint8_t *s, int32_t p, int32_t len)
+            : CollationIterator(d, numeric),
+              u8(s), pos(p), length(len) {}
+
+    virtual ~UTF8CollationIterator();
+
+    virtual void resetToOffset(int32_t newOffset);
+
+    virtual int32_t getOffset() const;
+
+    virtual UChar32 nextCodePoint(UErrorCode &errorCode);
+
+    virtual UChar32 previousCodePoint(UErrorCode &errorCode);
+
+protected:
+    /**
+     * For byte sequences that are illegal in UTF-8, an error value may be returned
+     * together with a bogus code point. The caller will ignore that code point.
+     *
+     * Special values may be returned for surrogate code points, which are also illegal in UTF-8,
+     * but the caller will treat them like U+FFFD because forbidSurrogateCodePoints() returns TRUE.
+     *
+     * Valid lead surrogates are returned from inside a normalized text segment,
+     * where handleGetTrailSurrogate() will return the matching trail surrogate.
+     */
+    virtual uint32_t handleNextCE32(UChar32 &c, UErrorCode &errorCode);
+
+    virtual UBool foundNULTerminator();
+
+    virtual UBool forbidSurrogateCodePoints() const;
+
+    virtual void forwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+
+    virtual void backwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+
+    const uint8_t *u8;
+    int32_t pos;
+    int32_t length;  // <0 for NUL-terminated strings
+};
+
+/**
+ * Incrementally checks the input text for FCD and normalizes where necessary.
+ */
+class U_I18N_API FCDUTF8CollationIterator : public UTF8CollationIterator {
+public:
+    FCDUTF8CollationIterator(const CollationData *data, UBool numeric,
+                             const uint8_t *s, int32_t p, int32_t len)
+            : UTF8CollationIterator(data, numeric, s, p, len),
+              state(CHECK_FWD), start(p),
+              nfcImpl(data->nfcImpl) {}
+
+    virtual ~FCDUTF8CollationIterator();
+
+    virtual void resetToOffset(int32_t newOffset);
+
+    virtual int32_t getOffset() const;
+
+    virtual UChar32 nextCodePoint(UErrorCode &errorCode);
+
+    virtual UChar32 previousCodePoint(UErrorCode &errorCode);
+
+protected:
+    virtual uint32_t handleNextCE32(UChar32 &c, UErrorCode &errorCode);
+
+    virtual UChar handleGetTrailSurrogate();
+
+    virtual UBool foundNULTerminator();
+
+    virtual void forwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+
+    virtual void backwardNumCodePoints(int32_t num, UErrorCode &errorCode);
+
+private:
+    UBool nextHasLccc() const;
+    UBool previousHasTccc() const;
+
+    /**
+     * Switches to forward checking if possible.
+     */
+    void switchToForward();
+
+    /**
+     * Extends the FCD text segment forward or normalizes around pos.
+     * @return TRUE if success
+     */
+    UBool nextSegment(UErrorCode &errorCode);
+
+    /**
+     * Switches to backward checking.
+     */
+    void switchToBackward();
+
+    /**
+     * Extends the FCD text segment backward or normalizes around pos.
+     * @return TRUE if success
+     */
+    UBool previousSegment(UErrorCode &errorCode);
+
+    UBool normalize(const UnicodeString &s, UErrorCode &errorCode);
+
+    enum State {
+        /**
+         * The input text [start..pos[ passes the FCD check.
+         * Moving forward checks incrementally.
+         * limit is undefined.
+         */
+        CHECK_FWD,
+        /**
+         * The input text [pos..limit[ passes the FCD check.
+         * Moving backward checks incrementally.
+         * start is undefined.
+         */
+        CHECK_BWD,
+        /**
+         * The input text [start..limit[ passes the FCD check.
+         * pos tracks the current text index.
+         */
+        IN_FCD_SEGMENT,
+        /**
+         * The input text [start..limit[ failed the FCD check and was normalized.
+         * pos tracks the current index in the normalized string.
+         */
+        IN_NORMALIZED
+    };
+
+    State state;
+
+    int32_t start;
+    int32_t limit;
+
+    const Normalizer2Impl &nfcImpl;
+    UnicodeString normalized;
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __UTF8COLLATIONITERATOR_H__
index 54ac8858ecba6d7313491e38d82bdf3b35777dcb..6f0065edf1aa49d4220a111dc0d3302716066ce7 100644 (file)
@@ -1012,6 +1012,13 @@ static void TestJB1401(void)
 */
 static void TestVariableTop(void)
 {
+#if 0
+    /*
+     * Starting with ICU 53, setting the variable top via a pseudo relation string
+     * is not supported any more.
+     * It was replaced by the [maxVariable symbol] setting.
+     * See ICU tickets #9958 and #8032.
+     */
     static const char       str[]          = "&z = [variable top]";
           int         len          = strlen(str);
           UChar      rules[sizeof(str)];
@@ -1078,6 +1085,7 @@ static void TestVariableTop(void)
     ucol_close(myCollation);
     enCollation = NULL;
     myCollation = NULL;
+#endif
 }
 
 /**
@@ -1167,13 +1175,13 @@ TestInvalidRules(){
         "& C < ch, cH, & Ch[variable top]"
     };
     static const char* preContextArr[MAX_ERROR_STATES] = {
-        "his should fail",
-        "& C < ch, cH",
+        " C < ch, cH, Ch",
+        "& C < ch, cH",
 
     };
     static const char* postContextArr[MAX_ERROR_STATES] = {
-        "<d",
-        " Ch[variable t"
+        "[this should fa",
+        ", & Ch[variable"
     };
     int i;
 
@@ -1194,10 +1202,12 @@ TestInvalidRules(){
         coll = ucol_openRules(rules,u_strlen(rules),UCOL_OFF,UCOL_DEFAULT_STRENGTH,&parseError,&status);
         (void)coll;   /* Suppress set but not used warning. */
         if(u_strcmp(parseError.preContext,preContextExp)!=0){
-            log_err_status(status, "preContext in UParseError for ucol_openRules does not match\n");
+            log_err_status(status, "preContext in UParseError for ucol_openRules does not match: \"%s\"\n",
+                           aescstrdup(parseError.preContext, -1));
         }
         if(u_strcmp(parseError.postContext,postContextExp)!=0){
-            log_err_status(status, "postContext in UParseError for ucol_openRules does not match\n");
+            log_err_status(status, "postContext in UParseError for ucol_openRules does not match: \"%s\"\n",
+                           aescstrdup(parseError.postContext, -1));
         }
     }  
 }
index d4ca6d8d36945febb488569c51c2d6ae3e3af44a..d9c004f8d2691472971f46ed1e88ad56d3a8b501 100644 (file)
@@ -31,6 +31,9 @@
 #include "putilimp.h"
 #include "cmemory.h"
 #include "cstring.h"
+#include "ucol_imp.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
 
 static void TestAttribute(void);
 static void TestDefault(void);
@@ -310,7 +313,7 @@ void TestProperty()
      * rather than hardcoding (and updating each time) a particular UCA version. */
     u_getUnicodeVersion(versionUCDArray);
     ucol_getUCAVersion(col, versionUCAArray);
-    if (0!=uprv_memcmp(versionUCAArray, versionUCDArray, 4) /*TODO: remove the following once UCA is up to date, ticket:9101*/ && !(versionUCDArray[0]==6 && versionUCDArray[1]==3)) {
+    if (0!=uprv_memcmp(versionUCAArray, versionUCDArray, 4)) {
       log_err("Testing ucol_getUCAVersion() - unexpected result: %hu.%hu.%hu.%hu\n",
               versionUCAArray[0], versionUCAArray[1], versionUCAArray[2], versionUCAArray[3]);
     }
@@ -435,7 +438,6 @@ void TestRuleBasedColl()
     UChar ruleset1[60];
     UChar ruleset2[50];
     UChar teststr[10];
-    UChar teststr2[10];
     const UChar *rule1, *rule2, *rule3, *rule4;
     int32_t tempLength;
     UErrorCode status = U_ZERO_ERROR;
@@ -531,17 +533,13 @@ void TestRuleBasedColl()
     ucol_closeElements(iter2);
     ucol_close(col1);
     ucol_close(col2);
-    /* test that we can start a rule without a & or < */
+    /* CLDR 24+ requires a reset before the first relation */
     u_uastrcpy(ruleset1, "< z < a");
     col1 = ucol_openRules(ruleset1, u_strlen(ruleset1), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &status);
-    if (U_FAILURE(status)) {
-        log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status));
-        return;
-    }
-    u_uastrcpy(teststr, "z");
-    u_uastrcpy(teststr2, "a");
-    if (ucol_greaterOrEqual(col1, teststr, 1, teststr2, 1)) {
-        log_err("Rule \"z < a\" fails");
+    if (status != U_PARSE_ERROR && status != U_INVALID_FORMAT_ERROR) {
+        log_err("ucol_openRules(without initial reset: '< z < a') "
+                "should fail with U_PARSE_ERROR or U_INVALID_FORMAT_ERROR but yielded %s\n",
+                myErrorName(status));
     }
     ucol_close(col1);
 }
@@ -1179,7 +1177,7 @@ void TestSortKey()
     free(sortkEmpty);
 
     log_verbose("testing passing invalid string\n");
-    sortklen = ucol_getSortKey(col, NULL, 0, NULL, 0);
+    sortklen = ucol_getSortKey(col, NULL, 10, NULL, 0);
     if(sortklen != 0) {
       log_err("Invalid string didn't return sortkey size of 0\n");
     }
@@ -1389,7 +1387,6 @@ void TestGetLocale() {
 
   int32_t i = 0;
 
-  /* Now that the collation tree is separate, actual==valid at all times. [alan] */
   static const struct {
     const char* requestedLocale;
     const char* validLocale;
@@ -1410,8 +1407,12 @@ void TestGetLocale() {
       ucol_close(coll);
       continue;
     }
-   locale = ucol_getLocaleByType(coll, ULOC_REQUESTED_LOCALE, &status);
-    if(strcmp(locale, testStruct[i].requestedLocale) != 0) {
+    /*
+     * The requested locale may be the same as the valid locale,
+     * or may not be supported at all. See ticket #10477.
+     */
+    locale = ucol_getLocaleByType(coll, ULOC_REQUESTED_LOCALE, &status);
+    if(strcmp(locale, testStruct[i].requestedLocale) != 0 && strcmp(locale, testStruct[i].validLocale) != 0) {
       log_err("[Coll %s]: Error in requested locale, expected %s, got %s\n", testStruct[i].requestedLocale, testStruct[i].requestedLocale, locale);
     }
     locale = ucol_getLocaleByType(coll, ULOC_VALID_LOCALE, &status);
@@ -1430,9 +1431,10 @@ void TestGetLocale() {
     UCollator *defaultColl = ucol_open(NULL, &status);
     coll = ucol_open("blahaha", &status);
     if(U_SUCCESS(status)) {
+      /* See comment above about ticket #10477.
       if(strcmp(ucol_getLocaleByType(coll, ULOC_REQUESTED_LOCALE, &status), "blahaha")) {
         log_err("Nonexisting locale didn't preserve the requested locale\n");
-      }
+      } */
       if(strcmp(ucol_getLocaleByType(coll, ULOC_VALID_LOCALE, &status),
         ucol_getLocaleByType(defaultColl, ULOC_VALID_LOCALE, &status))) {
         log_err("Valid locale for nonexisting locale locale collator differs "
@@ -1835,13 +1837,13 @@ void TestGetTailoredSet() {
   int32_t buffLen = 0;
   USet *set = NULL;
 
-  for(i = 0; i < sizeof(setTest)/sizeof(setTest[0]); i++) {
+  for(i = 0; i < LENGTHOF(setTest); i++) {
     buffLen = u_unescape(setTest[i].rules, buff, 1024);
     coll = ucol_openRules(buff, buffLen, UCOL_DEFAULT, UCOL_DEFAULT, &pError, &status);
     if(U_SUCCESS(status)) {
       set = ucol_getTailoredSet(coll, &status);
-      if(uset_size(set) != setTest[i].testsize) {
-        log_err("Tailored set size different (%d) than expected (%d)\n", uset_size(set), setTest[i].testsize);
+      if(uset_size(set) < setTest[i].testsize) {
+        log_err("Tailored set size smaller (%d) than expected (%d)\n", uset_size(set), setTest[i].testsize);
       }
       for(j = 0; j < setTest[i].testsize; j++) {
         buffLen = u_unescape(setTest[i].tests[j], buff, 1024);
@@ -2004,15 +2006,21 @@ static void TestShortString(void)
         uint32_t   expectedIdentifier;
     } testCases[] = {
         /*
-         * The following expectedOutput contains a collation weight (2700 from UCA 6.0)
-         * which is the primary weight for the T character (U+0041) in the input.
-         * When that character gets a different weight in FractionalUCA.txt,
-         * the expectedOutput needs to be adjusted.
-         * That is, when we upgrade to a new UCA version or change collation
-         * in such a way that the absolute weight for 'A' changes,
-         * we will get a test failure here and need to adjust the test case.
+         * Note: The first test case sets variableTop to the dollar sign '$'.
+         * We have agreed to drop support for variableTop in ucol_getShortDefinitionString(),
+         * related to ticket #10372 "deprecate collation APIs for short definition strings",
+         * and because it did not work for most spaces/punctuation/symbols,
+         * as documented in ticket #10386 "collation short definition strings issues":
+         * The old code wrote only 3 hex digits for primary weights below 0x0FFF,
+         * which is a syntax error, and then failed to normalize the result.
+         *
+         * The "B2700" was removed from the expected result ("B2700_KPHONEBOOK_LDE").
+         *
+         * Previously, this test had to be adjusted for root collator changes because the
+         * primary weight of the variable top character naturally changed
+         * but was baked into the expected result.
          */
-        {"LDE_RDE_KPHONEBOOK_T0041_ZLATN","B2700_KPHONEBOOK_LDE", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 },
+        {"LDE_RDE_KPHONEBOOK_T0024_ZLATN","KPHONEBOOK_LDE", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 },
 
         {"LEN_RUS_NO_AS_S4","AS_LROOT_NO_S4", NULL, U_USING_DEFAULT_WARNING, 0, 0 },
         {"LDE_VPHONEBOOK_EO_SI","EO_KPHONEBOOK_LDE_SI", "de@collation=phonebook", U_ZERO_ERROR, 0, 0 },
@@ -2084,7 +2092,7 @@ static void TestShortString(void)
 
 static void
 doSetsTest(const char *locale, const USet *ref, USet *set, const char* inSet, const char* outSet, UErrorCode *status) {
-    UChar buffer[512];
+    UChar buffer[65536];
     int32_t bufLen;
 
     uset_clear(set);
@@ -2096,6 +2104,11 @@ doSetsTest(const char *locale, const USet *ref, USet *set, const char* inSet, co
 
     if(!uset_containsAll(ref, set)) {
         log_err("%s: Some stuff from %s is not present in the set\n", locale, inSet);
+        uset_removeAll(set, ref);
+        bufLen = uset_toPattern(set, buffer, LENGTHOF(buffer), TRUE, status);
+        log_info("    missing: %s\n", aescstrdup(buffer, bufLen));
+        bufLen = uset_toPattern(ref, buffer, LENGTHOF(buffer), TRUE, status);
+        log_info("    total: size=%i  %s\n", uset_getItemCount(ref), aescstrdup(buffer, bufLen));
     }
 
     uset_clear(set);
@@ -2150,7 +2163,19 @@ TestGetContractionsAndUnsafes(void)
             "[jabv]"
         },
         { "ja",
-          "[{\\u3053\\u3099\\u309D}{\\u3053\\u3099\\u309D\\u3099}{\\u3053\\u3099\\u309E}{\\u3053\\u3099\\u30FC}{\\u3053\\u309D}{\\u3053\\u309D\\u3099}{\\u3053\\u309E}{\\u3053\\u30FC}{\\u30B3\\u3099\\u30FC}{\\u30B3\\u3099\\u30FD}{\\u30B3\\u3099\\u30FD\\u3099}{\\u30B3\\u3099\\u30FE}{\\u30B3\\u30FC}{\\u30B3\\u30FD}{\\u30B3\\u30FD\\u3099}{\\u30B3\\u30FE}]",
+          /*
+           * The "collv2" builder omits mappings if the collator maps their
+           * character sequences to the same CEs.
+           * For example, it omits Japanese contractions for NFD forms
+           * of the voiced iteration mark (U+309E = U+309D + U+3099), such as
+           * {\\u3053\\u3099\\u309D\\u3099}{\\u3053\\u309D\\u3099}
+           * {\\u30B3\\u3099\\u30FD\\u3099}{\\u30B3\\u30FD\\u3099}.
+           * It does add mappings for the precomposed forms.
+           */
+          "[{\\u3053\\u3099\\u309D}{\\u3053\\u3099\\u309E}{\\u3053\\u3099\\u30FC}"
+           "{\\u3053\\u309D}{\\u3053\\u309E}{\\u3053\\u30FC}"
+           "{\\u30B3\\u3099\\u30FC}{\\u30B3\\u3099\\u30FD}{\\u30B3\\u3099\\u30FE}"
+           "{\\u30B3\\u30FC}{\\u30B3\\u30FD}{\\u30B3\\u30FE}]",
           "[{\\u30FD\\u3099}{\\u309D\\u3099}{\\u3053\\u3099}{\\u30B3\\u3099}{lj}{nj}]",
             "[\\u30FE\\u00e6]",
             "[a]",
@@ -2159,9 +2184,6 @@ TestGetContractionsAndUnsafes(void)
         }
     };
 
-
-
-
     UErrorCode status = U_ZERO_ERROR;
     UCollator *coll = NULL;
     int32_t i = 0;
@@ -2221,6 +2243,20 @@ TestGetContractionsAndUnsafes(void)
 static void
 TestOpenBinary(void)
 {
+    /*
+     * ucol_openBinary() documents:
+     * "The API also takes a base collator which usually should be UCA."
+     * and
+     * "Currently it cannot be NULL."
+     *
+     * However, the check for NULL was commented out in ICU 3.4 (r18149).
+     * Ticket #4355 requested "Make collation work with minimal data.
+     * Optionally without UCA, with relevant parts of UCA copied into the tailoring table."
+     *
+     * The ICU team agreed with ticket #10517 "require base collator in ucol_openBinary() etc."
+     * to require base!=NULL again.
+     */
+#define OPEN_BINARY_ACCEPTS_NULL_BASE 0
     UErrorCode status = U_ZERO_ERROR;
     /*
     char rule[] = "&h < d < c < b";
@@ -2230,7 +2266,9 @@ TestOpenBinary(void)
     /* we have to use Cyrillic letters because latin-1 always gets copied */
     const char rule[] = "&\\u0452 < \\u0434 < \\u0433 < \\u0432"; /* &dje < d < g < v */
     const char *wUCA[] = { "\\u0430", "\\u0452", "\\u0434", "\\u0433", "\\u0432", "\\u0435" }; /* a, dje, d, g, v, e */
+#if OPEN_BINARY_ACCEPTS_NULL_BASE
     const char *noUCA[] = {"\\u0434", "\\u0433", "\\u0432", "\\u0430", "\\u0435", "\\u0452" }; /* d, g, v, a, e, dje */
+#endif
 
     UChar uRules[256];
     int32_t uRulesLen = u_unescape(rule, uRules, 256);
@@ -2266,11 +2304,18 @@ TestOpenBinary(void)
 
     cloneWUCA = ucol_openBinary(image, imageSize, UCA, &status);
     cloneNOUCA = ucol_openBinary(image, imageSize, NULL, &status);
+#if !OPEN_BINARY_ACCEPTS_NULL_BASE
+    if(status != U_ILLEGAL_ARGUMENT_ERROR) {
+        log_err("ucol_openBinary(base=NULL) unexpectedly did not fail - %s\n", u_errorName(status));
+    }
+#endif
 
     genericOrderingTest(coll, wUCA, sizeof(wUCA)/sizeof(wUCA[0]));
 
     genericOrderingTest(cloneWUCA, wUCA, sizeof(wUCA)/sizeof(wUCA[0]));
+#if OPEN_BINARY_ACCEPTS_NULL_BASE
     genericOrderingTest(cloneNOUCA, noUCA, sizeof(noUCA)/sizeof(noUCA[0]));
+#endif
 
     if(image != imageBuffer) {
         free(image);
index e8e2cff0ff36fdef49989e77bd55b52aacfc80fd..c49487ab8d18cc0c613ad33058cfa9e35bae447a 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT:
- * Copyright (c) 1997-2013, International Business Machines Corporation and
+ * Copyright (c) 1997-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 /********************************************************************************
@@ -35,7 +35,6 @@
 #include "filestrm.h"
 #include "cstring.h"
 #include "ucol_imp.h"
-#include "ucol_tok.h"
 #include "uparse.h"
 #include <stdio.h>
 
@@ -54,11 +53,7 @@ void addCollIterTest(TestNode** root)
     addTest(root, &TestBug672, "tscoll/citertst/TestBug672");
     addTest(root, &TestBug672Normalize, "tscoll/citertst/TestBug672Normalize");
     addTest(root, &TestSmallBuffer, "tscoll/citertst/TestSmallBuffer");
-    addTest(root, &TestCEs, "tscoll/citertst/TestCEs");
     addTest(root, &TestDiscontiguos, "tscoll/citertst/TestDiscontiguos");
-    addTest(root, &TestCEBufferOverflow, "tscoll/citertst/TestCEBufferOverflow");
-    addTest(root, &TestCEValidity, "tscoll/citertst/TestCEValidity");
-    addTest(root, &TestSortKeyValidity, "tscoll/citertst/TestSortKeyValidity");
     addTest(root, &TestSearchCollatorElements, "tscoll/citertst/TestSearchCollatorElements");
 }
 
@@ -763,15 +758,10 @@ static void TestSetText()
 
     /* Now set it to point to a null string with fake length*/
     ucol_setText(iter2, NULL, 2, &status);
-    if (U_FAILURE(status))
+    if (status != U_ILLEGAL_ARGUMENT_ERROR)
     {
-        log_err("call to iter2->setText(null) failed. %s\n", myErrorName(status));
-    }
-    else
-    {
-        if (ucol_next(iter2, &status) != UCOL_NULLORDER) {
-            log_err("iter2 with null text expected to return UCOL_NULLORDER\n");
-        }
+        log_err("call to iter2->setText(null, 2) should yield an illegal-argument-error - %s\n",
+                myErrorName(status));
     }
 
     ucol_closeElements(iter2);
@@ -1010,353 +1000,6 @@ static void TestSmallBuffer()
     }
 }
 
-/**
-* Sniplets of code from genuca
-*/
-static int32_t hex2num(char hex) {
-    if(hex>='0' && hex <='9') {
-        return hex-'0';
-    } else if(hex>='a' && hex<='f') {
-        return hex-'a'+10;
-    } else if(hex>='A' && hex<='F') {
-        return hex-'A'+10;
-    } else {
-        return 0;
-    }
-}
-
-/**
-* Getting codepoints from a string
-* @param str character string contain codepoints seperated by space and ended
-*        by a semicolon
-* @param codepoints array for storage, assuming size > 5
-* @return position at the end of the codepoint section
-*/
-static char *getCodePoints(char *str, UChar *codepoints, UChar *contextCPs) {
-    UErrorCode errorCode = U_ZERO_ERROR;
-    char *semi = uprv_strchr(str, ';');
-    char *pipe = uprv_strchr(str, '|');
-    char *s;
-    *codepoints = 0;
-    *contextCPs = 0;
-    if(semi == NULL) {
-        log_err("expected semicolon after code point string in FractionalUCA.txt %s\n", str);
-        return str;
-    }
-    if(pipe != NULL) {
-        int32_t contextLength;
-        *pipe = 0;
-        contextLength = u_parseString(str, contextCPs, 99, NULL, &errorCode);
-        *pipe = '|';
-        if(U_FAILURE(errorCode)) {
-            log_err("error parsing precontext string from FractionalUCA.txt %s\n", str);
-            return str;
-        }
-        /* prepend the precontext string to the codepoints */
-        u_memcpy(codepoints, contextCPs, contextLength);
-        codepoints += contextLength;
-        /* start of the code point string */
-        s = pipe + 1;
-    } else {
-        s = str;
-    }
-    u_parseString(s, codepoints, 99, NULL, &errorCode);
-    if(U_FAILURE(errorCode)) {
-        log_err("error parsing code point string from FractionalUCA.txt %s\n", str);
-        return str;
-    }
-    return semi + 1;
-}
-
-/**
-* Sniplets of code from genuca
-*/
-static int32_t
-readElement(char **from, char *to, char separator, UErrorCode *status)
-{
-    if (U_SUCCESS(*status)) {
-        char    buffer[1024];
-        int32_t i = 0;
-        while (**from != separator) {
-            if (**from != ' ') {
-                *(buffer+i++) = **from;
-            }
-            (*from)++;
-        }
-        (*from)++;
-        *(buffer + i) = 0;
-        strcpy(to, buffer);
-        return i/2;
-    }
-
-    return 0;
-}
-
-/**
-* Sniplets of code from genuca
-*/
-static uint32_t
-getSingleCEValue(char *primary, char *secondary, char *tertiary,
-                          UErrorCode *status)
-{
-    if (U_SUCCESS(*status)) {
-        uint32_t  value    = 0;
-        char      primsave = '\0';
-        char      secsave  = '\0';
-        char      tersave  = '\0';
-        char     *primend  = primary+4;
-        char     *secend   = secondary+2;
-        char     *terend   = tertiary+2;
-        uint32_t  primvalue;
-        uint32_t  secvalue;
-        uint32_t  tervalue;
-
-        if (uprv_strlen(primary) > 4) {
-            primsave = *primend;
-            *primend = '\0';
-        }
-
-        if (uprv_strlen(secondary) > 2) {
-            secsave = *secend;
-            *secend = '\0';
-        }
-
-        if (uprv_strlen(tertiary) > 2) {
-            tersave = *terend;
-            *terend = '\0';
-        }
-
-        primvalue = (*primary!='\0')?uprv_strtoul(primary, &primend, 16):0;
-        secvalue  = (*secondary!='\0')?uprv_strtoul(secondary, &secend, 16):0;
-        tervalue  = (*tertiary!='\0')?uprv_strtoul(tertiary, &terend, 16):0;
-        if(primvalue <= 0xFF) {
-          primvalue <<= 8;
-        }
-
-        value = ((primvalue << UCOL_PRIMARYORDERSHIFT) & UCOL_PRIMARYORDERMASK)
-           | ((secvalue << UCOL_SECONDARYORDERSHIFT) & UCOL_SECONDARYORDERMASK)
-           | (tervalue & UCOL_TERTIARYORDERMASK);
-
-        if(primsave!='\0') {
-            *primend = primsave;
-        }
-        if(secsave!='\0') {
-            *secend = secsave;
-        }
-        if(tersave!='\0') {
-            *terend = tersave;
-        }
-        return value;
-    }
-    return 0;
-}
-
-/**
-* Getting collation elements generated from a string
-* @param str character string contain collation elements contained in [] and
-*        seperated by space
-* @param ce array for storage, assuming size > 20
-* @param status error status
-* @return position at the end of the codepoint section
-*/
-static char * getCEs(char *str, uint32_t *ces, UErrorCode *status) {
-    char       *pStartCP     = uprv_strchr(str, '[');
-    int         count        = 0;
-    char       *pEndCP;
-    char        primary[100];
-    char        secondary[100];
-    char        tertiary[100];
-
-    while (*pStartCP == '[') {
-        uint32_t primarycount   = 0;
-        uint32_t secondarycount = 0;
-        uint32_t tertiarycount  = 0;
-        uint32_t CEi = 1;
-        pEndCP = strchr(pStartCP, ']');
-        if(pEndCP == NULL) {
-            break;
-        }
-        pStartCP ++;
-
-        primarycount   = readElement(&pStartCP, primary, ',', status);
-        secondarycount = readElement(&pStartCP, secondary, ',', status);
-        tertiarycount  = readElement(&pStartCP, tertiary, ']', status);
-
-        /* I want to get the CEs entered right here, including continuation */
-        ces[count ++] = getSingleCEValue(primary, secondary, tertiary, status);
-        if (U_FAILURE(*status)) {
-            break;
-        }
-
-        while (2 * CEi < primarycount || CEi < secondarycount ||
-               CEi < tertiarycount) {
-            uint32_t value = UCOL_CONTINUATION_MARKER; /* Continuation marker */
-            if (2 * CEi < primarycount) {
-                value |= ((hex2num(*(primary + 4 * CEi)) & 0xF) << 28);
-                value |= ((hex2num(*(primary + 4 * CEi + 1)) & 0xF) << 24);
-            }
-
-            if (2 * CEi + 1 < primarycount) {
-                value |= ((hex2num(*(primary + 4 * CEi + 2)) & 0xF) << 20);
-                value |= ((hex2num(*(primary + 4 * CEi + 3)) &0xF) << 16);
-            }
-
-            if (CEi < secondarycount) {
-                value |= ((hex2num(*(secondary + 2 * CEi)) & 0xF) << 12);
-                value |= ((hex2num(*(secondary + 2 * CEi + 1)) & 0xF) << 8);
-            }
-
-            if (CEi < tertiarycount) {
-                value |= ((hex2num(*(tertiary + 2 * CEi)) & 0x3) << 4);
-                value |= (hex2num(*(tertiary + 2 * CEi + 1)) & 0xF);
-            }
-
-            CEi ++;
-            ces[count ++] = value;
-        }
-
-      pStartCP = pEndCP + 1;
-    }
-    ces[count] = 0;
-    return pStartCP;
-}
-
-/**
-* Getting the FractionalUCA.txt file stream
-*/
-static FileStream * getFractionalUCA(void)
-{
-    char        newPath[256];
-    char        backupPath[256];
-    FileStream *result = NULL;
-
-    /* Look inside ICU_DATA first */
-    uprv_strcpy(newPath, ctest_dataSrcDir());
-    uprv_strcat(newPath, "unidata" U_FILE_SEP_STRING );
-    uprv_strcat(newPath, "FractionalUCA.txt");
-
-    /* As a fallback, try to guess where the source data was located
-     *   at the time ICU was built, and look there.
-     */
-#if defined (U_TOPSRCDIR)
-    strcpy(backupPath, U_TOPSRCDIR  U_FILE_SEP_STRING "data");
-#else
-    {
-        UErrorCode errorCode = U_ZERO_ERROR;
-        strcpy(backupPath, loadTestData(&errorCode));
-        strcat(backupPath, U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data");
-    }
-#endif
-    strcat(backupPath, U_FILE_SEP_STRING "unidata" U_FILE_SEP_STRING "FractionalUCA.txt");
-
-    result = T_FileStream_open(newPath, "rb");
-
-    if (result == NULL) {
-        result = T_FileStream_open(backupPath, "rb");
-        if (result == NULL) {
-            log_err("Failed to open either %s or %s\n", newPath, backupPath);
-        }
-    }
-    return result;
-}
-
-/**
-* Testing the CEs returned by the iterator
-*/
-static void TestCEs() {
-    FileStream *file = NULL;
-    char        line[2048];
-    char       *str;
-    UChar       codepoints[10];
-    uint32_t    ces[20];
-    UErrorCode  status = U_ZERO_ERROR;
-    UCollator          *coll = ucol_open("", &status);
-    uint32_t lineNo = 0;
-    UChar       contextCPs[5];    
-
-    if (U_FAILURE(status)) {
-        log_err_status(status, "Error in opening root collator -> %s\n", u_errorName(status));
-        return;
-    }
-
-    file = getFractionalUCA();
-
-    if (file == NULL) {
-        log_err("*** unable to open input FractionalUCA.txt file ***\n");
-        return;
-    }
-
-
-    while (T_FileStream_readLine(file, line, sizeof(line)) != NULL) {
-        int                 count = 0;
-        UCollationElements *iter;
-        int32_t            preContextCeLen=0;
-        lineNo++;
-        /* skip this line if it is empty or a comment or is a return value
-        or start of some variable section */
-        if(line[0] == 0 || line[0] == '#' || line[0] == '\n' ||
-            line[0] == 0x000D || line[0] == '[') {
-            continue;
-        }
-
-        str = getCodePoints(line, codepoints, contextCPs);
-
-        /* these are 'fake' codepoints in the fractional UCA, and are used just 
-         * for positioning of indirect values. They should not go through this
-         * test.
-         */
-        if(*codepoints == 0xFDD0) {
-          continue;
-        }
-        if (*contextCPs != 0) {
-            iter = ucol_openElements(coll, contextCPs, -1, &status);
-            if (U_FAILURE(status)) {
-                log_err("Error in opening collation elements\n");
-                break;
-            }
-            while((ces[preContextCeLen] = ucol_next(iter, &status)) != (uint32_t)UCOL_NULLORDER) {
-                preContextCeLen++;
-            }
-            ucol_closeElements(iter);
-        }
-
-        getCEs(str, ces+preContextCeLen, &status);
-        if (U_FAILURE(status)) {
-            log_err("Error in parsing collation elements in FractionalUCA.txt\n");
-            break;
-        }
-        iter = ucol_openElements(coll, codepoints, -1, &status);
-        if (U_FAILURE(status)) {
-            log_err("Error in opening collation elements\n");
-            break;
-        }
-        for (;;) {
-            uint32_t ce = (uint32_t)ucol_next(iter, &status);
-            if (ce == 0xFFFFFFFF) {
-                ce = 0;
-            }
-            /* we now unconditionally reorder Thai/Lao prevowels, so this
-             * test would fail if we don't skip here.
-             */
-            if(UCOL_ISTHAIPREVOWEL(*codepoints) && ce == 0 && count == 0) {
-              continue;
-            }
-            if (ce != ces[count] || U_FAILURE(status)) {
-                log_err("Collation elements in FractionalUCA.txt and iterators do not match!\n");
-                break;
-            }
-            if (ces[count] == 0) {
-                break;
-            }
-            count ++;
-        }
-        ucol_closeElements(iter);
-    }
-
-    T_FileStream_close(file);
-    ucol_close(coll);
-}
-
 /**
 * Testing the discontigous contractions
 */
@@ -1467,603 +1110,16 @@ static void TestDiscontiguos() {
     ucol_close(coll);
 }
 
-static void TestCEBufferOverflow()
-{
-    UChar               str[UCOL_EXPAND_CE_BUFFER_SIZE + 1];
-    UErrorCode          status = U_ZERO_ERROR;
-    UChar               rule[10];
-    UCollator          *coll;
-    UCollationElements *iter;
-
-    u_uastrcpy(rule, "&z < AB");
-    coll = ucol_openRules(rule, u_strlen(rule), UCOL_OFF, UCOL_DEFAULT_STRENGTH, NULL,&status);
-    if (U_FAILURE(status)) {
-        log_err_status(status, "Rule based collator not created for testing ce buffer overflow -> %s\n", u_errorName(status));
-        return;
-    }
-
-    /* 0xDCDC is a trail surrogate hence deemed unsafe by the heuristic
-    test. this will cause an overflow in getPrev */
-    str[0] = 0x0041;    /* 'A' */
-    /*uprv_memset(str + 1, 0xE0, sizeof(UChar) * UCOL_EXPAND_CE_BUFFER_SIZE);*/
-    uprv_memset(str + 1, 0xDC, sizeof(UChar) * UCOL_EXPAND_CE_BUFFER_SIZE);
-    str[UCOL_EXPAND_CE_BUFFER_SIZE] = 0x0042;   /* 'B' */
-    iter = ucol_openElements(coll, str, UCOL_EXPAND_CE_BUFFER_SIZE + 1,
-                             &status);
-    if (ucol_previous(iter, &status) == UCOL_NULLORDER ||
-        status == U_BUFFER_OVERFLOW_ERROR) {
-        log_err("CE buffer should not overflow with long string of trail surrogates\n");
-    }
-    ucol_closeElements(iter);
-    ucol_close(coll);
-}
-
-/**
-* Checking collation element validity.
-*/
-#define MAX_CODEPOINTS_TO_SHOW 10
-static void showCodepoints(const UChar *codepoints, int length, char * codepointText) {
-    int i, lengthToUse = length;
-    if (lengthToUse > MAX_CODEPOINTS_TO_SHOW) {
-        lengthToUse = MAX_CODEPOINTS_TO_SHOW;
-    }
-    for (i = 0; i < lengthToUse; ++i) {
-        int bytesWritten = sprintf(codepointText, " %04X", *codepoints++);
-        if (bytesWritten <= 0) {
-            break;
-        }
-        codepointText += bytesWritten;
-    }
-    if (i < length) {
-        sprintf(codepointText, " ...");
-    }
-}
-
-static UBool checkCEValidity(const UCollator *coll, const UChar *codepoints,
-                             int length)
-{
-    UErrorCode          status = U_ZERO_ERROR;
-    UCollationElements *iter   = ucol_openElements(coll, codepoints, length,
-                                                  &status);
-    UBool result = FALSE;
-    UBool primaryDone = FALSE, secondaryDone = FALSE, tertiaryDone = FALSE;
-    const char * collLocale;
-
-    if (U_FAILURE(status)) {
-        log_err("Error creating iterator for testing validity\n");
-        return FALSE;
-    }
-    collLocale = ucol_getLocale(coll, ULOC_VALID_LOCALE, &status);
-    if (U_FAILURE(status) || collLocale==NULL) {
-        status = U_ZERO_ERROR;
-        collLocale = "?";
-    }
-
-    for (;;) {
-        uint32_t ce = ucol_next(iter, &status);
-        uint32_t primary, p1, p2, secondary, tertiary;
-        if (ce == UCOL_NULLORDER) {
-            result = TRUE;
-            break;
-        }
-        if (ce == 0) {
-            continue;
-        }
-        if (ce == 0x02000202) {
-            /* special CE for merge-sort character */
-            if (*codepoints == 0xFFFE /* && length == 1 */) {
-                /*
-                 * Note: We should check for length==1 but the token parser appears
-                 * to give us trailing NUL characters.
-                 * TODO: Ticket #8047: Change TestCEValidity to use ucol_getTailoredSet()
-                 *                     rather than the internal collation rule parser
-                 */
-                continue;
-            } else {
-                log_err("Special 02/02/02 weight for code point U+%04X [len %d] != U+FFFE\n",
-                        (int)*codepoints, (int)length);
-                break;
-            }
-        }
-        primary   = UCOL_PRIMARYORDER(ce);
-        p1 = primary >> 8;
-        p2 = primary & 0xFF;
-        secondary = UCOL_SECONDARYORDER(ce);
-        tertiary  = UCOL_TERTIARYORDER(ce) & UCOL_REMOVE_CONTINUATION;
-
-        if (!isContinuation(ce)) {
-            if ((ce & UCOL_REMOVE_CONTINUATION) == 0) {
-                log_err("Empty CE %08lX except for case bits\n", (long)ce);
-                break;
-            }
-            if (p1 == 0) {
-                if (p2 != 0) {
-                    log_err("Primary 00 xx in %08lX\n", (long)ce);
-                    break;
-                }
-                primaryDone = TRUE;
-            } else {
-                if (p1 <= 2 || p1 >= 0xF0) {
-                    /* Primary first bytes F0..FF are specials. */
-                    log_err("Primary first byte of %08lX out of range\n", (long)ce);
-                    break;
-                }
-                if (p2 == 0) {
-                    primaryDone = TRUE;
-                } else {
-                    if (p2 <= 3 || p2 >= 0xFF) {
-                        /* Primary second bytes 03 and FF are sort key compression terminators. */
-                        log_err("Primary second byte of %08lX out of range\n", (long)ce);
-                        break;
-                    }
-                    primaryDone = FALSE;
-                }
-            }
-            if (secondary == 0) {
-                if (primary != 0) {
-                    log_err("Primary!=0 secondary==0 in %08lX\n", (long)ce);
-                    break;
-                }
-                secondaryDone = TRUE;
-            } else {
-                if (secondary <= 2 ||
-                    (UCOL_BYTE_COMMON < secondary && secondary <= (UCOL_BYTE_COMMON + 0x80))
-                ) {
-                    /* Secondary first bytes common+1..+0x80 are used for sort key compression. */
-                    log_err("Secondary byte of %08lX out of range\n", (long)ce);
-                    break;
-                }
-                secondaryDone = FALSE;
-            }
-            if (tertiary == 0) {
-                /* We know that ce != 0. */
-                log_err("Primary!=0 or secondary!=0 but tertiary==0 in %08lX\n", (long)ce);
-                break;
-            }
-            if (tertiary <= 2) {
-                log_err("Tertiary byte of %08lX out of range\n", (long)ce);
-                break;
-            }
-            tertiaryDone = FALSE;
-        } else {
-            if ((ce & UCOL_REMOVE_CONTINUATION) == 0) {
-                log_err("Empty continuation %08lX\n", (long)ce);
-                break;
-            }
-            if (primaryDone && primary != 0) {
-                log_err("Primary was done but continues in %08lX\n", (long)ce);
-                break;
-            }
-            if (p1 == 0) {
-                if (p2 != 0) {
-                    log_err("Primary 00 xx in %08lX\n", (long)ce);
-                    break;
-                }
-                primaryDone = TRUE;
-            } else {
-                if (p1 <= 2) {
-                    log_err("Primary first byte of %08lX out of range\n", (long)ce);
-                    break;
-                }
-                if (p2 == 0) {
-                    primaryDone = TRUE;
-                } else {
-                    if (p2 <= 3) {
-                        log_err("Primary second byte of %08lX out of range\n", (long)ce);
-                        break;
-                    }
-                }
-            }
-            if (secondaryDone && secondary != 0) {
-                log_err("Secondary was done but continues in %08lX\n", (long)ce);
-                break;
-            }
-            if (secondary == 0) {
-                secondaryDone = TRUE;
-            } else {
-                if (secondary <= 2) {
-                    log_err("Secondary byte of %08lX out of range\n", (long)ce);
-                    break;
-                }
-            }
-            if (tertiaryDone && tertiary != 0) {
-                log_err("Tertiary was done but continues in %08lX\n", (long)ce);
-                break;
-            }
-            if (tertiary == 0) {
-                tertiaryDone = TRUE;
-            } else if (tertiary <= 2) {
-                log_err("Tertiary byte of %08lX out of range\n", (long)ce);
-                break;
-            }
-        }
-    }
-    if (!result) {
-        char codepointText[5*MAX_CODEPOINTS_TO_SHOW + 5];
-        showCodepoints(codepoints, length, codepointText);
-        log_err("Locale: %s  Code point string: %s\n", collLocale, codepointText);
-    }
-    ucol_closeElements(iter);
-    return result;
-}
-
-static const UChar IMPORT[] = { 0x5B, 0x69, 0x6D, 0x70, 0x6F, 0x72, 0x74, 0 };  /* "[import" */
-
-static void TestCEValidity()
-{
-    /* testing UCA collation elements */
-    UErrorCode  status      = U_ZERO_ERROR;
-    /* en_US has no tailorings */
-    UCollator  *coll        = ucol_open("root", &status);
-    /* tailored locales */
-    char        locale[][11] = {"fr_FR", "ko_KR", "sh_YU", "th_TH", "zh_CN", "zh__PINYIN"};
-    const char *loc;
-    FileStream *file = NULL;
-    char        line[2048];
-    UChar       codepoints[11];
-    int         count = 0;
-    int         maxCount = 0;
-    UChar       contextCPs[3];
-    UChar32     c;
-    UParseError parseError;
-    if (U_FAILURE(status)) {
-        log_err_status(status, "en_US collator creation failed -> %s\n", u_errorName(status));
-        return;
-    }
-    log_verbose("Testing UCA elements\n");
-    file = getFractionalUCA();
-    if (file == NULL) {
-        log_err("Fractional UCA data can not be opened\n");
-        return;
-    }
-
-    while (T_FileStream_readLine(file, line, sizeof(line)) != NULL) {
-        if(line[0] == 0 || line[0] == '#' || line[0] == '\n' ||
-            line[0] == 0x000D || line[0] == '[') {
-            continue;
-        }
-
-        getCodePoints(line, codepoints, contextCPs);
-        checkCEValidity(coll, codepoints, u_strlen(codepoints));
-    }
-
-    log_verbose("Testing UCA elements for the whole range of unicode characters\n");
-    for (c = 0; c <= 0xffff; ++c) {
-        if (u_isdefined(c)) {
-            codepoints[0] = (UChar)c;
-            checkCEValidity(coll, codepoints, 1);
-        }
-    }
-    for (; c <= 0x10ffff; ++c) {
-        if (u_isdefined(c)) {
-            int32_t i = 0;
-            U16_APPEND_UNSAFE(codepoints, i, c);
-            checkCEValidity(coll, codepoints, i);
-        }
-    }
-
-    ucol_close(coll);
-
-    /* testing tailored collation elements */
-    log_verbose("Testing tailored elements\n");
-    if(getTestOption(QUICK_OPTION)) {
-        maxCount = sizeof(locale)/sizeof(locale[0]);
-    } else {
-        maxCount = uloc_countAvailable();
-    }
-    while (count < maxCount) {
-        const UChar *rules = NULL,
-                    *current = NULL;
-        UChar *rulesCopy = NULL;
-        int32_t ruleLen = 0;
-
-        uint32_t chOffset = 0;
-        uint32_t chLen = 0;
-        uint32_t exOffset = 0;
-        uint32_t exLen = 0;
-        uint32_t prefixOffset = 0;
-        uint32_t prefixLen = 0;
-        UBool    startOfRules = TRUE;
-        UColOptionSet opts;
-
-        UColTokenParser src;
-        uint32_t strength = 0;
-        uint16_t specs = 0;
-
-        (void)specs;        /* Suppress set but not used warnings. */
-        (void)strength;
-        (void)prefixLen;
-        (void)prefixOffset;
-        (void)exLen;
-        (void)exOffset;
-
-        if(getTestOption(QUICK_OPTION)) {
-            loc = locale[count];
-        } else {
-            loc = uloc_getAvailable(count);
-            if(!hasCollationElements(loc)) {
-                count++;
-                continue;
-            }
-        }
-        status = U_ZERO_ERROR; // clear status from previous loop iteration
-
-        uprv_memset(&src, 0, sizeof(UColTokenParser));
-
-        log_verbose("Testing CEs for %s\n", loc);
-
-        coll      = ucol_open(loc, &status);
-        if (U_FAILURE(status)) {
-            log_err("%s collator creation failed with status %s\n", loc, u_errorName(status));
-            return;
-        }
-
-        src.opts = &opts;
-        rules = ucol_getRules(coll, &ruleLen);
-
-        /*
-         * We have not set up the UColTokenParser with a callback function
-         * to fetch [import] sub-rules,
-         * so skip testing tailorings that import others.
-         * TODO: Ticket #8047: Change TestCEValidity to use ucol_getTailoredSet()
-         *                     rather than the internal collation rule parser
-         */
-        if (ruleLen > 0 && u_strstr(rules, IMPORT) == NULL) {
-            rulesCopy = (UChar *)uprv_malloc((ruleLen +
-                UCOL_TOK_EXTRA_RULE_SPACE_SIZE) * sizeof(UChar));
-            uprv_memcpy(rulesCopy, rules, ruleLen * sizeof(UChar));
-            src.current = src.source = rulesCopy;
-            src.end = rulesCopy + ruleLen;
-            src.extraCurrent = src.end;
-            src.extraEnd = src.end + UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
-
-               /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to
-                  the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */
-            while ((current = ucol_tok_parseNextToken(&src, startOfRules, &parseError,&status)) != NULL && U_SUCCESS(status)) {
-              strength = src.parsedToken.strength;
-              chOffset = src.parsedToken.charsOffset;
-              chLen = src.parsedToken.charsLen;
-              exOffset = src.parsedToken.extensionOffset;
-              exLen = src.parsedToken.extensionLen;
-              prefixOffset = src.parsedToken.prefixOffset;
-              prefixLen = src.parsedToken.prefixLen;
-              specs = src.parsedToken.flags;
-
-                startOfRules = FALSE;
-                uprv_memcpy(codepoints, src.source + chOffset,
-                                                       chLen * sizeof(UChar));
-                codepoints[chLen] = 0;
-                checkCEValidity(coll, codepoints, chLen);
-            }
-            if (U_FAILURE(status)) {
-                log_err("%s collator, ucol_tok_parseNextToken failed with status %s\n", loc, u_errorName(status));
-            }
-            uprv_free(src.source);
-            uprv_free(src.reorderCodes);
-        }
-
-        ucol_close(coll);
-        count ++;
-    }
-    T_FileStream_close(file);
-}
-
-static void printSortKeyError(const UChar   *codepoints, int length,
-                                    uint8_t *sortkey, int sklen)
-{
-    int count = 0;
-    log_err("Sortkey not valid for ");
-    while (length > 0) {
-        log_err("0x%04x ", *codepoints);
-        length --;
-        codepoints ++;
-    }
-    log_err("\nSortkey : ");
-    while (count < sklen) {
-        log_err("0x%02x ", sortkey[count]);
-        count ++;
-    }
-    log_err("\n");
-}
-
-/**
-* Checking sort key validity for all levels
-*/
-static UBool checkSortKeyValidity(UCollator *coll,
-                                  const UChar *codepoints,
-                                  int length)
-{
-    UErrorCode status  = U_ZERO_ERROR;
-    UCollationStrength strength[5] = {UCOL_PRIMARY, UCOL_SECONDARY,
-                                      UCOL_TERTIARY, UCOL_QUATERNARY,
-                                      UCOL_IDENTICAL};
-    int        strengthlen = 5;
-    int        strengthIndex = 0;
-    int        caselevel   = 0;
-
-    while (caselevel < 1) {
-        if (caselevel == 0) {
-            ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_OFF, &status);
-        }
-        else {
-            ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_ON, &status);
-        }
-
-        while (strengthIndex < strengthlen) {
-            int        count01 = 0;
-            uint32_t   count   = 0;
-            uint8_t    sortkey[128];
-            uint32_t   sklen;
-
-            ucol_setStrength(coll, strength[strengthIndex]);
-            sklen = ucol_getSortKey(coll, codepoints, length, sortkey, 128);
-            while (sortkey[count] != 0) {
-                if (sortkey[count] == 2 || (sortkey[count] == 3 && count01 > 0 && strengthIndex != 4)) {
-                    printSortKeyError(codepoints, length, sortkey, sklen);
-                    return FALSE;
-                }
-                if (sortkey[count] == 1) {
-                    count01 ++;
-                }
-                count ++;
-            }
-
-            if (count + 1 != sklen || (count01 != strengthIndex + caselevel)) {
-                printSortKeyError(codepoints, length, sortkey, sklen);
-                return FALSE;
-            }
-            strengthIndex ++;
-        }
-        caselevel ++;
-    }
-    return TRUE;
-}
-
-static void TestSortKeyValidity(void)
-{
-    /* testing UCA collation elements */
-    UErrorCode  status      = U_ZERO_ERROR;
-    /* en_US has no tailorings */
-    UCollator  *coll        = ucol_open("en_US", &status);
-    /* tailored locales */
-    char        locale[][6] = {"fr_FR", "ko_KR", "sh_YU", "th_TH", "zh_CN"};
-    FileStream *file = NULL;
-    char        line[2048];
-    UChar       codepoints[10];
-    int         count = 0;
-    UChar       contextCPs[5];
-    UParseError parseError;
-    if (U_FAILURE(status)) {
-        log_err_status(status, "en_US collator creation failed -> %s\n", u_errorName(status));
-        return;
-    }
-    log_verbose("Testing UCA elements\n");
-    file = getFractionalUCA();
-    if (file == NULL) {
-        log_err("Fractional UCA data can not be opened\n");
-        return;
-    }
-
-    while (T_FileStream_readLine(file, line, sizeof(line)) != NULL) {
-        if(line[0] == 0 || line[0] == '#' || line[0] == '\n' ||
-            line[0] == 0x000D || line[0] == '[') {
-            continue;
-        }
-
-        getCodePoints(line, codepoints, contextCPs);
-        if(codepoints[0] == 0xFFFE) {
-            /* Skip special merge-sort character U+FFFE which has otherwise illegal 02 weight bytes. */
-            continue;
-        }
-        checkSortKeyValidity(coll, codepoints, u_strlen(codepoints));
-    }
-
-    log_verbose("Testing UCA elements for the whole range of unicode characters\n");
-    codepoints[0] = 0;
-
-    while (codepoints[0] < 0xFFFF) {
-        if (u_isdefined((UChar32)codepoints[0])) {
-            checkSortKeyValidity(coll, codepoints, 1);
-        }
-        codepoints[0] ++;
-    }
-
-    ucol_close(coll);
-
-    /* testing tailored collation elements */
-    log_verbose("Testing tailored elements\n");
-    while (count < 5) {
-        const UChar *rules = NULL,
-                    *current = NULL;
-        UChar *rulesCopy = NULL;
-        int32_t ruleLen = 0;
-
-        uint32_t chOffset = 0;
-        uint32_t chLen = 0;
-        uint32_t exOffset = 0;
-        uint32_t exLen = 0;
-        uint32_t prefixOffset = 0;
-        uint32_t prefixLen = 0;
-        UBool    startOfRules = TRUE;
-        UColOptionSet opts;
-
-        UColTokenParser src;
-        uint32_t strength = 0;
-        uint16_t specs = 0;
-        status = U_ZERO_ERROR; // clear status from previous loop iteration
-
-        (void)specs;
-        (void)strength;
-        (void)prefixLen;
-        (void)prefixOffset;
-        (void)exLen;
-        (void)exOffset;
-
-        uprv_memset(&src, 0, sizeof(UColTokenParser));
-
-        coll      = ucol_open(locale[count], &status);
-        if (U_FAILURE(status)) {
-            log_err("%s collator creation failed with status %s\n", locale[count], u_errorName(status));
-            return;
-        }
-
-        src.opts = &opts;
-        rules = ucol_getRules(coll, &ruleLen);
-
-        /*
-         * We have not set up the UColTokenParser with a callback function
-         * to fetch [import] sub-rules,
-         * so skip testing tailorings that import others.
-         * TODO: Ticket #8047: Change TestSortKeyValidity to use ucol_getTailoredSet()
-         *                     rather than the internal collation rule parser
-         */
-        if (ruleLen > 0 && u_strstr(rules, IMPORT) == NULL) {
-            rulesCopy = (UChar *)uprv_malloc((ruleLen +
-                UCOL_TOK_EXTRA_RULE_SPACE_SIZE) * sizeof(UChar));
-            uprv_memcpy(rulesCopy, rules, ruleLen * sizeof(UChar));
-            src.current = src.source = rulesCopy;
-            src.end = rulesCopy + ruleLen;
-            src.extraCurrent = src.end;
-            src.extraEnd = src.end + UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
-
-               /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to
-                  the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */
-            while ((current = ucol_tok_parseNextToken(&src, startOfRules,&parseError, &status)) != NULL && U_SUCCESS(status)) {
-                strength = src.parsedToken.strength;
-                chOffset = src.parsedToken.charsOffset;
-                chLen = src.parsedToken.charsLen;
-                exOffset = src.parsedToken.extensionOffset;
-                exLen = src.parsedToken.extensionLen;
-                prefixOffset = src.parsedToken.prefixOffset;
-                prefixLen = src.parsedToken.prefixLen;
-                specs = src.parsedToken.flags;
-
-                startOfRules = FALSE;
-                uprv_memcpy(codepoints, src.source + chOffset,
-                                                       chLen * sizeof(UChar));
-                codepoints[chLen] = 0;
-                if(codepoints[0] == 0xFFFE) {
-                    /* Skip special merge-sort character U+FFFE which has otherwise illegal 02 weight bytes. */
-                    continue;
-                }
-                checkSortKeyValidity(coll, codepoints, chLen);
-            }
-            if (U_FAILURE(status)) {
-                log_err("%s collator, ucol_tok_parseNextToken failed with status %s\n", locale[count], u_errorName(status));
-            }
-            uprv_free(src.source);
-            uprv_free(src.reorderCodes);
-        }
-
-        ucol_close(coll);
-        count ++;
-    }
-    T_FileStream_close(file);
-}
-
 /**
 * TestSearchCollatorElements tests iterator behavior (forwards and backwards) with
 * normalization on AND jamo tailoring, among other things.
+*
+* Note: This test is sensitive to changes of the root collator,
+* for example whether the ae-ligature maps to three CEs (as in the DUCET)
+* or to two CEs (as in the CLDR 24 FractionalUCA.txt).
+* It is also sensitive to how those CEs map to the iterator's 32-bit CE encoding.
+* For example, the DUCET's artificial secondary CE in the ae-ligature
+* may map to two 32-bit iterator CEs (as it did until ICU 52).
 */
 static const UChar tsceText[] = {   /* Nothing in here should be ignorable */
     0x0020, 0xAC00,                 /* simple LV Hangul */
@@ -2089,7 +1145,7 @@ static const int32_t rootStandardOffsets[] = {
     12, 13,14,15,
     16, 17,18,19,
     20, 21,22,23,
-    24, 25,26,26,26,
+    24, 25,26,  /* plus another 1-2 offset=26 if ae-ligature maps to three CEs */
     26, 27,28,28,
     28,
     29
@@ -2105,7 +1161,7 @@ static const int32_t rootSearchOffsets[] = {
     12, 13,14,15,
     16, 17,18,19,20,
     20, 21,22,22,23,23,23,24,
-    24, 25,26,26,26,
+    24, 25,26,  /* plus another 1-2 offset=26 if ae-ligature maps to three CEs */
     26, 27,28,28,
     28,
     29
@@ -2142,6 +1198,7 @@ static void TestSearchCollatorElements(void)
                 do {
                     offset = ucol_getOffset(uce);
                     element = ucol_next(uce, &status);
+                    log_verbose("(%s) offset=%2d  ce=%08x\n", tsceItemPtr->locale, offset, element);
                     if ( element == 0 ) {
                         log_err("error, locale %s, ucol_next returned element 0\n", tsceItemPtr->locale );
                     }
index 849f6b58640dedbde0a7ce7a6fd8d92a59a2bf45..b4a778a65ffd2eff3110c3ab8c6d736b7669433b 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
- * COPYRIGHT: 
- * Copyright (c) 1997-2008,2011, International Business Machines Corporation and
+ * COPYRIGHT:
+ * Copyright (c) 1997-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 /********************************************************************************
@@ -80,28 +80,10 @@ static void TestBug672Normalize(void);
 */
 static void TestSmallBuffer(void);
 /**
-* Tests the CEs generated by the iterators.
-*/
-static void TestCEs(void);
-/**
 * Tests the discontiguos contractions
 */
 static void TestDiscontiguos(void);
 /**
-* Tests that the iterators bails out when the CEBuffer is exhausted
-*/
-static void TestCEBufferOverflow(void);
-/**
-* Tests the validity of CEs generated by the iterators.
-* Bound checkings.
-*/
-static void TestCEValidity(void);
-/**
-* Tests the validity of sortkeys generated by the iterators.
-* Bound checkings.
-*/
-static void TestSortKeyValidity(void);
-/**
 * TestSearchCollatorElements tests iterator behavior (forwards and backwards) with
 * normalization on AND jamo tailoring, among other things.
 */
index a0a3b660f801fba4492e479df3751b822847b346..361b18a1449bc13d36c8a12a958e5c7155752635 100644 (file)
@@ -29,7 +29,6 @@
 #include "unicode/ustring.h"
 #include "string.h"
 #include "ucol_imp.h"
-#include "ucol_tok.h"
 #include "cmemory.h"
 #include "cstring.h"
 #include "uassert.h"
@@ -413,1117 +412,6 @@ static void BillFairmanTest(void) {
     }
 }
 
-static void testPrimary(UCollator* col, const UChar* p,const UChar* q){
-    UChar source[256] = { '\0'};
-    UChar target[256] = { '\0'};
-    UChar preP = 0x31a3;
-    UChar preQ = 0x310d;
-/*
-    UChar preP = (*p>0x0400 && *p<0x0500)?0x00e1:0x491;
-    UChar preQ = (*p>0x0400 && *p<0x0500)?0x0041:0x413;
-*/
-    /*log_verbose("Testing primary\n");*/
-
-    doTest(col, p, q, UCOL_LESS);
-/*
-    UCollationResult result = ucol_strcoll(col,p,u_strlen(p),q,u_strlen(q));
-
-    if(result!=UCOL_LESS){
-       aescstrdup(p,utfSource,256);
-       aescstrdup(q,utfTarget,256);
-       fprintf(file,"Primary failed  source: %s target: %s \n", utfSource,utfTarget);
-    }
-*/
-    source[0] = preP;
-    u_strcpy(source+1,p);
-    target[0] = preQ;
-    u_strcpy(target+1,q);
-    doTest(col, source, target, UCOL_LESS);
-/*
-    fprintf(file,"Primary swamps 2nd failed  source: %s target: %s \n", utfSource,utfTarget);
-*/
-}
-
-static void testSecondary(UCollator* col, const UChar* p,const UChar* q){
-    UChar source[256] = { '\0'};
-    UChar target[256] = { '\0'};
-
-    /*log_verbose("Testing secondary\n");*/
-
-    doTest(col, p, q, UCOL_LESS);
-/*
-    fprintf(file,"secondary failed  source: %s target: %s \n", utfSource,utfTarget);
-*/
-    source[0] = 0x0053;
-    u_strcpy(source+1,p);
-    target[0]= 0x0073;
-    u_strcpy(target+1,q);
-
-    doTest(col, source, target, UCOL_LESS);
-/*
-    fprintf(file,"secondary swamps 3rd failed  source: %s target: %s \n",utfSource,utfTarget);
-*/
-
-
-    u_strcpy(source,p);
-    source[u_strlen(p)] = 0x62;
-    source[u_strlen(p)+1] = 0;
-
-
-    u_strcpy(target,q);
-    target[u_strlen(q)] = 0x61;
-    target[u_strlen(q)+1] = 0;
-
-    doTest(col, source, target, UCOL_GREATER);
-
-/*
-    fprintf(file,"secondary is swamped by 1  failed  source: %s target: %s \n",utfSource,utfTarget);
-*/
-}
-
-static void testTertiary(UCollator* col, const UChar* p,const UChar* q){
-    UChar source[256] = { '\0'};
-    UChar target[256] = { '\0'};
-
-    /*log_verbose("Testing tertiary\n");*/
-
-    doTest(col, p, q, UCOL_LESS);
-/*
-    fprintf(file,"Tertiary failed  source: %s target: %s \n",utfSource,utfTarget);
-*/
-    source[0] = 0x0020;
-    u_strcpy(source+1,p);
-    target[0]= 0x002D;
-    u_strcpy(target+1,q);
-
-    doTest(col, source, target, UCOL_LESS);
-/*
-    fprintf(file,"Tertiary swamps 4th failed  source: %s target: %s \n", utfSource,utfTarget);
-*/
-
-    u_strcpy(source,p);
-    source[u_strlen(p)] = 0xE0;
-    source[u_strlen(p)+1] = 0;
-
-    u_strcpy(target,q);
-    target[u_strlen(q)] = 0x61;
-    target[u_strlen(q)+1] = 0;
-
-    doTest(col, source, target, UCOL_GREATER);
-
-/*
-    fprintf(file,"Tertiary is swamped by 3rd failed  source: %s target: %s \n",utfSource,utfTarget);
-*/
-}
-
-static void testEquality(UCollator* col, const UChar* p,const UChar* q){
-/*
-    UChar source[256] = { '\0'};
-    UChar target[256] = { '\0'};
-*/
-
-    doTest(col, p, q, UCOL_EQUAL);
-/*
-    fprintf(file,"Primary failed  source: %s target: %s \n", utfSource,utfTarget);
-*/
-}
-
-static void testCollator(UCollator *coll, UErrorCode *status) {
-  const UChar *rules = NULL, *current = NULL;
-  int32_t ruleLen = 0;
-  uint32_t strength = 0;
-  uint32_t chOffset = 0; uint32_t chLen = 0;
-  uint32_t exOffset = 0; uint32_t exLen = 0;
-  uint32_t prefixOffset = 0; uint32_t prefixLen = 0;
-  uint32_t firstEx = 0;
-/*  uint32_t rExpsLen = 0; */
-  uint32_t firstLen = 0;
-  UBool varT = FALSE; UBool top_ = TRUE;
-  uint16_t specs = 0;
-  UBool startOfRules = TRUE;
-  UBool lastReset = FALSE;
-  UBool before = FALSE;
-  uint32_t beforeStrength = 0;
-  UColTokenParser src;
-  UColOptionSet opts;
-
-  UChar first[256];
-  UChar second[256];
-  UChar tempB[256];
-  uint32_t tempLen;
-  UChar *rulesCopy = NULL;
-  UParseError parseError;
-
-  uprv_memset(&src, 0, sizeof(UColTokenParser));
-
-  src.opts = &opts;
-
-  rules = ucol_getRules(coll, &ruleLen);
-  if(U_SUCCESS(*status) && ruleLen > 0) {
-    rulesCopy = (UChar *)uprv_malloc((ruleLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar));
-    uprv_memcpy(rulesCopy, rules, ruleLen*sizeof(UChar));
-    src.current = src.source = rulesCopy;
-    src.end = rulesCopy+ruleLen;
-    src.extraCurrent = src.end;
-    src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
-    *first = *second = 0;
-
-       /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to
-          the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */
-    while ((current = ucol_tok_parseNextToken(&src, startOfRules,&parseError, status)) != NULL) {
-      strength = src.parsedToken.strength;
-      chOffset = src.parsedToken.charsOffset;
-      chLen = src.parsedToken.charsLen;
-      exOffset = src.parsedToken.extensionOffset;
-      exLen = src.parsedToken.extensionLen;
-      prefixOffset = src.parsedToken.prefixOffset;
-      prefixLen = src.parsedToken.prefixLen;
-      specs = src.parsedToken.flags;
-
-      startOfRules = FALSE;
-      varT = (UBool)((specs & UCOL_TOK_VARIABLE_TOP) != 0);
-      (void)varT;    /* Suppress set but not used warning. */
-      top_ = (UBool)((specs & UCOL_TOK_TOP) != 0);
-      if(top_) { /* if reset is on top, the sequence is broken. We should have an empty string */
-        second[0] = 0;
-      } else {
-        u_strncpy(second,src.source+chOffset, chLen);
-        second[chLen] = 0;
-
-        if(exLen > 0 && firstEx == 0) {
-          u_strncat(first, src.source+exOffset, exLen);
-          first[firstLen+exLen] = 0;
-        }
-
-        if(lastReset == TRUE && prefixLen != 0) {
-          u_strncpy(first+prefixLen, first, firstLen);
-          u_strncpy(first, src.source+prefixOffset, prefixLen);
-          first[firstLen+prefixLen] = 0;
-          firstLen = firstLen+prefixLen;
-        }
-
-        if(before == TRUE) { /* swap first and second */
-          u_strcpy(tempB, first);
-          u_strcpy(first, second);
-          u_strcpy(second, tempB);
-
-          tempLen = firstLen;
-          firstLen = chLen;
-          chLen = tempLen;
-
-          tempLen = firstEx;
-          firstEx = exLen;
-          exLen = tempLen;
-          if(beforeStrength < strength) {
-            strength = beforeStrength;
-          }
-        }
-      }
-      lastReset = FALSE;
-
-      switch(strength){
-      case UCOL_IDENTICAL:
-          testEquality(coll,first,second);
-          break;
-      case UCOL_PRIMARY:
-          testPrimary(coll,first,second);
-          break;
-      case UCOL_SECONDARY:
-          testSecondary(coll,first,second);
-          break;
-      case UCOL_TERTIARY:
-          testTertiary(coll,first,second);
-          break;
-      case UCOL_TOK_RESET:
-        lastReset = TRUE;
-        before = (UBool)((specs & UCOL_TOK_BEFORE) != 0);
-        if(before) {
-          beforeStrength = (specs & UCOL_TOK_BEFORE)-1;
-        }
-        break;
-      default:
-          break;
-      }
-
-      if(before == TRUE && strength != UCOL_TOK_RESET) { /* first and second were swapped */
-        before = FALSE;
-      } else {
-        firstLen = chLen;
-        firstEx = exLen;
-        u_strcpy(first, second);
-      }
-    }
-    uprv_free(src.source);
-    uprv_free(src.reorderCodes);
-  }
-}
-
-static UCollationResult ucaTest(void *collator, const int object, const UChar *source, const int sLen, const UChar *target, const int tLen) {
-  UCollator *UCA = (UCollator *)collator;
-  return ucol_strcoll(UCA, source, sLen, target, tLen);
-}
-
-/*
-static UCollationResult winTest(void *collator, const int object, const UChar *source, const int sLen, const UChar *target, const int tLen) {
-#if U_PLATFORM_HAS_WIN32_API
-  LCID lcid = (LCID)collator;
-  return (UCollationResult)CompareString(lcid, 0, source, sLen, target, tLen);
-#else
-  return 0;
-#endif
-}
-*/
-
-static UCollationResult swampEarlier(tst_strcoll* func, void *collator, int opts,
-                                     UChar s1, UChar s2,
-                                     const UChar *s, const uint32_t sLen,
-                                     const UChar *t, const uint32_t tLen) {
-  UChar source[256] = {0};
-  UChar target[256] = {0};
-
-  source[0] = s1;
-  u_strcpy(source+1, s);
-  target[0] = s2;
-  u_strcpy(target+1, t);
-
-  return func(collator, opts, source, sLen+1, target, tLen+1);
-}
-
-static UCollationResult swampLater(tst_strcoll* func, void *collator, int opts,
-                                   UChar s1, UChar s2,
-                                   const UChar *s, const uint32_t sLen,
-                                   const UChar *t, const uint32_t tLen) {
-  UChar source[256] = {0};
-  UChar target[256] = {0};
-
-  u_strcpy(source, s);
-  source[sLen] = s1;
-  u_strcpy(target, t);
-  target[tLen] = s2;
-
-  return func(collator, opts, source, sLen+1, target, tLen+1);
-}
-
-static uint32_t probeStrength(tst_strcoll* func, void *collator, int opts,
-                              const UChar *s, const uint32_t sLen,
-                              const UChar *t, const uint32_t tLen,
-                              UCollationResult result) {
-  /*UChar fPrimary = 0x6d;*/
-  /*UChar sPrimary = 0x6e;*/
-  UChar fSecondary = 0x310d;
-  UChar sSecondary = 0x31a3;
-  UChar fTertiary = 0x310f;
-  UChar sTertiary = 0x31b7;
-
-  UCollationResult oposite;
-  if(result == UCOL_EQUAL) {
-    return UCOL_IDENTICAL;
-  } else if(result == UCOL_GREATER) {
-    oposite = UCOL_LESS;
-  } else {
-    oposite = UCOL_GREATER;
-  }
-
-  if(swampEarlier(func, collator, opts, sSecondary, fSecondary, s, sLen, t, tLen) == result) {
-    return UCOL_PRIMARY;
-  } else if((swampEarlier(func, collator, opts, sTertiary, 0x310f, s, sLen, t, tLen) == result) &&
-    (swampEarlier(func, collator, opts, 0x310f, sTertiary, s, sLen, t, tLen) == result)) {
-    return UCOL_SECONDARY;
-  } else if((swampLater(func, collator, opts, sTertiary, fTertiary, s, sLen, t, tLen) == result) &&
-    (swampLater(func, collator, opts, fTertiary, sTertiary, s, sLen, t, tLen) == result)) {
-    return UCOL_TERTIARY;
-  } else if((swampLater(func, collator, opts, sTertiary, 0x310f, s, sLen, t, tLen) == oposite) &&
-    (swampLater(func, collator, opts, fTertiary, sTertiary, s, sLen, t, tLen) == oposite)) {
-    return UCOL_QUATERNARY;
-  } else {
-    return UCOL_IDENTICAL;
-  }
-}
-
-static char *getRelationSymbol(UCollationResult res, uint32_t strength, char *buffer) {
-  uint32_t i = 0;
-
-  if(res == UCOL_EQUAL || strength == 0xdeadbeef) {
-    buffer[0] = '=';
-    buffer[1] = '=';
-    buffer[2] = '\0';
-  } else if(res == UCOL_GREATER) {
-    for(i = 0; i<strength+1; i++) {
-      buffer[i] = '>';
-    }
-    buffer[strength+1] = '\0';
-  } else {
-    for(i = 0; i<strength+1; i++) {
-      buffer[i] = '<';
-    }
-    buffer[strength+1] = '\0';
-  }
-
-  return buffer;
-}
-
-
-
-static void logFailure (const char *platform, const char *test,
-                        const UChar *source, const uint32_t sLen,
-                        const UChar *target, const uint32_t tLen,
-                        UCollationResult realRes, uint32_t realStrength,
-                        UCollationResult expRes, uint32_t expStrength, UBool error) {
-
-  uint32_t i = 0;
-
-  char sEsc[256], s[256], tEsc[256], t[256], b[256], output[512], relation[256];
-  static int32_t maxOutputLength = 0;
-  int32_t outputLength;
-
-  *sEsc = *tEsc = *s = *t = 0;
-  if(error == TRUE) {
-    log_err("Difference between expected and generated order. Run test with -v for more info\n");
-  } else if(getTestOption(VERBOSITY_OPTION) == 0) {
-    return;
-  }
-  for(i = 0; i<sLen; i++) {
-    sprintf(b, "%04X", source[i]);
-    strcat(sEsc, "\\u");
-    strcat(sEsc, b);
-    strcat(s, b);
-    strcat(s, " ");
-    if(source[i] < 0x80) {
-      sprintf(b, "(%c)", source[i]);
-      strcat(sEsc, b);
-    }
-  }
-  for(i = 0; i<tLen; i++) {
-    sprintf(b, "%04X", target[i]);
-    strcat(tEsc, "\\u");
-    strcat(tEsc, b);
-    strcat(t, b);
-    strcat(t, " ");
-    if(target[i] < 0x80) {
-      sprintf(b, "(%c)", target[i]);
-      strcat(tEsc, b);
-    }
-  }
-/*
-  strcpy(output, "[[ ");
-  strcat(output, sEsc);
-  strcat(output, getRelationSymbol(expRes, expStrength, relation));
-  strcat(output, tEsc);
-
-  strcat(output, " : ");
-
-  strcat(output, sEsc);
-  strcat(output, getRelationSymbol(realRes, realStrength, relation));
-  strcat(output, tEsc);
-  strcat(output, " ]] ");
-
-  log_verbose("%s", output);
-*/
-
-
-  strcpy(output, "DIFF: ");
-
-  strcat(output, s);
-  strcat(output, " : ");
-  strcat(output, t);
-
-  strcat(output, test);
-  strcat(output, ": ");
-
-  strcat(output, sEsc);
-  strcat(output, getRelationSymbol(expRes, expStrength, relation));
-  strcat(output, tEsc);
-
-  strcat(output, " ");
-
-  strcat(output, platform);
-  strcat(output, ": ");
-
-  strcat(output, sEsc);
-  strcat(output, getRelationSymbol(realRes, realStrength, relation));
-  strcat(output, tEsc);
-
-  outputLength = (int32_t)strlen(output);
-  if(outputLength > maxOutputLength) {
-    maxOutputLength = outputLength;
-    U_ASSERT(outputLength < sizeof(output));
-  }
-
-  log_verbose("%s\n", output);
-
-}
-
-/*
-static void printOutRules(const UChar *rules) {
-  uint32_t len = u_strlen(rules);
-  uint32_t i = 0;
-  char toPrint;
-  uint32_t line = 0;
-
-  fprintf(stdout, "Rules:");
-
-  for(i = 0; i<len; i++) {
-    if(rules[i]<0x7f && rules[i]>=0x20) {
-      toPrint = (char)rules[i];
-      if(toPrint == '&') {
-        line = 1;
-        fprintf(stdout, "\n&");
-      } else if(toPrint == ';') {
-        fprintf(stdout, "<<");
-        line+=2;
-      } else if(toPrint == ',') {
-        fprintf(stdout, "<<<");
-        line+=3;
-      } else {
-        fprintf(stdout, "%c", toPrint);
-        line++;
-      }
-    } else if(rules[i]<0x3400 || rules[i]>=0xa000) {
-      fprintf(stdout, "\\u%04X", rules[i]);
-      line+=6;
-    }
-    if(line>72) {
-      fprintf(stdout, "\n");
-      line = 0;
-    }
-  }
-
-  log_verbose("\n");
-
-}
-*/
-
-static uint32_t testSwitch(tst_strcoll* func, void *collator, int opts, uint32_t strength, const UChar *first, const UChar *second, const char* msg, UBool error) {
-  uint32_t diffs = 0;
-  UCollationResult realResult;
-  uint32_t realStrength;
-
-  uint32_t sLen = u_strlen(first);
-  uint32_t tLen = u_strlen(second);
-
-  realResult = func(collator, opts, first, sLen, second, tLen);
-  realStrength = probeStrength(func, collator, opts, first, sLen, second, tLen, realResult);
-
-  if(strength == UCOL_IDENTICAL && realResult != UCOL_EQUAL) {
-    logFailure(msg, "tailoring", first, sLen, second, tLen, realResult, realStrength, UCOL_EQUAL, strength, error);
-    diffs++;
-  } else if(realResult != UCOL_LESS || realStrength != strength) {
-    logFailure(msg, "tailoring", first, sLen, second, tLen, realResult, realStrength, UCOL_LESS, strength, error);
-    diffs++;
-  }
-  return diffs;
-}
-
-
-static void testAgainstUCA(UCollator *coll, UCollator *UCA, const char *refName, UBool error, UErrorCode *status) {
-  const UChar *rules = NULL, *current = NULL;
-  int32_t ruleLen = 0;
-  uint32_t strength = 0;
-  uint32_t chOffset = 0; uint32_t chLen = 0;
-  uint32_t exOffset = 0; uint32_t exLen = 0;
-  uint32_t prefixOffset = 0; uint32_t prefixLen = 0;
-/*  uint32_t rExpsLen = 0; */
-  uint32_t firstLen = 0, secondLen = 0;
-  UBool varT = FALSE; UBool top_ = TRUE;
-  uint16_t specs = 0;
-  UBool startOfRules = TRUE;
-  UColTokenParser src;
-  UColOptionSet opts;
-
-  UChar first[256];
-  UChar second[256];
-  UChar *rulesCopy = NULL;
-
-  uint32_t UCAdiff = 0;
-  uint32_t Windiff = 1;
-  UParseError parseError;
-
-  (void)top_;      /* Suppress set but not used warnings. */
-  (void)varT;
-  (void)secondLen;
-  (void)prefixLen;
-  (void)prefixOffset;
-
-  uprv_memset(&src, 0, sizeof(UColTokenParser));
-  src.opts = &opts;
-
-  rules = ucol_getRules(coll, &ruleLen);
-
-  /*printOutRules(rules);*/
-
-  if(U_SUCCESS(*status) && ruleLen > 0) {
-    rulesCopy = (UChar *)uprv_malloc((ruleLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar));
-    uprv_memcpy(rulesCopy, rules, ruleLen*sizeof(UChar));
-    src.current = src.source = rulesCopy;
-    src.end = rulesCopy+ruleLen;
-    src.extraCurrent = src.end;
-    src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
-    *first = *second = 0;
-
-    /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to
-       the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */
-    while ((current = ucol_tok_parseNextToken(&src, startOfRules, &parseError,status)) != NULL) {
-      strength = src.parsedToken.strength;
-      chOffset = src.parsedToken.charsOffset;
-      chLen = src.parsedToken.charsLen;
-      exOffset = src.parsedToken.extensionOffset;
-      exLen = src.parsedToken.extensionLen;
-      prefixOffset = src.parsedToken.prefixOffset;
-      prefixLen = src.parsedToken.prefixLen;
-      specs = src.parsedToken.flags;
-
-      startOfRules = FALSE;
-      varT = (UBool)((specs & UCOL_TOK_VARIABLE_TOP) != 0);
-      top_ = (UBool)((specs & UCOL_TOK_TOP) != 0);
-
-      u_strncpy(second,src.source+chOffset, chLen);
-      second[chLen] = 0;
-      secondLen = chLen;
-
-      if(exLen > 0) {
-        u_strncat(first, src.source+exOffset, exLen);
-        first[firstLen+exLen] = 0;
-        firstLen += exLen;
-      }
-
-      if(strength != UCOL_TOK_RESET) {
-        if((*first<0x3400 || *first>=0xa000) && (*second<0x3400 || *second>=0xa000)) {
-          UCAdiff += testSwitch(&ucaTest, (void *)UCA, 0, strength, first, second, refName, error);
-          /*Windiff += testSwitch(&winTest, (void *)lcid, 0, strength, first, second, "Win32");*/
-        }
-      }
-
-
-      firstLen = chLen;
-      u_strcpy(first, second);
-
-    }
-    if(UCAdiff != 0 && Windiff != 0) {
-      log_verbose("\n");
-    }
-    if(UCAdiff == 0) {
-      log_verbose("No immediate difference with %s!\n", refName);
-    }
-    if(Windiff == 0) {
-      log_verbose("No immediate difference with Win32!\n");
-    }
-    uprv_free(src.source);
-    uprv_free(src.reorderCodes);
-  }
-}
-
-/*
- * Takes two CEs (lead and continuation) and
- * compares them as CEs should be compared:
- * primary vs. primary, secondary vs. secondary
- * tertiary vs. tertiary
- */
-static int32_t compareCEs(uint32_t s1, uint32_t s2,
-                   uint32_t t1, uint32_t t2) {
-  uint32_t s = 0, t = 0;
-  if(s1 == t1 && s2 == t2) {
-    return 0;
-  }
-  s = (s1 & 0xFFFF0000)|((s2 & 0xFFFF0000)>>16);
-  t = (t1 & 0xFFFF0000)|((t2 & 0xFFFF0000)>>16);
-  if(s < t) {
-    return -1;
-  } else if(s > t) {
-    return 1;
-  } else {
-    s = (s1 & 0x0000FF00) | (s2 & 0x0000FF00)>>8;
-    t = (t1 & 0x0000FF00) | (t2 & 0x0000FF00)>>8;
-    if(s < t) {
-      return -1;
-    } else if(s > t) {
-      return 1;
-    } else {
-      s = (s1 & 0x000000FF)<<8 | (s2 & 0x000000FF);
-      t = (t1 & 0x000000FF)<<8 | (t2 & 0x000000FF);
-      if(s < t) {
-        return -1;
-      } else {
-        return 1;
-      }
-    }
-  }
-}
-
-typedef struct {
-  uint32_t startCE;
-  uint32_t startContCE;
-  uint32_t limitCE;
-  uint32_t limitContCE;
-} indirectBoundaries;
-
-/* these values are used for finding CE values for indirect positioning. */
-/* Indirect positioning is a mechanism for allowing resets on symbolic   */
-/* values. It only works for resets and you cannot tailor indirect names */
-/* An indirect name can define either an anchor point or a range. An     */
-/* anchor point behaves in exactly the same way as a code point in reset */
-/* would, except that it cannot be tailored. A range (we currently only  */
-/* know for the [top] range will explicitly set the upper bound for      */
-/* generated CEs, thus allowing for better control over how many CEs can */
-/* be squeezed between in the range without performance penalty.         */
-/* In that respect, we use [top] for tailoring of locales that use CJK   */
-/* characters. Other indirect values are currently a pure convenience,   */
-/* they can be used to assure that the CEs will be always positioned in  */
-/* the same place relative to a point with known properties (e.g. first  */
-/* primary ignorable). */
-static indirectBoundaries ucolIndirectBoundaries[15];
-static UBool indirectBoundariesSet = FALSE;
-static void setIndirectBoundaries(uint32_t indexR, uint32_t *start, uint32_t *end) {
-    /* Set values for the top - TODO: once we have values for all the indirects, we are going */
-    /* to initalize here. */
-    ucolIndirectBoundaries[indexR].startCE = start[0];
-    ucolIndirectBoundaries[indexR].startContCE = start[1];
-    if(end) {
-        ucolIndirectBoundaries[indexR].limitCE = end[0];
-        ucolIndirectBoundaries[indexR].limitContCE = end[1];
-    } else {
-        ucolIndirectBoundaries[indexR].limitCE = 0;
-        ucolIndirectBoundaries[indexR].limitContCE = 0;
-    }
-}
-
-static void testCEs(UCollator *coll, UErrorCode *status) {
-    const UChar *rules = NULL, *current = NULL;
-    int32_t ruleLen = 0;
-
-    uint32_t strength = 0;
-    uint32_t maxStrength = UCOL_IDENTICAL;
-    uint32_t baseCE, baseContCE, nextCE, nextContCE, currCE, currContCE;
-    uint32_t lastCE;
-    uint32_t lastContCE;
-
-    int32_t result = 0;
-    uint32_t chOffset = 0; uint32_t chLen = 0;
-    uint32_t exOffset = 0; uint32_t exLen = 0;
-    uint32_t prefixOffset = 0; uint32_t prefixLen = 0;
-    uint32_t oldOffset = 0;
-
-    /* uint32_t rExpsLen = 0; */
-    /* uint32_t firstLen = 0; */
-    uint16_t specs = 0;
-    UBool varT = FALSE; UBool top_ = TRUE;
-    UBool startOfRules = TRUE;
-    UBool before = FALSE;
-    UColTokenParser src;
-    UColOptionSet opts;
-    UParseError parseError;
-    UChar *rulesCopy = NULL;
-    collIterate *c = uprv_new_collIterate(status);
-    UCAConstants *consts = NULL;
-    uint32_t UCOL_RESET_TOP_VALUE, /*UCOL_RESET_TOP_CONT, */
-        UCOL_NEXT_TOP_VALUE, UCOL_NEXT_TOP_CONT;
-    const char *colLoc;
-    UCollator *UCA = ucol_open("root", status);
-
-    (void)varT;             /* Suppress set but not used warnings. */
-    (void)prefixLen;
-    (void)prefixOffset;
-    (void)exLen;
-    (void)exOffset;
-
-    if (U_FAILURE(*status)) {
-        log_err("Could not open root collator %s\n", u_errorName(*status));
-        uprv_delete_collIterate(c);
-        return;
-    }
-
-    colLoc = ucol_getLocaleByType(coll, ULOC_ACTUAL_LOCALE, status);
-    if (U_FAILURE(*status)) {
-        log_err("Could not get collator name: %s\n", u_errorName(*status));
-        ucol_close(UCA);
-        uprv_delete_collIterate(c);
-        return;
-    }
-
-    uprv_memset(&src, 0, sizeof(UColTokenParser));
-
-    consts = (UCAConstants *)((uint8_t *)UCA->image + UCA->image->UCAConsts);
-    UCOL_RESET_TOP_VALUE = consts->UCA_LAST_NON_VARIABLE[0];
-    /*UCOL_RESET_TOP_CONT = consts->UCA_LAST_NON_VARIABLE[1]; */
-    UCOL_NEXT_TOP_VALUE = consts->UCA_FIRST_IMPLICIT[0];
-    UCOL_NEXT_TOP_CONT = consts->UCA_FIRST_IMPLICIT[1];
-
-    baseCE=baseContCE=nextCE=nextContCE=currCE=currContCE=lastCE=lastContCE = UCOL_NOT_FOUND;
-
-    src.opts = &opts;
-
-    rules = ucol_getRules(coll, &ruleLen);
-
-    src.invUCA = ucol_initInverseUCA(status);
-
-    if(indirectBoundariesSet == FALSE) {
-        /* UCOL_RESET_TOP_VALUE */
-        setIndirectBoundaries(0, consts->UCA_LAST_NON_VARIABLE, consts->UCA_FIRST_IMPLICIT);
-        /* UCOL_FIRST_PRIMARY_IGNORABLE */
-        setIndirectBoundaries(1, consts->UCA_FIRST_PRIMARY_IGNORABLE, 0);
-        /* UCOL_LAST_PRIMARY_IGNORABLE */
-        setIndirectBoundaries(2, consts->UCA_LAST_PRIMARY_IGNORABLE, 0);
-        /* UCOL_FIRST_SECONDARY_IGNORABLE */
-        setIndirectBoundaries(3, consts->UCA_FIRST_SECONDARY_IGNORABLE, 0);
-        /* UCOL_LAST_SECONDARY_IGNORABLE */
-        setIndirectBoundaries(4, consts->UCA_LAST_SECONDARY_IGNORABLE, 0);
-        /* UCOL_FIRST_TERTIARY_IGNORABLE */
-        setIndirectBoundaries(5, consts->UCA_FIRST_TERTIARY_IGNORABLE, 0);
-        /* UCOL_LAST_TERTIARY_IGNORABLE */
-        setIndirectBoundaries(6, consts->UCA_LAST_TERTIARY_IGNORABLE, 0);
-        /* UCOL_FIRST_VARIABLE */
-        setIndirectBoundaries(7, consts->UCA_FIRST_VARIABLE, 0);
-        /* UCOL_LAST_VARIABLE */
-        setIndirectBoundaries(8, consts->UCA_LAST_VARIABLE, 0);
-        /* UCOL_FIRST_NON_VARIABLE */
-        setIndirectBoundaries(9, consts->UCA_FIRST_NON_VARIABLE, 0);
-        /* UCOL_LAST_NON_VARIABLE */
-        setIndirectBoundaries(10, consts->UCA_LAST_NON_VARIABLE, consts->UCA_FIRST_IMPLICIT);
-        /* UCOL_FIRST_IMPLICIT */
-        setIndirectBoundaries(11, consts->UCA_FIRST_IMPLICIT, 0);
-        /* UCOL_LAST_IMPLICIT */
-        setIndirectBoundaries(12, consts->UCA_LAST_IMPLICIT, consts->UCA_FIRST_TRAILING);
-        /* UCOL_FIRST_TRAILING */
-        setIndirectBoundaries(13, consts->UCA_FIRST_TRAILING, 0);
-        /* UCOL_LAST_TRAILING */
-        setIndirectBoundaries(14, consts->UCA_LAST_TRAILING, 0);
-        ucolIndirectBoundaries[14].limitCE = (consts->UCA_PRIMARY_SPECIAL_MIN<<24);
-        indirectBoundariesSet = TRUE;
-    }
-
-
-    if(U_SUCCESS(*status) && ruleLen > 0) {
-        rulesCopy = (UChar *)uprv_malloc((ruleLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar));
-        uprv_memcpy(rulesCopy, rules, ruleLen*sizeof(UChar));
-        src.current = src.source = rulesCopy;
-        src.end = rulesCopy+ruleLen;
-        src.extraCurrent = src.end;
-        src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
-
-           /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to
-              the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */
-        while ((current = ucol_tok_parseNextToken(&src, startOfRules, &parseError,status)) != NULL) {
-            strength = src.parsedToken.strength;
-            chOffset = src.parsedToken.charsOffset;
-            chLen = src.parsedToken.charsLen;
-            exOffset = src.parsedToken.extensionOffset;
-            exLen = src.parsedToken.extensionLen;
-            prefixOffset = src.parsedToken.prefixOffset;
-            prefixLen = src.parsedToken.prefixLen;
-            specs = src.parsedToken.flags;
-
-            startOfRules = FALSE;
-            varT = (UBool)((specs & UCOL_TOK_VARIABLE_TOP) != 0);
-            top_ = (UBool)((specs & UCOL_TOK_TOP) != 0);
-
-            uprv_init_collIterate(coll, src.source+chOffset, chLen, c, status);
-
-            currCE = ucol_getNextCE(coll, c, status);
-            if(currCE == 0 && UCOL_ISTHAIPREVOWEL(*(src.source+chOffset))) {
-                log_verbose("Thai prevowel detected. Will pick next CE\n");
-                currCE = ucol_getNextCE(coll, c, status);
-            }
-
-            currContCE = ucol_getNextCE(coll, c, status);
-            if(!isContinuation(currContCE)) {
-                currContCE = 0;
-            }
-
-            /* we need to repack CEs here */
-
-            if(strength == UCOL_TOK_RESET) {
-                before = (UBool)((specs & UCOL_TOK_BEFORE) != 0);
-                if(top_ == TRUE) {
-                    int32_t tokenIndex = src.parsedToken.indirectIndex;
-
-                    nextCE = baseCE = currCE = ucolIndirectBoundaries[tokenIndex].startCE;
-                    nextContCE = baseContCE = currContCE = ucolIndirectBoundaries[tokenIndex].startContCE;
-                } else {
-                    nextCE = baseCE = currCE;
-                    nextContCE = baseContCE = currContCE;
-                }
-                maxStrength = UCOL_IDENTICAL;
-            } else {
-                if(strength < maxStrength) {
-                    maxStrength = strength;
-                    if(baseCE == UCOL_RESET_TOP_VALUE) {
-                        log_verbose("Resetting to [top]\n");
-                        nextCE = UCOL_NEXT_TOP_VALUE;
-                        nextContCE = UCOL_NEXT_TOP_CONT;
-                    } else {
-                        result = ucol_inv_getNextCE(&src, baseCE & 0xFFFFFF3F, baseContCE, &nextCE, &nextContCE, maxStrength);
-                    }
-                    if(result < 0) {
-                        if(ucol_isTailored(coll, *(src.source+oldOffset), status)) {
-                            log_verbose("Reset is tailored codepoint %04X, don't know how to continue, taking next test\n", *(src.source+oldOffset));
-                            return;
-                        } else {
-                            log_err("%s: couldn't find the CE\n", colLoc);
-                            return;
-                        }
-                    }
-                }
-
-                currCE &= 0xFFFFFF3F;
-                currContCE &= 0xFFFFFFBF;
-
-                if(maxStrength == UCOL_IDENTICAL) {
-                    if(baseCE != currCE || baseContCE != currContCE) {
-                        log_err("%s: current CE  (initial strength UCOL_EQUAL)\n", colLoc);
-                    }
-                } else {
-                    if(strength == UCOL_IDENTICAL) {
-                        if(lastCE != currCE || lastContCE != currContCE) {
-                            log_err("%s: current CE  (initial strength UCOL_EQUAL)\n", colLoc);
-                        }
-                    } else {
-                        if(compareCEs(currCE, currContCE, nextCE, nextContCE) > 0) {
-                            /*if(currCE > nextCE || (currCE == nextCE && currContCE >= nextContCE)) {*/
-                            log_err("%s: current CE is not less than base CE\n", colLoc);
-                        }
-                        if(!before) {
-                            if(compareCEs(currCE, currContCE, lastCE, lastContCE) < 0) {
-                                /*if(currCE < lastCE || (currCE == lastCE && currContCE <= lastContCE)) {*/
-                                log_err("%s: sequence of generated CEs is broken\n", colLoc);
-                            }
-                        } else {
-                            before = FALSE;
-                            if(compareCEs(currCE, currContCE, lastCE, lastContCE) > 0) {
-                                /*if(currCE < lastCE || (currCE == lastCE && currContCE <= lastContCE)) {*/
-                                log_err("%s: sequence of generated CEs is broken\n", colLoc);
-                            }
-                        }
-                    }
-                }
-
-            }
-
-            oldOffset = chOffset;
-            lastCE = currCE & 0xFFFFFF3F;
-            lastContCE = currContCE & 0xFFFFFFBF;
-        }
-        uprv_free(src.source);
-        uprv_free(src.reorderCodes);
-    }
-    ucol_close(UCA);
-    uprv_delete_collIterate(c);
-}
-
-#if 0
-/* these locales are now picked from index RB */
-static const char* localesToTest[] = {
-"ar", "bg", "ca", "cs", "da",
-"el", "en_BE", "en_US_POSIX",
-"es", "et", "fi", "fr", "hi",
-"hr", "hu", "is", "iw", "ja",
-"ko", "lt", "lv", "mk", "mt",
-"nb", "nn", "nn_NO", "pl", "ro",
-"ru", "sh", "sk", "sl", "sq",
-"sr", "sv", "th", "tr", "uk",
-"vi", "zh", "zh_TW"
-};
-#endif
-
-static const char* rulesToTest[] = {
-  /* Funky fa rule */
-  "&\\u0622 < \\u0627 << \\u0671 < \\u0621",
-  /*"& Z < p, P",*/
-    /* Cui Mins rules */
-    "&[top]<o,O<p,P<q,Q<'?'/u<r,R<u,U", /*"<o,O<p,P<q,Q<r,R<u,U & Qu<'?'",*/
-    "&[top]<o,O<p,P<q,Q;'?'/u<r,R<u,U", /*"<o,O<p,P<q,Q<r,R<u,U & Qu;'?'",*/
-    "&[top]<o,O<p,P<q,Q,'?'/u<r,R<u,U", /*"<o,O<p,P<q,Q<r,R<u,U&'Qu','?'",*/
-    "&[top]<3<4<5<c,C<f,F<m,M<o,O<p,P<q,Q;'?'/u<r,R<u,U",  /*"<'?'<3<4<5<a,A<f,F<m,M<o,O<p,P<q,Q<r,R<u,U & Qu;'?'",*/
-    "&[top]<'?';Qu<3<4<5<c,C<f,F<m,M<o,O<p,P<q,Q<r,R<u,U",  /*"<'?'<3<4<5<a,A<f,F<m,M<o,O<p,P<q,Q<r,R<u,U & '?';Qu",*/
-    "&[top]<3<4<5<c,C<f,F<m,M<o,O<p,P<q,Q;'?'/um<r,R<u,U", /*"<'?'<3<4<5<a,A<f,F<m,M<o,O<p,P<q,Q<r,R<u,U & Qum;'?'",*/
-    "&[top]<'?';Qum<3<4<5<c,C<f,F<m,M<o,O<p,P<q,Q<r,R<u,U"  /*"<'?'<3<4<5<a,A<f,F<m,M<o,O<p,P<q,Q<r,R<u,U & '?';Qum"*/
-};
-
-
-static void TestCollations(void) {
-    int32_t noOfLoc = uloc_countAvailable();
-    int32_t i = 0, j = 0;
-
-    UErrorCode status = U_ZERO_ERROR;
-    char cName[256];
-    UChar name[256];
-    int32_t nameSize;
-
-
-    const char *locName = NULL;
-    UCollator *coll = NULL;
-    UCollator *UCA = ucol_open("", &status);
-    UColAttributeValue oldStrength = ucol_getAttribute(UCA, UCOL_STRENGTH, &status);
-    if (U_FAILURE(status)) {
-        log_err_status(status, "Could not open UCA collator %s\n", u_errorName(status));
-        return;
-    }
-    ucol_setAttribute(UCA, UCOL_STRENGTH, UCOL_QUATERNARY, &status);
-
-    for(i = 0; i<noOfLoc; i++) {
-        status = U_ZERO_ERROR;
-        locName = uloc_getAvailable(i);
-        if(uprv_strcmp("ja", locName) == 0) {
-            log_verbose("Don't know how to test prefixes\n");
-            continue;
-        }
-        if(hasCollationElements(locName)) {
-            nameSize = uloc_getDisplayName(locName, NULL, name, 256, &status);
-            for(j = 0; j<nameSize; j++) {
-                cName[j] = (char)name[j];
-            }
-            cName[nameSize] = 0;
-            log_verbose("\nTesting locale %s (%s)\n", locName, cName);
-            coll = ucol_open(locName, &status);
-            if(U_SUCCESS(status)) {
-                testAgainstUCA(coll, UCA, "UCA", FALSE, &status);
-                ucol_close(coll);
-            } else {
-                log_err("Couldn't instantiate collator for locale %s, error: %s\n", locName, u_errorName(status));
-                status = U_ZERO_ERROR;
-            }
-        }
-    }
-    ucol_setAttribute(UCA, UCOL_STRENGTH, oldStrength, &status);
-    ucol_close(UCA);
-}
-
-static void RamsRulesTest(void) {
-    UErrorCode status = U_ZERO_ERROR;
-    int32_t i = 0;
-    UCollator *coll = NULL;
-    UChar rule[2048];
-    uint32_t ruleLen;
-    int32_t noOfLoc = uloc_countAvailable();
-    const char *locName = NULL;
-
-    log_verbose("RamsRulesTest\n");
-
-    if (uprv_strcmp("km", uloc_getDefault())==0 || uprv_strcmp("km_KH", uloc_getDefault())==0) {
-        /* This test will fail if the default locale is "km" or "km_KH". Enable after trac#6040. */
-        return;
-    }
-
-    for(i = 0; i<noOfLoc; i++) {
-        locName = uloc_getAvailable(i);
-        if(hasCollationElements(locName)) {
-            if (uprv_strcmp("ja", locName)==0) {
-                log_verbose("Don't know how to test Japanese because of prefixes\n");
-                continue;
-            }
-            if (uprv_strcmp("de__PHONEBOOK", locName)==0) {
-                log_verbose("Don't know how to test Phonebook because the reset is on an expanding character\n");
-                continue;
-            }
-            if (uprv_strcmp("bn", locName)==0 ||
-                uprv_strcmp("bs", locName)==0 ||            /* Add due to import per cldrbug 5647 */
-                uprv_strcmp("bs_Cyrl", locName)==0 ||       /* Add due to import per cldrbug 5647 */
-                uprv_strcmp("en_US_POSIX", locName)==0 ||
-                uprv_strcmp("fa", locName)==0 ||            /* Add in #10222 with CLDR 24 integration */
-                uprv_strcmp("fa_AF", locName)==0 ||         /* Add due to import per cldrbug 5647 */
-                uprv_strcmp("gl", locName)==0 ||            /* Add due to import per cldrbug 5647 */
-                uprv_strcmp("gl_ES", locName)==0 ||         /* Add due to import per cldrbug 5647 */
-                uprv_strcmp("he", locName)==0 ||            /* Add due to new tailoring of \u05F3 vs \u0027 per cldrbug 5576 */
-                uprv_strcmp("he_IL", locName)==0 ||         /* Add due to new tailoring of \u05F3 vs \u0027 per cldrbug 5576 */
-                uprv_strcmp("km", locName)==0 ||
-                uprv_strcmp("km_KH", locName)==0 ||
-                uprv_strcmp("my", locName)==0 ||
-                uprv_strcmp("ps", locName)==0 ||            /* Add in #10222 with CLDR 24 integration */
-                uprv_strcmp("si", locName)==0 ||
-                uprv_strcmp("si_LK", locName)==0 ||
-                uprv_strcmp("sr_Latn", locName)==0 ||       /* Add due to import per cldrbug 5647 */
-                uprv_strcmp("th", locName)==0 ||
-                uprv_strcmp("th_TH", locName)==0 ||
-                uprv_strcmp("zh", locName)==0 ||
-                uprv_strcmp("zh_Hant", locName)==0
-            ) {
-              if(log_knownIssue("6040", NULL)) {
-                log_verbose("Can't test %s - TODO: Fix ticket #6040 and reenable RamsRulesTest for this locale.\n", locName);
-                continue;
-              }
-            }
-            log_verbose("Testing locale %s\n", locName);
-            status = U_ZERO_ERROR;
-            coll = ucol_open(locName, &status);
-            if(U_SUCCESS(status)) {
-              if((status != U_USING_DEFAULT_WARNING) && (status != U_USING_FALLBACK_WARNING)) {
-                if(coll->image->jamoSpecial == TRUE) {
-                  log_err("%s has special JAMOs\n", locName);
-                }
-                ucol_setAttribute(coll, UCOL_CASE_FIRST, UCOL_OFF, &status);
-                testCollator(coll, &status);
-                testCEs(coll, &status);
-              } else {
-                log_verbose("Skipping %s: %s\n", locName, u_errorName(status));
-              }
-              ucol_close(coll);
-            } else {
-              log_err("Could not open %s: %s\n", locName, u_errorName(status));
-            }
-        }
-    }
-
-    for(i = 0; i<sizeof(rulesToTest)/sizeof(rulesToTest[0]); i++) {
-        log_verbose("Testing rule: %s\n", rulesToTest[i]);
-        ruleLen = u_unescape(rulesToTest[i], rule, 2048);
-        status = U_ZERO_ERROR;
-        coll = ucol_openRules(rule, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
-        if(U_SUCCESS(status)) {
-            testCollator(coll, &status);
-            testCEs(coll, &status);
-            ucol_close(coll);
-        } else {
-          log_err_status(status, "Could not test rule: %s: '%s'\n", u_errorName(status), rulesToTest[i]);
-        }
-    }
-
-}
-
-static void IsTailoredTest(void) {
-    UErrorCode status = U_ZERO_ERROR;
-    uint32_t i = 0;
-    UCollator *coll = NULL;
-    UChar rule[2048];
-    UChar tailored[2048];
-    UChar notTailored[2048];
-    uint32_t ruleLen, tailoredLen, notTailoredLen;
-
-    log_verbose("IsTailoredTest\n");
-
-    u_uastrcpy(rule, "&Z < A, B, C;c < d");
-    ruleLen = u_strlen(rule);
-
-    u_uastrcpy(tailored, "ABCcd");
-    tailoredLen = u_strlen(tailored);
-
-    u_uastrcpy(notTailored, "ZabD");
-    notTailoredLen = u_strlen(notTailored);
-
-    coll = ucol_openRules(rule, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
-    if(U_SUCCESS(status)) {
-        for(i = 0; i<tailoredLen; i++) {
-            if(!ucol_isTailored(coll, tailored[i], &status)) {
-                log_err("%i: %04X should be tailored - it is reported as not\n", i, tailored[i]);
-            }
-        }
-        for(i = 0; i<notTailoredLen; i++) {
-            if(ucol_isTailored(coll, notTailored[i], &status)) {
-                log_err("%i: %04X should not be tailored - it is reported as it is\n", i, notTailored[i]);
-            }
-        }
-        ucol_close(coll);
-    }
-    else {
-        log_err_status(status, "Can't tailor rules\n");
-    }
-    /* Code coverage */
-    status = U_ZERO_ERROR;
-    coll = ucol_open("ja", &status);
-    if(!ucol_isTailored(coll, 0x4E9C, &status)) {
-        log_err_status(status, "0x4E9C should be tailored - it is reported as not\n");
-    }
-    ucol_close(coll);
-}
-
-
 const static char chTest[][20] = {
   "c",
   "C",
@@ -1591,7 +479,12 @@ static void TestImplicitTailoring(void) {
     const char *data[10];
     const uint32_t len;
   } tests[] = {
-      { "&[before 1]\\u4e00 < b < c &[before 1]\\u4e00 < d < e", { "d", "e", "b", "c", "\\u4e00"}, 5 },
+      {
+        /* Tailor b and c before U+4E00. */
+        "&[before 1]\\u4e00 < b < c "
+        /* Now, before U+4E00 is c; put d and e after that. */
+        "&[before 1]\\u4e00 < d < e",
+        { "b", "c", "d", "e", "\\u4e00"}, 5 },
       { "&\\u4e00 < a <<< A < b <<< B",   { "\\u4e00", "a", "A", "b", "B", "\\u4e01"}, 6 },
       { "&[before 1]\\u4e00 < \\u4e01 < \\u4e02", { "\\u4e01", "\\u4e02", "\\u4e00"}, 3},
       { "&[before 1]\\u4e01 < \\u4e02 < \\u4e03", { "\\u4e02", "\\u4e03", "\\u4e01"}, 3}
@@ -1936,205 +829,6 @@ static void TestJ815(void) {
 }
 
 
-/*
-"& a < b < c < d& r < c",                                   "& a < b < d& r < c",
-"& a < b < c < d& c < m",                                   "& a < b < c < m < d",
-"& a < b < c < d& a < m",                                   "& a < m < b < c < d",
-"& a <<< b << c < d& a < m",                                "& a <<< b << c < m < d",
-"& a < b < c < d& [before 1] c < m",                        "& a < b < m < c < d",
-"& a < b <<< c << d <<< e& [before 3] e <<< x",            "& a < b <<< c << d <<< x <<< e",
-"& a < b <<< c << d <<< e& [before 2] e <<< x",            "& a < b <<< c <<< x << d <<< e",
-"& a < b <<< c << d <<< e& [before 1] e <<< x",            "& a <<< x < b <<< c << d <<< e",
-"& a < b <<< c << d <<< e <<< f < g& [before 1] g < x",    "& a < b <<< c << d <<< e <<< f < x < g",
-*/
-static void TestRedundantRules(void) {
-  int32_t i;
-
-  static const struct {
-      const char *rules;
-      const char *expectedRules;
-      const char *testdata[8];
-      uint32_t testdatalen;
-  } tests[] = {
-    /* this test conflicts with positioning of CODAN placeholder */
-       /*{
-        "& a <<< b <<< c << d <<< e& [before 1] e <<< x",
-        "&\\u2089<<<x",
-        {"\\u2089", "x"}, 2
-       }, */
-    /* this test conflicts with the [before x] syntax tightening */
-      /*{
-        "& b <<< c <<< d << e <<< f& [before 1] f <<< x",
-        "&\\u0252<<<x",
-        {"\\u0252", "x"}, 2
-      }, */
-    /* this test conflicts with the [before x] syntax tightening */
-      /*{
-         "& a < b <<< c << d <<< e& [before 1] e <<< x",
-         "& a <<< x < b <<< c << d <<< e",
-        {"a", "x", "b", "c", "d", "e"}, 6
-      }, */
-      {
-        "& a < b < c < d& [before 1] c < m",
-        "& a < b < m < c < d",
-        {"a", "b", "m", "c", "d"}, 5
-      },
-      {
-        "& a < b <<< c << d <<< e& [before 3] e <<< x",
-        "& a < b <<< c << d <<< x <<< e",
-        {"a", "b", "c", "d", "x", "e"}, 6
-      },
-    /* this test conflicts with the [before x] syntax tightening */
-      /* {
-        "& a < b <<< c << d <<< e& [before 2] e <<< x",
-        "& a < b <<< c <<< x << d <<< e",
-        {"a", "b", "c", "x", "d", "e"},, 6
-      }, */
-      {
-        "& a < b <<< c << d <<< e <<< f < g& [before 1] g < x",
-        "& a < b <<< c << d <<< e <<< f < x < g",
-        {"a", "b", "c", "d", "e", "f", "x", "g"}, 8
-      },
-      {
-        "& a <<< b << c < d& a < m",
-        "& a <<< b << c < m < d",
-        {"a", "b", "c", "m", "d"}, 5
-      },
-      {
-        "&a<b<<b\\u0301 &z<b",
-        "&a<b\\u0301 &z<b",
-        {"a", "b\\u0301", "z", "b"}, 4
-      },
-      {
-        "&z<m<<<q<<<m",
-        "&z<q<<<m",
-        {"z", "q", "m"},3
-      },
-      {
-        "&z<<<m<q<<<m",
-        "&z<q<<<m",
-        {"z", "q", "m"}, 3
-      },
-      {
-        "& a < b < c < d& r < c",
-        "& a < b < d& r < c",
-        {"a", "b", "d"}, 3
-      },
-      {
-        "& a < b < c < d& r < c",
-        "& a < b < d& r < c",
-        {"r", "c"}, 2
-      },
-      {
-        "& a < b < c < d& c < m",
-        "& a < b < c < m < d",
-        {"a", "b", "c", "m", "d"}, 5
-      },
-      {
-        "& a < b < c < d& a < m",
-        "& a < m < b < c < d",
-        {"a", "m", "b", "c", "d"}, 5
-      }
-  };
-
-
-  UCollator *credundant = NULL;
-  UCollator *cresulting = NULL;
-  UErrorCode status = U_ZERO_ERROR;
-  UChar rlz[2048] = { 0 };
-  uint32_t rlen = 0;
-
-  for(i = 0; i<sizeof(tests)/sizeof(tests[0]); i++) {
-    log_verbose("testing rule %s, expected to be %s\n", tests[i].rules, tests[i].expectedRules);
-    rlen = u_unescape(tests[i].rules, rlz, 2048);
-
-    credundant = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT, NULL,&status);
-    if(status == U_FILE_ACCESS_ERROR) {
-      log_data_err("Is your data around?\n");
-      return;
-    } else if(U_FAILURE(status)) {
-      log_err("Error opening collator\n");
-      return;
-    }
-
-    rlen = u_unescape(tests[i].expectedRules, rlz, 2048);
-    cresulting = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT, NULL,&status);
-
-    testAgainstUCA(cresulting, credundant, "expected", TRUE, &status);
-
-    ucol_close(credundant);
-    ucol_close(cresulting);
-
-    log_verbose("testing using data\n");
-
-    genericRulesStarter(tests[i].rules, tests[i].testdata, tests[i].testdatalen);
-  }
-
-}
-
-static void TestExpansionSyntax(void) {
-  int32_t i;
-
-  const static char *rules[] = {
-    "&AE <<< a << b <<< c &d <<< f",
-    "&AE <<< a <<< b << c << d < e < f <<< g",
-    "&AE <<< B <<< C / D <<< F"
-  };
-
-  const static char *expectedRules[] = {
-    "&A <<< a / E << b / E <<< c /E  &d <<< f",
-    "&A <<< a / E <<< b / E << c / E << d / E < e < f <<< g",
-    "&A <<< B / E <<< C / ED <<< F / E"
-  };
-
-  const static char *testdata[][8] = {
-    {"AE", "a", "b", "c"},
-    {"AE", "a", "b", "c", "d", "e", "f", "g"},
-    {"AE", "B", "C"} /* / ED <<< F / E"},*/
-  };
-
-  const static uint32_t testdatalen[] = {
-      4,
-      8,
-      3
-  };
-
-
-
-  UCollator *credundant = NULL;
-  UCollator *cresulting = NULL;
-  UErrorCode status = U_ZERO_ERROR;
-  UChar rlz[2048] = { 0 };
-  uint32_t rlen = 0;
-
-  for(i = 0; i<sizeof(rules)/sizeof(rules[0]); i++) {
-    log_verbose("testing rule %s, expected to be %s\n", rules[i], expectedRules[i]);
-    rlen = u_unescape(rules[i], rlz, 2048);
-
-    credundant = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status);
-    if(status == U_FILE_ACCESS_ERROR) {
-      log_data_err("Is your data around?\n");
-      return;
-    } else if(U_FAILURE(status)) {
-      log_err("Error opening collator\n");
-      return;
-    }
-    rlen = u_unescape(expectedRules[i], rlz, 2048);
-    cresulting = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT, NULL,&status);
-
-    /* testAgainstUCA still doesn't handle expansions correctly, so this is not run */
-    /* as a hard error test, but only in information mode */
-    testAgainstUCA(cresulting, credundant, "expected", FALSE, &status);
-
-    ucol_close(credundant);
-    ucol_close(cresulting);
-
-    log_verbose("testing using data\n");
-
-    genericRulesStarter(rules[i], testdata[i], testdatalen[i]);
-  }
-}
-
 static void TestCase(void)
 {
     const static UChar gRules[MAX_TOKEN_LEN] =
@@ -2248,13 +942,13 @@ static void TestCase(void)
       };
       log_verbose("mixed case test\n");
       log_verbose("lower first, case level off\n");
-      genericRulesStarter("[casefirst lower]&H<ch<<<Ch<<<CH", lowerFirst, sizeof(lowerFirst)/sizeof(lowerFirst[0]));
+      genericRulesStarter("[caseFirst lower]&H<ch<<<Ch<<<CH", lowerFirst, sizeof(lowerFirst)/sizeof(lowerFirst[0]));
       log_verbose("upper first, case level off\n");
-      genericRulesStarter("[casefirst upper]&H<ch<<<Ch<<<CH", upperFirst, sizeof(upperFirst)/sizeof(upperFirst[0]));
+      genericRulesStarter("[caseFirst upper]&H<ch<<<Ch<<<CH", upperFirst, sizeof(upperFirst)/sizeof(upperFirst[0]));
       log_verbose("lower first, case level on\n");
-      genericRulesStarter("[casefirst lower][caselevel on]&H<ch<<<Ch<<<CH", lowerFirst, sizeof(lowerFirst)/sizeof(lowerFirst[0]));
+      genericRulesStarter("[caseFirst lower][caseLevel on]&H<ch<<<Ch<<<CH", lowerFirst, sizeof(lowerFirst)/sizeof(lowerFirst[0]));
       log_verbose("upper first, case level on\n");
-      genericRulesStarter("[casefirst upper][caselevel on]&H<ch<<<Ch<<<CH", upperFirst, sizeof(upperFirst)/sizeof(upperFirst[0]));
+      genericRulesStarter("[caseFirst upper][caseLevel on]&H<ch<<<Ch<<<CH", upperFirst, sizeof(upperFirst)/sizeof(upperFirst[0]));
     }
 
 }
@@ -2562,25 +1256,32 @@ static void TestHangulTailoring(void) {
     log_err("Unable to open collator with rules %s\n", rules);
   }
 
-  log_verbose("Setting jamoSpecial to TRUE and testing once more\n");
-  ((UCATableHeader *)coll->image)->jamoSpecial = TRUE; /* don't try this at home  */
-  genericOrderingTest(coll, koreanData, sizeof(koreanData)/sizeof(koreanData[0]));
-
   ucol_close(coll);
 
   log_verbose("Using ko__LOTUS locale\n");
   genericLocaleStarter("ko__LOTUS", koreanData, sizeof(koreanData)/sizeof(koreanData[0]));
 }
 
+/*
+ * The secondary/tertiary compression middle byte
+ * as used by the current implementation.
+ * Subject to change as the sort key compression changes.
+ * See class CollationKeys.
+ */
+enum {
+    SEC_COMMON_MIDDLE = 0x25,  /* range 05..45 */
+    TER_ONLY_COMMON_MIDDLE = 0x65  /* range 05..C5 */
+};
+
 static void TestCompressOverlap(void) {
     UChar       secstr[150];
     UChar       tertstr[150];
     UErrorCode  status = U_ZERO_ERROR;
     UCollator  *coll;
-    char        result[200];
+    uint8_t     result[500];
     uint32_t    resultlen;
     int         count = 0;
-    char       *tempptr;
+    uint8_t    *tempptr;
 
     coll = ucol_open("", &status);
 
@@ -2600,29 +1301,29 @@ static void TestCompressOverlap(void) {
 
     /* no compression secstr should have 150 secondary bytes, tertstr should
     have 150 tertiary bytes.
-    with correct overlapping compression, secstr should have 4 secondary
-    bytes, tertstr should have > 2 tertiary bytes */
-    resultlen = ucol_getSortKey(coll, secstr, 150, (uint8_t *)result, 250);
+    with correct compression, secstr should have 6 secondary
+    bytes (149/33 rounded up + accent), tertstr should have > 2 tertiary bytes */
+    resultlen = ucol_getSortKey(coll, secstr, 150, result, LEN(result));
     (void)resultlen;    /* Suppress set but not used warning. */
-    tempptr = uprv_strchr(result, 1) + 1;
+    tempptr = (uint8_t *)uprv_strchr((char *)result, 1) + 1;
     while (*(tempptr + 1) != 1) {
         /* the last secondary collation element is not checked since it is not
         part of the compression */
-        if (*tempptr < UCOL_COMMON_TOP2 - UCOL_TOP_COUNT2) {
-            log_err("Secondary compression overlapped\n");
+        if (*tempptr < SEC_COMMON_MIDDLE) {
+            log_err("Secondary top down compression overlapped\n");
         }
         tempptr ++;
     }
 
     /* tertiary top/bottom/common for en_US is similar to the secondary
     top/bottom/common */
-    resultlen = ucol_getSortKey(coll, tertstr, 150, (uint8_t *)result, 250);
-    tempptr = uprv_strrchr(result, 1) + 1;
+    resultlen = ucol_getSortKey(coll, tertstr, 150, result, LEN(result));
+    tempptr = (uint8_t *)uprv_strrchr((char *)result, 1) + 1;
     while (*(tempptr + 1) != 0) {
         /* the last secondary collation element is not checked since it is not
         part of the compression */
-        if (*tempptr < coll->tertiaryTop - coll->tertiaryTopCount) {
-            log_err("Tertiary compression overlapped\n");
+        if (*tempptr < TER_ONLY_COMMON_MIDDLE) {
+            log_err("Tertiary top down compression overlapped\n");
         }
         tempptr ++;
     }
@@ -2630,26 +1331,26 @@ static void TestCompressOverlap(void) {
     /* bottom up compression ------------------------------------- */
     secstr[count] = 0;
     tertstr[count] = 0;
-    resultlen = ucol_getSortKey(coll, secstr, 150, (uint8_t *)result, 250);
-    tempptr = uprv_strchr(result, 1) + 1;
+    resultlen = ucol_getSortKey(coll, secstr, 150, result, LEN(result));
+    tempptr = (uint8_t *)uprv_strchr((char *)result, 1) + 1;
     while (*(tempptr + 1) != 1) {
         /* the last secondary collation element is not checked since it is not
         part of the compression */
-        if (*tempptr > UCOL_COMMON_BOT2 + UCOL_BOT_COUNT2) {
-            log_err("Secondary compression overlapped\n");
+        if (*tempptr > SEC_COMMON_MIDDLE) {
+            log_err("Secondary bottom up compression overlapped\n");
         }
         tempptr ++;
     }
 
     /* tertiary top/bottom/common for en_US is similar to the secondary
     top/bottom/common */
-    resultlen = ucol_getSortKey(coll, tertstr, 150, (uint8_t *)result, 250);
-    tempptr = uprv_strrchr(result, 1) + 1;
+    resultlen = ucol_getSortKey(coll, tertstr, 150, result, LEN(result));
+    tempptr = (uint8_t *)uprv_strrchr((char *)result, 1) + 1;
     while (*(tempptr + 1) != 0) {
         /* the last secondary collation element is not checked since it is not
         part of the compression */
-        if (*tempptr > coll->tertiaryBottom + coll->tertiaryBottomCount) {
-            log_err("Tertiary compression overlapped\n");
+        if (*tempptr > TER_ONLY_COMMON_MIDDLE) {
+            log_err("Tertiary bottom up compression overlapped\n");
         }
         tempptr ++;
     }
@@ -2709,6 +1410,13 @@ static void TestContraction(void) {
         {0x0063 /* 'c' */, 0x0068 /* 'h' */},
         {0x0063 /* 'c' */, 0x006C /* 'l' */}
     };
+#if 0
+    /*
+     * These pairs of rule strings are not guaranteed to yield the very same mappings.
+     * In fact, LDML 24 recommends an improved way of creating mappings
+     * which always yields different mappings for such pairs. See
+     * http://www.unicode.org/reports/tr35/tr35-33/tr35-collation.html#Orderings
+     */
     const static char *testrules3[] = {
         "&z < xyz &xyzw << B",
         "&z < xyz &xyz << B / w",
@@ -2719,6 +1427,7 @@ static void TestContraction(void) {
         "&a\\ud800\\udc00m << B",
         "&a << B / \\ud800\\udc00m",
     };
+#endif
 
     UErrorCode  status   = U_ZERO_ERROR;
     UCollator  *coll;
@@ -2784,8 +1493,9 @@ static void TestContraction(void) {
         return;
     }
     ucol_close(coll);
-
+#if 0  /* see above */
     for (i = 0; i < sizeof(testrules3) / sizeof(testrules3[0]); i += 2) {
+        log_verbose("testrules3 i==%d  \"%s\" vs. \"%s\"\n", i, testrules3[i], testrules3[i + 1]);
         UCollator          *coll1,
                            *coll2;
         UCollationElements *iter1,
@@ -2812,8 +1522,11 @@ static void TestContraction(void) {
             return;
         }
         while (ce != UCOL_NULLORDER) {
-            if (ce != (uint32_t)ucol_next(iter2, &status)) {
-                log_err("CEs does not match\n");
+            uint32_t ce2 = (uint32_t)ucol_next(iter2, &status);
+            if (ce == ce2) {
+                log_verbose("CEs match: %08x\n", ce);
+            } else {
+                log_err("CEs do not match: %08x vs. %08x\n", ce, ce2);
                 return;
             }
             ce = ucol_next(iter1, &status);
@@ -2831,11 +1544,23 @@ static void TestContraction(void) {
         ucol_close(coll1);
         ucol_close(coll2);
     }
+#endif
 }
 
 static void TestExpansion(void) {
     const static char *testrules[] = {
+#if 0
+        /*
+         * This seems to have tested that M was not mapped to an expansion.
+         * I believe the old builder just did that because it computed the extension CEs
+         * at the very end, which was a bug.
+         * Among other problems, it violated the core tailoring principle
+         * by making an earlier rule depend on a later one.
+         * And, of course, if M did not get an expansion, then it was primary different from K,
+         * unlike what the rule &K<<M says.
+         */
         "&J << K / B & K << M",
+#endif
         "&J << K / B << M"
     };
     const static UChar testdata[][3] = {
@@ -2985,207 +1710,81 @@ static void TestBocsuCoverage(void) {
 
 static void TestVariableTopSetting(void) {
   UErrorCode status = U_ZERO_ERROR;
-  const UChar *current = NULL;
   uint32_t varTopOriginal = 0, varTop1, varTop2;
   UCollator *coll = ucol_open("", &status);
   if(U_SUCCESS(status)) {
 
-  uint32_t strength = 0;
-  uint16_t specs = 0;
-  uint32_t chOffset = 0;
-  uint32_t chLen = 0;
-  uint32_t exOffset = 0;
-  uint32_t exLen = 0;
-  uint32_t oldChOffset = 0;
-  uint32_t oldChLen = 0;
-  uint32_t oldExOffset = 0;
-  uint32_t oldExLen = 0;
-  uint32_t prefixOffset = 0;
-  uint32_t prefixLen = 0;
-
-  UBool startOfRules = TRUE;
-  UColTokenParser src;
-  UColOptionSet opts;
-
-  UChar *rulesCopy = NULL;
-  uint32_t rulesLen;
+  static const UChar nul = 0;
+  static const UChar space = 0x20;
+  static const UChar dot = 0x2e;  /* punctuation */
+  static const UChar degree = 0xb0;  /* symbol */
+  static const UChar dollar = 0x24;  /* currency symbol */
+  static const UChar zero = 0x30;  /* digit */
 
-  UCollationResult result;
-
-  UChar first[256] = { 0 };
-  UChar second[256] = { 0 };
-  UParseError parseError;
-  int32_t myQ = getTestOption(QUICK_OPTION);
-
-  (void)prefixLen;        /* Suppress set but not used warnings. */
-  (void)prefixOffset;
-  (void)specs;
-
-  uprv_memset(&src, 0, sizeof(UColTokenParser));
-
-  src.opts = &opts;
+  varTopOriginal = ucol_getVariableTop(coll, &status);
+  log_verbose("ucol_getVariableTop(root) -> %08x\n", varTopOriginal);
+  ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
 
-  if(getTestOption(QUICK_OPTION) <= 0) {
-    setTestOption(QUICK_OPTION, 1);
+  varTop1 = ucol_setVariableTop(coll, &space, 1, &status);
+  varTop2 = ucol_getVariableTop(coll, &status);
+  log_verbose("ucol_setVariableTop(space) -> %08x\n", varTop1);
+  if(U_FAILURE(status) || varTop1 != varTop2 ||
+      !ucol_equal(coll, &nul, 0, &space, 1) ||
+      ucol_equal(coll, &nul, 0, &dot, 1) ||
+      ucol_equal(coll, &nul, 0, &degree, 1) ||
+      ucol_equal(coll, &nul, 0, &dollar, 1) ||
+      ucol_equal(coll, &nul, 0, &zero, 1) ||
+      ucol_greaterOrEqual(coll, &space, 1, &dot, 1)) {
+    log_err("ucol_setVariableTop(space) did not work - %s\n", u_errorName(status));
   }
 
-  /* this test will fail when normalization is turned on */
-  /* therefore we always turn off exhaustive mode for it */
-  { /* QUICK > 0*/
-    log_verbose("Slide variable top over UCARules\n");
-    rulesLen = ucol_getRulesEx(coll, UCOL_FULL_RULES, rulesCopy, 0);
-    rulesCopy = (UChar *)uprv_malloc((rulesLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar));
-    rulesLen = ucol_getRulesEx(coll, UCOL_FULL_RULES, rulesCopy, rulesLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE);
-
-    if(U_SUCCESS(status) && rulesLen > 0) {
-      ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
-      src.current = src.source = rulesCopy;
-      src.end = rulesCopy+rulesLen;
-      src.extraCurrent = src.end;
-      src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
-
-         /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to
-          the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */
-      while ((current = ucol_tok_parseNextToken(&src, startOfRules, &parseError,&status)) != NULL) {
-        strength = src.parsedToken.strength;
-        chOffset = src.parsedToken.charsOffset;
-        chLen = src.parsedToken.charsLen;
-        exOffset = src.parsedToken.extensionOffset;
-        exLen = src.parsedToken.extensionLen;
-        prefixOffset = src.parsedToken.prefixOffset;
-        prefixLen = src.parsedToken.prefixLen;
-        specs = src.parsedToken.flags;
-
-        startOfRules = FALSE;
-        {
-          log_verbose("%04X %d ", *(src.source+chOffset), chLen);
-        }
-        if(strength == UCOL_PRIMARY) {
-          status = U_ZERO_ERROR;
-          varTopOriginal = ucol_getVariableTop(coll, &status);
-          varTop1 = ucol_setVariableTop(coll, src.source+oldChOffset, oldChLen, &status);
-          if(U_FAILURE(status)) {
-            char buffer[256];
-            char *buf = buffer;
-            uint32_t i = 0, j;
-            uint32_t CE = UCOL_NO_MORE_CES;
-
-            /* before we start screaming, let's see if there is a problem with the rules */
-            UErrorCode collIterateStatus = U_ZERO_ERROR;
-            collIterate *s = uprv_new_collIterate(&collIterateStatus);
-            uprv_init_collIterate(coll, src.source+oldChOffset, oldChLen, s, &collIterateStatus);
-
-            CE = ucol_getNextCE(coll, s, &status);
-            (void)CE;    /* Suppress set but not used warning. */
-
-            for(i = 0; i < oldChLen; i++) {
-              j = sprintf(buf, "%04X ", *(src.source+oldChOffset+i));
-              buf += j;
-            }
-            if(status == U_PRIMARY_TOO_LONG_ERROR) {
-              log_verbose("= Expected failure for %s =", buffer);
-            } else {
-              if(uprv_collIterateAtEnd(s)) {
-                log_err("Unexpected failure setting variable top at offset %d. Error %s. Codepoints: %s\n",
-                  oldChOffset, u_errorName(status), buffer);
-              } else {
-                log_verbose("There is a goofy contraction in UCA rules that does not appear in the fractional UCA. Codepoints: %s\n",
-                  buffer);
-              }
-            }
-            uprv_delete_collIterate(s);
-          }
-          varTop2 = ucol_getVariableTop(coll, &status);
-          if((varTop1 & 0xFFFF0000) != (varTop2 & 0xFFFF0000)) {
-            log_err("cannot retrieve set varTop value!\n");
-            continue;
-          }
+  varTop1 = ucol_setVariableTop(coll, &dot, 1, &status);
+  varTop2 = ucol_getVariableTop(coll, &status);
+  log_verbose("ucol_setVariableTop(dot) -> %08x\n", varTop1);
+  if(U_FAILURE(status) || varTop1 != varTop2 ||
+      !ucol_equal(coll, &nul, 0, &space, 1) ||
+      !ucol_equal(coll, &nul, 0, &dot, 1) ||
+      ucol_equal(coll, &nul, 0, &degree, 1) ||
+      ucol_equal(coll, &nul, 0, &dollar, 1) ||
+      ucol_equal(coll, &nul, 0, &zero, 1) ||
+      ucol_greaterOrEqual(coll, &dot, 1, &degree, 1)) {
+    log_err("ucol_setVariableTop(dot) did not work - %s\n", u_errorName(status));
+  }
 
-          if((varTop1 & 0xFFFF0000) > 0 && oldExLen == 0) {
-
-            u_strncpy(first, src.source+oldChOffset, oldChLen);
-            u_strncpy(first+oldChLen, src.source+chOffset, chLen);
-            u_strncpy(first+oldChLen+chLen, src.source+oldChOffset, oldChLen);
-            first[2*oldChLen+chLen] = 0;
-
-            if(oldExLen == 0) {
-              u_strncpy(second, src.source+chOffset, chLen);
-              second[chLen] = 0;
-            } else { /* This is skipped momentarily, but should work once UCARules are fully UCA conformant */
-              u_strncpy(second, src.source+oldExOffset, oldExLen);
-              u_strncpy(second+oldChLen, src.source+chOffset, chLen);
-              u_strncpy(second+oldChLen+chLen, src.source+oldExOffset, oldExLen);
-              second[2*oldExLen+chLen] = 0;
-            }
-            result = ucol_strcoll(coll, first, -1, second, -1);
-            if(result == UCOL_EQUAL) {
-              doTest(coll, first, second, UCOL_EQUAL);
-            } else {
-              log_verbose("Suspicious strcoll result for %04X and %04X\n", *(src.source+oldChOffset), *(src.source+chOffset));
-            }
-          }
-        }
-        if(strength != UCOL_TOK_RESET) {
-          oldChOffset = chOffset;
-          oldChLen = chLen;
-          oldExOffset = exOffset;
-          oldExLen = exLen;
-        }
-      }
-      status = U_ZERO_ERROR;
-    }
-    else {
-      log_err("Unexpected failure getting rules %s\n", u_errorName(status));
-      return;
-    }
-    if (U_FAILURE(status)) {
-        log_err("Error parsing rules %s\n", u_errorName(status));
-        return;
-    }
-    status = U_ZERO_ERROR;
+  varTop1 = ucol_setVariableTop(coll, &degree, 1, &status);
+  varTop2 = ucol_getVariableTop(coll, &status);
+  log_verbose("ucol_setVariableTop(degree) -> %08x\n", varTop1);
+  if(U_FAILURE(status) || varTop1 != varTop2 ||
+      !ucol_equal(coll, &nul, 0, &space, 1) ||
+      !ucol_equal(coll, &nul, 0, &dot, 1) ||
+      !ucol_equal(coll, &nul, 0, &degree, 1) ||
+      ucol_equal(coll, &nul, 0, &dollar, 1) ||
+      ucol_equal(coll, &nul, 0, &zero, 1) ||
+      ucol_greaterOrEqual(coll, &degree, 1, &dollar, 1)) {
+    log_err("ucol_setVariableTop(degree) did not work - %s\n", u_errorName(status));
   }
 
-  setTestOption(QUICK_OPTION, myQ);
+  varTop1 = ucol_setVariableTop(coll, &dollar, 1, &status);
+  varTop2 = ucol_getVariableTop(coll, &status);
+  log_verbose("ucol_setVariableTop(dollar) -> %08x\n", varTop1);
+  if(U_FAILURE(status) || varTop1 != varTop2 ||
+      !ucol_equal(coll, &nul, 0, &space, 1) ||
+      !ucol_equal(coll, &nul, 0, &dot, 1) ||
+      !ucol_equal(coll, &nul, 0, &degree, 1) ||
+      !ucol_equal(coll, &nul, 0, &dollar, 1) ||
+      ucol_equal(coll, &nul, 0, &zero, 1) ||
+      ucol_greaterOrEqual(coll, &dollar, 1, &zero, 1)) {
+    log_err("ucol_setVariableTop(dollar) did not work - %s\n", u_errorName(status));
+  }
 
   log_verbose("Testing setting variable top to contractions\n");
   {
-    UChar *conts = (UChar *)((uint8_t *)coll->image + coll->image->contractionUCACombos);
-    int32_t maxUCAContractionLength = coll->image->contractionUCACombosWidth;
-    while(*conts != 0) {
-      /*
-       * A continuation is NUL-terminated and NUL-padded
-       * except if it has the maximum length.
-       */
-      int32_t contractionLength = maxUCAContractionLength;
-      while(contractionLength > 0 && conts[contractionLength - 1] == 0) {
-        --contractionLength;
-      }
-      if(*(conts+1)==0) { /* pre-context */
-        varTop1 = ucol_setVariableTop(coll, conts, 1, &status);
-      } else {
-        varTop1 = ucol_setVariableTop(coll, conts, contractionLength, &status);
-      }
-      if(U_FAILURE(status)) {
-        if(status == U_PRIMARY_TOO_LONG_ERROR) {
-          /* ucol_setVariableTop() is documented to not accept 3-byte primaries,
-           * therefore it is not an error when it complains about them. */
-          log_verbose("Couldn't set variable top to a contraction %04X %04X %04X - U_PRIMARY_TOO_LONG_ERROR\n",
-                      *conts, *(conts+1), *(conts+2));
-        } else {
-          log_err("Couldn't set variable top to a contraction %04X %04X %04X - %s\n",
-                  *conts, *(conts+1), *(conts+2), u_errorName(status));
-        }
-        status = U_ZERO_ERROR;
-      }
-      conts+=maxUCAContractionLength;
-    }
-
-    status = U_ZERO_ERROR;
-
+    UChar first[4] = { 0 };
     first[0] = 0x0040;
     first[1] = 0x0050;
     first[2] = 0x0000;
 
+    status = U_ZERO_ERROR;
     ucol_setVariableTop(coll, first, -1, &status);
 
     if(U_SUCCESS(status)) {
@@ -3205,21 +1804,110 @@ static void TestVariableTopSetting(void) {
   log_verbose("Testing calling with error set\n");
 
   status = U_INTERNAL_PROGRAM_ERROR;
-  varTop1 = ucol_setVariableTop(coll, first, 1, &status);
+  varTop1 = ucol_setVariableTop(coll, &space, 1, &status);
   varTop2 = ucol_getVariableTop(coll, &status);
   ucol_restoreVariableTop(coll, varTop2, &status);
-  varTop1 = ucol_setVariableTop(NULL, first, 1, &status);
+  varTop1 = ucol_setVariableTop(NULL, &dot, 1, &status);
   varTop2 = ucol_getVariableTop(NULL, &status);
   ucol_restoreVariableTop(NULL, varTop2, &status);
   if(status != U_INTERNAL_PROGRAM_ERROR) {
     log_err("Bad reaction to passed error!\n");
   }
-  uprv_free(src.source);
   ucol_close(coll);
   } else {
     log_data_err("Couldn't open UCA collator\n");
   }
+}
+
+static void TestMaxVariable() {
+  UErrorCode status = U_ZERO_ERROR;
+  UColReorderCode oldMax, max;
+  UCollator *coll;
+
+  static const UChar nul = 0;
+  static const UChar space = 0x20;
+  static const UChar dot = 0x2e;  /* punctuation */
+  static const UChar degree = 0xb0;  /* symbol */
+  static const UChar dollar = 0x24;  /* currency symbol */
+  static const UChar zero = 0x30;  /* digit */
+
+  coll = ucol_open("", &status);
+  if(U_FAILURE(status)) {
+    log_data_err("Couldn't open root collator\n");
+    return;
+  }
+
+  oldMax = ucol_getMaxVariable(coll);
+  log_verbose("ucol_getMaxVariable(root) -> %04x\n", oldMax);
+  ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
+
+  ucol_setMaxVariable(coll, UCOL_REORDER_CODE_SPACE, &status);
+  max = ucol_getMaxVariable(coll);
+  log_verbose("ucol_setMaxVariable(space) -> %04x\n", max);
+  if(U_FAILURE(status) || max != UCOL_REORDER_CODE_SPACE ||
+      !ucol_equal(coll, &nul, 0, &space, 1) ||
+      ucol_equal(coll, &nul, 0, &dot, 1) ||
+      ucol_equal(coll, &nul, 0, &degree, 1) ||
+      ucol_equal(coll, &nul, 0, &dollar, 1) ||
+      ucol_equal(coll, &nul, 0, &zero, 1) ||
+      ucol_greaterOrEqual(coll, &space, 1, &dot, 1)) {
+    log_err("ucol_setMaxVariable(space) did not work - %s\n", u_errorName(status));
+  }
+
+  ucol_setMaxVariable(coll, UCOL_REORDER_CODE_PUNCTUATION, &status);
+  max = ucol_getMaxVariable(coll);
+  log_verbose("ucol_setMaxVariable(punctuation) -> %04x\n", max);
+  if(U_FAILURE(status) || max != UCOL_REORDER_CODE_PUNCTUATION ||
+      !ucol_equal(coll, &nul, 0, &space, 1) ||
+      !ucol_equal(coll, &nul, 0, &dot, 1) ||
+      ucol_equal(coll, &nul, 0, &degree, 1) ||
+      ucol_equal(coll, &nul, 0, &dollar, 1) ||
+      ucol_equal(coll, &nul, 0, &zero, 1) ||
+      ucol_greaterOrEqual(coll, &dot, 1, &degree, 1)) {
+    log_err("ucol_setMaxVariable(punctuation) did not work - %s\n", u_errorName(status));
+  }
+
+  ucol_setMaxVariable(coll, UCOL_REORDER_CODE_SYMBOL, &status);
+  max = ucol_getMaxVariable(coll);
+  log_verbose("ucol_setMaxVariable(symbol) -> %04x\n", max);
+  if(U_FAILURE(status) || max != UCOL_REORDER_CODE_SYMBOL ||
+      !ucol_equal(coll, &nul, 0, &space, 1) ||
+      !ucol_equal(coll, &nul, 0, &dot, 1) ||
+      !ucol_equal(coll, &nul, 0, &degree, 1) ||
+      ucol_equal(coll, &nul, 0, &dollar, 1) ||
+      ucol_equal(coll, &nul, 0, &zero, 1) ||
+      ucol_greaterOrEqual(coll, &degree, 1, &dollar, 1)) {
+    log_err("ucol_setMaxVariable(symbol) did not work - %s\n", u_errorName(status));
+  }
+
+  ucol_setMaxVariable(coll, UCOL_REORDER_CODE_CURRENCY, &status);
+  max = ucol_getMaxVariable(coll);
+  log_verbose("ucol_setMaxVariable(currency) -> %04x\n", max);
+  if(U_FAILURE(status) || max != UCOL_REORDER_CODE_CURRENCY ||
+      !ucol_equal(coll, &nul, 0, &space, 1) ||
+      !ucol_equal(coll, &nul, 0, &dot, 1) ||
+      !ucol_equal(coll, &nul, 0, &degree, 1) ||
+      !ucol_equal(coll, &nul, 0, &dollar, 1) ||
+      ucol_equal(coll, &nul, 0, &zero, 1) ||
+      ucol_greaterOrEqual(coll, &dollar, 1, &zero, 1)) {
+    log_err("ucol_setMaxVariable(currency) did not work - %s\n", u_errorName(status));
+  }
 
+  log_verbose("Test restoring maxVariable\n");
+  status = U_ZERO_ERROR;
+  ucol_setMaxVariable(coll, oldMax, &status);
+  if(oldMax != ucol_getMaxVariable(coll)) {
+    log_err("Couldn't restore old maxVariable\n");
+  }
+
+  log_verbose("Testing calling with error set\n");
+  status = U_INTERNAL_PROGRAM_ERROR;
+  ucol_setMaxVariable(coll, UCOL_REORDER_CODE_SPACE, &status);
+  max = ucol_getMaxVariable(coll);
+  if(max != oldMax || status != U_INTERNAL_PROGRAM_ERROR) {
+    log_err("Bad reaction to passed error!\n");
+  }
+  ucol_close(coll);
 }
 
 static void TestNonChars(void) {
@@ -3704,6 +2392,8 @@ static void TestRuleOptions(void) {
     const char *data[10];
     const uint32_t len;
   } tests[] = {
+#if 0
+    /* "you cannot go before ...": The parser now sets an error for such nonsensical rules. */
     /* - all befores here amount to zero */
     { "&[before 3][first tertiary ignorable]<<<a",
         { "\\u0000", "a"}, 2
@@ -3712,25 +2402,35 @@ static void TestRuleOptions(void) {
     { "&[before 3][last tertiary ignorable]<<<a",
         { "\\u0000", "a"}, 2
     }, /* you cannot go before last tertiary ignorable */
-
+#endif
+    /*
+     * However, there is a real secondary ignorable (artificial addition in FractionalUCA.txt),
+     * and it *is* possible to "go before" that.
+     */
     { "&[before 3][first secondary ignorable]<<<a",
         { "\\u0000", "a"}, 2
-    }, /* you cannot go before first secondary ignorable */
+    },
 
     { "&[before 3][last secondary ignorable]<<<a",
         { "\\u0000", "a"}, 2
-    }, /* you cannot go before first secondary ignorable */
+    },
 
     /* 'normal' befores */
 
-    { "&[before 3][first primary ignorable]<<<c<<<b &[first primary ignorable]<a",
+    /*
+     * Note: With a "SPACE first primary" boundary CE in FractionalUCA.txt,
+     * it is not possible to tailor &[first primary ignorable]<a or &[last primary ignorable]<a
+     * because there is no tailoring space before that boundary.
+     * Made the tests work by tailoring to a space instead.
+     */
+    { "&[before 3][first primary ignorable]<<<c<<<b &' '<a",  /* was &[first primary ignorable]<a */
         {  "c", "b", "\\u0332", "a" }, 4
     },
 
     /* we don't have a code point that corresponds to
      * the last primary ignorable
      */
-    { "&[before 3][last primary ignorable]<<<c<<<b &[last primary ignorable]<a",
+    { "&[before 3][last primary ignorable]<<<c<<<b &' '<a",  /* was &[last primary ignorable]<a */
         {  "\\u0332", "\\u20e3", "c", "b", "a" }, 5
     },
 
@@ -3756,14 +2456,14 @@ static void TestRuleOptions(void) {
       "&[first implicit]<a",
         { "b", "\\u4e00", "a", "\\u4e01"}, 4
     },
-
+#if 0  /* The current builder does not support tailoring to unassigned-implicit CEs (seems unnecessary, adds complexity). */
     { "&[before 1][last implicit]<b"
       "&[last implicit]<a",
         { "b", "\\U0010FFFD", "a" }, 3
     },
-
+#endif
     { "&[last variable]<z"
-      "&[last primary ignorable]<x"
+      "&' '<x"  /* was &[last primary ignorable]<x, see above */
       "&[last secondary ignorable]<<y"
       "&[last tertiary ignorable]<<<w"
       "&[top]<u",
@@ -4009,7 +2709,7 @@ static void TestPartialSortKeyTermination(void) {
     "\\udc00\\ud800\\ud800"
   };
 
-  int32_t i = sizeof(UCollator);
+  int32_t i;
 
   UErrorCode status = U_ZERO_ERROR;
 
@@ -4401,83 +3101,6 @@ static void TestPinyinProblem(void) {
     genericLocaleStarter("zh__PINYIN", test, sizeof(test)/sizeof(test[0]));
 }
 
-#define TST_UCOL_MAX_INPUT 0x220001
-#define topByte 0xFF000000;
-#define bottomByte 0xFF;
-#define fourBytes 0xFFFFFFFF;
-
-
-static void showImplicit(UChar32 i) {
-    if (i >= 0 && i <= TST_UCOL_MAX_INPUT) {
-        log_verbose("%08X\t%08X\n", i, uprv_uca_getImplicitFromRaw(i));
-    }
-}
-
-static void TestImplicitGeneration(void) {
-    UErrorCode status = U_ZERO_ERROR;
-    UChar32 last = 0;
-    UChar32 current;
-    UChar32 i = 0, j = 0;
-    UChar32 roundtrip = 0;
-    UChar32 lastBottom = 0;
-    UChar32 currentBottom = 0;
-    UChar32 lastTop = 0;
-    UChar32 currentTop = 0;
-
-    UCollator *coll = ucol_open("root", &status);
-    if(U_FAILURE(status)) {
-        log_err_status(status, "Couldn't open UCA -> %s\n", u_errorName(status));
-        return;
-    }
-
-    uprv_uca_getRawFromImplicit(0xE20303E7);
-
-    for (i = 0; i <= TST_UCOL_MAX_INPUT; ++i) {
-        current = uprv_uca_getImplicitFromRaw(i) & fourBytes;
-
-        /* check that it round-trips AND that all intervening ones are illegal*/
-        roundtrip = uprv_uca_getRawFromImplicit(current);
-        if (roundtrip != i) {
-            log_err("No roundtrip %08X\n", i);
-        }
-        if (last != 0) {
-            for (j = last + 1; j < current; ++j) {
-                roundtrip = uprv_uca_getRawFromImplicit(j);
-                /* raise an error if it *doesn't* find an error*/
-                if (roundtrip != -1) {
-                    log_err("Fails to recognize illegal %08X\n", j);
-                }
-            }
-        }
-        /* now do other consistency checks*/
-        lastBottom = last & bottomByte;
-        currentBottom = current & bottomByte;
-        lastTop = last & topByte;
-        currentTop = current & topByte;
-        (void)lastBottom;     /* Suppress set but not used warnings. */
-        (void)currentBottom;
-
-        /* print out some values for spot-checking*/
-        if (lastTop != currentTop || i == 0x10000 || i == 0x110000) {
-            showImplicit(i-3);
-            showImplicit(i-2);
-            showImplicit(i-1);
-            showImplicit(i);
-            showImplicit(i+1);
-            showImplicit(i+2);
-        }
-        last = current;
-
-        if(uprv_uca_getCodePointFromRaw(uprv_uca_getRawFromCodePoint(i)) != i) {
-            log_err("No raw <-> code point roundtrip for 0x%08X\n", i);
-        }
-    }
-    showImplicit(TST_UCOL_MAX_INPUT-2);
-    showImplicit(TST_UCOL_MAX_INPUT-1);
-    showImplicit(TST_UCOL_MAX_INPUT);
-    ucol_close(coll);
-}
-
 /**
  * Iterate through the given iterator, checking to see that all the strings
  * in the expected array are present.
@@ -4957,9 +3580,20 @@ TestVI5913(void)
     UCollator *coll =NULL;
     uint8_t  resColl[100], expColl[100];
     int32_t  rLen, tLen, ruleLen, sLen, kLen;
-    UChar rule[256]={0x26, 0x62, 0x3c, 0x1FF3, 0};  /* &a<0x1FF3-omega with Ypogegrammeni*/
+    UChar rule[256]={0x26, 0x62, 0x3c, 0x1FF3, 0};  /* &b<0x1FF3-omega with Ypogegrammeni*/
     UChar rule2[256]={0x26, 0x7a, 0x3c, 0x0161, 0};  /* &z<s with caron*/
-    UChar rule3[256]={0x26, 0x7a, 0x3c, 0x0061, 0x00ea, 0};  /* &z<a+e with circumflex.*/
+    /*
+     * Note: Just tailoring &z<ae^ does not work as expected:
+     * The UCA spec requires for discontiguous contractions that they
+     * extend an *existing match* by one combining mark at a time.
+     * Therefore, ae must be a contraction so that the builder finds
+     * discontiguous contractions for ae^, for example with an intervening underdot.
+     * Only then do we get the expected tail closure with a\u1EC7, a\u1EB9\u0302, etc.
+     */
+    UChar rule3[256]={
+        0x26, 0x78, 0x3c, 0x61, 0x65,      /* &x<ae */
+        0x26, 0x7a, 0x3c, 0x0061, 0x00ea,  /* &z<a+e with circumflex.*/
+        0};
     static const UChar tData[][20]={
         {0x1EAC, 0},
         {0x0041, 0x0323, 0x0302, 0},
@@ -5100,18 +3734,22 @@ TestVI5913(void)
     coll = ucol_openRules(rule3, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
     tLen = u_strlen(tailorData3[3]);
     kLen=ucol_getSortKey(coll, tailorData3[3], tLen, expColl, 100);
+    log_verbose("\n Test Data[3] :%s  \tlen: %d key: ", aescstrdup(tailorData3[3], tLen), tLen);
+    for(i = 0; i<kLen; i++) {
+        log_verbose(" %02X", expColl[i]);
+    }
     for (j=4; j<6; j++) {
         tLen = u_strlen(tailorData3[j]);
         rLen = ucol_getSortKey(coll, tailorData3[j], tLen, resColl, 100);
 
         if ( kLen!=rLen || uprv_memcmp(expColl, resColl, rLen*sizeof(uint8_t))!=0 ) {
-            log_err("\n After tailoring Data[%d] :%s  \tlen: %d key: ", j, tailorData[j], tLen);
+            log_err("\n After tailoring Data[%d] :%s  \tlen: %d key: ", j, aescstrdup(tailorData3[j], tLen), tLen);
             for(i = 0; i<rLen; i++) {
                 log_err(" %02X", resColl[i]);
             }
         }
 
-        log_verbose("\n Test Data[%d] :%s  \tlen: %d key: ", j, tailorData[j], tLen);
+        log_verbose("\n Test Data[%d] :%s  \tlen: %d key: ", j, aescstrdup(tailorData3[j], tLen), tLen);
          for(i = 0; i<rLen; i++) {
              log_verbose(" %02X", resColl[i]);
          }
@@ -5155,11 +3793,15 @@ TestTailor6179(void)
     /*
      * These values from FractionalUCA.txt will change,
      * and need to be updated here.
+     * TODO: Make this not check for particular sort keys.
+     * Instead, test that we get CEs before & after other ignorables; see ticket #6179.
      */
-    static const uint8_t firstPrimaryIgnCE[]={1, 0x88, 1, 5, 0};
-    static const uint8_t lastPrimaryIgnCE[]={1, 0xE3, 1, 5, 0};
-    static const uint8_t firstSecondaryIgnCE[]={1, 1, 0xbf, 0x04, 0};
-    static const uint8_t lastSecondaryIgnCE[]={1, 1, 0xbf, 0x04, 0};
+    static const uint8_t firstPrimaryIgnCE[]={1, 0x83, 1, 5, 0};
+    static const uint8_t lastPrimaryIgnCE[]={1, 0xFC, 1, 5, 0};
+    static const uint8_t firstSecondaryIgnCE[]={1, 1, 0xfe, 0};
+    static const uint8_t lastSecondaryIgnCE[]={1, 1, 0xff, 0};
+
+    UParseError parseError;
 
     /* Test [Last Primary ignorable] */
 
@@ -5193,10 +3835,12 @@ TestTailor6179(void)
 
     /* Test [Last Secondary ignorable] */
     log_verbose("Tailoring test: &[last secondary ignorable]<<<a  &[first secondary ignorable]<<<b\n");
-    ruleLen = u_strlen(rule1);
-    coll = ucol_openRules(rule2, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
+    ruleLen = u_strlen(rule2);
+    coll = ucol_openRules(rule2, ruleLen, UCOL_OFF, UCOL_TERTIARY, &parseError, &status);
     if (U_FAILURE(status)) {
         log_err("Tailoring test: &[last secondary ignorable] failed! -> %s\n", u_errorName(status));
+        log_info("  offset=%d  \"%s\" | \"%s\"\n",
+                 parseError.offset, aescstrdup(parseError.preContext, -1), aescstrdup(parseError.postContext, -1));
         return;
     }
     tLen = u_strlen(tData2[0]);
@@ -5208,16 +3852,14 @@ TestTailor6179(void)
         }
         log_err("\n");
     }
-    if(!log_knownIssue("8982", "debug and fix")) { /* TODO: debug & fix, see ticket #8982 */
-      tLen = u_strlen(tData2[1]);
-      rLen = ucol_getSortKey(coll, tData2[1], tLen, resColl, 100);
-      if (rLen != LEN(firstSecondaryIgnCE) || uprv_memcmp(resColl, firstSecondaryIgnCE, rLen) != 0) {
-        log_err("Bad result for &[lsi]<<<a...: Data[%d] :%s  \tlen: %d key: ", 1, tData2[1], rLen);
-        for(i = 0; i<rLen; i++) {
-          log_err(" %02X", resColl[i]);
-        }
-        log_err("\n");
+    tLen = u_strlen(tData2[1]);
+    rLen = ucol_getSortKey(coll, tData2[1], tLen, resColl, 100);
+    if (rLen != LEN(firstSecondaryIgnCE) || uprv_memcmp(resColl, firstSecondaryIgnCE, rLen) != 0) {
+      log_err("Bad result for &[lsi]<<<a...: Data[%d] :%s  \tlen: %d key: ", 1, tData2[1], rLen);
+      for(i = 0; i<rLen; i++) {
+        log_err(" %02X", resColl[i]);
       }
+      log_err("\n");
     }
     ucol_close(coll);
 }
@@ -5584,6 +4226,10 @@ static void doTestOneTestCase(const OneTestCase testcases[],
     myCollation = ucol_openRules(rule, length, UCOL_ON, UCOL_TERTIARY, &parse_error, &status);
     if(U_FAILURE(status)){
         log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status));
+        log_info("  offset=%d  \"%s\" | \"%s\"\n",
+                 parse_error.offset,
+                 aescstrdup(parse_error.preContext, -1),
+                 aescstrdup(parse_error.postContext, -1));
         return;
     }
     log_verbose("Testing the <<* syntax\n");
@@ -5629,13 +4275,13 @@ const static OneTestCase rangeTestcases[] = {
 static int nRangeTestcases = LEN(rangeTestcases);
 
 const static OneTestCase rangeTestcasesSupplemental[] = {
-  { {0xfffe},                            {0xffff},                          UCOL_LESS }, /* U+FFFE < U+FFFF */
-  { {0xffff},                            {0xd800, 0xdc00},                  UCOL_LESS }, /* U+FFFF < U+10000 */
+  { {0x4e00},                            {0xfffb},                          UCOL_LESS }, /* U+4E00 < U+FFFB */
+  { {0xfffb},                            {0xd800, 0xdc00},                  UCOL_LESS }, /* U+FFFB < U+10000 */
   { {0xd800, 0xdc00},                    {0xd800, 0xdc01},                  UCOL_LESS }, /* U+10000 < U+10001 */
-  { {0xfffe},                            {0xd800, 0xdc01},                  UCOL_LESS }, /* U+FFFE < U+10001 */
+  { {0x4e00},                            {0xd800, 0xdc01},                  UCOL_LESS }, /* U+4E00 < U+10001 */
   { {0xd800, 0xdc01},                    {0xd800, 0xdc02},                  UCOL_LESS }, /* U+10000 < U+10001 */
   { {0xd800, 0xdc01},                    {0xd800, 0xdc02},                  UCOL_LESS }, /* U+10000 < U+10001 */
-  { {0xfffe},                            {0xd800, 0xdc02},                  UCOL_LESS }, /* U+FFFE < U+10001 */
+  { {0x4e00},                            {0xd800, 0xdc02},                  UCOL_LESS }, /* U+4E00 < U+10001 */
 };
 
 static int nRangeTestcasesSupplemental = LEN(rangeTestcasesSupplemental);
@@ -5692,10 +4338,10 @@ static void TestSameStrengthListQuoted(void)
 static void TestSameStrengthListSupplemental(void)
 {
   const char* strRules[] = {
-    "&\\ufffe<\\uffff<\\U00010000<\\U00010001<\\U00010002",
-    "&\\ufffe<\\uffff<\\ud800\\udc00<\\ud800\\udc01<\\ud800\\udc02",
-    "&\\ufffe<*\\uffff\\U00010000\\U00010001\\U00010002",
-    "&\\ufffe<*\\uffff\\ud800\\udc00\\ud800\\udc01\\ud800\\udc02",
+    "&\\u4e00<\\ufffb<\\U00010000<\\U00010001<\\U00010002",
+    "&\\u4e00<\\ufffb<\\ud800\\udc00<\\ud800\\udc01<\\ud800\\udc02",
+    "&\\u4e00<*\\ufffb\\U00010000\\U00010001\\U00010002",
+    "&\\u4e00<*\\ufffb\\ud800\\udc00\\ud800\\udc01\\ud800\\udc02",
   };
   doTestOneTestCase(rangeTestcasesSupplemental, nRangeTestcasesSupplemental, strRules, LEN(strRules));
 }
@@ -5743,7 +4389,8 @@ static void TestSameStrengthListRanges(void)
 static void TestSameStrengthListSupplementalRanges(void)
 {
   const char* strRules[] = {
-    "&\\ufffe<*\\uffff-\\U00010002",
+    /* Note: U+FFFD..U+FFFF are not tailorable, so a range cannot include them. */
+    "&\\u4e00<*\\ufffb\\U00010000-\\U00010002",
   };
   doTestOneTestCase(rangeTestcasesSupplemental, nRangeTestcasesSupplemental, strRules, LEN(strRules));
 }
@@ -7078,7 +5725,7 @@ static const LongUpperStrItem longUpperStrItems[] = {
     { NULL,          0                           }
 };
 
-enum { kCollKeyLenMax = 800 }; /* longest expected is 749, but may change with collation changes */
+enum { kCollKeyLenMax = 850 }; /* may change with collation changes */
 
 /* Text fix for #8445; without fix, could have crash due to stack or heap corruption */
 static void TestCaseLevelBufferOverflow(void)
@@ -7169,6 +5816,7 @@ void addMiscCollTest(TestNode** root)
     TEST(TestExtremeCompression);
     TEST(TestSurrogates);
     TEST(TestVariableTopSetting);
+    TEST(TestMaxVariable);
     TEST(TestBocsuCoverage);
     TEST(TestCyrillicTailoring);
     TEST(TestCase);
@@ -7176,9 +5824,6 @@ void addMiscCollTest(TestNode** root)
     TEST(BlackBirdTest);
     TEST(FunkyATest);
     TEST(BillFairmanTest);
-    TEST(RamsRulesTest);
-    TEST(IsTailoredTest);
-    TEST(TestCollations);
     TEST(TestChMove);
     TEST(TestImplicitTailoring);
     TEST(TestFCDProblem);
@@ -7187,8 +5832,6 @@ void addMiscCollTest(TestNode** root)
     TEST(TestJ815);
     /*TEST(TestJ831);*/ /* we changed lv locale */
     TEST(TestBefore);
-    TEST(TestRedundantRules);
-    TEST(TestExpansionSyntax);
     TEST(TestHangulTailoring);
     TEST(TestUCARules);
     TEST(TestIncrementalNormalize);
@@ -7210,7 +5853,6 @@ void addMiscCollTest(TestNode** root)
     TEST(TestNumericCollation);
     TEST(TestTibetanConformance);
     TEST(TestPinyinProblem);
-    TEST(TestImplicitGeneration);
     TEST(TestSeparateTrees);
     TEST(TestBeforePinyin);
     TEST(TestBeforeTightening);
index c71edb03e8889b4d172feecfd032eb2b329efc76..7a57a9935ca6e040f04f11973b494f406c726f59 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 1997-2013, International Business Machines Corporation and
+ * Copyright (c) 1997-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 /*******************************************************************************
@@ -28,8 +28,6 @@
 #include "crestst.h"
 #include "unicode/ctest.h"
 
-#include "ucol_imp.h" /* collation */
-
 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
 
 static void TestOpenDirect(void);
index 26cb756783796e2a6323a4bd06c67a5ee07ab6c4..32d6d60d7cd6f6d3e761cf238bca0b09e63ffc36 100644 (file)
@@ -1,11 +1,11 @@
 /********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 1997-2013, International Business Machines Corporation and
+ * Copyright (c) 1997-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 /*******************************************************************************
 *
-* File CRESTST.C
+* File creststn.c
 *
 * Modification History:
 *        Name              Date               Description
@@ -288,6 +288,7 @@ static void TestErrorCodes(void) {
   ures_close(r);
   ures_close(r2);
 
+#if !UCONFIG_NO_COLLATION
   /** Now, with the collation bundle **/
  
   /* first bundle should return fallback warning */
@@ -326,6 +327,7 @@ static void TestErrorCodes(void) {
   checkStatus(__LINE__, U_USING_DEFAULT_WARNING, status);
   ures_close(r);
   ures_close(r2);
+#endif  /* !UCONFIG_NO_COLLATION */
 }
 
 static void TestAliasConflict(void) {
@@ -920,11 +922,10 @@ static void TestEmptyBundle(){
 }
 
 static void TestBinaryCollationData(){
+#if !UCONFIG_NO_COLLATION 
     UErrorCode status=U_ZERO_ERROR;
     const char*      locale="te";
-#if !UCONFIG_NO_COLLATION 
     const char* testdatapath;
-#endif
     UResourceBundle *teRes = NULL;
     UResourceBundle *coll=NULL;
     UResourceBundle *binColl = NULL;
@@ -932,7 +933,6 @@ static void TestBinaryCollationData(){
     int32_t len=0;
     const char* action="testing the binary collaton data";
 
-#if !UCONFIG_NO_COLLATION 
     log_verbose("Testing binary collation data resource......\n");
 
     testdatapath=loadTestData(&status);
@@ -1407,6 +1407,7 @@ static void TestGetVersion(){
 
 
 static void TestGetVersionColl(){
+#if !UCONFIG_NO_COLLATION
     UVersionInfo minVersionArray = {0x00, 0x00, 0x00, 0x00};
     UVersionInfo maxVersionArray = {0x50, 0x80, 0xcf, 0xcf};
     UVersionInfo versionArray;
@@ -1460,6 +1461,7 @@ static void TestGetVersionColl(){
         log_err("Err %s testing Collation locales.\n", u_errorName(status));
     }
     uenum_close(locs);
+#endif  /* !UCONFIG_NO_COLLATION */
 }
 
 static void TestResourceBundles()
@@ -2612,6 +2614,7 @@ static void TestGetFunctionalEquivalentOf(const char *path, const char *resName,
 }
 
 static void TestGetFunctionalEquivalent(void) {
+#if !UCONFIG_NO_COLLATION
     static const char * const collCases[] = {
         /*   avail   locale          equiv   */
         "f",    "sv_US_CALIFORNIA",               "sv",
@@ -2655,6 +2658,7 @@ static void TestGetFunctionalEquivalent(void) {
         "f",    "nl_NL_EEXT@collation=stroke",    "root",
         NULL
     };
+#endif  /* !UCONFIG_NO_COLLATION */
 
     static const char *calCases[] = {
         /*   avail   locale                       equiv   */
index f30cceee2106b7c9c5ca46cce23f2ac3b617837d..6a9fb5b52c39296451cd4f949316a48132c26b80 100644 (file)
@@ -1,7 +1,7 @@
 /*
 ******************************************************************************
 *
-*   Copyright (C) 2002-2010, International Business Machines
+*   Copyright (C) 2002-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 ******************************************************************************
@@ -37,8 +37,6 @@ static void TestSurrogateSearching(void);
 static void TestUnescape(void);
 static void TestCountChar32(void);
 static void TestUCharIterator(void);
-static void TestUNormIterator(void);
-static void TestBadUNormIterator(void);
 
 void addUStringTest(TestNode** root);
 
@@ -51,8 +49,6 @@ void addUStringTest(TestNode** root)
     addTest(root, &TestUnescape, "tsutil/custrtst/TestUnescape");
     addTest(root, &TestCountChar32, "tsutil/custrtst/TestCountChar32");
     addTest(root, &TestUCharIterator, "tsutil/custrtst/TestUCharIterator");
-    addTest(root, &TestUNormIterator, "tsutil/custrtst/TestUNormIterator");
-    addTest(root, &TestBadUNormIterator, "tsutil/custrtst/TestBadUNormIterator");
 }
 
 /* test data for TestStringFunctions ---------------------------------------- */
@@ -1514,304 +1510,3 @@ TestUCharIterator() {
 
     /* ### TODO test other iterators: CharacterIterator, Replaceable */
 }
-
-#if UCONFIG_NO_COLLATION
-
-static void
-TestUNormIterator() {
-    /* test nothing */
-}
-
-static void
-TestBadUNormIterator(void) {
-    /* test nothing, as well */
-}
-
-#else
-
-#include "unicode/unorm.h"
-#include "unorm_it.h"
-
-/*
- * Compare results from two iterators, should be same.
- * Assume that the text is not empty and that
- * iteration start==0 and iteration limit==length.
- *
- * Modified version of compareIterators() but does not assume that indexes
- * are available.
- */
-static void
-compareIterNoIndexes(UCharIterator *iter1, const char *n1,
-                     UCharIterator *iter2, const char *n2,
-                     int32_t middle) {
-    uint32_t state;
-    int32_t i;
-    UChar32 c1, c2;
-    UErrorCode errorCode;
-
-    /* code coverage for unorm_it.c/unormIteratorGetIndex() */
-    if(
-        iter2->getIndex(iter2, UITER_START)!=0 ||
-        iter2->getIndex(iter2, UITER_LENGTH)!=UITER_UNKNOWN_INDEX
-    ) {
-        log_err("UNormIterator.getIndex() failed\n");
-    }
-
-    /* set into the middle */
-    iter1->move(iter1, middle, UITER_ZERO);
-    iter2->move(iter2, middle, UITER_ZERO);
-
-    /* test current() */
-    c1=iter1->current(iter1);
-    c2=iter2->current(iter2);
-    if(c1!=c2) {
-        log_err("%s->current()=U+%04x != U+%04x=%s->current() at middle=%d\n", n1, c1, c2, n2, middle);
-        return;
-    }
-
-    /* move forward 3 UChars */
-    for(i=0; i<3; ++i) {
-        c1=iter1->next(iter1);
-        c2=iter2->next(iter2);
-        if(c1!=c2) {
-            log_err("%s->next()=U+%04x != U+%04x=%s->next() at %d (started in middle)\n", n1, c1, c2, n2, iter1->getIndex(iter1, UITER_CURRENT));
-            return;
-        }
-    }
-
-    /* move backward 5 UChars */
-    for(i=0; i<5; ++i) {
-        c1=iter1->previous(iter1);
-        c2=iter2->previous(iter2);
-        if(c1!=c2) {
-            log_err("%s->previous()=U+%04x != U+%04x=%s->previous() at %d (started in middle)\n", n1, c1, c2, n2, iter1->getIndex(iter1, UITER_CURRENT));
-            return;
-        }
-    }
-
-    /* iterate forward from the beginning */
-    iter1->move(iter1, 0, UITER_START);
-    if(!iter1->hasNext(iter1)) {
-        log_err("%s->hasNext() at the start returns FALSE\n", n1);
-        return;
-    }
-
-    iter2->move(iter2, 0, UITER_START);
-    if(!iter2->hasNext(iter2)) {
-        log_err("%s->hasNext() at the start returns FALSE\n", n2);
-        return;
-    }
-
-    do {
-        c1=iter1->next(iter1);
-        c2=iter2->next(iter2);
-        if(c1!=c2) {
-            log_err("%s->next()=U+%04x != U+%04x=%s->next() at %d\n", n1, c1, c2, n2, iter1->getIndex(iter1, UITER_CURRENT));
-            return;
-        }
-    } while(c1>=0);
-
-    if(iter1->hasNext(iter1)) {
-        log_err("%s->hasNext() at the end returns TRUE\n", n1);
-        return;
-    }
-    if(iter2->hasNext(iter2)) {
-        log_err("%s->hasNext() at the end returns TRUE\n", n2);
-        return;
-    }
-
-    /* iterate backward */
-    do {
-        c1=iter1->previous(iter1);
-        c2=iter2->previous(iter2);
-        if(c1!=c2) {
-            log_err("%s->previous()=U+%04x != U+%04x=%s->previous() at %d\n", n1, c1, c2, n2, iter1->getIndex(iter1, UITER_CURRENT));
-            return;
-        }
-    } while(c1>=0);
-
-    /* back to the middle */
-    iter1->move(iter1, middle, UITER_ZERO);
-    iter2->move(iter2, middle, UITER_ZERO);
-
-    /* try get/set state */
-    while((state=uiter_getState(iter2))==UITER_NO_STATE) {
-        if(!iter2->hasNext(iter2)) {
-            log_err("%s has no known state from middle=%d to the end\n", n2, middle);
-            return;
-        }
-        iter2->next(iter2);
-    }
-
-    errorCode=U_ZERO_ERROR;
-
-    c2=iter2->current(iter2);
-    iter2->move(iter2, 0, UITER_ZERO);
-    uiter_setState(iter2, state, &errorCode);
-    c1=iter2->current(iter2);
-    if(U_FAILURE(errorCode) || c1!=c2) {
-        log_err("%s->current() differs across get/set state, U+%04x vs. U+%04x\n", n2, c2, c1);
-        return;
-    }
-
-    c2=iter2->previous(iter2);
-    iter2->move(iter2, 0, UITER_ZERO);
-    uiter_setState(iter2, state, &errorCode);
-    c1=iter2->previous(iter2);
-    if(U_FAILURE(errorCode) || c1!=c2) {
-        log_err("%s->previous() differs across get/set state, U+%04x vs. U+%04x\n", n2, c2, c1);
-        return;
-    }
-
-    /* iterate backward from the end */
-    iter1->move(iter1, 0, UITER_LIMIT);
-    if(!iter1->hasPrevious(iter1)) {
-        log_err("%s->hasPrevious() at the end returns FALSE\n", n1);
-        return;
-    }
-
-    iter2->move(iter2, 0, UITER_LIMIT);
-    if(!iter2->hasPrevious(iter2)) {
-        log_err("%s->hasPrevious() at the end returns FALSE\n", n2);
-        return;
-    }
-
-    do {
-        c1=iter1->previous(iter1);
-        c2=iter2->previous(iter2);
-        if(c1!=c2) {
-            log_err("%s->previous()=U+%04x != U+%04x=%s->previous() at %d\n", n1, c1, c2, n2, iter1->getIndex(iter1, UITER_CURRENT));
-            return;
-        }
-    } while(c1>=0);
-
-    if(iter1->hasPrevious(iter1)) {
-        log_err("%s->hasPrevious() at the start returns TRUE\n", n1);
-        return;
-    }
-    if(iter2->hasPrevious(iter2)) {
-        log_err("%s->hasPrevious() at the start returns TRUE\n", n2);
-        return;
-    }
-}
-
-/* n2 must have a digit 1 at the end, will be incremented with the normalization mode */
-static void
-testUNormIteratorWithText(const UChar *text, int32_t textLength, int32_t middle,
-                          const char *name1, const char *n2) {
-    UChar buffer[600];
-    char name2[40];
-
-    UCharIterator iter1, iter2, *iter;
-    UNormIterator *uni;
-
-    UNormalizationMode mode;
-    UErrorCode errorCode;
-    int32_t length;
-
-    /* open a normalizing iterator */
-    errorCode=U_ZERO_ERROR;
-    uni=unorm_openIter(NULL, 0, &errorCode);
-    if(U_FAILURE(errorCode)) {
-        log_err("unorm_openIter() fails: %s\n", u_errorName(errorCode));
-        return;
-    }
-
-    /* set iterator 2 to the original text */
-    uiter_setString(&iter2, text, textLength);
-
-    strcpy(name2, n2);
-
-    /* test the normalizing iterator for each mode */
-    for(mode=UNORM_NONE; mode<UNORM_MODE_COUNT; ++mode) {
-        length=unorm_normalize(text, textLength, mode, 0, buffer, LENGTHOF(buffer), &errorCode);
-        if(U_FAILURE(errorCode)) {
-            log_data_err("unorm_normalize(mode %d) failed: %s - (Are you missing data?)\n", mode, u_errorName(errorCode));
-            break;
-        }
-
-        /* set iterator 1 to the normalized text  */
-        uiter_setString(&iter1, buffer, length);
-
-        /* set the normalizing iterator to use iter2 */
-        iter=unorm_setIter(uni, &iter2, mode, &errorCode);
-        if(U_FAILURE(errorCode)) {
-            log_err("unorm_setIter(mode %d) failed: %s\n", mode, u_errorName(errorCode));
-            break;
-        }
-
-        compareIterNoIndexes(&iter1, name1, iter, name2, middle);
-        ++name2[strlen(name2)-1];
-    }
-
-    unorm_closeIter(uni);
-}
-
-static void
-TestUNormIterator() {
-    static const UChar text[]={ /* must contain <00C5 0327> see u_strchr() below */
-        0x61,                                                   /* 'a' */
-        0xe4, 0x61, 0x308,                                      /* variations of 'a'+umlaut */
-        0xc5, 0x327, 0x41, 0x30a, 0x327, 0x41, 0x327, 0x30a,    /* variations of 'A'+ring+cedilla */
-        0xfb03, 0xfb00, 0x69, 0x66, 0x66, 0x69, 0x66, 0xfb01    /* variations of 'ffi' */
-    };
-    static const UChar surrogateText[]={
-        0x6e, 0xd900, 0x6a, 0xdc00, 0xd900, 0xdc00, 0x61
-    };
-
-    UChar longText[600];
-    int32_t i, middle, length;
-
-    length=LENGTHOF(text);
-    testUNormIteratorWithText(text, length, length/2, "UCharIter", "UNormIter1");
-    testUNormIteratorWithText(text, length, length, "UCharIterEnd", "UNormIterEnd1");
-
-    /* test again, this time with an insane string to cause internal buffer overflows */
-    middle=(int32_t)(u_strchr(text, 0x327)-text); /* see comment at text[] */
-    memcpy(longText, text, middle*U_SIZEOF_UCHAR);
-    for(i=0; i<150; ++i) {
-        longText[middle+i]=0x30a; /* insert many rings between 'A-ring' and cedilla */
-    }
-    memcpy(longText+middle+i, text+middle, (LENGTHOF(text)-middle)*U_SIZEOF_UCHAR);
-    length=LENGTHOF(text)+i;
-
-    /* append another copy of this string for more overflows */
-    memcpy(longText+length, longText, length*U_SIZEOF_UCHAR);
-    length*=2;
-
-    /* the first test of the following two starts at length/4, inside the sea of combining rings */
-    testUNormIteratorWithText(longText, length, length/4, "UCharIterLong", "UNormIterLong1");
-    testUNormIteratorWithText(longText, length, length, "UCharIterLongEnd", "UNormIterLongEnd1");
-
-    length=LENGTHOF(surrogateText);
-    testUNormIteratorWithText(surrogateText, length, length/4, "UCharIterSurr", "UNormIterSurr1");
-    testUNormIteratorWithText(surrogateText, length, length, "UCharIterSurrEnd", "UNormIterSurrEnd1");
-}
-
-static void
-TestBadUNormIterator(void) {
-#if !UCONFIG_NO_NORMALIZATION
-    UErrorCode status = U_ILLEGAL_ESCAPE_SEQUENCE;
-    UNormIterator *uni;
-
-    unorm_setIter(NULL, NULL, UNORM_NONE, &status);
-    if (status != U_ILLEGAL_ESCAPE_SEQUENCE) {
-        log_err("unorm_setIter changed the error code to: %s\n", u_errorName(status));
-    }
-    status = U_ZERO_ERROR;
-    unorm_setIter(NULL, NULL, UNORM_NONE, &status);
-    if (status != U_ILLEGAL_ARGUMENT_ERROR) {
-        log_err("unorm_setIter didn't react correctly to bad arguments: %s\n", u_errorName(status));
-    }
-    status = U_ZERO_ERROR;
-    uni=unorm_openIter(NULL, 0, &status);
-    if(U_FAILURE(status)) {
-        log_err("unorm_openIter() fails: %s\n", u_errorName(status));
-        return;
-    }
-    unorm_setIter(uni, NULL, UNORM_NONE, &status);
-    unorm_closeIter(uni);
-#endif
-}
-
-#endif
index 70c4f66baa1179b428fda370f4e582a21c17c692..bdcf8340fe180e9bb2183fece3a3c6c59715473f 100644 (file)
@@ -1,10 +1,10 @@
 /********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 1998-2013, International Business Machines Corporation and
+ * Copyright (c) 1998-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 /*
-* File test.c
+* File udatatst.c
 *
 * Modification History:
 *
@@ -1304,8 +1304,11 @@ static const struct {
 #if !UCONFIG_NO_COLLATION
     /* standalone collation data files */
     {"ucadata",                  "icu", ucol_swap},
+#if 0
+    /* Starting with ICU 53, the "inverse UCA" data is integrated into ucadata.icu. */
     {"invuca",                   "icu", ucol_swapInverseUCA},
 #endif
+#endif
 
 #if !UCONFIG_NO_LEGACY_CONVERSION
     /* conversion table files */
@@ -1676,12 +1679,11 @@ TestSwapData() {
     }
     errorCode=U_ZERO_ERROR;
 
-    /* Test argument checking. ucol_swapBinary is normally tested via ures_swap, and isn't normally called directly. */
+    /* Test argument checking. ucol_swap is normally tested via ures_swap, and isn't normally called directly. */
 #if !UCONFIG_NO_COLLATION
-    ucol_swapBinary(NULL, NULL, -1, NULL, NULL);
-    ucol_swapBinary(NULL, NULL, -1, NULL, &errorCode);
+    ucol_swap(NULL, NULL, -1, NULL, &errorCode);
     if (errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
-        log_err("ucol_swapBinary did not fail as expected\n", name);
+        log_err("ucol_swap did not fail as expected\n", name);
     }
     errorCode=U_ZERO_ERROR;
 #endif
@@ -1698,11 +1700,13 @@ TestSwapData() {
             pkg=U_ICUDATA_BRKITR;
             nm=swapCases[i].name;
             uprv_strcpy(name, U_ICUDATA_BRKITR);
+#if !UCONFIG_NO_COLLATION
         } else if (uprv_strcmp(swapCases[i].name, "ucadata")==0
             || uprv_strcmp(swapCases[i].name, "invuca")==0) {
             pkg=U_ICUDATA_COLL;
             nm=swapCases[i].name;
             uprv_strcpy(name, U_ICUDATA_COLL);
+#endif  /* !UCONFIG_NO_COLLATION */
         } else {
             pkg=NULL;
             nm=swapCases[i].name;
index 5a70c00115903e71013f94dc95b7e3f05486c461..166ae836ec6043caad7694d4014d18a1505e5077 100644 (file)
@@ -134,7 +134,7 @@ library: common
     date_interval
     breakiterator
     uts46 filterednormalizer2 normalizer2 canonical_iterator
-    normlzr unormcmp unorm_it unorm
+    normlzr unormcmp unorm
     idna2003 stringprep
     stringenumeration
     unistr_core unistr_props unistr_case unistr_case_locale unistr_titlecase_brkiter unistr_cnv
@@ -188,11 +188,6 @@ group: unormcmp  # unorm_compare()
     uniset_props  # for uniset_getUnicode32Instance()
     ucase
 
-group: unorm_it  # UNormIterator
-    unorm_it.o
-  deps
-    unorm uiter
-
 group: unorm  # old normalization C API
     unorm.o
   deps
@@ -723,7 +718,7 @@ group: icuplug
 group: ucol_swp
     ucol_swp.o
   deps
-    platform
+    utrie2  # Format version 4 uses UTrie2.
 
 group: errorcode  # ErrorCode base class
     errorcode.o
@@ -760,7 +755,8 @@ group: platform
 library: i18n
   deps
     region localedata genderinfo charset_detector spoof_detection
-    alphabetic_index collation formatting formattable_cnv regex regex_cnv translit
+    alphabetic_index collation collation_builder string_search
+    formatting formattable_cnv regex regex_cnv translit
     universal_time_scale
     uclean_i18n
 
@@ -803,12 +799,36 @@ group: alphabetic_index
     uclean_i18n
 
 group: collation
-    bocsu.o coleitr.o coll.o sortkey.o tblcoll.o ucol.o
-    ucol_bld.o ucol_cnt.o ucol_elm.o ucol_res.o ucol_sit.o ucol_tok.o ucol_wgt.o ucoleitr.o
+    # The collation "runtime" code should not depend on the collation_builder code.
+    # For example, loading from resource bundles does not fall back to
+    # building from rules.
+    collation.o collationcompare.o collationdata.o
+    collationdatareader.o collationdatawriter.o
+    collationfastlatin.o collationfcd.o collationiterator.o collationkeys.o
+    collationroot.o collationrootelements.o collationsets.o
+    collationsettings.o collationtailoring.o rulebasedcollator.o
+    uitercollationiterator.o utf16collationiterator.o utf8collationiterator.o
+    bocsu.o coleitr.o coll.o sortkey.o ucol.o
+    ucol_res.o ucol_sit.o ucoleitr.o
+  deps
+    bytestream normalizer2 resourcebundle service_registration
+    ucharstrieiterator uiter ulist uset usetiter uvector32 uvector64
+    uclean_i18n
+
+group: collation_builder
+    # The CollationBaseDataBuilder is only called from genuca, and maybe from tests.
+    # It is in the i18n library so that it gets maintained and refactored together with
+    # related code.
+    collationbasedatabuilder.o
+    collationbuilder.o collationdatabuilder.o collationfastlatinbuilder.o
+    collationruleparser.o collationweights.o
+  deps
+    canonical_iterator collation ucharstriebuilder uset_props
+
+group: string_search
     search.o stsearch.o usearch.o
   deps
-    common  # TODO: Could be narrower.
-    uclean_i18n
+    breakiterator collation
 
 group: formatting
     # TODO: Try to subdivide this ball of wax.
@@ -841,7 +861,7 @@ group: formatting
   deps
     digitlist formattable format
     pluralrules
-    collation  # for rbnf
+    collation collation_builder  # for rbnf
     common
     floating_point  # sqrt() for astro.o
     trigonometry  # for astro.o
index 0b7189134b50648602e2cf20e2d0f29344594c8b..dcc02a2be51b3db277cc07d98cb968bf196fab01 100644 (file)
@@ -37,8 +37,8 @@ DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"'
 LIBS = $(LIBCTESTFW) $(LIBICUI18N) $(LIBICUUC) $(LIBICUTOOLUTIL) $(DEFAULT_LIBS) $(LIB_M) $(LIB_THREAD)
 
 OBJECTS = aliastst.o allcoll.o apicoll.o astrotst.o callimts.o calregts.o caltest.o \
-caltztst.o canittst.o citrtest.o cntabcol.o colldata.o convtest.o currcoll.o \
-fldset.o dadrfmt.o dadrcal.o dadrcoll.o dcfmapts.o decoll.o dtfmapts.o dtfmrgts.o dtfmtrtts.o dtfmttst.o       \
+caltztst.o canittst.o citrtest.o colldata.o convtest.o currcoll.o collationtest.o \
+fldset.o dadrfmt.o dadrcal.o dcfmapts.o decoll.o dtfmapts.o dtfmrgts.o dtfmtrtts.o dtfmttst.o  \
 dtptngts.o encoll.o escoll.o ficoll.o frcoll.o g7coll.o intltest.o     \
 itercoll.o itformat.o itmajor.o itutil.o jacoll.o lcukocol.o   \
 loctest.o miscdtfm.o mnkytst.o msfmrgts.o nmfmapts.o nmfmtrt.o         \
index bfc53e693ea2f0dcfd782f401b549d20bada4cc6..3daae4b1173fab84e877707884ccf066a5ad8edc 100644 (file)
@@ -1,10 +1,10 @@
 /********************************************************************
  * COPYRIGHT:
- * Copyright (c) 2012-2013, International Business Machines Corporation
+ * Copyright (c) 2012-2014, International Business Machines Corporation
  * and others. All Rights Reserved.
  ********************************************************************/
 //
-//   file:  alphaindex.cpp
+//   file:  alphaindextst.cpp
 //          Alphabetic Index Tests.
 //
 //   Note: please... no character literals cast to UChars.. use (UChar)0xZZZZ
@@ -63,6 +63,7 @@ void AlphabeticIndexTest::runIndexedTest( int32_t index, UBool exec, const char*
     TESTCASE_AUTO(TestSchSt);
     TESTCASE_AUTO(TestNoLabels);
     TESTCASE_AUTO(TestChineseZhuyin);
+    TESTCASE_AUTO(TestJapaneseKanji);
     TESTCASE_AUTO_END;
 }
 
@@ -93,7 +94,8 @@ void AlphabeticIndexTest::APITest() {
     // Constructor from a Collator
     //
     status = U_ZERO_ERROR;
-    RuleBasedCollator *coll = dynamic_cast<RuleBasedCollator *>(Collator::createInstance(Locale::getChinese(), status));
+    RuleBasedCollator *coll = dynamic_cast<RuleBasedCollator *>(
+        Collator::createInstance(Locale::getGerman(), status));
     TEST_CHECK_STATUS;
     TEST_ASSERT(coll != NULL);
     index = new AlphabeticIndex(coll, status);
@@ -572,9 +574,9 @@ void AlphabeticIndexTest::TestHaniFirst() {
     assertEquals("getBucketIndex(i)", 9, bucketIndex);
     bucketIndex = index.getBucketIndex(UnicodeString((UChar)0x03B1), status);
     assertEquals("getBucketIndex(Greek alpha)", 27, bucketIndex);
-    // TODO: Test with an unassigned code point (not just U+FFFF)
-    // when unassigned code points are not in the Hani reordering group any more.
-    // String unassigned = UTF16.valueOf(0x50005);
+    // U+50005 is an unassigned code point which sorts at the end, independent of the Hani group.
+    bucketIndex = index.getBucketIndex(UnicodeString(0x50005), status);
+    assertEquals("getBucketIndex(U+50005)", 27, bucketIndex);
     bucketIndex = index.getBucketIndex(UnicodeString((UChar)0xFFFF), status);
     assertEquals("getBucketIndex(U+FFFF)", 27, bucketIndex);
 }
@@ -592,7 +594,7 @@ void AlphabeticIndexTest::TestPinyinFirst() {
     TEST_CHECK_STATUS;
     AlphabeticIndex index(coll.orphan(), status);
     TEST_CHECK_STATUS;
-    assertEquals("getBucketCount()", 1, index.getBucketCount(status));   // ... (underflow only)
+    assertEquals("getBucketCount()", 28, index.getBucketCount(status));   // ... A-Z ...
     index.addLabels(Locale::getChinese(), status);
     assertEquals("getBucketCount()", 28, index.getBucketCount(status));  // ... A-Z ...
     int32_t bucketIndex = index.getBucketIndex(UnicodeString((UChar)0x897f), status);
@@ -601,9 +603,9 @@ void AlphabeticIndexTest::TestPinyinFirst() {
     assertEquals("getBucketIndex(i)", 9, bucketIndex);
     bucketIndex = index.getBucketIndex(UnicodeString((UChar)0x03B1), status);
     assertEquals("getBucketIndex(Greek alpha)", (int32_t)27, bucketIndex);
-    // TODO: Test with an unassigned code point (not just U+FFFF)
-    // when unassigned code points are not in the Hani reordering group any more.
-    // String unassigned = UTF16.valueOf(0x50005);
+    // U+50005 is an unassigned code point which sorts at the end, independent of the Hani group.
+    bucketIndex = index.getBucketIndex(UnicodeString(0x50005), status);
+    assertEquals("getBucketIndex(U+50005)", 27, bucketIndex);
     bucketIndex = index.getBucketIndex(UnicodeString((UChar)0xFFFF), status);
     assertEquals("getBucketIndex(U+FFFF)", 27, bucketIndex);
 }
@@ -682,4 +684,21 @@ void AlphabeticIndexTest::TestChineseZhuyin() {
     assertEquals("label 5", UnicodeString((UChar)0x3109), immIndex->getBucket(5)->getLabel());
 }
 
+void AlphabeticIndexTest::TestJapaneseKanji() {
+    UErrorCode status = U_ZERO_ERROR;
+    AlphabeticIndex index(Locale::getJapanese(), status);
+    LocalPointer<AlphabeticIndex::ImmutableIndex> immIndex(index.buildImmutableIndex(status));
+    TEST_CHECK_STATUS;
+    // There are no index characters for Kanji in the Japanese standard collator.
+    // They should all go into the overflow bucket.
+    static const UChar32 kanji[] = { 0x4E9C, 0x95C7, 0x4E00, 0x58F1 };
+    int32_t overflowIndex = immIndex->getBucketCount() - 1;
+    for(int32_t i = 0; i < LENGTHOF(kanji); ++i) {
+        char msg[40];
+        sprintf(msg, "kanji[%d]=U+%04lX in overflow bucket", (int)i, (long)kanji[i]);
+        assertEquals(msg, overflowIndex, immIndex->getBucketIndex(UnicodeString(kanji[i]), status));
+        TEST_CHECK_STATUS;
+    }
+}
+
 #endif
index 2f864712d05bf5bdb3fcb67f34aa9588bfa564bf..6953ae6ae15c93fc7c10e8c97a73d9d080d118be 100644 (file)
@@ -1,10 +1,10 @@
 /********************************************************************
  * COPYRIGHT:
- * Copyright (c) 2012-2013, International Business Machines Corporation and
+ * Copyright (c) 2012-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 //
-//   file:  alphaindex.h
+//   file:  alphaindextst.h
 //          Alphabetic Index Tests.
 //
 
@@ -45,6 +45,7 @@ public:
      * Test with the Bopomofo-phonetic tailoring.
      */
     void TestChineseZhuyin();
+    void TestJapaneseKanji();
 };
 
 #endif
index a51400b767c14485606882e0e3b22987e7ac8f2c..2745317ef6c9f0887036587b5c2d94c0f1431e49 100644 (file)
@@ -1,11 +1,11 @@
 /********************************************************************
  * COPYRIGHT:
- * Copyright (c) 1997-2013, International Business Machines Corporation and
+ * Copyright (c) 1997-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 //===============================================================================
 //
-// File apitest.cpp
+// File apicoll.cpp
 //
 //
 //
@@ -56,38 +56,6 @@ CollationAPITest::doAssert(UBool condition, const char *message)
     }
 }
 
-#ifdef U_USE_COLLATION_OBSOLETE_2_6
-/*
- * Test Collator::createInstance(... version...) for some locale. Called by TestProperty().
- */
-static void
-TestOpenVersion(IntlTest &test, const Locale &locale) {
-    UVersionInfo version1, version2;
-    Collator *collator1, *collator2;
-    UErrorCode errorCode;
-
-    errorCode=U_ZERO_ERROR;
-    collator1=Collator::createInstance(locale, errorCode);
-    if(U_SUCCESS(errorCode)) {
-        /* get the current version */
-        collator1->getVersion(version1);
-        delete collator1;
-
-        /* try to get that same version again */
-        collator2=Collator::createInstance(locale, version1, errorCode);
-        if(U_SUCCESS(errorCode)) {
-            collator2->getVersion(version2);
-            if(0!=uprv_memcmp(version1, version2, sizeof(UVersionInfo))) {
-                test.errln("error: Collator::createInstance(\"%s\", (%s collator)->getVersion()) returns a different collator\n", locale.getName(), locale.getName());
-            }
-            delete collator2;
-        } else {
-            test.errln("error: Collator::createInstance(\"%s\", (%s collator)->getVersion()) fails: %s\n", locale.getName(), locale.getName(), u_errorName(errorCode));
-        }
-    }
-}
-#endif
-
 // Collator Class Properties
 // ctor, dtor, createInstance, compare, getStrength/setStrength
 // getDecomposition/setDecomposition, getDisplayName
@@ -263,25 +231,6 @@ CollationAPITest::TestProperty(/* char* par */)
     delete frCol;
     delete aFrCol;
     delete junk;
-
-#ifdef U_USE_COLLATION_OBSOLETE_2_6
-    /* test Collator::createInstance(...version...) */
-    TestOpenVersion(*this, "");
-    TestOpenVersion(*this, "da");
-    TestOpenVersion(*this, "fr");
-    TestOpenVersion(*this, "ja");
-
-    /* try some bogus version */
-    versionArray[0]=0;
-    versionArray[1]=0x99;
-    versionArray[2]=0xc7;
-    versionArray[3]=0xfe;
-    col=Collator::createInstance(Locale(), versionArray, success);
-    if(U_SUCCESS(success)) {
-        errln("error: ucol_openVersion(bogus version) succeeded");
-        delete col;
-    }
-#endif
 }
 
 void 
@@ -550,12 +499,35 @@ CollationAPITest::TestCollationKey(/* char* par */)
     UErrorCode key1Status = U_ZERO_ERROR, key2Status = U_ZERO_ERROR;
 
     logln("Testing weird arguments");
-    col->getCollationKey(NULL, 0, sortk1, key1Status);
-    // key gets reset here
+    // No string vs. empty string vs. completely-ignorable string:
+    // See ICU ticket #10495.
+    CollationKey sortkNone;
     int32_t length;
-    sortk1.getByteArray(length);
-    doAssert(sortk1.isBogus() == FALSE && length == 0,
-             "Empty string should return an empty collation key");
+    sortkNone.getByteArray(length);
+    doAssert(!sortkNone.isBogus() && length == 0,
+             "Default-constructed collation key should be empty");
+    CollationKey sortkEmpty;
+    col->getCollationKey(NULL, 0, sortkEmpty, key1Status);
+    // key gets reset here
+    const uint8_t* byteArrayEmpty = sortkEmpty.getByteArray(length);
+    doAssert(sortkEmpty.isBogus() == FALSE && length == 3 &&
+             byteArrayEmpty[0] == 1 && byteArrayEmpty[1] == 1 && byteArrayEmpty[2] == 0,
+             "Empty string should return a collation key with empty levels");
+    doAssert(sortkNone.compareTo(sortkEmpty) == Collator::LESS,
+             "Expected no collation key < collation key for empty string");
+    doAssert(sortkEmpty.compareTo(sortkNone) == Collator::GREATER,
+             "Expected collation key for empty string > no collation key");
+
+    CollationKey sortkIgnorable;
+    // Most control codes and CGJ are completely ignorable.
+    // A string with only completely ignorables must compare equal to an empty string.
+    col->getCollationKey(UnicodeString((UChar)1).append((UChar)0x34f), sortkIgnorable, key1Status);
+    sortkIgnorable.getByteArray(length);
+    doAssert(!sortkIgnorable.isBogus() && length == 3,
+             "Completely ignorable string should return a collation key with empty levels");
+    doAssert(sortkIgnorable.compareTo(sortkEmpty) == Collator::EQUAL,
+             "Completely ignorable string should compare equal to empty string");
+
     // bogus key returned here
     key1Status = U_ILLEGAL_ARGUMENT_ERROR;
     col->getCollationKey(NULL, 0, sortk1, key1Status);
@@ -566,12 +538,15 @@ CollationAPITest::TestCollationKey(/* char* par */)
     logln("Use tertiary comparison level testing ....");
 
     col->getCollationKey(test1, sortk1, key1Status);
+    if (U_FAILURE(key1Status)) {
+        errln("getCollationKey(Abcda) failed - %s", u_errorName(key1Status));
+        return;
+    }
     doAssert((sortk1.compareTo(col->getCollationKey(test2, sortk2, key2Status)))
                  == Collator::GREATER,
                 "Result should be \"Abcda\" >>> \"abcda\"");
 
-    CollationKey sortk3(sortk2), sortkNew, sortkEmpty;
-
+    CollationKey sortk3(sortk2), sortkNew;
 
     sortkNew = sortk1;
     doAssert((sortk1 != sortk2), "The sort keys should be different");
@@ -838,8 +813,8 @@ void
 CollationAPITest::TestOperators(/* char* par */)
 {
     UErrorCode success = U_ZERO_ERROR;
-    UnicodeString ruleset1("< a, A < b, B < c, C; ch, cH, Ch, CH < d, D, e, E");
-    UnicodeString ruleset2("< a, A < b, B < c, C < d, D, e, E");
+    UnicodeString ruleset1("&9 < a, A < b, B < c, C; ch, cH, Ch, CH < d, D, e, E");
+    UnicodeString ruleset2("&9 < a, A < b, B < c, C < d, D, e, E");
     RuleBasedCollator *col1 = new RuleBasedCollator(ruleset1, success);
     if (U_FAILURE(success)) {
         errcheckln(success, "RuleBasedCollator creation failed. - %s", u_errorName(success));
@@ -925,16 +900,15 @@ CollationAPITest::TestDuplicate(/* char* par */)
     }
     Collator *col2 = col1->clone();
     doAssert((*col1 == *col2), "Cloned object is not equal to the orginal");
-    UnicodeString *ruleset = new UnicodeString("< a, A < b, B < c, C < d, D, e, E");
-    RuleBasedCollator *col3 = new RuleBasedCollator(*ruleset, status);
-    doAssert((*col1 != *col3), "Cloned object is equal to some dummy");
-    *col3 = *((RuleBasedCollator*)col1);
-    doAssert((*col1 == *col3), "Copied object is not equal to the orginal");
-
+    UnicodeString ruleset("&9 < a, A < b, B < c, C < d, D, e, E");
+    RuleBasedCollator *col3 = new RuleBasedCollator(ruleset, status);
     if (U_FAILURE(status)) {
         logln("Collation tailoring failed.");
         return;
     }
+    doAssert((*col1 != *col3), "Cloned object is equal to some dummy");
+    *col3 = *((RuleBasedCollator*)col1);
+    doAssert((*col1 == *col3), "Copied object is not equal to the orginal");
 
     UCollationResult res;
     UnicodeString first((UChar)0x0061);
@@ -942,7 +916,6 @@ CollationAPITest::TestDuplicate(/* char* par */)
     UnicodeString copiedEnglishRules(((RuleBasedCollator*)col1)->getRules());
 
     delete col1;
-    delete ruleset;
 
     // Try using the cloned collators after deleting the original data
     res = col2->compare(first, second, status);
@@ -1329,7 +1302,7 @@ void CollationAPITest::TestMaxExpansion()
         if (order == 0)
             order = iter->previous(status);
 
-        while (U_SUCCESS(status) && iter->previous(status) != UCOL_NULLORDER) {
+        while (U_SUCCESS(status) && iter->previous(status) != CollationElementIterator::NULLORDER) {
             count ++;
         }
 
@@ -1554,19 +1527,41 @@ void CollationAPITest::TestVariableTopSetting() {
 
   uint32_t oldVarTop = coll->getVariableTop(status);
 
+  // ICU 53+: The character must be in a supported reordering group,
+  // and the variable top is pinned to the end of that group.
   vt[0] = 0x0041;
 
+  (void)coll->setVariableTop(vt, 1, status);
+  if(status != U_ILLEGAL_ARGUMENT_ERROR) {
+    errln("setVariableTop(letter) did not detect illegal argument - %s", u_errorName(status));
+  }
+
+  status = U_ZERO_ERROR;
+  vt[0] = 0x24;  // dollar sign (currency symbol)
   uint32_t newVarTop = coll->setVariableTop(vt, 1, status);
 
-  if((newVarTop & 0xFFFF0000) != (coll->getVariableTop(status) & 0xFFFF0000)) {
-    errln("Didn't set vartop properly\n");
+  if(newVarTop != coll->getVariableTop(status)) {
+    errln("setVariableTop(dollar sign) != following getVariableTop()");
   }
 
+  UnicodeString dollar((UChar)0x24);
+  UnicodeString euro((UChar)0x20AC);
+  uint32_t newVarTop2 = coll->setVariableTop(euro, status);
+  assertEquals("setVariableTop(Euro sign) == following getVariableTop()",
+               (int64_t)newVarTop2, (int64_t)coll->getVariableTop(status));
+  assertEquals("setVariableTop(Euro sign) == setVariableTop(dollar sign) (should pin to top of currency group)",
+               (int64_t)newVarTop2, (int64_t)newVarTop);
+
+  coll->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, status);
+  assertEquals("empty==dollar", UCOL_EQUAL, coll->compare(UnicodeString(), dollar));
+  assertEquals("empty==euro", UCOL_EQUAL, coll->compare(UnicodeString(), euro));
+  assertEquals("dollar<zero", UCOL_LESS, coll->compare(dollar, UnicodeString((UChar)0x30)));
+
   coll->setVariableTop(oldVarTop, status);
 
   uint32_t newerVarTop = coll->setVariableTop(UnicodeString(vt, 1), status);
 
-  if((newVarTop & 0xFFFF0000) != (newerVarTop & 0xFFFF0000)) {
+  if(newVarTop != newerVarTop) {
     errln("Didn't set vartop properly from UnicodeString!\n");
   }
 
@@ -1574,13 +1569,62 @@ void CollationAPITest::TestVariableTopSetting() {
 
 }
 
+void CollationAPITest::TestMaxVariable() {
+  UErrorCode errorCode = U_ZERO_ERROR;
+  LocalPointer<Collator> coll(Collator::createInstance(Locale::getRoot(), errorCode));
+  if(U_FAILURE(errorCode)) {
+    errcheckln(errorCode, "Collator creation failed with error %s", u_errorName(errorCode));
+    return;
+  }
+
+  (void)coll->setMaxVariable(UCOL_REORDER_CODE_OTHERS, errorCode);
+  if(errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
+    errln("setMaxVariable(others) did not detect illegal argument - %s", u_errorName(errorCode));
+  }
+
+  errorCode = U_ZERO_ERROR;
+  (void)coll->setMaxVariable(UCOL_REORDER_CODE_CURRENCY, errorCode);
+
+  if(UCOL_REORDER_CODE_CURRENCY != coll->getMaxVariable()) {
+    errln("setMaxVariable(currency) != following getMaxVariable()");
+  }
+
+  coll->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, errorCode);
+  assertEquals("empty==dollar", UCOL_EQUAL, coll->compare(UnicodeString(), UnicodeString((UChar)0x24)));
+  assertEquals("empty==euro", UCOL_EQUAL, coll->compare(UnicodeString(), UnicodeString((UChar)0x20AC)));
+  assertEquals("dollar<zero", UCOL_LESS, coll->compare(UnicodeString((UChar)0x24), UnicodeString((UChar)0x30)));
+}
+
 void CollationAPITest::TestGetLocale() {
   UErrorCode status = U_ZERO_ERROR;
   const char *rules = "&a<x<y<z";
   UChar rlz[256] = {0};
 
-  Collator *coll = NULL;
-  Locale locale;
+  Collator *coll = Collator::createInstance("root", status);
+  if(U_FAILURE(status)) {
+    dataerrln("Failed to open collator for \"root\" with %s", u_errorName(status));
+    return;
+  }
+  Locale locale = coll->getLocale(ULOC_ACTUAL_LOCALE, status);
+  if(locale != Locale::getRoot()) {
+    errln("Collator::createInstance(\"root\").getLocale(actual) != Locale::getRoot(); "
+          "getLocale().getName() = \"%s\"",
+          locale.getName());
+  }
+  delete coll;
+
+  coll = Collator::createInstance("", status);
+  if(U_FAILURE(status)) {
+    dataerrln("Failed to open collator for \"\" with %s", u_errorName(status));
+    return;
+  }
+  locale = coll->getLocale(ULOC_ACTUAL_LOCALE, status);
+  if(locale != Locale::getRoot()) {
+    errln("Collator::createInstance(\"\").getLocale(actual) != Locale::getRoot(); "
+          "getLocale().getName() = \"%s\"",
+          locale.getName());
+  }
+  delete coll;
 
   int32_t i = 0;
 
@@ -1589,34 +1633,62 @@ void CollationAPITest::TestGetLocale() {
     const char* validLocale;
     const char* actualLocale;
   } testStruct[] = {
-    { "sr_YU", "sr_YU", "root" },
-    { "sh_YU", "sh_YU", "sh" },
-    { "en_US_CALIFORNIA", "en_US", "root" },
-    { "fr_FR_NONEXISTANT", "fr_FR", "fr" }
+    // Note: Locale::getRoot().getName() == "" not "root".
+    { "de_DE", "de_DE", "" },
+    { "sr_RS", "sr_Cyrl_RS", "sr" },
+    { "en_US_CALIFORNIA", "en_US", "" },
+    { "fr_FR_NONEXISTANT", "fr_FR", "" },
+    // pinyin is the default, therefore suppressed.
+    { "zh_CN", "zh_Hans_CN", "zh" },
+    // zh_Hant has default=stroke but the data is in zh.
+    { "zh_TW", "zh_Hant_TW", "zh@collation=stroke" },
+    { "zh_TW@collation=pinyin", "zh_Hant_TW@collation=pinyin", "zh" },
+    { "zh_CN@collation=stroke", "zh_Hans_CN@collation=stroke", "zh@collation=stroke" }
   };
 
   u_unescape(rules, rlz, 256);
 
   /* test opening collators for different locales */
-  for(i = 0; i<(int32_t)(sizeof(testStruct)/sizeof(testStruct[0])); i++) {
+  for(i = 0; i<(int32_t)LENGTHOF(testStruct); i++) {
     status = U_ZERO_ERROR;
     coll = Collator::createInstance(testStruct[i].requestedLocale, status);
     if(U_FAILURE(status)) {
-      log("Failed to open collator for %s with %s\n", testStruct[i].requestedLocale, u_errorName(status));
+      errln("Failed to open collator for %s with %s", testStruct[i].requestedLocale, u_errorName(status));
       delete coll;
       continue;
     }
+    // The requested locale may be the same as the valid locale,
+    // or may not be supported at all. See ticket #10477.
     locale = coll->getLocale(ULOC_REQUESTED_LOCALE, status);
-    if(locale != testStruct[i].requestedLocale) {
-      log("[Coll %s]: Error in requested locale, expected %s, got %s\n", testStruct[i].requestedLocale, testStruct[i].requestedLocale, locale.getName());
+    if(locale != testStruct[i].requestedLocale && locale != testStruct[i].validLocale) {
+      errln("[Coll %s]: Error in requested locale, expected %s or %s, got %s",
+            testStruct[i].requestedLocale,
+            testStruct[i].requestedLocale, testStruct[i].validLocale, locale.getName());
     }
     locale = coll->getLocale(ULOC_VALID_LOCALE, status);
     if(locale != testStruct[i].validLocale) {
-      log("[Coll %s]: Error in valid locale, expected %s, got %s\n", testStruct[i].requestedLocale, testStruct[i].validLocale, locale.getName());
+      errln("[Coll %s]: Error in valid locale, expected %s, got %s",
+            testStruct[i].requestedLocale, testStruct[i].validLocale, locale.getName());
     }
     locale = coll->getLocale(ULOC_ACTUAL_LOCALE, status);
     if(locale != testStruct[i].actualLocale) {
-      log("[Coll %s]: Error in actual locale, expected %s, got %s\n", testStruct[i].requestedLocale, testStruct[i].actualLocale, locale.getName());
+      errln("[Coll %s]: Error in actual locale, expected %s, got %s",
+            testStruct[i].requestedLocale, testStruct[i].actualLocale, locale.getName());
+    }
+    // If we open a collator for the actual locale, we should get an equivalent one again.
+    LocalPointer<Collator> coll2(Collator::createInstance(locale, status));
+    if(U_FAILURE(status)) {
+      errln("Failed to open collator for actual locale \"%s\" with %s",
+            locale.getName(), u_errorName(status));
+    } else {
+      Locale actual2 = coll2->getLocale(ULOC_ACTUAL_LOCALE, status);
+      if(actual2 != locale) {
+        errln("[Coll actual \"%s\"]: Error in actual locale, got different one: \"%s\"",
+              locale.getName(), actual2.getName());
+      }
+      if(*coll2 != *coll) {
+        errln("[Coll actual \"%s\"]: Got different collator than before", locale.getName());
+      }
     }
     delete coll;
   }
@@ -1626,23 +1698,20 @@ void CollationAPITest::TestGetLocale() {
     Collator *defaultColl = Collator::createInstance((const Locale)NULL, status);
     coll = Collator::createInstance("blahaha", status);
     if(U_FAILURE(status)) {
-      log("Failed to open collator with %s\n", u_errorName(status));
+      errln("Failed to open collator with %s", u_errorName(status));
       delete coll;
       delete defaultColl;
       return;
     }
-    if(coll->getLocale(ULOC_REQUESTED_LOCALE, status) != "blahaha") {
-      log("Nonexisting locale didn't preserve the requested locale\n");
-    }
     if(coll->getLocale(ULOC_VALID_LOCALE, status) !=
       defaultColl->getLocale(ULOC_VALID_LOCALE, status)) {
-      log("Valid locale for nonexisting locale locale collator differs "
-        "from valid locale for default collator\n");
+      errln("Valid locale for nonexisting locale locale collator differs "
+        "from valid locale for default collator");
     }
     if(coll->getLocale(ULOC_ACTUAL_LOCALE, status) !=
       defaultColl->getLocale(ULOC_ACTUAL_LOCALE, status)) {
-      log("Actual locale for nonexisting locale locale collator differs "
-        "from actual locale for default collator\n");
+      errln("Actual locale for nonexisting locale locale collator differs "
+        "from actual locale for default collator");
     }
     delete coll;
     delete defaultColl;
@@ -1654,15 +1723,15 @@ void CollationAPITest::TestGetLocale() {
   coll = new RuleBasedCollator(rlz, status);
   locale = coll->getLocale(ULOC_REQUESTED_LOCALE, status);
   if(!locale.isBogus()) {
-    log("For collator instantiated from rules, requested locale %s is not bogus\n", locale.getName());
+    errln("For collator instantiated from rules, requested locale %s is not bogus", locale.getName());
   }
   locale = coll->getLocale(ULOC_VALID_LOCALE, status);
   if(!locale.isBogus()) {
-    log("For collator instantiated from rules, valid locale %s is not bogus\n", locale.getName());
+    errln("For collator instantiated from rules, valid locale %s is not bogus", locale.getName());
   }
   locale = coll->getLocale(ULOC_ACTUAL_LOCALE, status);
   if(!locale.isBogus()) {
-    log("For collator instantiated from rules, actual locale %s is not bogus\n", locale.getName());
+    errln("For collator instantiated from rules, actual locale %s is not bogus", locale.getName());
   }
   delete coll;
 }
@@ -1829,23 +1898,22 @@ void CollationAPITest::TestGetTailoredSet()
     { "& S < \\u0161 <<< \\u0160", { "\\u0161", "s\\u030C", "\\u0160", "S\\u030C" }, 4}
   };
 
-  uint32_t i = 0, j = 0;
+  int32_t i = 0, j = 0;
   UErrorCode status = U_ZERO_ERROR;
 
-  RuleBasedCollator *coll = NULL;
   UnicodeString buff; 
   UnicodeSet *set = NULL;
 
-  for(i = 0; i < sizeof(setTest)/sizeof(setTest[0]); i++) {
-    buff = UnicodeString(setTest[i].rules, "").unescape();
-    coll = new RuleBasedCollator(buff, status);
+  for(i = 0; i < LENGTHOF(setTest); i++) {
+    buff = UnicodeString(setTest[i].rules, -1, US_INV).unescape();
+    RuleBasedCollator coll(buff, status);
     if(U_SUCCESS(status)) {
-      set = coll->getTailoredSet(status);
-      if(set->size() != setTest[i].testsize) {
-        errln("Tailored set size different (%d) than expected (%d)", set->size(), setTest[i].testsize);
+      set = coll.getTailoredSet(status);
+      if(set->size() < setTest[i].testsize) {
+        errln("Tailored set size smaller (%d) than expected (%d)", set->size(), setTest[i].testsize);
       }
-      for(j = 0; j < (uint32_t)setTest[i].testsize; j++) {
-        buff = UnicodeString(setTest[i].tests[j], "").unescape();
+      for(j = 0; j < setTest[i].testsize; j++) {
+        buff = UnicodeString(setTest[i].tests[j], -1, US_INV).unescape();
         if(!set->contains(buff)) {
           errln("Tailored set doesn't contain %s... It should", setTest[i].tests[j]);
         }
@@ -1854,7 +1922,6 @@ void CollationAPITest::TestGetTailoredSet()
     } else {
       errcheckln(status, "Couldn't open collator with rules %s - %s", setTest[i].rules, u_errorName(status));
     }
-    delete coll;
   }
 }
 
@@ -2270,6 +2337,43 @@ void CollationAPITest::TestClone() {
     delete c2;
 }
 
+void CollationAPITest::TestCloneBinary() {
+    IcuTestErrorCode errorCode(*this, "TestCloneBinary");
+    LocalPointer<Collator> root(Collator::createInstance(Locale::getRoot(), errorCode));
+    LocalPointer<Collator> coll(Collator::createInstance("de@collation=phonebook", errorCode));
+    if(errorCode.logDataIfFailureAndReset("Collator::createInstance(de@collation=phonebook)")) {
+        return;
+    }
+    RuleBasedCollator *rbRoot = dynamic_cast<RuleBasedCollator *>(root.getAlias());
+    RuleBasedCollator *rbc = dynamic_cast<RuleBasedCollator *>(coll.getAlias());
+    if(rbRoot == NULL || rbc == NULL) {
+        infoln("root or de@collation=phonebook is not a RuleBasedCollator");
+        return;
+    }
+    rbc->setAttribute(UCOL_STRENGTH, UCOL_PRIMARY, errorCode);
+    UnicodeString uUmlaut((UChar)0xfc);
+    UnicodeString ue = UNICODE_STRING_SIMPLE("ue");
+    assertEquals("rbc/primary: u-umlaut==ue", UCOL_EQUAL, rbc->compare(uUmlaut, ue, errorCode));
+    uint8_t bin[25000];
+    int32_t binLength = rbc->cloneBinary(bin, LENGTHOF(bin), errorCode);
+    if(errorCode.logDataIfFailureAndReset("rbc->cloneBinary()")) {
+        return;
+    }
+    logln("rbc->cloneBinary() -> %d bytes", (int)binLength);
+
+    RuleBasedCollator rbc2(bin, binLength, rbRoot, errorCode);
+    if(errorCode.logDataIfFailureAndReset("RuleBasedCollator(rbc binary)")) {
+        return;
+    }
+    assertEquals("rbc2.strength==primary", UCOL_PRIMARY, rbc2.getAttribute(UCOL_STRENGTH, errorCode));
+    assertEquals("rbc2: u-umlaut==ue", UCOL_EQUAL, rbc2.compare(uUmlaut, ue, errorCode));
+    assertTrue("rbc==rbc2", *rbc == rbc2);
+    uint8_t bin2[25000];
+    int32_t bin2Length = rbc2.cloneBinary(bin2, LENGTHOF(bin2), errorCode);
+    assertEquals("len(rbc binary)==len(rbc2 binary)", binLength, bin2Length);
+    assertTrue("rbc binary==rbc2 binary", binLength == bin2Length && memcmp(bin, bin2, binLength) == 0);
+}
+
 void CollationAPITest::TestIterNumeric() {
     // Regression test for ticket #9915.
     // The collation code sometimes masked the continuation marker away
@@ -2322,6 +2426,7 @@ void CollationAPITest::runIndexedTest( int32_t index, UBool exec, const char* &n
     TESTCASE_AUTO(TestDisplayName);
     TESTCASE_AUTO(TestAttribute);
     TESTCASE_AUTO(TestVariableTopSetting);
+    TESTCASE_AUTO(TestMaxVariable);
     TESTCASE_AUTO(TestRules);
     TESTCASE_AUTO(TestGetLocale);
     TESTCASE_AUTO(TestBounds);
@@ -2330,6 +2435,7 @@ void CollationAPITest::runIndexedTest( int32_t index, UBool exec, const char* &n
     TESTCASE_AUTO(TestSubclass);
     TESTCASE_AUTO(TestNULLCharTailoring);
     TESTCASE_AUTO(TestClone);
+    TESTCASE_AUTO(TestCloneBinary);
     TESTCASE_AUTO(TestIterNumeric);
     TESTCASE_AUTO_END;
 }
index da894853a0e22998c5810d913115df584f6129cb..16d5634c63c1395de6ac0c76adb89a1d87b74fd0 100644 (file)
@@ -1,6 +1,6 @@
 /***********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 1997-2013, International Business Machines Corporation
+ * Copyright (c) 1997-2014, International Business Machines Corporation
  * and others. All Rights Reserved.
  ***********************************************************************/
 
@@ -134,6 +134,7 @@ public:
     * Tests the setters and getters of variable top
     */
     void TestVariableTopSetting();
+    void TestMaxVariable();
 
     /**
     * Tests GetLocale for a Collator
@@ -166,6 +167,7 @@ public:
     void TestNULLCharTailoring();
 
     void TestClone();
+    void TestCloneBinary();
     void TestIterNumeric();
 
 private:
diff --git a/icu4c/source/test/intltest/cntabcol.cpp b/icu4c/source/test/intltest/cntabcol.cpp
deleted file mode 100644 (file)
index 28f38cb..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-/********************************************************************
-* COPYRIGHT: 
-* Copyright (c) 1997-2006, International Business Machines Corporation and
-* others. All Rights Reserved. 
-********************************************************************/
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION
-
-#include "cntabcol.h"
-
-U_NAMESPACE_USE
-
-ContractionTableTest::ContractionTableTest() {
-    testMapping = utrie_open(NULL, NULL, 0, 0, 0, TRUE);
-}
-
-ContractionTableTest::~ContractionTableTest() {
-    utrie_close(testMapping);
-}
-
-void ContractionTableTest::TestGrowTable(/* char* par */) {
-    UErrorCode status = U_ZERO_ERROR;
-    uint32_t i = 0, res = 0;
-    testTable = uprv_cnttab_open(testMapping, &status);
-
-    // fill up one contraction so that it has to expand
-    for(i = 0; i<65536; i++) {
-        uprv_cnttab_addContraction(testTable, 0, (UChar)i, i, &status);
-        if(U_FAILURE(status)) {
-            errln("Error occurred at position %i, error = %i (%s)\n", i, status, u_errorName(status));
-            break;
-        }
-    }
-    // test whether the filled up contraction really contains the data we input
-    if(U_SUCCESS(status)) {
-        for(i = 0; i<65536; i++) {
-            res = uprv_cnttab_getCE(testTable, 0, i, &status);
-            if(U_FAILURE(status)) {
-                errln("Error occurred at position %i, error = %i (%s)\n", i, status, u_errorName(status));
-                break;
-            }
-            if(res != i) {
-                errln("Error: expected %i, got %i\n", i, res);
-                break;
-            }
-        }
-    }
-    uprv_cnttab_close(testTable);
-}
-
-void ContractionTableTest::TestSetContraction(){ 
-    UErrorCode status = U_ZERO_ERROR;
-    testTable = uprv_cnttab_open(testMapping, &status);
-    // This should make a new contraction
-    uprv_cnttab_setContraction(testTable, 1, 0, 0x41, 0x41, &status);
-    if(U_FAILURE(status)) {
-        errln("Error setting a non existing contraction error = %i (%s)\n", status, u_errorName(status));
-    }
-    // if we try to change the non existing offset, we should get an error
-    status = U_ZERO_ERROR;
-    // currently this tests whether there is enough space, maybe it should test whether the element is actually in 
-    // range. Also, maybe a silent growing should take place....
-    uprv_cnttab_setContraction(testTable, 1, 0x401, 0x41, 0x41, &status);
-    if(status != U_INDEX_OUTOFBOUNDS_ERROR) {
-        errln("changing a non-existing offset should have resulted in an error\n");
-    }
-    status = U_ZERO_ERROR;
-    uprv_cnttab_close(testTable);
-}
-
-void ContractionTableTest::TestAddATableElement(){
-    UErrorCode status = U_ZERO_ERROR;
-    testTable = uprv_cnttab_open(testMapping, &status);
-    uint32_t i = 0, res = 0;
-
-    // fill up one contraction so that it has to expand
-    for(i = 0; i<0x1000; i++) {
-        uprv_cnttab_addContraction(testTable, i, (UChar)i, i, &status);
-        if(U_FAILURE(status)) {
-            errln("Error occurred at position %i, error = %i (%s)\n", i, status, u_errorName(status));
-            break;
-        }
-    }
-    // test whether the filled up contraction really contains the data we input
-    if(U_SUCCESS(status)) {
-        for(i = 0; i<0x1000; i++) {
-            res = uprv_cnttab_getCE(testTable, i, 0, &status);
-            if(U_FAILURE(status)) {
-                errln("Error occurred at position %i, error = %i (%s)\n", i, status, u_errorName(status));
-                break;
-            }
-            if(res != i) {
-                errln("Error: expected %i, got %i\n", i, res);
-                break;
-            }
-        }
-    }
-    uprv_cnttab_close(testTable);
-}
-
-void ContractionTableTest::TestClone(){
-    UErrorCode status = U_ZERO_ERROR;
-    testTable = uprv_cnttab_open(testMapping, &status);
-    int32_t i = 0, res = 0;
-    // we must construct table in order to copy codepoints and CEs
-    // fill up one contraction so that it has to expand
-    for(i = 0; i<0x500; i++) {
-        uprv_cnttab_addContraction(testTable, i, (UChar)i, i, &status);
-        if(U_FAILURE(status)) {
-            errln("Error occurred at position %i, error = %i (%s)\n", i, status, u_errorName(status));
-            break;
-        }
-    }
-    uprv_cnttab_constructTable(testTable, 0, &status);
-    if(U_FAILURE(status)) {
-        errln("Error constructing table error = %i (%s)\n", status, u_errorName(status));
-    } else {
-        testClone = uprv_cnttab_clone(testTable, &status);
-        if(U_SUCCESS(status)) {
-            for(i = 0; i<0x500; i++) {
-                res = uprv_cnttab_getCE(testTable, i, 0, &status);
-                if(U_FAILURE(status)) {
-                    errln("Error occurred at position %i, error = %i (%s)\n", i, status, u_errorName(status));
-                    break;
-                }
-                if(res != i) {
-                    errln("Error: expected %i, got %i\n", i, res);
-                    break;
-                }
-            }
-        }
-        uprv_cnttab_close(testClone);
-    }
-    uprv_cnttab_close(testTable);
-    testTable = uprv_cnttab_open(testMapping, &status);
-    if(U_FAILURE(status)) {
-        errln("Error opening table error = %i (%s)\n", status, u_errorName(status));
-    }
-    uprv_cnttab_close(testTable);
-}
-
-void ContractionTableTest::TestChangeContraction(){
-    UErrorCode status = U_ZERO_ERROR;
-    testTable = uprv_cnttab_open(testMapping, &status);
-    uint32_t i = 0, res = 0;
-    res = uprv_cnttab_changeContraction(testTable, 0, 0x41, 0xAB, &status);
-    if(res != 0) {
-        errln("found a non existing contraction!\n");
-    }
-
-    for(i = 0; i < 0x20; i+=2) {
-        uprv_cnttab_addContraction(testTable, 0, (UChar)i, i, &status);
-    }
-
-    res = uprv_cnttab_changeContraction(testTable, 0, 0x41, 0xAB, &status);
-    if(res != UCOL_NOT_FOUND) {
-        errln("managed to change a non existing contraction!\n");
-    }
-
-    for(i = 1; i < 0x20; i+=2) {
-        res = uprv_cnttab_changeContraction(testTable, 0, (UChar)i, 0xAB, &status);
-        if(res != UCOL_NOT_FOUND) {
-            errln("managed to change a non existing contraction!\n");
-        }
-    }
-    uprv_cnttab_close(testTable);
-}
-
-void ContractionTableTest::TestChangeLastCE(){
-    UErrorCode status = U_ZERO_ERROR;
-    testTable = uprv_cnttab_open(testMapping, &status);
-    uint32_t res = uprv_cnttab_changeLastCE(testTable, 1, 0xABCD, &status);
-    if(res!=0) {
-        errln("managed to change the last CE in an non-existing contraction!\n");
-    }
-    uprv_cnttab_close(testTable);
-}
-
-void ContractionTableTest::TestErrorCodeChecking(){
-    UErrorCode status = U_REGEX_SET_CONTAINS_STRING;
-
-    uprv_cnttab_open(NULL, &status);
-    if (status != U_REGEX_SET_CONTAINS_STRING) {
-        errln("Status was incorrectly modified to %s\n", u_errorName(status));
-    }
-    uprv_cnttab_clone(NULL, &status);
-    if (status != U_REGEX_SET_CONTAINS_STRING) {
-        errln("Status was incorrectly modified to %s\n", u_errorName(status));
-    }
-    uprv_cnttab_changeLastCE(NULL, 0, 0, &status);
-    if (status != U_REGEX_SET_CONTAINS_STRING) {
-        errln("Status was incorrectly modified to %s\n", u_errorName(status));
-    }
-    uprv_cnttab_insertContraction(NULL, 0, 0, 0, &status);
-    if (status != U_REGEX_SET_CONTAINS_STRING) {
-        errln("Status was incorrectly modified to %s\n", u_errorName(status));
-    }
-    uprv_cnttab_addContraction(NULL, 0, 0, 0, &status);
-    if (status != U_REGEX_SET_CONTAINS_STRING) {
-        errln("Status was incorrectly modified to %s\n", u_errorName(status));
-    }
-    uprv_cnttab_setContraction(NULL, 0, 0, 0, 0, &status);
-    if (status != U_REGEX_SET_CONTAINS_STRING) {
-        errln("Status was incorrectly modified to %s\n", u_errorName(status));
-    }
-    uprv_cnttab_findCP(NULL, 0, 0, &status);
-    if (status != U_REGEX_SET_CONTAINS_STRING) {
-        errln("Status was incorrectly modified to %s\n", u_errorName(status));
-    }
-    if (uprv_cnttab_getCE(NULL, 0, 0, &status) != UCOL_NOT_FOUND) {
-        errln("uprv_cnttab_getCE didn't return UCOL_NOT_FOUND\n");
-    }
-    if (status != U_REGEX_SET_CONTAINS_STRING) {
-        errln("Status was incorrectly modified to %s\n", u_errorName(status));
-    }
-    if (uprv_cnttab_findCE(NULL, 0, 0, &status) != UCOL_NOT_FOUND) {
-        errln("uprv_cnttab_findCE didn't return UCOL_NOT_FOUND\n");
-    }
-    if (status != U_REGEX_SET_CONTAINS_STRING) {
-        errln("Status was incorrectly modified to %s\n", u_errorName(status));
-    }
-    uprv_cnttab_isTailored(NULL, 0, NULL, &status);
-    if (status != U_REGEX_SET_CONTAINS_STRING) {
-        errln("Status was incorrectly modified to %s\n", u_errorName(status));
-    }
-    uprv_cnttab_changeContraction(NULL, 0, 0, 0, &status);
-    if (status != U_REGEX_SET_CONTAINS_STRING) {
-        errln("Status was incorrectly modified to %s\n", u_errorName(status));
-    }
-}
-
-void ContractionTableTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
-{
-    if (exec) logln("TestSuite ContractionTableTest: ");
-    switch (index) {
-        case 0: name = "TestGrowTable";         if (exec)   TestGrowTable(/* par */); break;
-        case 1: name = "TestSetContraction";    if (exec)   TestSetContraction(/* par */); break;
-        case 2: name = "TestAddATableElement";  if (exec)   TestAddATableElement(/* par */); break;
-        case 3: name = "TestClone";             if (exec)   TestClone(/* par */); break;
-        case 4: name = "TestChangeContraction"; if (exec)   TestChangeContraction(/* par */); break;
-        case 5: name = "TestChangeLastCE";      if (exec)   TestChangeLastCE(/* par */); break;
-        case 6: name = "TestErrorCodeChecking"; if (exec)   TestErrorCodeChecking(/* par */); break;
-        default: name = ""; break;
-    }
-}
-
-#endif /* #if !UCONFIG_NO_COLLATION */
diff --git a/icu4c/source/test/intltest/cntabcol.h b/icu4c/source/test/intltest/cntabcol.h
deleted file mode 100644 (file)
index 0e35d7d..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/********************************************************************
- * COPYRIGHT: 
- * Copyright (c) 1997-2006, International Business Machines Corporation and
- * others. All Rights Reserved.
- ********************************************************************/
-
-
-#ifndef CONTRACTIONTABLETEST_H
-#define CONTRACTIONTABLETEST_H
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION
-
-#include "tscoll.h"
-#include "ucol_cnt.h"
-#include "utrie.h"
-
-class ContractionTableTest: public IntlTestCollator {
-public:
-    ContractionTableTest();
-    virtual ~ContractionTableTest();
-    void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL );
-
-    // performs test with strength TERIARY
-    void TestGrowTable(/* char* par */);
-    void TestSetContraction();
-    void TestAddATableElement();
-    void TestClone();
-    void TestChangeContraction();
-    void TestChangeLastCE();
-    void TestErrorCodeChecking();
-private:
-    CntTable *testTable, *testClone;
-    /*CompactEIntArray *testMapping;*/
-    UNewTrie *testMapping;
-};
-
-#endif /* #if !UCONFIG_NO_COLLATION */
-
-#endif
diff --git a/icu4c/source/test/intltest/collationtest.cpp b/icu4c/source/test/intltest/collationtest.cpp
new file mode 100644 (file)
index 0000000..7b43fef
--- /dev/null
@@ -0,0 +1,1762 @@
+/*
+*******************************************************************************
+* Copyright (C) 2012-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationtest.cpp
+*
+* created on: 2012apr27
+* created by: Markus W. Scherer
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "unicode/coll.h"
+#include "unicode/errorcode.h"
+#include "unicode/localpointer.h"
+#include "unicode/normalizer2.h"
+#include "unicode/sortkey.h"
+#include "unicode/std_string.h"
+#include "unicode/strenum.h"
+#include "unicode/tblcoll.h"
+#include "unicode/uiter.h"
+#include "unicode/uniset.h"
+#include "unicode/unistr.h"
+#include "unicode/usetiter.h"
+#include "unicode/ustring.h"
+#include "charstr.h"
+#include "cmemory.h"
+#include "collation.h"
+#include "collationdata.h"
+#include "collationfcd.h"
+#include "collationiterator.h"
+#include "collationroot.h"
+#include "collationrootelements.h"
+#include "collationruleparser.h"
+#include "collationweights.h"
+#include "cstring.h"
+#include "intltest.h"
+#include "normalizer2impl.h"
+#include "ucbuf.h"
+#include "uhash.h"
+#include "uitercollationiterator.h"
+#include "utf16collationiterator.h"
+#include "utf8collationiterator.h"
+#include "uvectr32.h"
+#include "uvectr64.h"
+#include "writesrc.h"
+
+#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
+
+// TODO: Move to ucbuf.h
+U_DEFINE_LOCAL_OPEN_POINTER(LocalUCHARBUFPointer, UCHARBUF, ucbuf_close);
+
+class CodePointIterator;
+
+// TODO: try to share code with IntlTestCollator; for example, prettify(CollationKey)
+
+class CollationTest : public IntlTest {
+public:
+    CollationTest()
+            : fcd(NULL), nfd(NULL),
+              fileLineNumber(0),
+              coll(NULL) {}
+
+    ~CollationTest() {
+        delete coll;
+    }
+
+    void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=NULL);
+
+    void TestMinMax();
+    void TestImplicits();
+    void TestNulTerminated();
+    void TestIllegalUTF8();
+    void TestShortFCDData();
+    void TestFCD();
+    void TestCollationWeights();
+    void TestRootElements();
+    void TestTailoredElements();
+    void TestDataDriven();
+
+private:
+    void checkFCD(const char *name, CollationIterator &ci, CodePointIterator &cpi);
+    void checkAllocWeights(CollationWeights &cw,
+                           uint32_t lowerLimit, uint32_t upperLimit, int32_t n,
+                           int32_t someLength, int32_t minCount);
+
+    static UnicodeString printSortKey(const uint8_t *p, int32_t length);
+    static UnicodeString printCollationKey(const CollationKey &key);
+
+    // Helpers & fields for data-driven test.
+    static UBool isCROrLF(UChar c) { return c == 0xa || c == 0xd; }
+    static UBool isSpace(UChar c) { return c == 9 || c == 0x20 || c == 0x3000; }
+    static UBool isSectionStarter(UChar c) { return c == 0x25 || c == 0x2a || c == 0x40; }  // %*@
+    int32_t skipSpaces(int32_t i) {
+        while(isSpace(fileLine[i])) { ++i; }
+        return i;
+    }
+
+    UBool readLine(UCHARBUF *f, IcuTestErrorCode &errorCode);
+    void parseString(int32_t &start, UnicodeString &prefix, UnicodeString &s, UErrorCode &errorCode);
+    Collation::Level parseRelationAndString(UnicodeString &s, IcuTestErrorCode &errorCode);
+    void parseAndSetAttribute(IcuTestErrorCode &errorCode);
+    void parseAndSetReorderCodes(int32_t start, IcuTestErrorCode &errorCode);
+    void buildTailoring(UCHARBUF *f, IcuTestErrorCode &errorCode);
+    void setRootCollator(IcuTestErrorCode &errorCode);
+    void setLocaleCollator(IcuTestErrorCode &errorCode);
+
+    UBool needsNormalization(const UnicodeString &s, UErrorCode &errorCode) const;
+
+    UBool getSortKeyParts(const UChar *s, int32_t length,
+                          CharString &dest, int32_t partSize,
+                          IcuTestErrorCode &errorCode);
+    UBool getCollationKey(const char *norm, const UnicodeString &line,
+                          const UChar *s, int32_t length,
+                          CollationKey &key, IcuTestErrorCode &errorCode);
+    UBool checkCompareTwo(const char *norm, const UnicodeString &prevFileLine,
+                          const UnicodeString &prevString, const UnicodeString &s,
+                          UCollationResult expectedOrder, Collation::Level expectedLevel,
+                          IcuTestErrorCode &errorCode);
+    void checkCompareStrings(UCHARBUF *f, IcuTestErrorCode &errorCode);
+
+    const Normalizer2 *fcd, *nfd;
+    UnicodeString fileLine;
+    int32_t fileLineNumber;
+    UnicodeString fileTestName;
+    Collator *coll;
+};
+
+extern IntlTest *createCollationTest() {
+    return new CollationTest();
+}
+
+void CollationTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /*par*/) {
+    if(exec) {
+        logln("TestSuite CollationTest: ");
+    }
+    TESTCASE_AUTO_BEGIN;
+    TESTCASE_AUTO(TestMinMax);
+    TESTCASE_AUTO(TestImplicits);
+    TESTCASE_AUTO(TestNulTerminated);
+    TESTCASE_AUTO(TestIllegalUTF8);
+    TESTCASE_AUTO(TestShortFCDData);
+    TESTCASE_AUTO(TestFCD);
+    TESTCASE_AUTO(TestCollationWeights);
+    TESTCASE_AUTO(TestRootElements);
+    TESTCASE_AUTO(TestTailoredElements);
+    TESTCASE_AUTO(TestDataDriven);
+    TESTCASE_AUTO_END;
+}
+
+void CollationTest::TestMinMax() {
+    IcuTestErrorCode errorCode(*this, "TestMinMax");
+
+    setRootCollator(errorCode);
+    if(errorCode.isFailure()) {
+        errorCode.reset();
+        return;
+    }
+    RuleBasedCollator *rbc = dynamic_cast<RuleBasedCollator *>(coll);
+    if(rbc == NULL) {
+        errln("the root collator is not a RuleBasedCollator");
+        return;
+    }
+
+    static const UChar s[2] = { 0xfffe, 0xffff };
+    UVector64 ces(errorCode);
+    rbc->internalGetCEs(UnicodeString(FALSE, s, 2), ces, errorCode);
+    errorCode.assertSuccess();
+    if(ces.size() != 2) {
+        errln("expected 2 CEs for <FFFE, FFFF>, got %d", (int)ces.size());
+        return;
+    }
+    int64_t ce = ces.elementAti(0);
+    int64_t expected =
+        ((int64_t)Collation::MERGE_SEPARATOR_PRIMARY << 32) |
+        Collation::MERGE_SEPARATOR_LOWER32;
+    if(ce != expected) {
+        errln("CE(U+fffe)=%04lx != 02.02.02", (long)ce);
+    }
+
+    ce = ces.elementAti(1);
+    expected = Collation::makeCE(Collation::MAX_PRIMARY);
+    if(ce != expected) {
+        errln("CE(U+ffff)=%04lx != max..", (long)ce);
+    }
+}
+
+void CollationTest::TestImplicits() {
+    IcuTestErrorCode errorCode(*this, "TestImplicits");
+
+    const CollationData *cd = CollationRoot::getData(errorCode);
+    if(errorCode.logIfFailureAndReset("CollationRoot::getBaseData()")) {
+        return;
+    }
+
+    // Implicit primary weights should be assigned for the following sets,
+    // and sort in ascending order by set and then code point.
+    // See http://www.unicode.org/reports/tr10/#Implicit_Weights
+    // core Han Unified Ideographs
+    UnicodeSet coreHan("[\\p{unified_ideograph}&"
+                            "[\\p{Block=CJK_Unified_Ideographs}"
+                            "\\p{Block=CJK_Compatibility_Ideographs}]]",
+                       errorCode);
+    // all other Unified Han ideographs
+    UnicodeSet otherHan("[\\p{unified ideograph}-"
+                            "[\\p{Block=CJK_Unified_Ideographs}"
+                            "\\p{Block=CJK_Compatibility_Ideographs}]]",
+                        errorCode);
+    UnicodeSet unassigned("[[:Cn:][:Cs:][:Co:]]", errorCode);
+    unassigned.remove(0xfffe, 0xffff);  // These have special CLDR root mappings.
+    if(errorCode.logIfFailureAndReset("UnicodeSet")) {
+        return;
+    }
+    const UnicodeSet *sets[] = { &coreHan, &otherHan, &unassigned };
+    UChar32 prev = 0;
+    uint32_t prevPrimary = 0;
+    UTF16CollationIterator ci(cd, FALSE, NULL, NULL, NULL);
+    for(int32_t i = 0; i < LENGTHOF(sets); ++i) {
+        LocalPointer<UnicodeSetIterator> iter(new UnicodeSetIterator(*sets[i]));
+        while(iter->next()) {
+            UChar32 c = iter->getCodepoint();
+            UnicodeString s(c);
+            ci.setText(s.getBuffer(), s.getBuffer() + s.length());
+            int64_t ce = ci.nextCE(errorCode);
+            int64_t ce2 = ci.nextCE(errorCode);
+            if(errorCode.logIfFailureAndReset("CollationIterator.nextCE()")) {
+                return;
+            }
+            if(ce == Collation::NO_CE || ce2 != Collation::NO_CE) {
+                errln("CollationIterator.nextCE(U+%04lx) did not yield exactly one CE", (long)c);
+                continue;
+            }
+            if((ce & 0xffffffff) != Collation::COMMON_SEC_AND_TER_CE) {
+                errln("CollationIterator.nextCE(U+%04lx) has non-common sec/ter weights: %08lx",
+                      (long)c, (long)(ce & 0xffffffff));
+                continue;
+            }
+            uint32_t primary = (uint32_t)(ce >> 32);
+            if(!(primary > prevPrimary)) {
+                errln("CE(U+%04lx)=%04lx.. not greater than CE(U+%04lx)=%04lx..",
+                      (long)c, (long)primary, (long)prev, (long)prevPrimary);
+            }
+            prev = c;
+            prevPrimary = primary;
+        }
+    }
+}
+
+void CollationTest::TestNulTerminated() {
+    IcuTestErrorCode errorCode(*this, "TestNulTerminated");
+    const CollationData *data = CollationRoot::getData(errorCode);
+    if(errorCode.logIfFailureAndReset("CollationRoot::getData()")) {
+        return;
+    }
+
+    static const UChar s[] = { 0x61, 0x62, 0x61, 0x62, 0 };
+
+    UTF16CollationIterator ci1(data, FALSE, s, s, s + 2);
+    UTF16CollationIterator ci2(data, FALSE, s + 2, s + 2, NULL);
+    for(int32_t i = 0;; ++i) {
+        int64_t ce1 = ci1.nextCE(errorCode);
+        int64_t ce2 = ci2.nextCE(errorCode);
+        if(errorCode.logIfFailureAndReset("CollationIterator.nextCE()")) {
+            return;
+        }
+        if(ce1 != ce2) {
+            errln("CollationIterator.nextCE(with length) != nextCE(NUL-terminated) at CE %d", (int)i);
+            break;
+        }
+        if(ce1 == Collation::NO_CE) { break; }
+    }
+}
+
+void CollationTest::TestIllegalUTF8() {
+    IcuTestErrorCode errorCode(*this, "TestIllegalUTF8");
+
+    setRootCollator(errorCode);
+    if(errorCode.isFailure()) {
+        errorCode.reset();
+        return;
+    }
+    coll->setAttribute(UCOL_STRENGTH, UCOL_IDENTICAL, errorCode);
+
+    static const char *strings[] = {
+        // U+FFFD
+        "a\xef\xbf\xbdz",
+        // illegal byte sequences
+        "a\x80z",  // trail byte
+        "a\xc1\x81z",  // non-shortest form
+        "a\xe0\x82\x83z",  // non-shortest form
+        "a\xed\xa0\x80z",  // lead surrogate: would be U+D800
+        "a\xed\xbf\xbfz",  // trail surrogate: would be U+DFFF
+        "a\xf0\x8f\xbf\xbfz",  // non-shortest form
+        "a\xf4\x90\x80\x80z"  // out of range: would be U+110000
+    };
+
+    StringPiece fffd(strings[0]);
+    for(int32_t i = 1; i < LENGTHOF(strings); ++i) {
+        StringPiece illegal(strings[i]);
+        UCollationResult order = coll->compareUTF8(fffd, illegal, errorCode);
+        if(order != UCOL_EQUAL) {
+            errln("compareUTF8(U+FFFD, string %d with illegal UTF-8)=%d != UCOL_EQUAL",
+                  (int)i, order);
+        }
+    }
+}
+
+namespace {
+
+void addLeadSurrogatesForSupplementary(const UnicodeSet &src, UnicodeSet &dest) {
+    for(UChar32 c = 0x10000; c < 0x110000;) {
+        UChar32 next = c + 0x400;
+        if(src.containsSome(c, next - 1)) {
+            dest.add(U16_LEAD(c));
+        }
+        c = next;
+    }
+}
+
+}  // namespace
+
+void CollationTest::TestShortFCDData() {
+    // See CollationFCD class comments.
+    IcuTestErrorCode errorCode(*this, "TestShortFCDData");
+    UnicodeSet expectedLccc("[:^lccc=0:]", errorCode);
+    errorCode.assertSuccess();
+    expectedLccc.add(0xdc00, 0xdfff);  // add all trail surrogates
+    addLeadSurrogatesForSupplementary(expectedLccc, expectedLccc);
+    UnicodeSet lccc;  // actual
+    for(UChar32 c = 0; c <= 0xffff; ++c) {
+        if(CollationFCD::hasLccc(c)) { lccc.add(c); }
+    }
+    UnicodeSet diff(expectedLccc);
+    diff.removeAll(lccc);
+    diff.remove(0x10000, 0x10ffff);  // hasLccc() only works for the BMP
+    UnicodeString empty("[]");
+    UnicodeString diffString;
+    diff.toPattern(diffString, TRUE);
+    assertEquals("CollationFCD::hasLccc() expected-actual", empty, diffString);
+    diff = lccc;
+    diff.removeAll(expectedLccc);
+    diff.toPattern(diffString, TRUE);
+    assertEquals("CollationFCD::hasLccc() actual-expected", empty, diffString);
+
+    UnicodeSet expectedTccc("[:^tccc=0:]", errorCode);
+    errorCode.assertSuccess();
+    addLeadSurrogatesForSupplementary(expectedLccc, expectedTccc);
+    addLeadSurrogatesForSupplementary(expectedTccc, expectedTccc);
+    UnicodeSet tccc;  // actual
+    for(UChar32 c = 0; c <= 0xffff; ++c) {
+        if(CollationFCD::hasTccc(c)) { tccc.add(c); }
+    }
+    diff = expectedTccc;
+    diff.removeAll(tccc);
+    diff.remove(0x10000, 0x10ffff);  // hasTccc() only works for the BMP
+    assertEquals("CollationFCD::hasTccc() expected-actual", empty, diffString);
+    diff = tccc;
+    diff.removeAll(expectedTccc);
+    diff.toPattern(diffString, TRUE);
+    assertEquals("CollationFCD::hasTccc() actual-expected", empty, diffString);
+}
+
+class CodePointIterator {
+public:
+    CodePointIterator(const UChar32 *cp, int32_t length) : cp(cp), length(length), pos(0) {}
+    void resetToStart() { pos = 0; }
+    UChar32 next() { return (pos < length) ? cp[pos++] : U_SENTINEL; }
+    UChar32 previous() { return (pos > 0) ? cp[--pos] : U_SENTINEL; }
+    int32_t getLength() const { return length; }
+    int getIndex() const { return (int)pos; }
+private:
+    const UChar32 *cp;
+    int32_t length;
+    int32_t pos;
+};
+
+void CollationTest::checkFCD(const char *name,
+                             CollationIterator &ci, CodePointIterator &cpi) {
+    IcuTestErrorCode errorCode(*this, "checkFCD");
+
+    // Iterate forward to the limit.
+    for(;;) {
+        UChar32 c1 = ci.nextCodePoint(errorCode);
+        UChar32 c2 = cpi.next();
+        if(c1 != c2) {
+            errln("%s.nextCodePoint(to limit, 1st pass) = U+%04lx != U+%04lx at %d",
+                  name, (long)c1, (long)c2, cpi.getIndex());
+            return;
+        }
+        if(c1 < 0) { break; }
+    }
+
+    // Iterate backward most of the way.
+    for(int32_t n = (cpi.getLength() * 2) / 3; n > 0; --n) {
+        UChar32 c1 = ci.previousCodePoint(errorCode);
+        UChar32 c2 = cpi.previous();
+        if(c1 != c2) {
+            errln("%s.previousCodePoint() = U+%04lx != U+%04lx at %d",
+                  name, (long)c1, (long)c2, cpi.getIndex());
+            return;
+        }
+    }
+
+    // Forward again.
+    for(;;) {
+        UChar32 c1 = ci.nextCodePoint(errorCode);
+        UChar32 c2 = cpi.next();
+        if(c1 != c2) {
+            errln("%s.nextCodePoint(to limit again) = U+%04lx != U+%04lx at %d",
+                  name, (long)c1, (long)c2, cpi.getIndex());
+            return;
+        }
+        if(c1 < 0) { break; }
+    }
+
+    // Iterate backward to the start.
+    for(;;) {
+        UChar32 c1 = ci.previousCodePoint(errorCode);
+        UChar32 c2 = cpi.previous();
+        if(c1 != c2) {
+            errln("%s.previousCodePoint(to start) = U+%04lx != U+%04lx at %d",
+                  name, (long)c1, (long)c2, cpi.getIndex());
+            return;
+        }
+        if(c1 < 0) { break; }
+    }
+}
+
+void CollationTest::TestFCD() {
+    IcuTestErrorCode errorCode(*this, "TestFCD");
+    const CollationData *data = CollationRoot::getData(errorCode);
+    if(errorCode.logIfFailureAndReset("CollationRoot::getData()")) {
+        return;
+    }
+
+    // Input string, not FCD, NUL-terminated.
+    static const UChar s[] = {
+        0x308, 0xe1, 0x62, 0x301, 0x327, 0x430, 0x62,
+        U16_LEAD(0x1D15F), U16_TRAIL(0x1D15F),  // MUSICAL SYMBOL QUARTER NOTE=1D158 1D165, ccc=0, 216
+        0x327, 0x308,  // ccc=202, 230
+        U16_LEAD(0x1D16D), U16_TRAIL(0x1D16D),  // MUSICAL SYMBOL COMBINING AUGMENTATION DOT, ccc=226
+        U16_LEAD(0x1D15F), U16_TRAIL(0x1D15F),
+        U16_LEAD(0x1D16D), U16_TRAIL(0x1D16D),
+        0xac01,
+        0xe7,  // Character with tccc!=0 decomposed together with mis-ordered sequence.
+        U16_LEAD(0x1D16D), U16_TRAIL(0x1D16D), U16_LEAD(0x1D165), U16_TRAIL(0x1D165),
+        0xe1,  // Character with tccc!=0 decomposed together with decomposed sequence.
+        0xf73, 0xf75,  // Tibetan composite vowels must be decomposed.
+        0x4e00, 0xf81,
+        0
+    };
+    // Expected code points.
+    static const UChar32 cp[] = {
+        0x308, 0xe1, 0x62, 0x327, 0x301, 0x430, 0x62,
+        0x1D158, 0x327, 0x1D165, 0x1D16D, 0x308,
+        0x1D15F, 0x1D16D,
+        0xac01,
+        0x63, 0x327, 0x1D165, 0x1D16D,
+        0x61,
+        0xf71, 0xf71, 0xf72, 0xf74, 0x301,
+        0x4e00, 0xf71, 0xf80
+    };
+
+    FCDUTF16CollationIterator u16ci(data, FALSE, s, s, NULL);
+    if(errorCode.logIfFailureAndReset("FCDUTF16CollationIterator constructor")) {
+        return;
+    }
+    CodePointIterator cpi(cp, LENGTHOF(cp));
+    checkFCD("FCDUTF16CollationIterator", u16ci, cpi);
+
+#if U_HAVE_STD_STRING
+    cpi.resetToStart();
+    std::string utf8;
+    UnicodeString(s).toUTF8String(utf8);
+    FCDUTF8CollationIterator u8ci(data, FALSE,
+                                  reinterpret_cast<const uint8_t *>(utf8.c_str()), 0, -1);
+    if(errorCode.logIfFailureAndReset("FCDUTF8CollationIterator constructor")) {
+        return;
+    }
+    checkFCD("FCDUTF8CollationIterator", u8ci, cpi);
+#endif
+
+    cpi.resetToStart();
+    UCharIterator iter;
+    uiter_setString(&iter, s, LENGTHOF(s) - 1);  // -1: without the terminating NUL
+    FCDUIterCollationIterator uici(data, FALSE, iter, 0);
+    if(errorCode.logIfFailureAndReset("FCDUIterCollationIterator constructor")) {
+        return;
+    }
+    checkFCD("FCDUIterCollationIterator", uici, cpi);
+}
+
+void CollationTest::checkAllocWeights(CollationWeights &cw,
+                                      uint32_t lowerLimit, uint32_t upperLimit, int32_t n,
+                                      int32_t someLength, int32_t minCount) {
+    if(!cw.allocWeights(lowerLimit, upperLimit, n)) {
+        errln("CollationWeights::allocWeights(%lx, %lx, %ld) = FALSE",
+              (long)lowerLimit, (long)upperLimit, (long)n);
+        return;
+    }
+    uint32_t previous = lowerLimit;
+    int32_t count = 0;  // number of weights that have someLength
+    for(int32_t i = 0; i < n; ++i) {
+        uint32_t w = cw.nextWeight();
+        if(w == 0xffffffff) {
+            errln("CollationWeights::allocWeights(%lx, %lx, %ld).nextWeight() "
+                  "returns only %ld weights",
+                  (long)lowerLimit, (long)upperLimit, (long)n, (long)i);
+            return;
+        }
+        if(!(previous < w && w < upperLimit)) {
+            errln("CollationWeights::allocWeights(%lx, %lx, %ld).nextWeight() "
+                  "number %ld -> %lx not between %lx and %lx",
+                  (long)lowerLimit, (long)upperLimit, (long)n,
+                  (long)(i + 1), (long)w, (long)previous, (long)upperLimit);
+            return;
+        }
+        if(CollationWeights::lengthOfWeight(w) == someLength) { ++count; }
+    }
+    if(count < minCount) {
+        errln("CollationWeights::allocWeights(%lx, %lx, %ld).nextWeight() "
+              "returns only %ld < %ld weights of length %d",
+              (long)lowerLimit, (long)upperLimit, (long)n,
+              (long)count, (long)minCount, (int)someLength);
+    }
+}
+
+void CollationTest::TestCollationWeights() {
+    CollationWeights cw;
+
+    // Non-compressible primaries use 254 second bytes 02..FF.
+    logln("CollationWeights.initForPrimary(non-compressible)");
+    cw.initForPrimary(FALSE);
+    // Expect 1 weight 11 and 254 weights 12xx.
+    checkAllocWeights(cw, 0x10000000, 0x13000000, 255, 1, 1);
+    checkAllocWeights(cw, 0x10000000, 0x13000000, 255, 2, 254);
+    // Expect 255 two-byte weights from the ranges 10ff, 11xx, 1202.
+    checkAllocWeights(cw, 0x10fefe40, 0x12030300, 260, 2, 255);
+    // Expect 254 two-byte weights from the ranges 10ff and 11xx.
+    checkAllocWeights(cw, 0x10fefe40, 0x12030300, 600, 2, 254);
+    // Expect 254^2=64516 three-byte weights.
+    // During computation, there should be 3 three-byte ranges
+    // 10ffff, 11xxxx, 120202.
+    // The middle one should be split 64515:1,
+    // and the newly-split-off range and the last ranged lengthened.
+    checkAllocWeights(cw, 0x10fffe00, 0x12020300, 1 + 64516 + 254 + 1, 3, 64516);
+    // Expect weights 1102 & 1103.
+    checkAllocWeights(cw, 0x10ff0000, 0x11040000, 2, 2, 2);
+    // Expect weights 102102 & 102103.
+    checkAllocWeights(cw, 0x1020ff00, 0x10210400, 2, 3, 2);
+
+    // Compressible primaries use 251 second bytes 04..FE.
+    logln("CollationWeights.initForPrimary(compressible)");
+    cw.initForPrimary(TRUE);
+    // Expect 1 weight 11 and 251 weights 12xx.
+    checkAllocWeights(cw, 0x10000000, 0x13000000, 252, 1, 1);
+    checkAllocWeights(cw, 0x10000000, 0x13000000, 252, 2, 251);
+    // Expect 252 two-byte weights from the ranges 10fe, 11xx, 1204.
+    checkAllocWeights(cw, 0x10fdfe40, 0x12050300, 260, 2, 252);
+    // Expect weights 1104 & 1105.
+    checkAllocWeights(cw, 0x10fe0000, 0x11060000, 2, 2, 2);
+    // Expect weights 102102 & 102103.
+    checkAllocWeights(cw, 0x1020ff00, 0x10210400, 2, 3, 2);
+
+    // Secondary and tertiary weights use only bytes 3 & 4.
+    logln("CollationWeights.initForSecondary()");
+    cw.initForSecondary();
+    // Expect weights fbxx and all four fc..ff.
+    checkAllocWeights(cw, 0xfb20, 0x10000, 20, 3, 4);
+
+    logln("CollationWeights.initForTertiary()");
+    cw.initForTertiary();
+    // Expect weights 3dxx and both 3e & 3f.
+    checkAllocWeights(cw, 0x3d02, 0x4000, 10, 3, 2);
+}
+
+namespace {
+
+UBool isValidCE(const CollationRootElements &re, const CollationData &data,
+                uint32_t p, uint32_t s, uint32_t ctq) {
+    uint32_t p1 = p >> 24;
+    uint32_t p2 = (p >> 16) & 0xff;
+    uint32_t p3 = (p >> 8) & 0xff;
+    uint32_t p4 = p & 0xff;
+    uint32_t s1 = s >> 8;
+    uint32_t s2 = s & 0xff;
+    // ctq = Case, Tertiary, Quaternary
+    uint32_t c = (ctq & Collation::CASE_MASK) >> 14;
+    uint32_t t = ctq & Collation::ONLY_TERTIARY_MASK;
+    uint32_t t1 = t >> 8;
+    uint32_t t2 = t & 0xff;
+    uint32_t q = ctq & Collation::QUATERNARY_MASK;
+    // No leading zero bytes.
+    if((p != 0 && p1 == 0) || (s != 0 && s1 == 0) || (t != 0 && t1 == 0)) {
+        return FALSE;
+    }
+    // No intermediate zero bytes.
+    if(p1 != 0 && p2 == 0 && (p & 0xffff) != 0) {
+        return FALSE;
+    }
+    if(p2 != 0 && p3 == 0 && p4 != 0) {
+        return FALSE;
+    }
+    // Minimum & maximum lead bytes.
+    if((p1 != 0 && p1 <= Collation::MERGE_SEPARATOR_BYTE) ||
+            (s1 != 0 && s1 <= Collation::MERGE_SEPARATOR_BYTE) ||
+            (t1 != 0 && t1 <= Collation::MERGE_SEPARATOR_BYTE)) {
+        return FALSE;
+    }
+    if(t1 != 0 && t1 > 0x3f) {
+        return FALSE;
+    }
+    if(c > 2) {
+        return FALSE;
+    }
+    // The valid byte range for the second primary byte depends on compressibility.
+    if(p2 != 0) {
+        if(data.isCompressibleLeadByte(p1)) {
+            if(p2 <= Collation::PRIMARY_COMPRESSION_LOW_BYTE ||
+                    Collation::PRIMARY_COMPRESSION_HIGH_BYTE <= p2) {
+                return FALSE;
+            }
+        } else {
+            if(p2 <= Collation::LEVEL_SEPARATOR_BYTE) {
+                return FALSE;
+            }
+        }
+    }
+    // Other bytes just need to avoid the level separator.
+    // Trailing zeros are ok.
+    U_ASSERT(Collation::LEVEL_SEPARATOR_BYTE == 1);
+    if(p3 == Collation::LEVEL_SEPARATOR_BYTE || p4 == Collation::LEVEL_SEPARATOR_BYTE ||
+            s2 == Collation::LEVEL_SEPARATOR_BYTE || t2 == Collation::LEVEL_SEPARATOR_BYTE) {
+        return FALSE;
+    }
+    // Well-formed CEs.
+    if(p == 0) {
+        if(s == 0) {
+            if(t == 0) {
+                // Completely ignorable CE.
+                // Quaternary CEs are not supported.
+                if(c != 0 || q != 0) {
+                    return FALSE;
+                }
+            } else {
+                // Tertiary CE.
+                if(t < re.getTertiaryBoundary() || c != 2) {
+                    return FALSE;
+                }
+            }
+        } else {
+            // Secondary CE.
+            if(s < re.getSecondaryBoundary() || t == 0 || t >= re.getTertiaryBoundary()) {
+                return FALSE;
+            }
+        }
+    } else {
+        // Primary CE.
+        if(s == 0 || (Collation::COMMON_WEIGHT16 < s && s <= re.getLastCommonSecondary()) ||
+                s >= re.getSecondaryBoundary()) {
+            return FALSE;
+        }
+        if(t == 0 || t >= re.getTertiaryBoundary()) {
+            return FALSE;
+        }
+    }
+    return TRUE;
+}
+
+UBool isValidCE(const CollationRootElements &re, const CollationData &data, int64_t ce) {
+    uint32_t p = (uint32_t)(ce >> 32);
+    uint32_t secTer = (uint32_t)ce;
+    return isValidCE(re, data, p, secTer >> 16, secTer & 0xffff);
+}
+
+class RootElementsIterator {
+public:
+    RootElementsIterator(const CollationData &root)
+            : data(root),
+              elements(root.rootElements), length(root.rootElementsLength),
+              pri(0), secTer(0),
+              index((int32_t)elements[CollationRootElements::IX_FIRST_TERTIARY_INDEX]) {}
+
+    UBool next() {
+        if(index >= length) { return FALSE; }
+        uint32_t p = elements[index];
+        if(p == CollationRootElements::PRIMARY_SENTINEL) { return FALSE; }
+        if((p & CollationRootElements::SEC_TER_DELTA_FLAG) != 0) {
+            ++index;
+            secTer = p & ~CollationRootElements::SEC_TER_DELTA_FLAG;
+            return TRUE;
+        }
+        if((p & CollationRootElements::PRIMARY_STEP_MASK) != 0) {
+            // End of a range, enumerate the primaries in the range.
+            int32_t step = (int32_t)p & CollationRootElements::PRIMARY_STEP_MASK;
+            p &= 0xffffff00;
+            if(pri == p) {
+                // Finished the range, return the next CE after it.
+                ++index;
+                return next();
+            }
+            U_ASSERT(pri < p);
+            // Return the next primary in this range.
+            UBool isCompressible = data.isCompressiblePrimary(pri);
+            if((pri & 0xffff) == 0) {
+                pri = Collation::incTwoBytePrimaryByOffset(pri, isCompressible, step);
+            } else {
+                pri = Collation::incThreeBytePrimaryByOffset(pri, isCompressible, step);
+            }
+            return TRUE;
+        }
+        // Simple primary CE.
+        ++index;
+        pri = p;
+        secTer = Collation::COMMON_SEC_AND_TER_CE;
+        return TRUE;
+    }
+
+    uint32_t getPrimary() const { return pri; }
+    uint32_t getSecTer() const { return secTer; }
+
+private:
+    const CollationData &data;
+    const uint32_t *elements;
+    int32_t length;
+
+    uint32_t pri;
+    uint32_t secTer;
+    int32_t index;
+};
+
+}  // namespace
+
+void CollationTest::TestRootElements() {
+    IcuTestErrorCode errorCode(*this, "TestRootElements");
+    const CollationData *root = CollationRoot::getData(errorCode);
+    if(errorCode.logIfFailureAndReset("CollationRoot::getData()")) {
+        return;
+    }
+    CollationRootElements rootElements(root->rootElements, root->rootElementsLength);
+    RootElementsIterator iter(*root);
+
+    // We check each root CE for validity,
+    // and we also verify that there is a tailoring gap between each two CEs.
+    CollationWeights cw1c;  // compressible primary weights
+    CollationWeights cw1u;  // uncompressible primary weights
+    CollationWeights cw2;
+    CollationWeights cw3;
+
+    cw1c.initForPrimary(TRUE);
+    cw1u.initForPrimary(FALSE);
+    cw2.initForSecondary();
+    cw3.initForTertiary();
+
+    // Note: The root elements do not include Han-implicit or unassigned-implicit CEs,
+    // nor the special merge-separator CE for U+FFFE.
+    uint32_t prevPri = 0;
+    uint32_t prevSec = 0;
+    uint32_t prevTer = 0;
+    while(iter.next()) {
+        uint32_t pri = iter.getPrimary();
+        uint32_t secTer = iter.getSecTer();
+        // CollationRootElements CEs must have 0 case and quaternary bits.
+        if((secTer & Collation::CASE_AND_QUATERNARY_MASK) != 0) {
+            errln("CollationRootElements CE has non-zero case and/or quaternary bits: %08lx %08lx",
+                  (long)pri, (long)secTer);
+        }
+        uint32_t sec = secTer >> 16;
+        uint32_t ter = secTer & Collation::ONLY_TERTIARY_MASK;
+        uint32_t ctq = ter;
+        if(pri == 0 && sec == 0 && ter != 0) {
+            // Tertiary CEs must have uppercase bits,
+            // but they are not stored in the CollationRootElements.
+            ctq |= 0x8000;
+        }
+        if(!isValidCE(rootElements, *root, pri, sec, ctq)) {
+            errln("invalid root CE %08lx %08lx", (long)pri, (long)secTer);
+        } else {
+            if(pri != prevPri) {
+                uint32_t newWeight = 0;
+                if(prevPri == 0 || prevPri >= Collation::FFFD_PRIMARY) {
+                    // There is currently no tailoring gap after primary ignorables,
+                    // and we forbid tailoring after U+FFFD and U+FFFF.
+                } else if(root->isCompressiblePrimary(prevPri)) {
+                    if(!cw1c.allocWeights(prevPri, pri, 1)) {
+                        errln("no primary/compressible tailoring gap between %08lx and %08lx",
+                              (long)prevPri, (long)pri);
+                    } else {
+                        newWeight = cw1c.nextWeight();
+                    }
+                } else {
+                    if(!cw1u.allocWeights(prevPri, pri, 1)) {
+                        errln("no primary/uncompressible tailoring gap between %08lx and %08lx",
+                              (long)prevPri, (long)pri);
+                    } else {
+                        newWeight = cw1u.nextWeight();
+                    }
+                }
+                if(newWeight != 0 && !(prevPri < newWeight && newWeight < pri)) {
+                    errln("mis-allocated primary weight, should get %08lx < %08lx < %08lx",
+                          (long)prevPri, (long)newWeight, (long)pri);
+                }
+            } else if(sec != prevSec) {
+                uint32_t lowerLimit =
+                    prevSec == 0 ? rootElements.getSecondaryBoundary() - 0x100 : prevSec;
+                if(!cw2.allocWeights(lowerLimit, sec, 1)) {
+                    errln("no secondary tailoring gap between %04x and %04x", lowerLimit, sec);
+                } else {
+                    uint32_t newWeight = cw2.nextWeight();
+                    if(!(prevSec < newWeight && newWeight < sec)) {
+                        errln("mis-allocated secondary weight, should get %04x < %04x < %04x",
+                              (long)lowerLimit, (long)newWeight, (long)sec);
+                    }
+                }
+            } else if(ter != prevTer) {
+                uint32_t lowerLimit =
+                    prevTer == 0 ? rootElements.getTertiaryBoundary() - 0x100 : prevTer;
+                if(!cw3.allocWeights(lowerLimit, ter, 1)) {
+                    errln("no teriary tailoring gap between %04x and %04x", lowerLimit, ter);
+                } else {
+                    uint32_t newWeight = cw3.nextWeight();
+                    if(!(prevTer < newWeight && newWeight < ter)) {
+                        errln("mis-allocated secondary weight, should get %04x < %04x < %04x",
+                              (long)lowerLimit, (long)newWeight, (long)ter);
+                    }
+                }
+            } else {
+                errln("duplicate root CE %08lx %08lx", (long)pri, (long)secTer);
+            }
+        }
+        prevPri = pri;
+        prevSec = sec;
+        prevTer = ter;
+    }
+}
+
+void CollationTest::TestTailoredElements() {
+    IcuTestErrorCode errorCode(*this, "TestTailoredElements");
+    const CollationData *root = CollationRoot::getData(errorCode);
+    if(errorCode.logIfFailureAndReset("CollationRoot::getData()")) {
+        return;
+    }
+    CollationRootElements rootElements(root->rootElements, root->rootElementsLength);
+
+    UHashtable *prevLocales = uhash_open(uhash_hashChars, uhash_compareChars, NULL, errorCode);
+    if(errorCode.logIfFailureAndReset("failed to create a hash table")) {
+        return;
+    }
+    uhash_setKeyDeleter(prevLocales, uprv_free);
+    // TestRootElements() tests the root collator which does not have tailorings.
+    uhash_puti(prevLocales, uprv_strdup(""), 1, errorCode);
+    uhash_puti(prevLocales, uprv_strdup("root"), 1, errorCode);
+    uhash_puti(prevLocales, uprv_strdup("root@collation=standard"), 1, errorCode);
+
+    UVector64 ces(errorCode);
+    LocalPointer<StringEnumeration> locales(Collator::getAvailableLocales());
+    U_ASSERT(locales.isValid());
+    const char *localeID = "root";
+    do {
+        Locale locale(localeID);
+        LocalPointer<StringEnumeration> types(
+                Collator::getKeywordValuesForLocale("collation", locale, FALSE, errorCode));
+        errorCode.assertSuccess();
+        const char *type = NULL;  // default type
+        do {
+            Locale localeWithType(locale);
+            if(type != NULL) {
+                localeWithType.setKeywordValue("collation", type, errorCode);
+            }
+            errorCode.assertSuccess();
+            LocalPointer<Collator> coll(Collator::createInstance(localeWithType, errorCode));
+            if(errorCode.logIfFailureAndReset("Collator::createInstance(%s)",
+                                              localeWithType.getName())) {
+                continue;
+            }
+            Locale actual = coll->getLocale(ULOC_ACTUAL_LOCALE, errorCode);
+            if(uhash_geti(prevLocales, actual.getName()) != 0) {
+                continue;
+            }
+            uhash_puti(prevLocales, uprv_strdup(actual.getName()), 1, errorCode);
+            errorCode.assertSuccess();
+            logln("TestTailoredElements(): requested %s -> actual %s",
+                  localeWithType.getName(), actual.getName());
+            RuleBasedCollator *rbc = dynamic_cast<RuleBasedCollator *>(coll.getAlias());
+            if(rbc == NULL) {
+                continue;
+            }
+            // Note: It would be better to get tailored strings such that we can
+            // identify the prefix, and only get the CEs for the prefix+string,
+            // not also for the prefix.
+            // There is currently no API for that.
+            // It would help in an unusual case where a contraction starting in the prefix
+            // extends past its end, and we do not see the intended mapping.
+            // For example, for a mapping p|st, if there is also a contraction ps,
+            // then we get CEs(ps)+CEs(t), rather than CEs(p|st).
+            LocalPointer<UnicodeSet> tailored(coll->getTailoredSet(errorCode));
+            errorCode.assertSuccess();
+            UnicodeSetIterator iter(*tailored);
+            while(iter.next()) {
+                const UnicodeString &s = iter.getString();
+                ces.removeAllElements();
+                rbc->internalGetCEs(s, ces, errorCode);
+                errorCode.assertSuccess();
+                for(int32_t i = 0; i < ces.size(); ++i) {
+                    int64_t ce = ces.elementAti(i);
+                    if(!isValidCE(rootElements, *root, ce)) {
+                        errln("invalid tailored CE %016llx at CE index %d from string:",
+                              (long long)ce, (int)i);
+                        infoln(prettify(s));
+                    }
+                }
+            }
+        } while((type = types->next(NULL, errorCode)) != NULL);
+    } while((localeID = locales->next(NULL, errorCode)) != NULL);
+    uhash_close(prevLocales);
+}
+
+UnicodeString CollationTest::printSortKey(const uint8_t *p, int32_t length) {
+    UnicodeString s;
+    for(int32_t i = 0; i < length; ++i) {
+        if(i > 0) { s.append((UChar)0x20); }
+        uint8_t b = p[i];
+        if(b == 0) {
+            s.append((UChar)0x2e);  // period
+        } else if(b == 1) {
+            s.append((UChar)0x7c);  // vertical bar
+        } else {
+            appendHex(b, 2, s);
+        }
+    }
+    return s;
+}
+
+UnicodeString CollationTest::printCollationKey(const CollationKey &key) {
+    int32_t length;
+    const uint8_t *p = key.getByteArray(length);
+    return printSortKey(p, length);
+}
+
+UBool CollationTest::readLine(UCHARBUF *f, IcuTestErrorCode &errorCode) {
+    int32_t lineLength;
+    const UChar *line = ucbuf_readline(f, &lineLength, errorCode);
+    if(line == NULL || errorCode.isFailure()) {
+        fileLine.remove();
+        return FALSE;
+    }
+    ++fileLineNumber;
+    // Strip trailing CR/LF, comments, and spaces.
+    const UChar *comment = u_memchr(line, 0x23, lineLength);  // '#'
+    if(comment != NULL) {
+        lineLength = (int32_t)(comment - line);
+    } else {
+        while(lineLength > 0 && isCROrLF(line[lineLength - 1])) { --lineLength; }
+    }
+    while(lineLength > 0 && isSpace(line[lineLength - 1])) { --lineLength; }
+    fileLine.setTo(FALSE, line, lineLength);
+    return TRUE;
+}
+
+void CollationTest::parseString(int32_t &start, UnicodeString &prefix, UnicodeString &s,
+                                UErrorCode &errorCode) {
+    int32_t length = fileLine.length();
+    int32_t i;
+    for(i = start; i < length && !isSpace(fileLine[i]); ++i) {}
+    int32_t pipeIndex = fileLine.indexOf((UChar)0x7c, start, i - start);  // '|'
+    if(pipeIndex >= 0) {
+        prefix = fileLine.tempSubStringBetween(start, pipeIndex).unescape();
+        if(prefix.isEmpty()) {
+            errln("empty prefix on line %d", (int)fileLineNumber);
+            infoln(fileLine);
+            errorCode = U_PARSE_ERROR;
+            return;
+        }
+        start = pipeIndex + 1;
+    } else {
+        prefix.remove();
+    }
+    s = fileLine.tempSubStringBetween(start, i).unescape();
+    if(s.isEmpty()) {
+        errln("empty string on line %d", (int)fileLineNumber);
+        infoln(fileLine);
+        errorCode = U_PARSE_ERROR;
+        return;
+    }
+    start = i;
+}
+
+Collation::Level CollationTest::parseRelationAndString(UnicodeString &s, IcuTestErrorCode &errorCode) {
+    Collation::Level relation;
+    int32_t start;
+    if(fileLine[0] == 0x3c) {  // <
+        UChar second = fileLine[1];
+        start = 2;
+        switch(second) {
+        case 0x31:  // <1
+            relation = Collation::PRIMARY_LEVEL;
+            break;
+        case 0x32:  // <2
+            relation = Collation::SECONDARY_LEVEL;
+            break;
+        case 0x33:  // <3
+            relation = Collation::TERTIARY_LEVEL;
+            break;
+        case 0x34:  // <4
+            relation = Collation::QUATERNARY_LEVEL;
+            break;
+        case 0x63:  // <c
+            relation = Collation::CASE_LEVEL;
+            break;
+        case 0x69:  // <i
+            relation = Collation::IDENTICAL_LEVEL;
+            break;
+        default:  // just <
+            relation = Collation::NO_LEVEL;
+            start = 1;
+            break;
+        }
+    } else if(fileLine[0] == 0x3d) {  // =
+        relation = Collation::ZERO_LEVEL;
+        start = 1;
+    } else {
+        start = 0;
+    }
+    if(start == 0 || !isSpace(fileLine[start])) {
+        errln("no relation (= < <1 <2 <c <3 <4 <i) at beginning of line %d", (int)fileLineNumber);
+        infoln(fileLine);
+        errorCode.set(U_PARSE_ERROR);
+        return Collation::NO_LEVEL;
+    }
+    start = skipSpaces(start);
+    UnicodeString prefix;
+    parseString(start, prefix, s, errorCode);
+    if(errorCode.isSuccess() && !prefix.isEmpty()) {
+        errln("prefix string not allowed for test string: on line %d", (int)fileLineNumber);
+        infoln(fileLine);
+        errorCode.set(U_PARSE_ERROR);
+        return Collation::NO_LEVEL;
+    }
+    if(start < fileLine.length()) {
+        errln("unexpected line contents after test string on line %d", (int)fileLineNumber);
+        infoln(fileLine);
+        errorCode.set(U_PARSE_ERROR);
+        return Collation::NO_LEVEL;
+    }
+    return relation;
+}
+
+static const struct {
+    const char *name;
+    UColAttribute attr;
+} attributes[] = {
+    { "backwards", UCOL_FRENCH_COLLATION },
+    { "alternate", UCOL_ALTERNATE_HANDLING },
+    { "caseFirst", UCOL_CASE_FIRST },
+    { "caseLevel", UCOL_CASE_LEVEL },
+    // UCOL_NORMALIZATION_MODE is turned on and off automatically.
+    { "strength", UCOL_STRENGTH },
+    // UCOL_HIRAGANA_QUATERNARY_MODE is deprecated.
+    { "numeric", UCOL_NUMERIC_COLLATION }
+};
+
+static const struct {
+    const char *name;
+    UColAttributeValue value;
+} attributeValues[] = {
+    { "default", UCOL_DEFAULT },
+    { "primary", UCOL_PRIMARY },
+    { "secondary", UCOL_SECONDARY },
+    { "tertiary", UCOL_TERTIARY },
+    { "quaternary", UCOL_QUATERNARY },
+    { "identical", UCOL_IDENTICAL },
+    { "off", UCOL_OFF },
+    { "on", UCOL_ON },
+    { "shifted", UCOL_SHIFTED },
+    { "non-ignorable", UCOL_NON_IGNORABLE },
+    { "lower", UCOL_LOWER_FIRST },
+    { "upper", UCOL_UPPER_FIRST }
+};
+
+void CollationTest::parseAndSetAttribute(IcuTestErrorCode &errorCode) {
+    int32_t start = skipSpaces(1);
+    int32_t equalPos = fileLine.indexOf(0x3d);
+    if(equalPos < 0) {
+        if(fileLine.compare(start, 7, UNICODE_STRING("reorder", 7)) == 0) {
+            parseAndSetReorderCodes(start + 7, errorCode);
+            return;
+        }
+        errln("missing '=' on line %d", (int)fileLineNumber);
+        infoln(fileLine);
+        errorCode.set(U_PARSE_ERROR);
+        return;
+    }
+
+    UnicodeString attrString = fileLine.tempSubStringBetween(start, equalPos);
+    UnicodeString valueString = fileLine.tempSubString(equalPos+1);
+    if(attrString == UNICODE_STRING("maxVariable", 11)) {
+        UColReorderCode max;
+        if(valueString == UNICODE_STRING("space", 5)) {
+            max = UCOL_REORDER_CODE_SPACE;
+        } else if(valueString == UNICODE_STRING("punct", 5)) {
+            max = UCOL_REORDER_CODE_PUNCTUATION;
+        } else if(valueString == UNICODE_STRING("symbol", 6)) {
+            max = UCOL_REORDER_CODE_SYMBOL;
+        } else if(valueString == UNICODE_STRING("currency", 8)) {
+            max = UCOL_REORDER_CODE_CURRENCY;
+        } else {
+            errln("invalid attribute value name on line %d", (int)fileLineNumber);
+            infoln(fileLine);
+            errorCode.set(U_PARSE_ERROR);
+            return;
+        }
+        coll->setMaxVariable(max, errorCode);
+        if(errorCode.isFailure()) {
+            errln("setMaxVariable() failed on line %d: %s",
+                  (int)fileLineNumber, errorCode.errorName());
+            infoln(fileLine);
+            return;
+        }
+        fileLine.remove();
+        return;
+    }
+
+    UColAttribute attr;
+    for(int32_t i = 0;; ++i) {
+        if(i == LENGTHOF(attributes)) {
+            errln("invalid attribute name on line %d", (int)fileLineNumber);
+            infoln(fileLine);
+            errorCode.set(U_PARSE_ERROR);
+            return;
+        }
+        if(attrString == UnicodeString(attributes[i].name, -1, US_INV)) {
+            attr = attributes[i].attr;
+            break;
+        }
+    }
+
+    UColAttributeValue value;
+    for(int32_t i = 0;; ++i) {
+        if(i == LENGTHOF(attributeValues)) {
+            errln("invalid attribute value name on line %d", (int)fileLineNumber);
+            infoln(fileLine);
+            errorCode.set(U_PARSE_ERROR);
+            return;
+        }
+        if(valueString == UnicodeString(attributeValues[i].name, -1, US_INV)) {
+            value = attributeValues[i].value;
+            break;
+        }
+    }
+
+    coll->setAttribute(attr, value, errorCode);
+    if(errorCode.isFailure()) {
+        errln("illegal attribute=value combination on line %d: %s",
+              (int)fileLineNumber, errorCode.errorName());
+        infoln(fileLine);
+        return;
+    }
+    fileLine.remove();
+}
+
+void CollationTest::parseAndSetReorderCodes(int32_t start, IcuTestErrorCode &errorCode) {
+    UVector32 reorderCodes(errorCode);
+    while(start < fileLine.length()) {
+        start = skipSpaces(start);
+        int32_t limit = start;
+        while(limit < fileLine.length() && !isSpace(fileLine[limit])) { ++limit; }
+        CharString name;
+        name.appendInvariantChars(fileLine.tempSubStringBetween(start, limit), errorCode);
+        int32_t code = CollationRuleParser::getReorderCode(name.data());
+        if(code < -1) {
+            errln("invalid reorder code '%s' on line %d", name.data(), (int)fileLineNumber);
+            infoln(fileLine);
+            errorCode.set(U_PARSE_ERROR);
+            return;
+        }
+        reorderCodes.addElement(code, errorCode);
+        start = limit;
+    }
+    coll->setReorderCodes(reorderCodes.getBuffer(), reorderCodes.size(), errorCode);
+    if(errorCode.isFailure()) {
+        errln("setReorderCodes() failed on line %d: %s", (int)fileLineNumber, errorCode.errorName());
+        infoln(fileLine);
+        return;
+    }
+    fileLine.remove();
+}
+
+void CollationTest::buildTailoring(UCHARBUF *f, IcuTestErrorCode &errorCode) {
+    UnicodeString rules;
+    while(readLine(f, errorCode)) {
+        if(fileLine.isEmpty()) { continue; }
+        if(isSectionStarter(fileLine[0])) { break; }
+        rules.append(fileLine.unescape());
+    }
+    if(errorCode.isFailure()) { return; }
+    logln(rules);
+
+    UParseError parseError;
+    UnicodeString reason;
+    delete coll;
+    coll = new RuleBasedCollator(rules, parseError, reason, errorCode);
+    if(coll == NULL) {
+        errln("unable to allocate a new collator");
+        errorCode.set(U_MEMORY_ALLOCATION_ERROR);
+        return;
+    }
+    if(errorCode.isFailure()) {
+        errln("RuleBasedCollator(rules) failed - %s", errorCode.errorName());
+        infoln(UnicodeString("  reason: ") + reason);
+        if(parseError.offset >= 0) { infoln("  rules offset: %d", (int)parseError.offset); }
+        if(parseError.preContext[0] != 0 || parseError.postContext[0] != 0) {
+            infoln(UnicodeString("  snippet: ...") +
+                parseError.preContext + "(!)" + parseError.postContext + "...");
+        }
+    } else {
+        assertEquals("no error reason when RuleBasedCollator(rules) succeeds",
+                     UnicodeString(), reason);
+    }
+}
+
+void CollationTest::setRootCollator(IcuTestErrorCode &errorCode) {
+    if(errorCode.isFailure()) { return; }
+    delete coll;
+    coll = Collator::createInstance(Locale::getRoot(), errorCode);
+    if(errorCode.isFailure()) {
+        dataerrln("unable to create a root collator");
+        return;
+    }
+}
+
+void CollationTest::setLocaleCollator(IcuTestErrorCode &errorCode) {
+    if(errorCode.isFailure()) { return; }
+    CharString langTag;
+    langTag.appendInvariantChars(fileLine.tempSubString(9), errorCode);
+    char localeID[ULOC_FULLNAME_CAPACITY];
+    int32_t parsedLength;
+    (void)uloc_forLanguageTag(
+        langTag.data(), localeID, LENGTHOF(localeID), &parsedLength, errorCode);
+    Locale locale(localeID);
+    if(fileLine.length() == 9 ||
+            errorCode.isFailure() || errorCode.get() == U_STRING_NOT_TERMINATED_WARNING ||
+            parsedLength != langTag.length() || locale.isBogus()) {
+        errln("invalid language tag on line %d", (int)fileLineNumber);
+        infoln(fileLine);
+        if(errorCode.isSuccess()) { errorCode.set(U_PARSE_ERROR); }
+        return;
+    }
+
+    logln("creating a collator for locale ID %s", locale.getName());
+    Collator *newColl = Collator::createInstance(locale, errorCode);
+    if(errorCode.isFailure()) {
+        dataerrln("unable to create a collator for locale %s on line %d",
+                  locale.getName(), (int)fileLineNumber);
+        infoln(fileLine);
+        return;
+    }
+    delete coll;
+    coll = newColl;
+}
+
+UBool CollationTest::needsNormalization(const UnicodeString &s, UErrorCode &errorCode) const {
+    if(U_FAILURE(errorCode) || !fcd->isNormalized(s, errorCode)) { return TRUE; }
+    // In some sequences with Tibetan composite vowel signs,
+    // even if the string passes the FCD check,
+    // those composites must be decomposed.
+    // Check if s contains 0F71 immediately followed by 0F73 or 0F75 or 0F81.
+    int32_t index = 0;
+    while((index = s.indexOf((UChar)0xf71, index)) >= 0) {
+        if(++index < s.length()) {
+            UChar c = s[index];
+            if(c == 0xf73 || c == 0xf75 || c == 0xf81) { return TRUE; }
+        }
+    }
+    return FALSE;
+}
+
+UBool CollationTest::getSortKeyParts(const UChar *s, int32_t length,
+                                     CharString &dest, int32_t partSize,
+                                     IcuTestErrorCode &errorCode) {
+    if(errorCode.isFailure()) { return FALSE; }
+    uint8_t part[32];
+    U_ASSERT(partSize <= LENGTHOF(part));
+    UCharIterator iter;
+    uiter_setString(&iter, s, length);
+    uint32_t state[2] = { 0, 0 };
+    for(;;) {
+        int32_t partLength = coll->internalNextSortKeyPart(&iter, state, part, partSize, errorCode);
+        UBool done = partLength < partSize;
+        if(done) {
+            // At the end, append the next byte as well which should be 00.
+            ++partLength;
+        }
+        dest.append(reinterpret_cast<char *>(part), partLength, errorCode);
+        if(done) {
+            return errorCode.isSuccess();
+        }
+    }
+}
+
+UBool CollationTest::getCollationKey(const char *norm, const UnicodeString &line,
+                                     const UChar *s, int32_t length,
+                                     CollationKey &key, IcuTestErrorCode &errorCode) {
+    if(errorCode.isFailure()) { return FALSE; }
+    coll->getCollationKey(s, length, key, errorCode);
+    if(errorCode.isFailure()) {
+        infoln(fileTestName);
+        errln("Collator(%s).getCollationKey() failed: %s",
+              norm, errorCode.errorName());
+        infoln(line);
+        return FALSE;
+    }
+    int32_t keyLength;
+    const uint8_t *keyBytes = key.getByteArray(keyLength);
+    if(keyLength == 0 || keyBytes[keyLength - 1] != 0) {
+        infoln(fileTestName);
+        errln("Collator(%s).getCollationKey() wrote an empty or unterminated key",
+              norm);
+        infoln(line);
+        infoln(printCollationKey(key));
+        return FALSE;
+    }
+
+    int32_t numLevels = coll->getAttribute(UCOL_STRENGTH, errorCode);
+    if(numLevels < UCOL_IDENTICAL) {
+        ++numLevels;
+    } else {
+        numLevels = 5;
+    }
+    if(coll->getAttribute(UCOL_CASE_LEVEL, errorCode) == UCOL_ON) {
+        ++numLevels;
+    }
+    errorCode.assertSuccess();
+    int32_t numLevelSeparators = 0;
+    for(int32_t i = 0; i < (keyLength - 1); ++i) {
+        uint8_t b = keyBytes[i];
+        if(b == 0) {
+            infoln(fileTestName);
+            errln("Collator(%s).getCollationKey() contains a 00 byte", norm);
+            infoln(line);
+            infoln(printCollationKey(key));
+            return FALSE;
+        }
+        if(b == 1) { ++numLevelSeparators; }
+    }
+    if(numLevelSeparators != (numLevels - 1)) {
+        infoln(fileTestName);
+        errln("Collator(%s).getCollationKey() has %d level separators for %d levels",
+              norm, (int)numLevelSeparators, (int)numLevels);
+        infoln(line);
+        infoln(printCollationKey(key));
+        return FALSE;
+    }
+
+    // If s contains U+FFFE, check that merged segments make the same key.
+    LocalMemory<uint8_t> mergedKey;
+    int32_t mergedKeyLength = 0;
+    int32_t mergedKeyCapacity = 0;
+    int32_t sLength = (length >= 0) ? length : u_strlen(s);
+    int32_t segmentStart = 0;
+    for(int32_t i = 0;;) {
+        if(i == sLength) {
+            if(segmentStart == 0) {
+                // s does not contain any U+FFFE.
+                break;
+            }
+        } else if(s[i] != 0xfffe) {
+            ++i;
+            continue;
+        }
+        // Get the sort key for another segment and merge it into mergedKey.
+        CollationKey key1(mergedKey.getAlias(), mergedKeyLength);  // copies the bytes
+        CollationKey key2;
+        coll->getCollationKey(s + segmentStart, i - segmentStart, key2, errorCode);
+        int32_t key1Length, key2Length;
+        const uint8_t *key1Bytes = key1.getByteArray(key1Length);
+        const uint8_t *key2Bytes = key2.getByteArray(key2Length);
+        uint8_t *dest;
+        int32_t minCapacity = key1Length + key2Length;
+        if(key1Length > 0) { --minCapacity; }
+        if(minCapacity <= mergedKeyCapacity) {
+            dest = mergedKey.getAlias();
+        } else {
+            if(minCapacity <= 200) {
+                mergedKeyCapacity = 200;
+            } else if(minCapacity <= 2 * mergedKeyCapacity) {
+                mergedKeyCapacity *= 2;
+            } else {
+                mergedKeyCapacity = minCapacity;
+            }
+            dest = mergedKey.allocateInsteadAndReset(mergedKeyCapacity);
+        }
+        U_ASSERT(dest != NULL || mergedKeyCapacity == 0);
+        if(key1Length == 0) {
+            // key2 is the sort key for the first segment.
+            uprv_memcpy(dest, key2Bytes, key2Length);
+            mergedKeyLength = key2Length;
+        } else {
+            mergedKeyLength =
+                ucol_mergeSortkeys(key1Bytes, key1Length, key2Bytes, key2Length,
+                                   dest, mergedKeyCapacity);
+        }
+        if(i == sLength) { break; }
+        segmentStart = ++i;
+    }
+    if(segmentStart != 0 &&
+            (mergedKeyLength != keyLength ||
+            uprv_memcmp(mergedKey.getAlias(), keyBytes, keyLength) != 0)) {
+        infoln(fileTestName);
+        errln("Collator(%s).getCollationKey(with U+FFFE) != "
+              "ucol_mergeSortkeys(segments)",
+              norm);
+        infoln(line);
+        infoln(printCollationKey(key));
+        infoln(printSortKey(mergedKey.getAlias(), mergedKeyLength));
+        return FALSE;
+    }
+
+    // Check that internalNextSortKeyPart() makes the same key, with several part sizes.
+    static const int32_t partSizes[] = { 32, 3, 1 };
+    for(int32_t psi = 0; psi < LENGTHOF(partSizes); ++psi) {
+        int32_t partSize = partSizes[psi];
+        CharString parts;
+        if(!getSortKeyParts(s, length, parts, 32, errorCode)) {
+            infoln(fileTestName);
+            errln("Collator(%s).internalNextSortKeyPart(%d) failed: %s",
+                  norm, (int)partSize, errorCode.errorName());
+            infoln(line);
+            return FALSE;
+        }
+        if(keyLength != parts.length() || uprv_memcmp(keyBytes, parts.data(), keyLength) != 0) {
+            infoln(fileTestName);
+            errln("Collator(%s).getCollationKey() != internalNextSortKeyPart(%d)",
+                  norm, (int)partSize);
+            infoln(line);
+            infoln(printCollationKey(key));
+            infoln(printSortKey(reinterpret_cast<uint8_t *>(parts.data()), parts.length()));
+            return FALSE;
+        }
+    }
+    return TRUE;
+}
+
+namespace {
+
+/**
+ * Replaces unpaired surrogates with U+FFFD.
+ * Returns s if no replacement was made, otherwise buffer.
+ */
+const UnicodeString &surrogatesToFFFD(const UnicodeString &s, UnicodeString &buffer) {
+    int32_t i = 0;
+    while(i < s.length()) {
+        UChar32 c = s.char32At(i);
+        if(U_IS_SURROGATE(c)) {
+            if(buffer.length() < i) {
+                buffer.append(s, buffer.length(), i - buffer.length());
+            }
+            buffer.append((UChar)0xfffd);
+        }
+        i += U16_LENGTH(c);
+    }
+    if(buffer.isEmpty()) {
+        return s;
+    }
+    if(buffer.length() < i) {
+        buffer.append(s, buffer.length(), i - buffer.length());
+    }
+    return buffer;
+}
+
+}
+
+UBool CollationTest::checkCompareTwo(const char *norm, const UnicodeString &prevFileLine,
+                                     const UnicodeString &prevString, const UnicodeString &s,
+                                     UCollationResult expectedOrder, Collation::Level expectedLevel,
+                                     IcuTestErrorCode &errorCode) {
+    if(errorCode.isFailure()) { return FALSE; }
+
+    // Get the sort keys first, for error debug output.
+    CollationKey prevKey;
+    if(!getCollationKey(norm, prevFileLine, prevString.getBuffer(), prevString.length(),
+                        prevKey, errorCode)) {
+        return FALSE;
+    }
+    CollationKey key;
+    if(!getCollationKey(norm, fileLine, s.getBuffer(), s.length(), key, errorCode)) { return FALSE; }
+
+    UCollationResult order = coll->compare(prevString, s, errorCode);
+    if(order != expectedOrder || errorCode.isFailure()) {
+        infoln(fileTestName);
+        errln("line %d Collator(%s).compare(previous, current) wrong order: %d != %d (%s)",
+              (int)fileLineNumber, norm, order, expectedOrder, errorCode.errorName());
+        infoln(prevFileLine);
+        infoln(fileLine);
+        infoln(printCollationKey(prevKey));
+        infoln(printCollationKey(key));
+        return FALSE;
+    }
+    order = coll->compare(s, prevString, errorCode);
+    if(order != -expectedOrder || errorCode.isFailure()) {
+        infoln(fileTestName);
+        errln("line %d Collator(%s).compare(current, previous) wrong order: %d != %d (%s)",
+              (int)fileLineNumber, norm, order, -expectedOrder, errorCode.errorName());
+        infoln(prevFileLine);
+        infoln(fileLine);
+        infoln(printCollationKey(prevKey));
+        infoln(printCollationKey(key));
+        return FALSE;
+    }
+    // Test NUL-termination if the strings do not contain NUL characters.
+    UBool containNUL = prevString.indexOf((UChar)0) >= 0 || s.indexOf((UChar)0) >= 0;
+    if(!containNUL) {
+        order = coll->compare(prevString.getBuffer(), -1, s.getBuffer(), -1, errorCode);
+        if(order != expectedOrder || errorCode.isFailure()) {
+            infoln(fileTestName);
+            errln("line %d Collator(%s).compare(previous-NUL, current-NUL) wrong order: %d != %d (%s)",
+                  (int)fileLineNumber, norm, order, expectedOrder, errorCode.errorName());
+            infoln(prevFileLine);
+            infoln(fileLine);
+            infoln(printCollationKey(prevKey));
+            infoln(printCollationKey(key));
+            return FALSE;
+        }
+        order = coll->compare(s.getBuffer(), -1, prevString.getBuffer(), -1, errorCode);
+        if(order != -expectedOrder || errorCode.isFailure()) {
+            infoln(fileTestName);
+            errln("line %d Collator(%s).compare(current-NUL, previous-NUL) wrong order: %d != %d (%s)",
+                  (int)fileLineNumber, norm, order, -expectedOrder, errorCode.errorName());
+            infoln(prevFileLine);
+            infoln(fileLine);
+            infoln(printCollationKey(prevKey));
+            infoln(printCollationKey(key));
+            return FALSE;
+        }
+    }
+
+#if U_HAVE_STD_STRING
+    // compare(UTF-16) treats unpaired surrogates like unassigned code points.
+    // Unpaired surrogates cannot be converted to UTF-8.
+    // Create valid UTF-16 strings if necessary, and use those for
+    // both the expected compare() result and for the input to compare(UTF-8).
+    UnicodeString prevBuffer, sBuffer;
+    const UnicodeString &prevValid = surrogatesToFFFD(prevString, prevBuffer);
+    const UnicodeString &sValid = surrogatesToFFFD(s, sBuffer);
+    std::string prevUTF8, sUTF8;
+    UnicodeString(prevValid).toUTF8String(prevUTF8);
+    UnicodeString(sValid).toUTF8String(sUTF8);
+    UCollationResult expectedUTF8Order;
+    if(&prevValid == &prevString && &sValid == &s) {
+        expectedUTF8Order = expectedOrder;
+    } else {
+        expectedUTF8Order = coll->compare(prevValid, sValid, errorCode);
+    }
+
+    order = coll->compareUTF8(prevUTF8, sUTF8, errorCode);
+    if(order != expectedUTF8Order || errorCode.isFailure()) {
+        infoln(fileTestName);
+        errln("line %d Collator(%s).compareUTF8(previous, current) wrong order: %d != %d (%s)",
+              (int)fileLineNumber, norm, order, expectedUTF8Order, errorCode.errorName());
+        infoln(prevFileLine);
+        infoln(fileLine);
+        infoln(printCollationKey(prevKey));
+        infoln(printCollationKey(key));
+        return FALSE;
+    }
+    order = coll->compareUTF8(sUTF8, prevUTF8, errorCode);
+    if(order != -expectedUTF8Order || errorCode.isFailure()) {
+        infoln(fileTestName);
+        errln("line %d Collator(%s).compareUTF8(current, previous) wrong order: %d != %d (%s)",
+              (int)fileLineNumber, norm, order, -expectedUTF8Order, errorCode.errorName());
+        infoln(prevFileLine);
+        infoln(fileLine);
+        infoln(printCollationKey(prevKey));
+        infoln(printCollationKey(key));
+        return FALSE;
+    }
+    // Test NUL-termination if the strings do not contain NUL characters.
+    if(!containNUL) {
+        order = coll->internalCompareUTF8(prevUTF8.c_str(), -1, sUTF8.c_str(), -1, errorCode);
+        if(order != expectedUTF8Order || errorCode.isFailure()) {
+            infoln(fileTestName);
+            errln("line %d Collator(%s).internalCompareUTF8(previous-NUL, current-NUL) wrong order: %d != %d (%s)",
+                  (int)fileLineNumber, norm, order, expectedUTF8Order, errorCode.errorName());
+            infoln(prevFileLine);
+            infoln(fileLine);
+            infoln(printCollationKey(prevKey));
+            infoln(printCollationKey(key));
+            return FALSE;
+        }
+        order = coll->internalCompareUTF8(sUTF8.c_str(), -1, prevUTF8.c_str(), -1, errorCode);
+        if(order != -expectedUTF8Order || errorCode.isFailure()) {
+            infoln(fileTestName);
+            errln("line %d Collator(%s).internalCompareUTF8(current-NUL, previous-NUL) wrong order: %d != %d (%s)",
+                  (int)fileLineNumber, norm, order, -expectedUTF8Order, errorCode.errorName());
+            infoln(prevFileLine);
+            infoln(fileLine);
+            infoln(printCollationKey(prevKey));
+            infoln(printCollationKey(key));
+            return FALSE;
+        }
+    }
+#endif
+
+    UCharIterator leftIter;
+    UCharIterator rightIter;
+    uiter_setString(&leftIter, prevString.getBuffer(), prevString.length());
+    uiter_setString(&rightIter, s.getBuffer(), s.length());
+    order = coll->compare(leftIter, rightIter, errorCode);
+    if(order != expectedOrder || errorCode.isFailure()) {
+        infoln(fileTestName);
+        errln("line %d Collator(%s).compare(UCharIterator: previous, current) "
+              "wrong order: %d != %d (%s)",
+              (int)fileLineNumber, norm, order, expectedOrder, errorCode.errorName());
+        infoln(prevFileLine);
+        infoln(fileLine);
+        infoln(printCollationKey(prevKey));
+        infoln(printCollationKey(key));
+        return FALSE;
+    }
+
+    order = prevKey.compareTo(key, errorCode);
+    if(order != expectedOrder || errorCode.isFailure()) {
+        infoln(fileTestName);
+        errln("line %d Collator(%s).getCollationKey(previous, current).compareTo() wrong order: %d != %d (%s)",
+              (int)fileLineNumber, norm, order, expectedOrder, errorCode.errorName());
+        infoln(prevFileLine);
+        infoln(fileLine);
+        infoln(printCollationKey(prevKey));
+        infoln(printCollationKey(key));
+        return FALSE;
+    }
+    if(order != UCOL_EQUAL && expectedLevel != Collation::NO_LEVEL) {
+        int32_t prevKeyLength;
+        const uint8_t *prevBytes = prevKey.getByteArray(prevKeyLength);
+        int32_t keyLength;
+        const uint8_t *bytes = key.getByteArray(keyLength);
+        int32_t level = Collation::PRIMARY_LEVEL;
+        for(int32_t i = 0;; ++i) {
+            uint8_t b = prevBytes[i];
+            if(b != bytes[i]) { break; }
+            if(b == Collation::LEVEL_SEPARATOR_BYTE) {
+                ++level;
+                if(level == Collation::CASE_LEVEL &&
+                        coll->getAttribute(UCOL_CASE_LEVEL, errorCode) == UCOL_OFF) {
+                    ++level;
+                }
+            }
+        }
+        if(level != expectedLevel) {
+            infoln(fileTestName);
+            errln("line %d Collator(%s).getCollationKey(previous, current).compareTo()=%d wrong level: %d != %d",
+                  (int)fileLineNumber, norm, order, level, expectedLevel);
+            infoln(prevFileLine);
+            infoln(fileLine);
+            infoln(printCollationKey(prevKey));
+            infoln(printCollationKey(key));
+            return FALSE;
+        }
+    }
+    return TRUE;
+}
+
+void CollationTest::checkCompareStrings(UCHARBUF *f, IcuTestErrorCode &errorCode) {
+    if(errorCode.isFailure()) { return; }
+    UnicodeString prevFileLine = UNICODE_STRING("(none)", 6);
+    UnicodeString prevString, s;
+    prevString.getTerminatedBuffer();  // Ensure NUL-termination.
+    while(readLine(f, errorCode)) {
+        if(fileLine.isEmpty()) { continue; }
+        if(isSectionStarter(fileLine[0])) { break; }
+        Collation::Level relation = parseRelationAndString(s, errorCode);
+        if(errorCode.isFailure()) {
+            errorCode.reset();
+            break;
+        }
+        UCollationResult expectedOrder = (relation == Collation::ZERO_LEVEL) ? UCOL_EQUAL : UCOL_LESS;
+        Collation::Level expectedLevel = relation;
+        s.getTerminatedBuffer();  // Ensure NUL-termination.
+        UBool isOk = TRUE;
+        if(!needsNormalization(prevString, errorCode) && !needsNormalization(s, errorCode)) {
+            coll->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, errorCode);
+            isOk = checkCompareTwo("normalization=on", prevFileLine, prevString, s,
+                                   expectedOrder, expectedLevel, errorCode);
+        }
+        if(isOk) {
+            coll->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, errorCode);
+            isOk = checkCompareTwo("normalization=off", prevFileLine, prevString, s,
+                                   expectedOrder, expectedLevel, errorCode);
+        }
+        if(isOk && (!nfd->isNormalized(prevString, errorCode) || !nfd->isNormalized(s, errorCode))) {
+            UnicodeString pn = nfd->normalize(prevString, errorCode);
+            UnicodeString n = nfd->normalize(s, errorCode);
+            pn.getTerminatedBuffer();
+            n.getTerminatedBuffer();
+            errorCode.assertSuccess();
+            isOk = checkCompareTwo("NFD input", prevFileLine, pn, n,
+                                   expectedOrder, expectedLevel, errorCode);
+        }
+        if(!isOk) {
+            errorCode.reset();  // already reported
+        }
+        prevFileLine = fileLine;
+        prevString = s;
+        prevString.getTerminatedBuffer();  // Ensure NUL-termination.
+    }
+}
+
+void CollationTest::TestDataDriven() {
+    IcuTestErrorCode errorCode(*this, "TestDataDriven");
+
+    fcd = Normalizer2Factory::getFCDInstance(errorCode);
+    nfd = Normalizer2Factory::getNFDInstance(errorCode);
+    if(errorCode.logIfFailureAndReset("Normalizer2Factory::getFCDInstance() or getNFDInstance()")) {
+        return;
+    }
+
+    CharString path(getSourceTestData(errorCode), errorCode);
+    path.appendPathPart("collationtest.txt", errorCode);
+    const char *codePage = "UTF-8";
+    LocalUCHARBUFPointer f(ucbuf_open(path.data(), &codePage, TRUE, FALSE, errorCode));
+    if(errorCode.logIfFailureAndReset("ucbuf_open(collationtest.txt)")) {
+        return;
+    }
+    while(errorCode.isSuccess()) {
+        // Read a new line if necessary.
+        // Sub-parsers leave the first line set that they do not handle.
+        if(fileLine.isEmpty()) {
+            if(!readLine(f.getAlias(), errorCode)) { break; }
+            continue;
+        }
+        if(!isSectionStarter(fileLine[0])) {
+            errln("syntax error on line %d", (int)fileLineNumber);
+            infoln(fileLine);
+            return;
+        }
+        if(fileLine.startsWith(UNICODE_STRING("** test: ", 9))) {
+            fileTestName = fileLine;
+            logln(fileLine);
+            fileLine.remove();
+        } else if(fileLine == UNICODE_STRING("@ root", 6)) {
+            setRootCollator(errorCode);
+            fileLine.remove();
+        } else if(fileLine.startsWith(UNICODE_STRING("@ locale ", 9))) {
+            setLocaleCollator(errorCode);
+            fileLine.remove();
+        } else if(fileLine == UNICODE_STRING("@ rules", 7)) {
+            buildTailoring(f.getAlias(), errorCode);
+        } else if(fileLine[0] == 0x25 && isSpace(fileLine[1])) {  // %
+            parseAndSetAttribute(errorCode);
+        } else if(fileLine == UNICODE_STRING("* compare", 9)) {
+            checkCompareStrings(f.getAlias(), errorCode);
+        } else {
+            errln("syntax error on line %d", (int)fileLineNumber);
+            infoln(fileLine);
+            return;
+        }
+    }
+}
+
+#endif  // !UCONFIG_NO_COLLATION
index 2f561c67086730eaad2cae27ec5d898b960d4828..abbfac2c9fd8086674bdd79832c9a466b4000895 100644 (file)
@@ -1,7 +1,7 @@
 /*
  ******************************************************************************
- *   Copyright (C) 1996-2012, International Business Machines                 *
- *   Corporation and others.  All Rights Reserved.                            *
+ *   Copyright (C) 1996-2014, International Business Machines
+ *   Corporation and others.  All Rights Reserved.
  ******************************************************************************
  */
 
 
 #include "unicode/uniset.h"
 #include "unicode/uset.h"
+#include "unicode/usetiter.h"
 #include "unicode/ustring.h"
 #include "hash.h"
+#include "normalizer2impl.h"
 #include "uhash.h"
-#include "ucol_imp.h"
+#include "usrchimp.h"
 #include "uassert.h"
 
 #include "colldata.h"
@@ -50,7 +52,7 @@ CEList::CEList(UCollator *coll, const UnicodeString &string, UErrorCode &status)
     }
 
     // **** only set flag if string has Han(gul) ****
-    ucol_forceHanImplicit(elems, &status);
+    // ucol_forceHanImplicit(elems, &status); -- removed for ticket #10476
 
     switch (strength)
     {
@@ -410,10 +412,22 @@ bail:
         return;
     }
 
-     UChar32 hanRanges[] = {UCOL_FIRST_HAN, UCOL_LAST_HAN, UCOL_FIRST_HAN_COMPAT, UCOL_LAST_HAN_COMPAT, UCOL_FIRST_HAN_A, UCOL_LAST_HAN_A,
-                            UCOL_FIRST_HAN_B, UCOL_LAST_HAN_B};
-     UChar  jamoRanges[] = {UCOL_FIRST_L_JAMO, UCOL_FIRST_V_JAMO, UCOL_FIRST_T_JAMO, UCOL_LAST_T_JAMO};
-     UnicodeString hanString = UnicodeString::fromUTF32(hanRanges, ARRAY_SIZE(hanRanges));
+    UnicodeSet hanRanges(UNICODE_STRING_SIMPLE("[:Unified_Ideograph:]"), status);
+    if (U_FAILURE(status)) {
+        return;
+    }
+    UnicodeSetIterator hanIter(hanRanges);
+    UnicodeString hanString;
+    while(hanIter.nextRange()) {
+        hanString.append(hanIter.getCodepoint());
+        hanString.append(hanIter.getCodepointEnd());
+    }
+    // TODO: Why U+11FF? The old code had an outdated UCOL_LAST_T_JAMO=0x11F9,
+    // but as of Unicode 6.3 the 11xx block is filled,
+    // and there are also more Jamo T at U+D7CB..U+D7FB.
+    // Maybe use [:HST=T:] and look for the end of the last range?
+    // Maybe use script boundary mappings instead of this code??
+    UChar  jamoRanges[] = {Hangul::JAMO_L_BASE, Hangul::JAMO_V_BASE, Hangul::JAMO_T_BASE + 1, 0x11FF};
      UnicodeString jamoString(FALSE, jamoRanges, ARRAY_SIZE(jamoRanges));
      CEList hanList(coll, hanString, status);
      CEList jamoList(coll, jamoString, status);
diff --git a/icu4c/source/test/intltest/dadrcoll.cpp b/icu4c/source/test/intltest/dadrcoll.cpp
deleted file mode 100644 (file)
index 6224809..0000000
+++ /dev/null
@@ -1,291 +0,0 @@
-/********************************************************************
- * COPYRIGHT: 
- * Copyright (c) 1997-2010, International Business Machines Corporation and
- * others. All Rights Reserved.
- ********************************************************************/
-
-/**
- * IntlTestCollator is the medium level test class for everything in the directory "collate".
- */
-
-/***********************************************************************
-* Modification history
-* Date        Name        Description
-* 02/14/2001  synwee      Compare with cintltst and commented away tests 
-*                         that are not run.
-***********************************************************************/
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_FILE_IO
-
-#include "unicode/uchar.h"
-#include "unicode/tstdtmod.h"
-#include "cstring.h"
-#include "ucol_tok.h"
-#include "tscoll.h"
-#include "dadrcoll.h"
-
-U_CDECL_BEGIN
-static void U_CALLCONV deleteSeqElement(void *elem) {
-  delete((SeqElement *)elem);
-}
-U_CDECL_END
-
-DataDrivenCollatorTest::DataDrivenCollatorTest() 
-: seq(StringCharacterIterator("")),
-status(U_ZERO_ERROR),
-sequences(status)
-{
-  driver = TestDataModule::getTestDataModule("DataDrivenCollationTest", *this, status);
-  sequences.setDeleter(deleteSeqElement);
-  UCA = (RuleBasedCollator*)Collator::createInstance("root", status);
-}
-
-DataDrivenCollatorTest::~DataDrivenCollatorTest() 
-{
-  delete driver;
-  delete UCA;
-}
-
-void DataDrivenCollatorTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par */)
-{
-  if(driver != NULL) {
-    if (exec)
-    {
-        logln("TestSuite Collator: ");
-    }
-    const DataMap *info = NULL;
-    TestData *testData = driver->createTestData(index, status);
-    if(U_SUCCESS(status)) {
-      name = testData->getName();
-      if(testData->getInfo(info, status)) {
-        log(info->getString("Description", status));
-      }
-      if(exec) {
-        log(name);
-          logln("---");
-          logln("");
-          processTest(testData);
-      }
-      delete testData;
-    } else {
-      name = "";
-    }
-  } else {
-    dataerrln("collate/DataDrivenTest data not initialized!");
-    name = "";
-  }
-
-
-}
-
-UBool
-DataDrivenCollatorTest::setTestSequence(const UnicodeString &setSequence, SeqElement &el) {
-  seq.setText(setSequence);
-  return getNextInSequence(el);
-}
-
-// Parses the sequence to be tested
-UBool 
-DataDrivenCollatorTest::getNextInSequence(SeqElement &el) {
-  el.source.truncate(0);
-  UBool quoted = FALSE;
-  UBool quotedsingle = FALSE;
-  UChar32 currChar = 0;
-
-  while(currChar != CharacterIterator::DONE) {
-    currChar= seq.next32PostInc();
-    if(!quoted) {
-      if(u_isWhitespace(currChar)) {
-        continue;
-      }
-      switch(currChar) {
-      case CharacterIterator::DONE:
-        break;
-      case 0x003C /* < */:
-        el.relation = Collator::LESS;
-        currChar = CharacterIterator::DONE;
-        break;
-      case 0x003D /* = */:
-        el.relation = Collator::EQUAL;
-        currChar = CharacterIterator::DONE;
-        break;
-      case 0x003E /* > */:
-        el.relation = Collator::GREATER;
-        currChar = CharacterIterator::DONE;
-        break;
-      case 0x0027 /* ' */: /* very basic quoting */
-        quoted = TRUE;
-        quotedsingle = FALSE;
-        break;
-      case 0x005c /* \ */: /* single quote */
-        quoted = TRUE;
-        quotedsingle = TRUE;
-        break;
-      default:
-        el.source.append(currChar);
-      }
-    } else {
-      if(currChar == CharacterIterator::DONE) {
-        status = U_ILLEGAL_ARGUMENT_ERROR;
-        errln("Quote in sequence not closed!");
-        return FALSE;
-      } else if(currChar == 0x0027) {
-        quoted = FALSE;
-      } else {
-        el.source.append(currChar);
-      }
-      if(quotedsingle) {
-        quoted = FALSE;
-      }
-    }
-  }
-  return seq.hasNext();
-}
-
-// Reads the options string and sets appropriate attributes in collator
-void 
-DataDrivenCollatorTest::processArguments(Collator *col, const UChar *start, int32_t optLen) {
-  const UChar *end = start+optLen;
-  UColAttribute attrib;
-  UColAttributeValue value;
-
-  if(optLen == 0) {
-    return;
-  }
-
-  start = ucol_tok_getNextArgument(start, end, &attrib, &value, &status);
-  while(start != NULL) {
-    if(U_SUCCESS(status)) {
-      col->setAttribute(attrib, value, status);
-    }
-    start = ucol_tok_getNextArgument(start, end, &attrib, &value, &status);
-  }
-}
-
-void
-DataDrivenCollatorTest::processTest(TestData *testData) {
-  Collator *col = NULL;
-  const UChar *arguments = NULL;
-  int32_t argLen = 0;
-  const DataMap *settings = NULL;
-  const DataMap *currentCase = NULL;
-  UErrorCode intStatus = U_ZERO_ERROR;
-  UnicodeString testSetting;
-  while(testData->nextSettings(settings, status)) {
-    intStatus = U_ZERO_ERROR;
-    // try to get a locale
-    testSetting = settings->getString("TestLocale", intStatus);
-    if(U_SUCCESS(intStatus)) {
-      char localeName[256];
-      testSetting.extract(0, testSetting.length(), localeName, "");
-      col = Collator::createInstance(localeName, status);
-      if(U_SUCCESS(status)) {
-        logln("Testing collator for locale "+testSetting);
-      } else {
-        errln("Unable to instantiate collator for locale "+testSetting);
-        return;
-      }
-    } else {
-      // if no locale, try from rules
-      intStatus = U_ZERO_ERROR;
-      testSetting = settings->getString("Rules", intStatus);
-      if(U_SUCCESS(intStatus)) {
-        col = new RuleBasedCollator(testSetting, status);
-        if(U_SUCCESS(status)) {
-          logln("Testing collator for rules "+testSetting);
-        } else {
-          errln("Unable to instantiate collator for rules "+testSetting+" - "+u_errorName(status));
-          return;
-        }
-      } else {
-        errln("No collator definition!");
-        return;
-      }
-    }
-    
-    int32_t cloneSize = 0;
-    uint8_t* cloneBuf = NULL;
-    RuleBasedCollator* clone = NULL;
-    if(col != NULL){
-      RuleBasedCollator* rbc = (RuleBasedCollator*)col;
-      cloneSize = rbc->cloneBinary(NULL, 0, intStatus);
-      intStatus = U_ZERO_ERROR;
-      cloneBuf = (uint8_t*) malloc(cloneSize);
-      cloneSize = rbc->cloneBinary(cloneBuf, cloneSize, intStatus);
-      clone = new RuleBasedCollator(cloneBuf, cloneSize, UCA, intStatus);
-      if(U_FAILURE(intStatus)){
-          errln("Could not clone the RuleBasedCollator. Error: %s", u_errorName(intStatus));
-          intStatus= U_ZERO_ERROR;
-      }
-      // get attributes
-      testSetting = settings->getString("Arguments", intStatus);
-      if(U_SUCCESS(intStatus)) {
-        logln("Arguments: "+testSetting);
-        argLen = testSetting.length();
-        arguments = testSetting.getBuffer();
-        processArguments(col, arguments, argLen);
-        if(clone != NULL){
-            processArguments(clone, arguments, argLen);
-        }
-        if(U_FAILURE(status)) {
-          errln("Couldn't process arguments");
-          break;
-        }
-      } else {
-        intStatus = U_ZERO_ERROR;
-      }
-      // Start the processing
-      while(testData->nextCase(currentCase, status)) {
-        UnicodeString sequence = currentCase->getString("sequence", status);
-        if(U_SUCCESS(status)) {
-            processSequence(col, sequence);
-            if(clone != NULL){
-                processSequence(clone, sequence);
-            }
-        }
-      }
-    } else {
-      errln("Couldn't instantiate a collator!");
-    }
-    delete clone;
-    free(cloneBuf);
-    delete col;
-    col = NULL;
-  }
-}
-
-
-void 
-DataDrivenCollatorTest::processSequence(Collator* col, const UnicodeString &sequence) {
-  Collator::EComparisonResult relation = Collator::EQUAL;
-  UBool hasNext;
-  SeqElement *source = NULL;
-  SeqElement *target = NULL;
-  int32_t j = 0;
-
-  sequences.removeAllElements();
-
-  target = new SeqElement(); 
-
-  setTestSequence(sequence, *target);
-  sequences.addElement(target, status);
-
-  do {
-    relation = Collator::EQUAL;
-    target = new SeqElement(); 
-    hasNext = getNextInSequence(*target);
-    for(j = sequences.size(); j > 0; j--) {
-      source = (SeqElement *)sequences.elementAt(j-1);
-      if(relation == Collator::EQUAL && source->relation != Collator::EQUAL) {
-        relation = source->relation;
-      }
-      doTest(col, source->source, target->source, relation);     
-    }
-    sequences.addElement(target, status);
-    source = target;
-  } while(hasNext);
-}
-
-#endif /* #if !UCONFIG_NO_COLLATION */
diff --git a/icu4c/source/test/intltest/dadrcoll.h b/icu4c/source/test/intltest/dadrcoll.h
deleted file mode 100644 (file)
index 2927486..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/********************************************************************
- * COPYRIGHT: 
- * Copyright (c) 2002-2009, International Business Machines Corporation and
- * others. All Rights Reserved.
- ********************************************************************/
-
-/**
- * DataDrivenCollatorTest is a test class that uses data stored in resource
- * bundles to perform testing. For more details on data structure, see
- * source/test/testdata/DataDrivenCollationTest.txt
- */
-
-#ifndef _INTLTESTDATADRIVENCOLLATOR
-#define _INTLTESTDATADRIVENCOLLATOR
-
-#include "unicode/utypes.h"
-
-#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_FILE_IO
-
-#include "tscoll.h"
-#include "uvector.h"
-#include "unicode/coll.h"
-#include "unicode/tblcoll.h"
-#include "unicode/sortkey.h"
-#include "unicode/schriter.h"
-
-class TestDataModule;
-class TestData;
-
-class SeqElement {
-public:
-  UnicodeString source;
-  Collator::EComparisonResult relation;
-};
-
-class DataDrivenCollatorTest: public IntlTestCollator {
-    void runIndexedTest(int32_t index, UBool exec, const char* &name, char* par = NULL );
-public:
-    DataDrivenCollatorTest();
-    virtual ~DataDrivenCollatorTest();
-protected:
-
-    void DataDrivenTest(char *par);
-    void processSequence(Collator* col, const UnicodeString &sequence);
-    void processTest(TestData *testData);
-    void processArguments(Collator *col, const UChar *start, int32_t optLen);
-    UBool setTestSequence(const UnicodeString &setSequence, SeqElement &el);
-    UBool getNextInSequence(SeqElement &el);
-private:
-  StringCharacterIterator seq;
-  TestDataModule *driver;
-  UErrorCode status;
-  UVector sequences;
-  RuleBasedCollator *UCA; // needed for opening collators from binary images
-};
-
-#endif /* #if !UCONFIG_NO_COLLATION */
-
-#endif
index 8a717e4ad894810c66dd39d7e99585874bc3ae87..8c4371510dbeef4da36c7ab333fff67d8327a0aa 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT:
- * Copyright (c) 1997-2013, International Business Machines Corporation and
+ * Copyright (c) 1997-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 
@@ -1095,7 +1095,7 @@ void IntlTest::LL_message( UnicodeString message, UBool newline )
     };
     UnicodeString indent(FALSE, indentUChars, 1 + LL_indentlevel);
 
-    char buffer[10000];
+    char buffer[30000];
     int32_t length;
 
     // stream out the indentation string first if necessary
@@ -1110,7 +1110,7 @@ void IntlTest::LL_message( UnicodeString message, UBool newline )
     // stream out the message
     length = message.extract(0, message.length(), buffer, sizeof(buffer));
     if (length > 0) {
-        length = length > 10000 ? 10000 : length;
+        length = length > 30000 ? 30000 : length;
         fwrite(buffer, sizeof(*buffer), length, (FILE *)testoutfp);
     }
 
index 7f6ad997c928f550c31dda3e3c159659d1f1e82a..4e78ec5c117b6f26ad8427ca03af0a6cf4db3c18 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 1997-2013, International Business Machines Corporation and
+ * Copyright (c) 1997-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 
@@ -117,6 +117,30 @@ UnicodeString toString(UBool b);
             break; \
         }
 
+#define TESTCASE_AUTO_CLASS(TestClass) \
+        if (index == testCaseAutoNumber++) { \
+            name = #TestClass; \
+            if (exec) { \
+                logln(#TestClass "---"); \
+                logln(); \
+                TestClass test; \
+                callTest(test, par); \
+            } \
+            break; \
+        }
+
+#define TESTCASE_AUTO_CREATE_CLASS(TestClass) \
+        if (index == testCaseAutoNumber++) { \
+            name = #TestClass; \
+            if (exec) { \
+                logln(#TestClass "---"); \
+                logln(); \
+                LocalPointer<IntlTest> test(create##TestClass()); \
+                callTest(*test, par); \
+            } \
+            break; \
+        }
+
 #define TESTCASE_AUTO_END \
         name = ""; \
         break; \
index 13d8846ed32b434f26212c06c3a38147ee9cd3e9..4e6c55c2216d3f26b64d27de76c60db18670ff35 100644 (file)
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
     <ClCompile Include="bytestrietest.cpp" />\r
-    <ClCompile Include="colldata.cpp" />\r
+    <ClCompile Include="collationtest.cpp">\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+    </ClCompile>\r
+    <ClCompile Include="colldata.cpp">\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+    </ClCompile>\r
     <ClCompile Include="regiontst.cpp" />\r
     <ClCompile Include="ucharstrietest.cpp" />\r
     <ClCompile Include="itrbbi.cpp" />\r
     <ClCompile Include="rbbiapts.cpp">\r
-        <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="rbbitst.cpp" />\r
     <ClCompile Include="itspoof.cpp" />\r
     <ClCompile Include="allcoll.cpp" />\r
     <ClCompile Include="alphaindextst.cpp" />\r
     <ClCompile Include="apicoll.cpp" />\r
-    <ClCompile Include="cntabcol.cpp" />\r
     <ClCompile Include="currcoll.cpp" />\r
-    <ClCompile Include="dadrcoll.cpp" />\r
     <ClCompile Include="decoll.cpp" />\r
     <ClCompile Include="encoll.cpp" />\r
     <ClCompile Include="escoll.cpp" />\r
     <ClCompile Include="uvectest.cpp" />\r
     <ClCompile Include="v32test.cpp" />\r
     <ClCompile Include="simplethread.cpp">\r
-           <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="strtest.cpp">\r
       <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="tsputil.cpp" />\r
     <ClCompile Include="uobjtest.cpp">\r
-           <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="astrotst.cpp" />\r
     <ClCompile Include="calcasts.cpp" />\r
     <ClCompile Include="calregts.cpp" />\r
     <ClCompile Include="caltest.cpp" />\r
     <ClCompile Include="caltztst.cpp">\r
-           <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="compactdecimalformattest.cpp" />\r
     <ClCompile Include="dadrcal.cpp" />\r
     <ClCompile Include="tufmtts.cpp" />\r
     <ClCompile Include="tzbdtest.cpp" />\r
     <ClCompile Include="tzfmttst.cpp">\r
-           <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="tzoffloc.cpp" />\r
     <ClCompile Include="tzregts.cpp" />\r
     <ClCompile Include="tzrulets.cpp" />\r
     <ClCompile Include="tztest.cpp">\r
-           <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="windttst.cpp">\r
       <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>\r
     <ClCompile Include="nptrans.cpp" />\r
     <ClCompile Include="punyref.c" />\r
     <ClCompile Include="testidn.cpp">\r
-           <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="testidna.cpp" />\r
     <ClCompile Include="uts46test.cpp" />\r
     <ClCompile Include="restest.cpp" />\r
     <ClCompile Include="restsnew.cpp" />\r
     <ClCompile Include="intltest.cpp">\r
-           <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="itmajor.cpp">\r
-           <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="itutil.cpp">\r
-           <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="testutil.cpp" />\r
     <ClCompile Include="textfile.cpp" />\r
     <ClCompile Include="tokiter.cpp" />\r
     <ClCompile Include="winutil.cpp">\r
-          <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="canittst.cpp" />\r
     <ClCompile Include="normconf.cpp" />\r
     <ClCompile Include="tstnorm.cpp">\r
-           <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="tstnrapi.cpp">\r
-           <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="ucdtest.cpp">\r
-           <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="usettest.cpp" />\r
     <ClCompile Include="regextst.cpp" />\r
     <ClCompile Include="icusvtst.cpp">\r
-           <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
     </ClCompile>\r
     <ClCompile Include="citrtest.cpp" />\r
     <ClCompile Include="reptest.cpp" />\r
     <ClInclude Include="allcoll.h" />\r
     <ClInclude Include="alphaindextst.h" />\r
     <ClInclude Include="apicoll.h" />\r
-    <ClInclude Include="cntabcol.h" />\r
     <ClInclude Include="currcoll.h" />\r
-    <ClInclude Include="dadrcoll.h" />\r
     <ClInclude Include="decoll.h" />\r
     <ClInclude Include="encoll.h" />\r
     <ClInclude Include="escoll.h" />\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
   <ImportGroup Label="ExtensionTargets">\r
   </ImportGroup>\r
-</Project>\r
+</Project>
\ No newline at end of file
index dacd9e24cbc12871479033cc6cd0a92f1df47438..05df5301e4a344b07bfc51bc9f70ae63b4938a00 100644 (file)
     <ClCompile Include="apicoll.cpp">\r
       <Filter>collation</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="cntabcol.cpp">\r
-      <Filter>collation</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="currcoll.cpp">\r
       <Filter>collation</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="dadrcoll.cpp">\r
-      <Filter>collation</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="decoll.cpp">\r
       <Filter>collation</Filter>\r
     </ClCompile>\r
     <ClCompile Include="regiontst.cpp">\r
       <Filter>formatting</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="collationtest.cpp">\r
+      <Filter>collation</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="itrbbi.h">\r
     <ClInclude Include="apicoll.h">\r
       <Filter>collation</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="cntabcol.h">\r
-      <Filter>collation</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="currcoll.h">\r
       <Filter>collation</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="dadrcoll.h">\r
-      <Filter>collation</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="decoll.h">\r
       <Filter>collation</Filter>\r
     </ClInclude>\r
index 3040c4566d6a7151ae9b23ac4515603c67bf9827..cd586d83eaf375cdcc73a0de8301575bb9ea5a95 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
- * COPYRIGHT: 
- * Copyright (c) 1997-2009, International Business Machines Corporation and
+ * COPYRIGHT:
+ * Copyright (c) 1997-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 
@@ -176,12 +176,12 @@ void CollationIteratorTest::TestOffset(/* char* par */)
     UErrorCode status = U_ZERO_ERROR;
     // testing boundaries
     iter->setOffset(0, status);
-    if (U_FAILURE(status) || iter->previous(status) != UCOL_NULLORDER) {
+    if (U_FAILURE(status) || iter->previous(status) != CollationElementIterator::NULLORDER) {
         errln("Error: After setting offset to 0, we should be at the end "
                 "of the backwards iteration");
     }
     iter->setOffset(test1.length(), status);
-    if (U_FAILURE(status) || iter->next(status) != UCOL_NULLORDER) {
+    if (U_FAILURE(status) || iter->next(status) != CollationElementIterator::NULLORDER) {
         errln("Error: After setting offset to end of the string, we should "
                 "be at the end of the backwards iteration");
     }
@@ -214,11 +214,66 @@ void CollationIteratorTest::TestOffset(/* char* par */)
         assertEqual(*iter, *pristine);
     }
 
-    // TODO: try iterating halfway through a messy string.
-
     delete pristine;
     delete[] orders;
     delete iter;
+
+    // setting offset in the middle of a contraction
+    UnicodeString contraction = "change";
+    status = U_ZERO_ERROR;
+    RuleBasedCollator tailored("& a < ch", status);
+    if (U_FAILURE(status)) {
+        errln("Error: in creation of Spanish collator - %s", u_errorName(status));
+        return;
+    }
+    iter = tailored.createCollationElementIterator(contraction);
+    Order *order = getOrders(*iter, orderLength);
+    iter->setOffset(1, status); // sets offset in the middle of ch
+    int32_t order2Length = 0;
+    Order *order2 = getOrders(*iter, order2Length);
+    if (orderLength != order2Length || uprv_memcmp(order, order2, orderLength * sizeof(Order)) != 0) {
+        errln("Error: setting offset in the middle of a contraction should be the same as setting it to the start of the contraction");
+    }
+    delete[] order;
+    delete[] order2;
+    delete iter;
+    contraction = "peache";
+    iter = tailored.createCollationElementIterator(contraction);
+    iter->setOffset(3, status);
+    order = getOrders(*iter, orderLength);
+    iter->setOffset(4, status); // sets offset in the middle of ch
+    order2 = getOrders(*iter, order2Length);
+    if (orderLength != order2Length || uprv_memcmp(order, order2, orderLength * sizeof(Order)) != 0) {
+        errln("Error: setting offset in the middle of a contraction should be the same as setting it to the start of the contraction");
+    }
+    delete[] order;
+    delete[] order2;
+    delete iter;
+    // setting offset in the middle of a surrogate pair
+    UnicodeString surrogate = UNICODE_STRING_SIMPLE("\\ud800\\udc00str").unescape();
+    iter = tailored.createCollationElementIterator(surrogate);
+    order = getOrders(*iter, orderLength);
+    iter->setOffset(1, status); // sets offset in the middle of surrogate
+    order2 = getOrders(*iter, order2Length);
+    if (orderLength != order2Length || uprv_memcmp(order, order2, orderLength * sizeof(Order)) != 0) {
+        errln("Error: setting offset in the middle of a surrogate pair should be the same as setting it to the start of the surrogate pair");
+    }
+    delete[] order;
+    delete[] order2;
+    delete iter;
+    surrogate = UNICODE_STRING_SIMPLE("simple\\ud800\\udc00str").unescape();
+    iter = tailored.createCollationElementIterator(surrogate);
+    iter->setOffset(6, status);
+    order = getOrders(*iter, orderLength);
+    iter->setOffset(7, status); // sets offset in the middle of surrogate
+    order2 = getOrders(*iter, order2Length);
+    if (orderLength != order2Length || uprv_memcmp(order, order2, orderLength * sizeof(Order)) != 0) {
+        errln("Error: setting offset in the middle of a surrogate pair should be the same as setting it to the start of the surrogate pair");
+    }
+    delete[] order;
+    delete[] order2;
+    delete iter;
+    // TODO: try iterating halfway through a messy string.
 }
 
 /**
@@ -274,13 +329,13 @@ void CollationIteratorTest::TestSetText(/* char* par */)
     UnicodeString empty("");
     iter1->setText(empty, status);
     if (U_FAILURE(status) 
-        || iter1->next(status) != (int32_t)UCOL_NULLORDER) {
+        || iter1->next(status) != (int32_t)CollationElementIterator::NULLORDER) {
         errln("Empty string should have no CEs.");
     }
     ((StringCharacterIterator *)chariter)->setText(empty);
     iter1->setText(*chariter, status);
     if (U_FAILURE(status) 
-        || iter1->next(status) != (int32_t)UCOL_NULLORDER) {
+        || iter1->next(status) != (int32_t)CollationElementIterator::NULLORDER) {
         errln("Empty string should have no CEs.");
     }
     delete chariter;
@@ -314,7 +369,7 @@ void CollationIteratorTest::TestMaxExpansion(/* char* par */)
             order = iter->previous(status);
 
         while (U_SUCCESS(status)
-            && iter->previous(status) != (int32_t)UCOL_NULLORDER)
+            && iter->previous(status) != (int32_t)CollationElementIterator::NULLORDER)
         {
             count ++; 
         }
@@ -521,10 +576,10 @@ void CollationIteratorTest::TestConstructors()
         || *iter2 != *iter1) {
         errln("CollationElementIterators constructed with the same string data should be the same at the start");
     } 
-    if (iter1->next(status) != (int32_t)UCOL_NULLORDER) {
+    if (iter1->next(status) != (int32_t)CollationElementIterator::NULLORDER) {
         errln("Empty string should have no CEs.");
     }
-    if (iter2->next(status) != (int32_t)UCOL_NULLORDER) {
+    if (iter2->next(status) != (int32_t)CollationElementIterator::NULLORDER) {
         errln("Empty string should have no CEs.");
     }
     delete iter1;
index 4028f43602dad29cd22676907278ea3926d7dbe6..3ce1818f4510431036b2fe09ed01df1935612caa 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT:
- * Copyright (c) 1997-2011, International Business Machines Corporation and
+ * Copyright (c) 1997-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 
@@ -9,6 +9,7 @@
 #if !UCONFIG_NO_COLLATION
 
 #include "unicode/coll.h"
+#include "unicode/localpointer.h"
 #include "unicode/tblcoll.h"
 #include "unicode/unistr.h"
 #include "unicode/sortkey.h"
@@ -84,19 +85,10 @@ void CollationRegressionTest::Test4048446(/* char* par */)
 //
 void CollationRegressionTest::Test4051866(/* char* par */)
 {
-/*
-    RuleBasedCollator c1 = new RuleBasedCollator("< o "
-                                                +"& oe ,o\u3080"
-                                                +"& oe ,\u1530 ,O"
-                                                +"& OE ,O\u3080"
-                                                +"& OE ,\u1520"
-                                                +"< p ,P");
-*/
-
     UnicodeString rules;
     UErrorCode status = U_ZERO_ERROR;
 
-    rules += "< o ";
+    rules += "&n < o ";
     rules += "& oe ,o";
     rules += (UChar)0x3080;
     rules += "& oe ,";
@@ -109,19 +101,20 @@ void CollationRegressionTest::Test4051866(/* char* par */)
     rules += "< p ,P";
 
     // Build a collator containing expanding characters
-    RuleBasedCollator *c1 = new RuleBasedCollator(rules, status);
+    LocalPointer<RuleBasedCollator> c1(new RuleBasedCollator(rules, status));
 
     // Build another using the rules from  the first
-    RuleBasedCollator *c2 = new RuleBasedCollator(c1->getRules(), status);
+    LocalPointer<RuleBasedCollator> c2(new RuleBasedCollator(c1->getRules(), status));
+    if (U_FAILURE(status)) {
+        errln("RuleBasedCollator(rule string) failed - %s", u_errorName(status));
+        return;
+    }
 
     // Make sure they're the same
     if (!(c1->getRules() == c2->getRules()))
     {
         errln("Rules are not equal");
     }
-
-    delete c2;
-    delete c1;
 }
 
 // @bug 4053636
@@ -273,7 +266,7 @@ void CollationRegressionTest::Test4059820(/* char* par */)
     UErrorCode status = U_ZERO_ERROR;
 
     RuleBasedCollator *c = NULL;
-    UnicodeString rules = "< a < b , c/a < d < z";
+    UnicodeString rules = "&9 < a < b , c/a < d < z";
 
     c = new RuleBasedCollator(rules, status);
 
@@ -301,7 +294,7 @@ void CollationRegressionTest::Test4060154(/* char* par */)
     UErrorCode status = U_ZERO_ERROR;
     UnicodeString rules;
 
-    rules += "< g, G < h, H < i, I < j, J";
+    rules += "&f < g, G < h, H < i, I < j, J";
     rules +=  " & H < ";
     rules += (UChar)0x0131;
     rules += ", ";
@@ -544,7 +537,7 @@ void CollationRegressionTest::Test4079231(/* char* par */)
 void CollationRegressionTest::Test4078588(/* char *par */)
 {
     UErrorCode status = U_ZERO_ERROR;
-    RuleBasedCollator *rbc = new RuleBasedCollator((UnicodeString)"< a < bb", status);
+    RuleBasedCollator *rbc = new RuleBasedCollator("&9 < a < bb", status);
 
     if (rbc == NULL || U_FAILURE(status))
     {
@@ -616,7 +609,7 @@ void CollationRegressionTest::Test4087241(/* char* par */)
     static const UChar tests[][CollationRegressionTest::MAX_TOKEN_LEN] =
     {
         {0x7a, 0},          {0x3c, 0}, {0x00E6, 0},            // z        < ae
-        {0x61, 0x0308, 0}, {0x3c, 0}, {0x61, 0x030A, 0},      // a-unlaut < a-ring
+        {0x61, 0x0308, 0},  {0x3c, 0}, {0x61, 0x030A, 0},      // a-umlaut < a-ring
         {0x59, 0},          {0x3c, 0}, {0x75, 0x0308, 0},      // Y        < u-umlaut
     };
 
@@ -711,7 +704,7 @@ void CollationRegressionTest::Test4101940(/* char* par */)
 {
     UErrorCode status = U_ZERO_ERROR;
     RuleBasedCollator *c = NULL;
-    UnicodeString rules = "< a < b";
+    UnicodeString rules = "&9 < a < b";
     UnicodeString nothing = "";
 
     c = new RuleBasedCollator(rules, status);
@@ -1078,6 +1071,103 @@ void CollationRegressionTest::Test4146160(/* char* par */)
 #endif
 }
 
+void CollationRegressionTest::Test4179216() {
+    // you can position a CollationElementIterator in the middle of
+    // a contracting character sequence, yielding a bogus collation
+    // element
+    IcuTestErrorCode errorCode(*this, "Test4179216");
+    RuleBasedCollator coll(en_us->getRules() + " & C < ch , cH , Ch , CH < cat < crunchy", errorCode);
+    UnicodeString testText = "church church catcatcher runcrunchynchy";
+    CollationElementIterator *iter = coll.createCollationElementIterator(testText);
+
+    // test that the "ch" combination works properly
+    iter->setOffset(4, errorCode);
+    int32_t elt4 = CollationElementIterator::primaryOrder(iter->next(errorCode));
+
+    iter->reset();
+    int32_t elt0 = CollationElementIterator::primaryOrder(iter->next(errorCode));
+
+    iter->setOffset(5, errorCode);
+    int32_t elt5 = CollationElementIterator::primaryOrder(iter->next(errorCode));
+
+    // Compares and prints only 16-bit primary weights.
+    if (elt4 != elt0 || elt5 != elt0) {
+        errln("The collation elements at positions 0 (0x%04x), "
+                "4 (0x%04x), and 5 (0x%04x) don't match.",
+                elt0, elt4, elt5);
+    }
+
+    // test that the "cat" combination works properly
+    iter->setOffset(14, errorCode);
+    int32_t elt14 = CollationElementIterator::primaryOrder(iter->next(errorCode));
+
+    iter->setOffset(15, errorCode);
+    int32_t elt15 = CollationElementIterator::primaryOrder(iter->next(errorCode));
+
+    iter->setOffset(16, errorCode);
+    int32_t elt16 = CollationElementIterator::primaryOrder(iter->next(errorCode));
+
+    iter->setOffset(17, errorCode);
+    int32_t elt17 = CollationElementIterator::primaryOrder(iter->next(errorCode));
+
+    iter->setOffset(18, errorCode);
+    int32_t elt18 = CollationElementIterator::primaryOrder(iter->next(errorCode));
+
+    iter->setOffset(19, errorCode);
+    int32_t elt19 = CollationElementIterator::primaryOrder(iter->next(errorCode));
+
+    // Compares and prints only 16-bit primary weights.
+    if (elt14 != elt15 || elt14 != elt16 || elt14 != elt17
+            || elt14 != elt18 || elt14 != elt19) {
+        errln("\"cat\" elements don't match: elt14 = 0x%04x, "
+                "elt15 = 0x%04x, elt16 = 0x%04x, elt17 = 0x%04x, "
+                "elt18 = 0x%04x, elt19 = 0x%04x",
+                elt14, elt15, elt16, elt17, elt18, elt19);
+    }
+
+    // now generate a complete list of the collation elements,
+    // first using next() and then using setOffset(), and
+    // make sure both interfaces return the same set of elements
+    iter->reset();
+
+    int32_t elt = iter->next(errorCode);
+    int32_t count = 0;
+    while (elt != CollationElementIterator::NULLORDER) {
+        ++count;
+        elt = iter->next(errorCode);
+    }
+
+    LocalArray<UnicodeString> nextElements(new UnicodeString[count]);
+    LocalArray<UnicodeString> setOffsetElements(new UnicodeString[count]);
+    int32_t lastPos = 0;
+
+    iter->reset();
+    elt = iter->next(errorCode);
+    count = 0;
+    while (elt != CollationElementIterator::NULLORDER) {
+        nextElements[count++] = testText.tempSubStringBetween(lastPos, iter->getOffset());
+        lastPos = iter->getOffset();
+        elt = iter->next(errorCode);
+    }
+    int32_t nextElementsLength = count;
+    count = 0;
+    for (int32_t i = 0; i < testText.length(); ) {
+        iter->setOffset(i, errorCode);
+        lastPos = iter->getOffset();
+        elt = iter->next(errorCode);
+        setOffsetElements[count++] = testText.tempSubStringBetween(lastPos, iter->getOffset());
+        i = iter->getOffset();
+    }
+    for (int32_t i = 0; i < nextElementsLength; i++) {
+        if (nextElements[i] == setOffsetElements[i]) {
+            logln(nextElements[i]);
+        } else {
+            errln(UnicodeString("Error: next() yielded ") + nextElements[i] +
+                ", but setOffset() yielded " + setOffsetElements[i]);
+        }
+    }
+}
+
 // Ticket 7189
 //
 // nextSortKeyPart incorrect for EO_S1 collation
@@ -1315,48 +1405,47 @@ void CollationRegressionTest::runIndexedTest(int32_t index, UBool exec, const ch
         logln("Collation Regression Tests: ");
     }
 
-    if(en_us) {
-      switch (index)
-      {
-          case  0: name = "Test4048446"; if (exec) Test4048446(/* par */); break;
-          case  1: name = "Test4051866"; if (exec) Test4051866(/* par */); break;
-          case  2: name = "Test4053636"; if (exec) Test4053636(/* par */); break;
-          case  3: name = "Test4054238"; if (exec) Test4054238(/* par */); break;
-          case  4: name = "Test4054734"; if (exec) Test4054734(/* par */); break;
-          case  5: name = "Test4054736"; if (exec) Test4054736(/* par */); break;
-          case  6: name = "Test4058613"; if (exec) Test4058613(/* par */); break;
-          case  7: name = "Test4059820"; if (exec) Test4059820(/* par */); break;
-          case  8: name = "Test4060154"; if (exec) Test4060154(/* par */); break;
-          case  9: name = "Test4062418"; if (exec) Test4062418(/* par */); break;
-          case 10: name = "Test4065540"; if (exec) Test4065540(/* par */); break;
-          case 11: name = "Test4066189"; if (exec) Test4066189(/* par */); break;
-          case 12: name = "Test4066696"; if (exec) Test4066696(/* par */); break;
-          case 13: name = "Test4076676"; if (exec) Test4076676(/* par */); break;
-          case 14: name = "Test4078588"; if (exec) Test4078588(/* par */); break;
-          case 15: name = "Test4079231"; if (exec) Test4079231(/* par */); break;
-          case 16: name = "Test4081866"; if (exec) Test4081866(/* par */); break;
-          case 17: name = "Test4087241"; if (exec) Test4087241(/* par */); break;
-          case 18: name = "Test4087243"; if (exec) Test4087243(/* par */); break;
-          case 19: name = "Test4092260"; if (exec) Test4092260(/* par */); break;
-          case 20: name = "Test4095316"; if (exec) Test4095316(/* par */); break;
-          case 21: name = "Test4101940"; if (exec) Test4101940(/* par */); break;
-          case 22: name = "Test4103436"; if (exec) Test4103436(/* par */); break;
-          case 23: name = "Test4114076"; if (exec) Test4114076(/* par */); break;
-          case 24: name = "Test4114077"; if (exec) Test4114077(/* par */); break;
-          case 25: name = "Test4124632"; if (exec) Test4124632(/* par */); break;
-          case 26: name = "Test4132736"; if (exec) Test4132736(/* par */); break;
-          case 27: name = "Test4133509"; if (exec) Test4133509(/* par */); break;
-          case 28: name = "Test4139572"; if (exec) Test4139572(/* par */); break;
-          case 29: name = "Test4141640"; if (exec) Test4141640(/* par */); break;
-          case 30: name = "Test4146160"; if (exec) Test4146160(/* par */); break;
-          case 31: name = "TestT7189";   if (exec) TestT7189(); break;
-          case 32: name = "TestCaseFirstCompression"; if (exec) TestCaseFirstCompression(); break;
-          default: name = ""; break;
-      }
-    } else {
-      dataerrln("Class collator not instantiated");
-      name = "";
+    if(en_us == NULL) {
+        dataerrln("Class collator not instantiated");
+        name = "";
+        return;
     }
+    TESTCASE_AUTO_BEGIN;
+    TESTCASE_AUTO(Test4048446);
+    TESTCASE_AUTO(Test4051866);
+    TESTCASE_AUTO(Test4053636);
+    TESTCASE_AUTO(Test4054238);
+    TESTCASE_AUTO(Test4054734);
+    TESTCASE_AUTO(Test4054736);
+    TESTCASE_AUTO(Test4058613);
+    TESTCASE_AUTO(Test4059820);
+    TESTCASE_AUTO(Test4060154);
+    TESTCASE_AUTO(Test4062418);
+    TESTCASE_AUTO(Test4065540);
+    TESTCASE_AUTO(Test4066189);
+    TESTCASE_AUTO(Test4066696);
+    TESTCASE_AUTO(Test4076676);
+    TESTCASE_AUTO(Test4078588);
+    TESTCASE_AUTO(Test4079231);
+    TESTCASE_AUTO(Test4081866);
+    TESTCASE_AUTO(Test4087241);
+    TESTCASE_AUTO(Test4087243);
+    TESTCASE_AUTO(Test4092260);
+    TESTCASE_AUTO(Test4095316);
+    TESTCASE_AUTO(Test4101940);
+    TESTCASE_AUTO(Test4103436);
+    TESTCASE_AUTO(Test4114076);
+    TESTCASE_AUTO(Test4114077);
+    TESTCASE_AUTO(Test4124632);
+    TESTCASE_AUTO(Test4132736);
+    TESTCASE_AUTO(Test4133509);
+    TESTCASE_AUTO(Test4139572);
+    TESTCASE_AUTO(Test4141640);
+    TESTCASE_AUTO(Test4146160);
+    TESTCASE_AUTO(Test4179216);
+    TESTCASE_AUTO(TestT7189);
+    TESTCASE_AUTO(TestCaseFirstCompression);
+    TESTCASE_AUTO_END;
 }
 
 #endif /* #if !UCONFIG_NO_COLLATION */
index 54fb280553f6e8f291f674aedc02e09c398c6e8f..4048d6fcb65e4167582ce2b440f4e38615bf35bb 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 1997-2011, International Business Machines Corporation and
+ * Copyright (c) 1997-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 
@@ -224,6 +224,8 @@ public:
     //
     void Test4146160(/* char* par */);
 
+    void Test4179216();
+
     // Ticket 7189
     //
     // nextSortKeyPart incorrect for EO_S1 collation
index fff44d3bdc92a8b2707980fd541f00ec0319d76f..1a2821686ef114a771ef4384c251ae503783cfd9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  **********************************************************************
- *   Copyright (C) 2005-2013, International Business Machines
+ *   Copyright (C) 2005-2014, International Business Machines
  *   Corporation and others.  All Rights Reserved.
  **********************************************************************
  */
@@ -11,7 +11,7 @@
 
 #include "cmemory.h"
 #include "cstring.h"
-#include "ucol_imp.h"
+#include "usrchimp.h"
 
 #include "unicode/coll.h"
 #include "unicode/tblcoll.h"
index 565ef81b3051f01179fc22b728d5e7d83cc33ef7..fb5a5ffba9c056068a17e2cf85c16f602408d053 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *******************************************************************************
- * Copyright (C) 2003-2013, International Business Machines Corporation and    *
- * others. All Rights Reserved.                                                *
+ * Copyright (C) 2003-2014, International Business Machines Corporation and
+ * others. All Rights Reserved.
  *******************************************************************************
  */
 
@@ -15,7 +15,6 @@
 #include "hash.h"
 #include "uassert.h"
 
-#include "ucol_imp.h" // internal api needed to test ucollator equality
 #include "cstring.h" // internal api used to compare locale strings
 
 void CollationServiceTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par */)
@@ -49,25 +48,22 @@ void CollationServiceTest::TestRegister()
     }
 
     { // try override en_US collator
+        Collator *clone = frcol->clone();
         URegistryKey key = Collator::registerInstance(frcol, US, status);
+        // frcol has been adopted. We must not use it any more, nor rely on its attributes.
+        frcol = NULL;
 
         Collator* ncol = Collator::createInstance(US_FOO, status);
-        if (*frcol != *ncol) {
+        if (*clone != *ncol) {
             errln("register of french collator for en_US failed on request for en_US_FOO");
         }
-        // ensure original collator's params not touched
-        Locale loc = frcol->getLocale(ULOC_REQUESTED_LOCALE, status);
-        if (loc != FR) {
-          errln(UnicodeString("fr collator's requested locale changed to ") + loc.getName());
-        }
-        loc = frcol->getLocale(ULOC_VALID_LOCALE, status);
-        if (loc != FR) {
-          errln(UnicodeString("fr collator's valid locale changed to ") + loc.getName());
-        }
+        delete clone;
 
-        loc = ncol->getLocale(ULOC_REQUESTED_LOCALE, status);
-        if (loc != US_FOO) {
-            errln(UnicodeString("requested locale for en_US_FOO is not en_US_FOO but ") + loc.getName());
+        // The requested locale may be the same as the valid locale,
+        // or may not be supported at all. See ticket #10477.
+        Locale loc = ncol->getLocale(ULOC_REQUESTED_LOCALE, status);
+        if (loc != US_FOO && loc != US) {
+            errln(UnicodeString("requested locale for en_US_FOO is not en_US_FOO nor en_US but ") + loc.getName());
         }
         loc = ncol->getLocale(ULOC_VALID_LOCALE, status);
         if (loc != US) {
@@ -82,7 +78,6 @@ void CollationServiceTest::TestRegister()
         if (!Collator::unregister(key, status)) {
             errln("failed to unregister french collator");
         }
-        // !!! frcol pointer is now invalid !!!
 
         ncol = Collator::createInstance(US, status);
         if (*uscol != *ncol) {
@@ -101,11 +96,14 @@ void CollationServiceTest::TestRegister()
         Locale fu_FU("fu", "FU", "");
 
         Collator* fucol = Collator::createInstance(fu_FU, status);
+        Collator *clone = frcol->clone();
         URegistryKey key = Collator::registerInstance(frcol, fu_FU, status);
+        frcol = NULL;  // frcol has been adopted.
         Collator* ncol = Collator::createInstance(fu_FU_FOO, status);
-        if (*frcol != *ncol) {
+        if (*clone != *ncol) {
             errln("register of fr collator for fu_FU failed");
         }
+        delete clone;
 
         UnicodeString locName = fu_FU.getName();
         StringEnumeration* localeEnum = Collator::getAvailableLocales();
@@ -174,7 +172,8 @@ void CollationServiceTest::TestRegister()
         if (fufu.isNull()) {
             errln("could not open fu_FU_FOO with ucol_open");
         } else {
-            if (!ucol_equals(fufu.getAlias(), frFR.getAlias())) {
+            if (*Collator::fromUCollator(fufu.getAlias()) !=
+                    *Collator::fromUCollator(frFR.getAlias())) {
                 errln("collator fufu != collator frFR");
             }
         }
@@ -227,6 +226,7 @@ CollatorInfo::CollatorInfo(const Locale& _locale, Collator* _collator, Hashtable
   , collator(_collator)
   , displayNames(_displayNames)
 {
+  collator->setLocales(locale, locale, locale);
 }
 
 CollatorInfo::~CollatorInfo() {
@@ -410,9 +410,11 @@ void CollationServiceTest::TestRegisterFactory(void)
             errln("jpcol for fu_FU_FOO failed");
         }
 
+        // The requested locale may be the same as the valid locale,
+        // or may not be supported at all. See ticket #10477.
         Locale loc = ncol->getLocale(ULOC_REQUESTED_LOCALE, status);
-        if (loc != fu_FU_FOO) {
-            errln(UnicodeString("requested locale for fu_FU_FOO is not fu_FU_FOO but ") + loc.getName());
+        if (loc != fu_FU_FOO && loc != fu_FU) {
+            errln(UnicodeString("requested locale for fu_FU_FOO is not fu_FU_FOO nor fu_FU but ") + loc.getName());
         }
         loc = ncol->getLocale(ULOC_VALID_LOCALE, status);
         if (loc != fu_FU) {
index 2626938bf004cdac6f340d4fda04a3ac29579904..1054b53abaa1e549fa7fb6e64459716c0c3de2d5 100644 (file)
@@ -1,6 +1,6 @@
 /*
 **********************************************************************
-*   Copyright (C) 1999-2012, International Business Machines
+*   Copyright (C) 1999-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 **********************************************************************
 *   Date        Name        Description
@@ -17,6 +17,7 @@
 #include "unicode/coll.h"
 #include "unicode/localpointer.h"
 #include "unicode/sortkey.h"
+#include "unicode/tblcoll.h"
 #include "unicode/ustring.h"
 #include "cstring.h"
 #include "filestrm.h"
index 872a78b950431d5ec2b3f5265562ce405963a0ea..6e29105804321815f6854dc9a5a08b87ac319cfb 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 1997-2011, International Business Machines Corporation and
+ * Copyright (c) 1997-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 
 #if !UCONFIG_NO_COLLATION
 
 #include "unicode/localpointer.h"
+#include "unicode/sortkey.h"
 #include "unicode/uchar.h"
 #include "unicode/ustring.h"
 
-#include "dadrcoll.h"
-
 #include "encoll.h"
 #include "frcoll.h"
 #include "decoll.h"
 #include "thcoll.h"
 #include "srchtest.h"
 #include "ssearch.h"
-#include "cntabcol.h"
 #include "lcukocol.h"
 #include "ucaconf.h"
 #include "svccoll.h"
 #include "cmemory.h"
 #include "alphaindextst.h"
-//#include "rndmcoll.h"
 
 // Set to 1 to test offsets in backAndForth()
 #define TEST_OFFSETS 0
 
-#define TESTCLASS(n,classname)        \
-    case n:                           \
-        name = #classname;            \
-        if (exec) {                   \
-            logln(#classname "---");  \
-            logln("");                \
-            classname t;              \
-            callTest(t, par);         \
-        }                             \
-        break
+extern IntlTest *createCollationTest();
 
 void IntlTestCollator::runIndexedTest( int32_t index, UBool exec, const char* &name, char* par )
 {
@@ -72,38 +60,33 @@ void IntlTestCollator::runIndexedTest( int32_t index, UBool exec, const char* &n
         logln("TestSuite Collator: ");
     }
 
-    switch (index) {
-      TESTCLASS(0, CollationEnglishTest);
-      TESTCLASS(1, CollationFrenchTest);
-      TESTCLASS(2, CollationGermanTest);
-      TESTCLASS(3, CollationSpanishTest);
-      TESTCLASS(4, CollationKanaTest);
-      TESTCLASS(5, CollationTurkishTest);
-      TESTCLASS(6, CollationDummyTest);
-      TESTCLASS(7, G7CollationTest);
-      TESTCLASS(8, CollationMonkeyTest);
-      TESTCLASS(9, CollationAPITest);
-      TESTCLASS(10, CollationRegressionTest);
-      TESTCLASS(11, CollationCurrencyTest);
-      TESTCLASS(12, CollationIteratorTest);
-      TESTCLASS(13, CollationThaiTest);
-      TESTCLASS(14, LotusCollationKoreanTest);
-      TESTCLASS(15, StringSearchTest);
-      TESTCLASS(16, ContractionTableTest);
-#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
-      TESTCLASS(17, DataDrivenCollatorTest);
-#endif
-      TESTCLASS(18, UCAConformanceTest);
-      TESTCLASS(19, CollationServiceTest);
-      TESTCLASS(20, CollationFinnishTest); // removed by weiv - we have changed Finnish collation
-      //TESTCLASS(21, RandomCollatorTest); // See ticket 5747 about reenabling this test.
-      TESTCLASS(21, SSearchTest);
-#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_NORMALIZATION
-      TESTCLASS(22, AlphabeticIndexTest);
+    TESTCASE_AUTO_BEGIN;
+    TESTCASE_AUTO_CLASS(CollationEnglishTest);
+    TESTCASE_AUTO_CLASS(CollationFrenchTest);
+    TESTCASE_AUTO_CLASS(CollationGermanTest);
+    TESTCASE_AUTO_CLASS(CollationSpanishTest);
+    TESTCASE_AUTO_CLASS(CollationKanaTest);
+    TESTCASE_AUTO_CLASS(CollationTurkishTest);
+    TESTCASE_AUTO_CLASS(CollationDummyTest);
+    TESTCASE_AUTO_CLASS(G7CollationTest);
+    TESTCASE_AUTO_CLASS(CollationMonkeyTest);
+    TESTCASE_AUTO_CLASS(CollationAPITest);
+    TESTCASE_AUTO_CLASS(CollationRegressionTest);
+    TESTCASE_AUTO_CLASS(CollationCurrencyTest);
+    TESTCASE_AUTO_CLASS(CollationIteratorTest);
+    TESTCASE_AUTO_CLASS(CollationThaiTest);
+    TESTCASE_AUTO_CLASS(LotusCollationKoreanTest);
+    TESTCASE_AUTO_CLASS(StringSearchTest);
+    TESTCASE_AUTO_CLASS(UCAConformanceTest);
+    TESTCASE_AUTO_CLASS(CollationServiceTest);
+    TESTCASE_AUTO_CLASS(CollationFinnishTest); // removed by weiv - we have changed Finnish collation
+      //TESTCASE_AUTO_CLASS(RandomCollatorTest); // See ticket 5747 about reenabling this test.
+    TESTCASE_AUTO_CLASS(SSearchTest);
+#if !UCONFIG_NO_NORMALIZATION
+    TESTCASE_AUTO_CLASS(AlphabeticIndexTest);
 #endif
-
-      default: name = ""; break;
-    }
+    TESTCASE_AUTO_CREATE_CLASS(CollationTest);
+    TESTCASE_AUTO_END;
 }
 
 UCollationResult 
@@ -145,7 +128,7 @@ IntlTestCollator::doTestVariant(Collator* col, const UnicodeString &source, cons
 {   
   UErrorCode status = U_ZERO_ERROR;
 
-  UCollator *myCollation = (UCollator *)((RuleBasedCollator *)col)->getUCollator();
+  UCollator *myCollation = col->toUCollator();
 
   Collator::EComparisonResult compareResult = col->compare(source, target);
 
@@ -524,6 +507,10 @@ IntlTestCollator::Order *IntlTestCollator::getOrders(CollationElementIterator &i
         offset = iter.getOffset();
         size += 1;
     }
+    if (U_FAILURE(status)) {
+        errln("CollationElementIterator.next() failed - %s",
+              u_errorName(status));
+    }
 
     if (maxSize > size)
     {
index e7bee3c5d37c489c7f9408bf91d95b7c595504c6..bdb37ee29ed731bb145bb29d4aeafebcfd2fcf86 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT:
- * Copyright (c) 2002-2012, International Business Machines Corporation and
+ * Copyright (c) 2002-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 
@@ -15,6 +15,8 @@
 #if !UCONFIG_NO_COLLATION
 
 #include "ucaconf.h"
+#include "unicode/sortkey.h"
+#include "unicode/tblcoll.h"
 #include "unicode/ustring.h"
 #include "cmemory.h"
 #include "cstring.h"
@@ -48,9 +50,7 @@ UCAConformanceTest::~UCAConformanceTest()
 {
     delete UCA;
     delete rbUCA;
-    if (testFile) {
-        fclose(testFile);
-    }
+    fclose(testFile);
 }
 
 void UCAConformanceTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par */)
@@ -69,8 +69,8 @@ void UCAConformanceTest::runIndexedTest( int32_t index, UBool exec, const char*
 void UCAConformanceTest::initRbUCA() 
 {
     if(!rbUCA) {
-        UnicodeString ucarules;
         if (UCA) {
+            UnicodeString ucarules;
             UCA->getRules(UCOL_FULL_RULES, ucarules);
             rbUCA = new RuleBasedCollator(ucarules, status);
             if (U_FAILURE(status)) {
@@ -142,7 +142,7 @@ void UCAConformanceTest::openTestFile(const char *type)
                     "INFO: Working with the stub file.\n"
                     "If you need the full conformance test, please\n"
                     "download the appropriate data files from:\n"
-                    "http://source.icu-project.org/repos/icu/tools/trunk/unicodetools/com/ibm/text/data/");
+                    "http://unicode.org/cldr/trac/browser/trunk/common/uca");
             }
         }
     }
@@ -153,22 +153,11 @@ static const uint32_t FROM_RULES = 2;
 
 static UBool
 skipLineBecauseOfBug(const UChar *s, int32_t length, uint32_t flags) {
-    // TODO: Fix ICU ticket #8052
-    if(length >= 3 &&
-            (s[0] == 0xfb2 || s[0] == 0xfb3) &&
-            s[1] == 0x334 &&
-            (s[2] == 0xf73 || s[2] == 0xf75 || s[2] == 0xf81)) {
-        return TRUE;
-    }
-    // TODO: Fix ICU ticket #9361
-    if((flags & IS_SHIFTED) != 0 && length >= 2 && s[0] == 0xfffe) {
-        return TRUE;
-    }
-    // TODO: Fix tailoring builder, ICU ticket #9593.
-    UChar c;
-    if((flags & FROM_RULES) != 0 && length >= 2 && ((c = s[1]) == 0xedc || c == 0xedd)) {
-        return TRUE;
-    }
+    // Add temporary exceptions here if there are ICU bugs, until we can fix them.
+    // For examples see the ICU 52 version of this file.
+    (void)s;
+    (void)length;
+    (void)flags;
     return FALSE;
 }
 
@@ -190,6 +179,9 @@ void UCAConformanceTest::testConformance(const Collator *coll)
         skipFlags |= FROM_RULES;
     }
 
+    logln("-prop:ucaconfnosortkeys=1 turns off getSortKey() in UCAConformanceTest");
+    UBool withSortKeys = getProperty("ucaconfnosortkeys") == NULL;
+
     int32_t line = 0;
 
     UChar b1[1024], b2[1024];
@@ -226,22 +218,27 @@ void UCAConformanceTest::testConformance(const Collator *coll)
             continue;
         }
 
-        int32_t resLen = coll->getSortKey(buffer, buflen, newSk, 1024);
+        int32_t resLen = withSortKeys ? coll->getSortKey(buffer, buflen, newSk, 1024) : 0;
 
         if(oldSk != NULL) {
-            int32_t skres = strcmp((char *)oldSk, (char *)newSk);
+            UBool ok=TRUE;
+            int32_t skres = withSortKeys ? strcmp((char *)oldSk, (char *)newSk) : 0;
             int32_t cmpres = coll->compare(oldB, oldBlen, buffer, buflen, status);
             int32_t cmpres2 = coll->compare(buffer, buflen, oldB, oldBlen, status);
 
             if(cmpres != -cmpres2) {
-                errln("Compare result not symmetrical on line %i", line);
+                errln("Compare result not symmetrical on line %i: "
+                      "previous vs. current (%d) / current vs. previous (%d)",
+                      line, cmpres, cmpres2);
+                ok = FALSE;
             }
 
-            if(cmpres != normalizeResult(skres)) {
+            // TODO: Compare with normalization turned off if the input passes the FCD test.
+
+            if(withSortKeys && cmpres != normalizeResult(skres)) {
                 errln("Difference between coll->compare (%d) and sortkey compare (%d) on line %i",
                       cmpres, skres, line);
-                errln("  Previous data line %s", oldLineB);
-                errln("  Current data line  %s", lineB);
+                ok = FALSE;
             }
 
             int32_t res = cmpres;
@@ -255,13 +252,19 @@ void UCAConformanceTest::testConformance(const Collator *coll)
             }
             if(res > 0) {
                 errln("Line %i is not greater or equal than previous line", line);
+                ok = FALSE;
+            }
+
+            if(!ok) {
                 errln("  Previous data line %s", oldLineB);
                 errln("  Current data line  %s", lineB);
-                UnicodeString oldS, newS;
-                prettify(CollationKey(oldSk, oldLen), oldS);
-                prettify(CollationKey(newSk, resLen), newS);
-                errln("  Previous key: "+oldS);
-                errln("  Current key:  "+newS);
+                if(withSortKeys) {
+                    UnicodeString oldS, newS;
+                    prettify(CollationKey(oldSk, oldLen), oldS);
+                    prettify(CollationKey(newSk, resLen), newS);
+                    errln("  Previous key: "+oldS);
+                    errln("  Current key:  "+newS);
+                }
             }
         }
 
@@ -304,6 +307,7 @@ void UCAConformanceTest::TestTableShifted(/* par */) {
 }
 
 void UCAConformanceTest::TestRulesNonIgnorable(/* par */) {
+    if(logKnownIssue("cldrbug:6745", "UCARules.txt has problems")) { return; }
     initRbUCA();
 
     if(U_SUCCESS(status)) {
index f2a7ec0ffb7a33b6feae0cd916ed2fb6c0aaff5d..ca5dac8e851b46384660bff84362f8f73616210b 100644 (file)
@@ -1,7 +1,7 @@
 # File:        CollationTest_CLDR_NON_IGNORABLE_SHORT.txt
-# UCA Version: 6.2.0
-# UCD Version: 6.2.0
-# Generated:   2012-08-15, 21:43:27 GMT [MD]
+# UCA Version: 6.3.0
+# UCD Version: 6.3.0
+# Generated:   2013-09-03 [MS]
 # For a description of the format and usage, see CollationAuxiliary.html
 
 0338 0334
@@ -13,6 +13,7 @@
 20E5 0334
 20EA 0334
 20EB 0334
+0335 0334
 0334 0591
 0591 0334
 0334 0592
@@ -600,6 +601,10 @@ A67D 0334
 20EF 0334
 0334 10A0D
 10A0D 0334
+0334 3099
+3099 0334
+0334 309A
+309A 0334
 0305 0334
 0334 0305
 0309 0334
@@ -973,10 +978,6 @@ A92D 0334
 302E 0334
 0334 302F
 302F 0334
-0334 3099
-3099 0334
-0334 309A
-309A 0334
 0334 20D0
 20D0 0334
 0334 20D1
@@ -1003,7 +1004,6 @@ A92D 0334
 20E9 0334
 0334 101FD
 101FD 0334
-0335 0334
 10A39 0334
 20D2 0334
 20D3 0334
@@ -1043,11 +1043,6 @@ FFFE 0062
 0085 0061
 0085 0041
 0085 0062
-180E 0021
-180E 003F
-180E 0061
-180E 0041
-180E 0062
 2028 0021
 2028 003F
 2028 0061
@@ -1826,6 +1821,7 @@ A6F4 0062
 0618 0021
 0619 0021
 061A 0021
+061C 0021
 0640 0021
 06D6 0021
 06D7 0021
@@ -1883,6 +1879,7 @@ A6F4 0062
 180B 0021
 180C 0021
 180D 0021
+180E 0021
 1A7F 0021
 1B6B 0021
 1B6C 0021
@@ -1934,6 +1931,10 @@ A6F4 0062
 2062 0021
 2063 0021
 2064 0021
+2066 0021
+2067 0021
+2068 0021
+2069 0021
 206A 0021
 206B 0021
 206C 0021
@@ -2508,6 +2509,11 @@ A67D 0021
 20E2 0021
 20E3 0021
 20E4 0021
+3099 0021
+FF9E 0021
+309A 0021
+FF9F 0021
+0335 0021
 0305 0021
 0309 0021
 030F 0021
@@ -2525,7 +2531,6 @@ A67D 0021
 0330 0021
 0331 0021
 0334 0021
-0335 0021
 0339 0021
 0345 0021
 0358 0021
@@ -2796,10 +2801,6 @@ A92D 0021
 302D 0021
 302E 0021
 302F 0021
-3099 0021
-FF9E 0021
-309A 0021
-FF9F 0021
 20D0 0021
 20D1 0021
 20D2 0021
@@ -2979,6 +2980,7 @@ FE15 0062
 0618 003F
 0619 003F
 061A 003F
+061C 003F
 0640 003F
 06D6 003F
 06D7 003F
@@ -3036,6 +3038,7 @@ FE15 0062
 180B 003F
 180C 003F
 180D 003F
+180E 003F
 1A7F 003F
 1B6B 003F
 1B6C 003F
@@ -3087,6 +3090,10 @@ FE15 0062
 2062 003F
 2063 003F
 2064 003F
+2066 003F
+2067 003F
+2068 003F
+2069 003F
 206A 003F
 206B 003F
 206C 003F
@@ -3661,6 +3668,11 @@ A67D 003F
 20E2 003F
 20E3 003F
 20E4 003F
+3099 003F
+FF9E 003F
+309A 003F
+FF9F 003F
+0335 003F
 0305 003F
 0309 003F
 030F 003F
@@ -3678,7 +3690,6 @@ A67D 003F
 0330 003F
 0331 003F
 0334 003F
-0335 003F
 0339 003F
 0345 003F
 0358 003F
@@ -3949,10 +3960,6 @@ A92D 003F
 302D 003F
 302E 003F
 302F 003F
-3099 003F
-FF9E 003F
-309A 003F
-FF9F 003F
 20D0 003F
 20D1 003F
 20D2 003F
@@ -5679,6 +5686,26 @@ FE38 0062
 2046 0061
 2046 0041
 2046 0062
+2308 0021
+2308 003F
+2308 0061
+2308 0041
+2308 0062
+2309 0021
+2309 003F
+2309 0061
+2309 0041
+2309 0062
+230A 0021
+230A 003F
+230A 0061
+230A 0041
+230A 0062
+230B 0021
+230B 003F
+230B 0061
+230B 0041
+230B 0062
 29FC 0021
 29FC 003F
 29FC 0061
@@ -10995,26 +11022,6 @@ FF5E 0062
 2307 0061
 2307 0041
 2307 0062
-2308 0021
-2308 003F
-2308 0061
-2308 0041
-2308 0062
-2309 0021
-2309 003F
-2309 0061
-2309 0041
-2309 0062
-230A 0021
-230A 003F
-230A 0061
-230A 0041
-230A 0062
-230B 0021
-230B 003F
-230B 0061
-230B 0041
-230B 0062
 230C 0021
 230C 003F
 230C 0061
@@ -29520,11 +29527,6 @@ FFFC 003F
 FFFC 0061
 FFFC 0041
 FFFC 0062
-FFFD 0021
-FFFD 003F
-FFFD 0061
-FFFD 0041
-FFFD 0062
 02D0 0021
 02D0 003F
 02D0 0061
@@ -30831,16 +30833,6 @@ A835 0062
 12433 0061
 12433 0041
 12433 0062
-12456 0021
-12456 003F
-12456 0061
-12456 0041
-12456 0062
-12457 0021
-12457 003F
-12457 0061
-12457 0041
-12457 0062
 1245A 0021
 1245A 003F
 1245A 0061
@@ -30937,20 +30929,9 @@ A835 0062
 1F101 0041
 1F101 0062
 0030 0021
-FF10 0021
-1D7CE 0021
-1D7D8 0021
-1D7E2 0021
-1D7EC 0021
-1D7F6 0021
-24EA 0021
-24FF 0021
-2070 0021
-2080 0021
 0660 0021
 06F0 0021
 07C0 0021
-104A0 0021
 0966 0021
 09E6 0021
 0A66 0021
@@ -30961,51 +30942,51 @@ FF10 0021
 0C78 0021
 0CE6 0021
 0D66 0021
-ABF0 0021
-A8D0 0021
-1946 0021
-19D0 0021
-1A80 0021
-1A90 0021
 0E50 0021
 0ED0 0021
 0F20 0021
-0F33 0021
-1C40 0021
-A900 0021
 1040 0021
 1090 0021
-11136 0021
 17E0 0021
 17F0 0021
-AA50 0021
+1810 0021
+1946 0021
+19D0 0021
+1A80 0021
+1A90 0021
 1B50 0021
-A9D0 0021
 1BB0 0021
-1810 0021
+1C40 0021
 1C50 0021
-A620 0021
-110F0 0021
 3007 0021
+A620 0021
+A8D0 0021
+A900 0021
+A9D0 0021
+AA50 0021
+ABF0 0021
 1018A 0021
+104A0 0021
+11066 0021
+110F0 0021
+11136 0021
 111D0 0021
 116C0 0021
-11066 0021
+FF10 0021
+0F33 0021
+1D7CE 0021
+1D7D8 0021
+1D7E2 0021
+1D7EC 0021
+1D7F6 0021
+24EA 0021
+24FF 0021
+2070 0021
+2080 0021
 0030 003F
-FF10 003F
-1D7CE 003F
-1D7D8 003F
-1D7E2 003F
-1D7EC 003F
-1D7F6 003F
-24EA 003F
-24FF 003F
-2070 003F
-2080 003F
 0660 003F
 06F0 003F
 07C0 003F
-104A0 003F
 0966 003F
 09E6 003F
 0A66 003F
@@ -31016,36 +30997,47 @@ FF10 003F
 0C78 003F
 0CE6 003F
 0D66 003F
-ABF0 003F
-A8D0 003F
-1946 003F
-19D0 003F
-1A80 003F
-1A90 003F
 0E50 003F
 0ED0 003F
 0F20 003F
-0F33 003F
-1C40 003F
-A900 003F
 1040 003F
 1090 003F
-11136 003F
 17E0 003F
 17F0 003F
-AA50 003F
+1810 003F
+1946 003F
+19D0 003F
+1A80 003F
+1A90 003F
 1B50 003F
-A9D0 003F
 1BB0 003F
-1810 003F
+1C40 003F
 1C50 003F
-A620 003F
-110F0 003F
 3007 003F
+A620 003F
+A8D0 003F
+A900 003F
+A9D0 003F
+AA50 003F
+ABF0 003F
 1018A 003F
+104A0 003F
+11066 003F
+110F0 003F
+11136 003F
 111D0 003F
 116C0 003F
-11066 003F
+FF10 003F
+0F33 003F
+1D7CE 003F
+1D7D8 003F
+1D7E2 003F
+1D7EC 003F
+1D7F6 003F
+24EA 003F
+24FF 003F
+2070 003F
+2080 003F
 1F100 0021
 1F100 003F
 1F100 0061
@@ -31057,130 +31049,119 @@ A620 003F
 2189 0041
 2189 0062
 0030 0061
-0030 0041
-FF10 0061
-FF10 0041
-1D7CE 0061
-1D7D8 0061
-1D7E2 0061
-1D7EC 0061
-1D7F6 0061
-1D7CE 0041
-1D7D8 0041
-1D7E2 0041
-1D7EC 0041
-1D7F6 0041
-24EA 0061
-24FF 0061
-24EA 0041
-24FF 0041
-2070 0061
-2070 0041
-2080 0061
-2080 0041
 0660 0061
-0660 0041
 06F0 0061
-06F0 0041
 07C0 0061
-07C0 0041
-104A0 0061
-104A0 0041
 0966 0061
-0966 0041
 09E6 0061
-09E6 0041
 0A66 0061
-0A66 0041
 0AE6 0061
-0AE6 0041
 0B66 0061
-0B66 0041
 0BE6 0061
-0BE6 0041
 0C66 0061
 0C78 0061
-0C66 0041
-0C78 0041
 0CE6 0061
-0CE6 0041
 0D66 0061
-0D66 0041
-ABF0 0061
-ABF0 0041
-A8D0 0061
-A8D0 0041
+0E50 0061
+0ED0 0061
+0F20 0061
+1040 0061
+1090 0061
+17E0 0061
+17F0 0061
+1810 0061
 1946 0061
-1946 0041
 19D0 0061
-19D0 0041
 1A80 0061
-1A80 0041
 1A90 0061
-1A90 0041
-0E50 0061
+1B50 0061
+1BB0 0061
+1C40 0061
+1C50 0061
+3007 0061
+A620 0061
+A8D0 0061
+A900 0061
+A9D0 0061
+AA50 0061
+ABF0 0061
+1018A 0061
+104A0 0061
+11066 0061
+110F0 0061
+11136 0061
+111D0 0061
+116C0 0061
+0030 0041
+0660 0041
+06F0 0041
+07C0 0041
+0966 0041
+09E6 0041
+0A66 0041
+0AE6 0041
+0B66 0041
+0BE6 0041
+0C66 0041
+0C78 0041
+0CE6 0041
+0D66 0041
 0E50 0041
-0ED0 0061
 0ED0 0041
-0F20 0061
 0F20 0041
-0F33 0061
-0F33 0041
-1C40 0061
-1C40 0041
-A900 0061
-A900 0041
-1040 0061
 1040 0041
-1090 0061
 1090 0041
-11136 0061
-11136 0041
-17E0 0061
 17E0 0041
-17F0 0061
 17F0 0041
-AA50 0061
-AA50 0041
-1B50 0061
+1810 0041
+1946 0041
+19D0 0041
+1A80 0041
+1A90 0041
 1B50 0041
-A9D0 0061
-A9D0 0041
-1BB0 0061
 1BB0 0041
-1810 0061
-1810 0041
-1C50 0061
+1C40 0041
 1C50 0041
-A620 0061
-A620 0041
-110F0 0061
-110F0 0041
-3007 0061
 3007 0041
-1018A 0061
+A620 0041
+A8D0 0041
+A900 0041
+A9D0 0041
+AA50 0041
+ABF0 0041
 1018A 0041
-111D0 0061
+104A0 0041
+11066 0041
+110F0 0041
+11136 0041
 111D0 0041
-116C0 0061
 116C0 0041
-11066 0061
-11066 0041
+FF10 0061
+FF10 0041
+0F33 0061
+0F33 0041
+1D7CE 0061
+1D7D8 0061
+1D7E2 0061
+1D7EC 0061
+1D7F6 0061
+1D7CE 0041
+1D7D8 0041
+1D7E2 0041
+1D7EC 0041
+1D7F6 0041
+24EA 0061
+24FF 0061
+24EA 0041
+24FF 0041
+2070 0061
+2070 0041
+2080 0061
+2080 0041
 0030 0062
-FF10 0062
-1D7CE 0062
-1D7D8 0062
-1D7E2 0062
-1D7EC 0062
-1D7F6 0062
-24EA 0062
-24FF 0062
-2070 0062
-2080 0062
 0660 0062
 06F0 0062
 07C0 0062
-104A0 0062
 0966 0062
 09E6 0062
 0A66 0062
@@ -31191,36 +31172,47 @@ FF10 0062
 0C78 0062
 0CE6 0062
 0D66 0062
-ABF0 0062
-A8D0 0062
-1946 0062
-19D0 0062
-1A80 0062
-1A90 0062
 0E50 0062
 0ED0 0062
 0F20 0062
-0F33 0062
-1C40 0062
-A900 0062
 1040 0062
 1090 0062
-11136 0062
 17E0 0062
 17F0 0062
-AA50 0062
+1810 0062
+1946 0062
+19D0 0062
+1A80 0062
+1A90 0062
 1B50 0062
-A9D0 0062
 1BB0 0062
-1810 0062
+1C40 0062
 1C50 0062
-A620 0062
-110F0 0062
 3007 0062
+A620 0062
+A8D0 0062
+A900 0062
+A9D0 0062
+AA50 0062
+ABF0 0062
 1018A 0062
+104A0 0062
+11066 0062
+110F0 0062
+11136 0062
 111D0 0062
 116C0 0062
-11066 0062
+FF10 0062
+0F33 0062
+1D7CE 0062
+1D7D8 0062
+1D7E2 0062
+1D7EC 0062
+1D7F6 0062
+24EA 0062
+24FF 0062
+2070 0062
+2080 0062
 3358 0021
 3358 003F
 3358 0061
@@ -31232,25 +31224,9 @@ A620 0062
 1F102 0041
 1F102 0062
 0031 0021
-FF11 0021
-1D7CF 0021
-1D7D9 0021
-1D7E3 0021
-1D7ED 0021
-1D7F7 0021
-2460 0021
-24F5 0021
-2776 0021
-2780 0021
-278A 0021
-00B9 0021
-2081 0021
 0661 0021
 06F1 0021
-10E60 0021
 07C1 0021
-1369 0021
-104A1 0021
 0967 0021
 09E7 0021
 0A67 0021
@@ -31262,33 +31238,31 @@ FF11 0021
 0C7C 0021
 0CE7 0021
 0D67 0021
-ABF1 0021
-A8D1 0021
-1947 0021
-19D1 0021
-19DA 0021
-1A81 0021
-1A91 0021
 0E51 0021
 0ED1 0021
 0F21 0021
-0F2A 0021
-1C41 0021
-A901 0021
 1041 0021
 1091 0021
-11137 0021
+1369 0021
 17E1 0021
 17F1 0021
-AA51 0021
+1811 0021
+1947 0021
+19D1 0021
+19DA 0021
+1A81 0021
+1A91 0021
 1B51 0021
-A9D1 0021
 1BB1 0021
-1811 0021
+1C41 0021
 1C51 0021
-A621 0021
-110F1 0021
 3021 0021
+A621 0021
+A8D1 0021
+A901 0021
+A9D1 0021
+AA51 0021
+ABF1 0021
 10107 0021
 10142 0021
 10158 0021
@@ -31296,43 +31270,45 @@ A621 0021
 1015A 0021
 10320 0021
 103D1 0021
+104A1 0021
+10858 0021
+10916 0021
+10A40 0021
+10A7D 0021
+10B58 0021
+10B78 0021
+10E60 0021
+11052 0021
+11067 0021
+110F1 0021
+11137 0021
+111D1 0021
+116C1 0021
 12415 0021
 1241E 0021
 1242C 0021
 12434 0021
 1244F 0021
 12458 0021
-10A7D 0021
-10916 0021
-10858 0021
-10B58 0021
-10B78 0021
-111D1 0021
-116C1 0021
-11067 0021
-11052 0021
-10A40 0021
 1D360 0021
+FF11 0021
+0F2A 0021
+1D7CF 0021
+1D7D9 0021
+1D7E3 0021
+1D7ED 0021
+1D7F7 0021
+2460 0021
+24F5 0021
+2776 0021
+2780 0021
+278A 0021
+00B9 0021
+2081 0021
 0031 003F
-FF11 003F
-1D7CF 003F
-1D7D9 003F
-1D7E3 003F
-1D7ED 003F
-1D7F7 003F
-2460 003F
-24F5 003F
-2776 003F
-2780 003F
-278A 003F
-00B9 003F
-2081 003F
 0661 003F
 06F1 003F
-10E60 003F
 07C1 003F
-1369 003F
-104A1 003F
 0967 003F
 09E7 003F
 0A67 003F
@@ -31344,33 +31320,31 @@ FF11 003F
 0C7C 003F
 0CE7 003F
 0D67 003F
-ABF1 003F
-A8D1 003F
-1947 003F
-19D1 003F
-19DA 003F
-1A81 003F
-1A91 003F
 0E51 003F
 0ED1 003F
 0F21 003F
-0F2A 003F
-1C41 003F
-A901 003F
 1041 003F
 1091 003F
-11137 003F
+1369 003F
 17E1 003F
 17F1 003F
-AA51 003F
+1811 003F
+1947 003F
+19D1 003F
+19DA 003F
+1A81 003F
+1A91 003F
 1B51 003F
-A9D1 003F
 1BB1 003F
-1811 003F
+1C41 003F
 1C51 003F
-A621 003F
-110F1 003F
 3021 003F
+A621 003F
+A8D1 003F
+A901 003F
+A9D1 003F
+AA51 003F
+ABF1 003F
 10107 003F
 10142 003F
 10158 003F
@@ -31378,23 +31352,41 @@ A621 003F
 1015A 003F
 10320 003F
 103D1 003F
+104A1 003F
+10858 003F
+10916 003F
+10A40 003F
+10A7D 003F
+10B58 003F
+10B78 003F
+10E60 003F
+11052 003F
+11067 003F
+110F1 003F
+11137 003F
+111D1 003F
+116C1 003F
 12415 003F
 1241E 003F
 1242C 003F
 12434 003F
 1244F 003F
 12458 003F
-10A7D 003F
-10916 003F
-10858 003F
-10B58 003F
-10B78 003F
-111D1 003F
-116C1 003F
-11067 003F
-11052 003F
-10A40 003F
 1D360 003F
+FF11 003F
+0F2A 003F
+1D7CF 003F
+1D7D9 003F
+1D7E3 003F
+1D7ED 003F
+1D7F7 003F
+2460 003F
+24F5 003F
+2776 003F
+2780 003F
+278A 003F
+00B9 003F
+2081 003F
 2488 0021
 2488 003F
 2488 0061
@@ -31736,189 +31728,173 @@ A621 003F
 336B 0041
 336B 0062
 0031 0061
-0031 0041
-FF11 0061
-FF11 0041
-1D7CF 0061
-1D7D9 0061
-1D7E3 0061
-1D7ED 0061
-1D7F7 0061
-1D7CF 0041
-1D7D9 0041
-1D7E3 0041
-1D7ED 0041
-1D7F7 0041
-2460 0061
-24F5 0061
-2776 0061
-2780 0061
-278A 0061
-2460 0041
-24F5 0041
-2776 0041
-2780 0041
-278A 0041
-00B9 0061
-00B9 0041
-2081 0061
-2081 0041
 0661 0061
-0661 0041
 06F1 0061
-06F1 0041
-10E60 0061
-10E60 0041
 07C1 0061
-07C1 0041
-1369 0061
-1369 0041
-104A1 0061
-104A1 0041
 0967 0061
-0967 0041
 09E7 0061
-09E7 0041
 0A67 0061
-0A67 0041
 0AE7 0061
-0AE7 0041
 0B67 0061
-0B67 0041
 0BE7 0061
-0BE7 0041
 0C67 0061
 0C79 0061
 0C7C 0061
-0C67 0041
-0C79 0041
-0C7C 0041
 0CE7 0061
-0CE7 0041
 0D67 0061
-0D67 0041
-ABF1 0061
-ABF1 0041
-A8D1 0061
-A8D1 0041
-1947 0061
-1947 0041
-19D1 0061
-19DA 0061
-19D1 0041
-19DA 0041
-1A81 0061
-1A81 0041
-1A91 0061
-1A91 0041
 0E51 0061
-0E51 0041
 0ED1 0061
-0ED1 0041
 0F21 0061
-0F21 0041
-0F2A 0061
-0F2A 0041
-1C41 0061
-1C41 0041
-A901 0061
-A901 0041
 1041 0061
-1041 0041
 1091 0061
-1091 0041
-11137 0061
-11137 0041
+1369 0061
 17E1 0061
-17E1 0041
 17F1 0061
-17F1 0041
-AA51 0061
-AA51 0041
+1811 0061
+1947 0061
+19D1 0061
+19DA 0061
+1A81 0061
+1A91 0061
 1B51 0061
-1B51 0041
-A9D1 0061
-A9D1 0041
 1BB1 0061
-1BB1 0041
-1811 0061
-1811 0041
+1C41 0061
 1C51 0061
-1C51 0041
-A621 0061
-A621 0041
-110F1 0061
-110F1 0041
 3021 0061
-3021 0041
+A621 0061
+A8D1 0061
+A901 0061
+A9D1 0061
+AA51 0061
+ABF1 0061
 10107 0061
-10107 0041
 10142 0061
 10158 0061
 10159 0061
 1015A 0061
-10142 0041
-10158 0041
-10159 0041
-1015A 0041
 10320 0061
-10320 0041
 103D1 0061
-103D1 0041
+104A1 0061
+10858 0061
+10916 0061
+10A40 0061
+10A7D 0061
+10B58 0061
+10B78 0061
+10E60 0061
+11052 0061
+11067 0061
+110F1 0061
+11137 0061
+111D1 0061
+116C1 0061
 12415 0061
 1241E 0061
 1242C 0061
 12434 0061
 1244F 0061
 12458 0061
+1D360 0061
+0031 0041
+0661 0041
+06F1 0041
+07C1 0041
+0967 0041
+09E7 0041
+0A67 0041
+0AE7 0041
+0B67 0041
+0BE7 0041
+0C67 0041
+0C79 0041
+0C7C 0041
+0CE7 0041
+0D67 0041
+0E51 0041
+0ED1 0041
+0F21 0041
+1041 0041
+1091 0041
+1369 0041
+17E1 0041
+17F1 0041
+1811 0041
+1947 0041
+19D1 0041
+19DA 0041
+1A81 0041
+1A91 0041
+1B51 0041
+1BB1 0041
+1C41 0041
+1C51 0041
+3021 0041
+A621 0041
+A8D1 0041
+A901 0041
+A9D1 0041
+AA51 0041
+ABF1 0041
+10107 0041
+10142 0041
+10158 0041
+10159 0041
+1015A 0041
+10320 0041
+103D1 0041
+104A1 0041
+10858 0041
+10916 0041
+10A40 0041
+10A7D 0041
+10B58 0041
+10B78 0041
+10E60 0041
+11052 0041
+11067 0041
+110F1 0041
+11137 0041
+111D1 0041
+116C1 0041
 12415 0041
 1241E 0041
 1242C 0041
 12434 0041
 1244F 0041
 12458 0041
-10A7D 0061
-10A7D 0041
-10916 0061
-10916 0041
-10858 0061
-10858 0041
-10B58 0061
-10B58 0041
-10B78 0061
-10B78 0041
-111D1 0061
-111D1 0041
-116C1 0061
-116C1 0041
-11067 0061
-11067 0041
-11052 0061
-11052 0041
-10A40 0061
-10A40 0041
-1D360 0061
 1D360 0041
+FF11 0061
+FF11 0041
+0F2A 0061
+0F2A 0041
+1D7CF 0061
+1D7D9 0061
+1D7E3 0061
+1D7ED 0061
+1D7F7 0061
+1D7CF 0041
+1D7D9 0041
+1D7E3 0041
+1D7ED 0041
+1D7F7 0041
+2460 0061
+24F5 0061
+2776 0061
+2780 0061
+278A 0061
+2460 0041
+24F5 0041
+2776 0041
+2780 0041
+278A 0041
+00B9 0061
+00B9 0041
+2081 0061
+2081 0041
 0031 0062
-FF11 0062
-1D7CF 0062
-1D7D9 0062
-1D7E3 0062
-1D7ED 0062
-1D7F7 0062
-2460 0062
-24F5 0062
-2776 0062
-2780 0062
-278A 0062
-00B9 0062
-2081 0062
 0661 0062
 06F1 0062
-10E60 0062
 07C1 0062
-1369 0062
-104A1 0062
 0967 0062
 09E7 0062
 0A67 0062
@@ -31930,33 +31906,31 @@ FF11 0062
 0C7C 0062
 0CE7 0062
 0D67 0062
-ABF1 0062
-A8D1 0062
-1947 0062
-19D1 0062
-19DA 0062
-1A81 0062
-1A91 0062
 0E51 0062
 0ED1 0062
 0F21 0062
-0F2A 0062
-1C41 0062
-A901 0062
 1041 0062
 1091 0062
-11137 0062
+1369 0062
 17E1 0062
 17F1 0062
-AA51 0062
+1811 0062
+1947 0062
+19D1 0062
+19DA 0062
+1A81 0062
+1A91 0062
 1B51 0062
-A9D1 0062
 1BB1 0062
-1811 0062
+1C41 0062
 1C51 0062
-A621 0062
-110F1 0062
 3021 0062
+A621 0062
+A8D1 0062
+A901 0062
+A9D1 0062
+AA51 0062
+ABF1 0062
 10107 0062
 10142 0062
 10158 0062
@@ -31964,23 +31938,41 @@ A621 0062
 1015A 0062
 10320 0062
 103D1 0062
+104A1 0062
+10858 0062
+10916 0062
+10A40 0062
+10A7D 0062
+10B58 0062
+10B78 0062
+10E60 0062
+11052 0062
+11067 0062
+110F1 0062
+11137 0062
+111D1 0062
+116C1 0062
 12415 0062
 1241E 0062
 1242C 0062
 12434 0062
 1244F 0062
 12458 0062
-10A7D 0062
-10916 0062
-10858 0062
-10B58 0062
-10B78 0062
-111D1 0062
-116C1 0062
-11067 0062
-11052 0062
-10A40 0062
 1D360 0062
+FF11 0062
+0F2A 0062
+1D7CF 0062
+1D7D9 0062
+1D7E3 0062
+1D7ED 0062
+1D7F7 0062
+2460 0062
+24F5 0062
+2776 0062
+2780 0062
+278A 0062
+00B9 0062
+2081 0062
 33E0 0021
 33E0 003F
 33E0 0061
@@ -32002,25 +31994,9 @@ A621 0062
 1F103 0041
 1F103 0062
 0032 0021
-FF12 0021
-1D7D0 0021
-1D7DA 0021
-1D7E4 0021
-1D7EE 0021
-1D7F8 0021
-2461 0021
-24F6 0021
-2777 0021
-2781 0021
-278B 0021
-00B2 0021
-2082 0021
 0662 0021
 06F2 0021
-10E61 0021
 07C2 0021
-136A 0021
-104A2 0021
 0968 0021
 09E8 0021
 0A68 0021
@@ -32032,38 +32008,49 @@ FF12 0021
 0C7D 0021
 0CE8 0021
 0D68 0021
-ABF2 0021
-A8D2 0021
-1948 0021
-19D2 0021
-1A82 0021
-1A92 0021
 0E52 0021
 0ED2 0021
 0F22 0021
-0F2B 0021
-1C42 0021
-A902 0021
 1042 0021
 1092 0021
-11138 0021
+136A 0021
 17E2 0021
 17F2 0021
-AA52 0021
+1812 0021
+1948 0021
+19D2 0021
+1A82 0021
+1A92 0021
 1B52 0021
-A9D2 0021
 1BB2 0021
-1812 0021
+1C42 0021
 1C52 0021
-A622 0021
-110F2 0021
 3022 0021
+A622 0021
+A8D2 0021
+A902 0021
+A9D2 0021
+AA52 0021
+ABF2 0021
 10108 0021
 1015B 0021
 1015C 0021
 1015D 0021
 1015E 0021
 103D2 0021
+104A2 0021
+10859 0021
+1091A 0021
+10A41 0021
+10B59 0021
+10B79 0021
+10E61 0021
+11053 0021
+11068 0021
+110F2 0021
+11138 0021
+111D2 0021
+116C2 0021
 12400 0021
 12416 0021
 1241F 0021
@@ -32072,37 +32059,27 @@ A622 0021
 12435 0021
 1244A 0021
 12450 0021
+12456 0021
 12459 0021
-1091A 0021
-10859 0021
-10B59 0021
-10B79 0021
-111D2 0021
-116C2 0021
-11068 0021
-11053 0021
-10A41 0021
 1D361 0021
+FF12 0021
+0F2B 0021
+1D7D0 0021
+1D7DA 0021
+1D7E4 0021
+1D7EE 0021
+1D7F8 0021
+2461 0021
+24F6 0021
+2777 0021
+2781 0021
+278B 0021
+00B2 0021
+2082 0021
 0032 003F
-FF12 003F
-1D7D0 003F
-1D7DA 003F
-1D7E4 003F
-1D7EE 003F
-1D7F8 003F
-2461 003F
-24F6 003F
-2777 003F
-2781 003F
-278B 003F
-00B2 003F
-2082 003F
 0662 003F
 06F2 003F
-10E61 003F
 07C2 003F
-136A 003F
-104A2 003F
 0968 003F
 09E8 003F
 0A68 003F
@@ -32114,38 +32091,49 @@ FF12 003F
 0C7D 003F
 0CE8 003F
 0D68 003F
-ABF2 003F
-A8D2 003F
-1948 003F
-19D2 003F
-1A82 003F
-1A92 003F
 0E52 003F
 0ED2 003F
 0F22 003F
-0F2B 003F
-1C42 003F
-A902 003F
 1042 003F
 1092 003F
-11138 003F
+136A 003F
 17E2 003F
 17F2 003F
-AA52 003F
+1812 003F
+1948 003F
+19D2 003F
+1A82 003F
+1A92 003F
 1B52 003F
-A9D2 003F
 1BB2 003F
-1812 003F
+1C42 003F
 1C52 003F
-A622 003F
-110F2 003F
 3022 003F
+A622 003F
+A8D2 003F
+A902 003F
+A9D2 003F
+AA52 003F
+ABF2 003F
 10108 003F
 1015B 003F
 1015C 003F
 1015D 003F
 1015E 003F
 103D2 003F
+104A2 003F
+10859 003F
+1091A 003F
+10A41 003F
+10B59 003F
+10B79 003F
+10E61 003F
+11053 003F
+11068 003F
+110F2 003F
+11138 003F
+111D2 003F
+116C2 003F
 12400 003F
 12416 003F
 1241F 003F
@@ -32154,17 +32142,23 @@ A622 003F
 12435 003F
 1244A 003F
 12450 003F
+12456 003F
 12459 003F
-1091A 003F
-10859 003F
-10B59 003F
-10B79 003F
-111D2 003F
-116C2 003F
-11068 003F
-11053 003F
-10A41 003F
 1D361 003F
+FF12 003F
+0F2B 003F
+1D7D0 003F
+1D7DA 003F
+1D7E4 003F
+1D7EE 003F
+1D7F8 003F
+2461 003F
+24F6 003F
+2777 003F
+2781 003F
+278B 003F
+00B2 003F
+2082 003F
 2489 0021
 2489 003F
 2489 0061
@@ -32321,131 +32315,63 @@ A622 003F
 33FC 0041
 33FC 0062
 0032 0061
-0032 0041
-FF12 0061
-FF12 0041
-1D7D0 0061
-1D7DA 0061
-1D7E4 0061
-1D7EE 0061
-1D7F8 0061
-1D7D0 0041
-1D7DA 0041
-1D7E4 0041
-1D7EE 0041
-1D7F8 0041
-2461 0061
-24F6 0061
-2777 0061
-2781 0061
-278B 0061
-2461 0041
-24F6 0041
-2777 0041
-2781 0041
-278B 0041
-00B2 0061
-00B2 0041
-2082 0061
-2082 0041
 0662 0061
-0662 0041
 06F2 0061
-06F2 0041
-10E61 0061
-10E61 0041
 07C2 0061
-07C2 0041
-136A 0061
-136A 0041
-104A2 0061
-104A2 0041
 0968 0061
-0968 0041
 09E8 0061
-09E8 0041
 0A68 0061
-0A68 0041
 0AE8 0061
-0AE8 0041
 0B68 0061
-0B68 0041
 0BE8 0061
-0BE8 0041
 0C68 0061
 0C7A 0061
 0C7D 0061
-0C68 0041
-0C7A 0041
-0C7D 0041
 0CE8 0061
-0CE8 0041
 0D68 0061
-0D68 0041
-ABF2 0061
-ABF2 0041
-A8D2 0061
-A8D2 0041
-1948 0061
-1948 0041
-19D2 0061
-19D2 0041
-1A82 0061
-1A82 0041
-1A92 0061
-1A92 0041
 0E52 0061
-0E52 0041
 0ED2 0061
-0ED2 0041
 0F22 0061
-0F22 0041
-0F2B 0061
-0F2B 0041
-1C42 0061
-1C42 0041
-A902 0061
-A902 0041
 1042 0061
-1042 0041
 1092 0061
-1092 0041
-11138 0061
-11138 0041
+136A 0061
 17E2 0061
-17E2 0041
 17F2 0061
-17F2 0041
-AA52 0061
-AA52 0041
+1812 0061
+1948 0061
+19D2 0061
+1A82 0061
+1A92 0061
 1B52 0061
-1B52 0041
-A9D2 0061
-A9D2 0041
 1BB2 0061
-1BB2 0041
-1812 0061
-1812 0041
+1C42 0061
 1C52 0061
-1C52 0041
-A622 0061
-A622 0041
-110F2 0061
-110F2 0041
 3022 0061
-3022 0041
+A622 0061
+A8D2 0061
+A902 0061
+A9D2 0061
+AA52 0061
+ABF2 0061
 10108 0061
-10108 0041
 1015B 0061
 1015C 0061
 1015D 0061
 1015E 0061
-1015B 0041
-1015C 0041
-1015D 0041
-1015E 0041
 103D2 0061
-103D2 0041
+104A2 0061
+10859 0061
+1091A 0061
+10A41 0061
+10B59 0061
+10B79 0061
+10E61 0061
+11053 0061
+11068 0061
+110F2 0061
+11138 0061
+111D2 0061
+116C2 0061
 12400 0061
 12416 0061
 1241F 0061
@@ -32454,7 +32380,67 @@ A622 0041
 12435 0061
 1244A 0061
 12450 0061
+12456 0061
 12459 0061
+1D361 0061
+0032 0041
+0662 0041
+06F2 0041
+07C2 0041
+0968 0041
+09E8 0041
+0A68 0041
+0AE8 0041
+0B68 0041
+0BE8 0041
+0C68 0041
+0C7A 0041
+0C7D 0041
+0CE8 0041
+0D68 0041
+0E52 0041
+0ED2 0041
+0F22 0041
+1042 0041
+1092 0041
+136A 0041
+17E2 0041
+17F2 0041
+1812 0041
+1948 0041
+19D2 0041
+1A82 0041
+1A92 0041
+1B52 0041
+1BB2 0041
+1C42 0041
+1C52 0041
+3022 0041
+A622 0041
+A8D2 0041
+A902 0041
+A9D2 0041
+AA52 0041
+ABF2 0041
+10108 0041
+1015B 0041
+1015C 0041
+1015D 0041
+1015E 0041
+103D2 0041
+104A2 0041
+10859 0041
+1091A 0041
+10A41 0041
+10B59 0041
+10B79 0041
+10E61 0041
+11053 0041
+11068 0041
+110F2 0041
+11138 0041
+111D2 0041
+116C2 0041
 12400 0041
 12416 0041
 1241F 0041
@@ -32463,47 +32449,41 @@ A622 0041
 12435 0041
 1244A 0041
 12450 0041
+12456 0041
 12459 0041
-1091A 0061
-1091A 0041
-10859 0061
-10859 0041
-10B59 0061
-10B59 0041
-10B79 0061
-10B79 0041
-111D2 0061
-111D2 0041
-116C2 0061
-116C2 0041
-11068 0061
-11068 0041
-11053 0061
-11053 0041
-10A41 0061
-10A41 0041
-1D361 0061
 1D361 0041
+FF12 0061
+FF12 0041
+0F2B 0061
+0F2B 0041
+1D7D0 0061
+1D7DA 0061
+1D7E4 0061
+1D7EE 0061
+1D7F8 0061
+1D7D0 0041
+1D7DA 0041
+1D7E4 0041
+1D7EE 0041
+1D7F8 0041
+2461 0061
+24F6 0061
+2777 0061
+2781 0061
+278B 0061
+2461 0041
+24F6 0041
+2777 0041
+2781 0041
+278B 0041
+00B2 0061
+00B2 0041
+2082 0061
+2082 0041
 0032 0062
-FF12 0062
-1D7D0 0062
-1D7DA 0062
-1D7E4 0062
-1D7EE 0062
-1D7F8 0062
-2461 0062
-24F6 0062
-2777 0062
-2781 0062
-278B 0062
-00B2 0062
-2082 0062
 0662 0062
 06F2 0062
-10E61 0062
 07C2 0062
-136A 0062
-104A2 0062
 0968 0062
 09E8 0062
 0A68 0062
@@ -32515,38 +32495,49 @@ FF12 0062
 0C7D 0062
 0CE8 0062
 0D68 0062
-ABF2 0062
-A8D2 0062
-1948 0062
-19D2 0062
-1A82 0062
-1A92 0062
 0E52 0062
 0ED2 0062
 0F22 0062
-0F2B 0062
-1C42 0062
-A902 0062
 1042 0062
 1092 0062
-11138 0062
+136A 0062
 17E2 0062
 17F2 0062
-AA52 0062
+1812 0062
+1948 0062
+19D2 0062
+1A82 0062
+1A92 0062
 1B52 0062
-A9D2 0062
 1BB2 0062
-1812 0062
+1C42 0062
 1C52 0062
-A622 0062
-110F2 0062
 3022 0062
+A622 0062
+A8D2 0062
+A902 0062
+A9D2 0062
+AA52 0062
+ABF2 0062
 10108 0062
 1015B 0062
 1015C 0062
 1015D 0062
 1015E 0062
 103D2 0062
+104A2 0062
+10859 0062
+1091A 0062
+10A41 0062
+10B59 0062
+10B79 0062
+10E61 0062
+11053 0062
+11068 0062
+110F2 0062
+11138 0062
+111D2 0062
+116C2 0062
 12400 0062
 12416 0062
 1241F 0062
@@ -32555,17 +32546,23 @@ A622 0062
 12435 0062
 1244A 0062
 12450 0062
+12456 0062
 12459 0062
-1091A 0062
-10859 0062
-10B59 0062
-10B79 0062
-111D2 0062
-116C2 0062
-11068 0062
-11053 0062
-10A41 0062
 1D361 0062
+FF12 0062
+0F2B 0062
+1D7D0 0062
+1D7DA 0062
+1D7E4 0062
+1D7EE 0062
+1D7F8 0062
+2461 0062
+24F6 0062
+2777 0062
+2781 0062
+278B 0062
+00B2 0062
+2082 0062
 33E1 0021
 33E1 003F
 33E1 0061
@@ -32587,25 +32584,9 @@ A622 0062
 1F104 0041
 1F104 0062
 0033 0021
-FF13 0021
-1D7D1 0021
-1D7DB 0021
-1D7E5 0021
-1D7EF 0021
-1D7F9 0021
-2462 0021
-24F7 0021
-2778 0021
-2782 0021
-278C 0021
-00B3 0021
-2083 0021
 0663 0021
 06F3 0021
-10E62 0021
 07C3 0021
-136B 0021
-104A3 0021
 0969 0021
 09E9 0021
 0A69 0021
@@ -32617,33 +32598,44 @@ FF13 0021
 0C7E 0021
 0CE9 0021
 0D69 0021
-ABF3 0021
-A8D3 0021
-1949 0021
-19D3 0021
-1A83 0021
-1A93 0021
 0E53 0021
 0ED3 0021
 0F23 0021
-0F2C 0021
-1C43 0021
-A903 0021
 1043 0021
 1093 0021
-11139 0021
+136B 0021
 17E3 0021
 17F3 0021
-AA53 0021
+1813 0021
+1949 0021
+19D3 0021
+1A83 0021
+1A93 0021
 1B53 0021
-A9D3 0021
 1BB3 0021
-1813 0021
+1C43 0021
 1C53 0021
-A623 0021
-110F3 0021
 3023 0021
+A623 0021
+A8D3 0021
+A903 0021
+A9D3 0021
+AA53 0021
+ABF3 0021
 10109 0021
+104A3 0021
+1085A 0021
+1091B 0021
+10A42 0021
+10B5A 0021
+10B7A 0021
+10E62 0021
+11054 0021
+11069 0021
+110F3 0021
+11139 0021
+111D3 0021
+116C3 0021
 12401 0021
 12408 0021
 12417 0021
@@ -32658,36 +32650,26 @@ A623 0021
 1243B 0021
 1244B 0021
 12451 0021
-1091B 0021
-1085A 0021
-10B5A 0021
-10B7A 0021
-111D3 0021
-116C3 0021
-11069 0021
-11054 0021
-10A42 0021
+12457 0021
 1D362 0021
+FF13 0021
+0F2C 0021
+1D7D1 0021
+1D7DB 0021
+1D7E5 0021
+1D7EF 0021
+1D7F9 0021
+2462 0021
+24F7 0021
+2778 0021
+2782 0021
+278C 0021
+00B3 0021
+2083 0021
 0033 003F
-FF13 003F
-1D7D1 003F
-1D7DB 003F
-1D7E5 003F
-1D7EF 003F
-1D7F9 003F
-2462 003F
-24F7 003F
-2778 003F
-2782 003F
-278C 003F
-00B3 003F
-2083 003F
 0663 003F
 06F3 003F
-10E62 003F
 07C3 003F
-136B 003F
-104A3 003F
 0969 003F
 09E9 003F
 0A69 003F
@@ -32699,33 +32681,44 @@ FF13 003F
 0C7E 003F
 0CE9 003F
 0D69 003F
-ABF3 003F
-A8D3 003F
-1949 003F
-19D3 003F
-1A83 003F
-1A93 003F
 0E53 003F
 0ED3 003F
 0F23 003F
-0F2C 003F
-1C43 003F
-A903 003F
 1043 003F
 1093 003F
-11139 003F
+136B 003F
 17E3 003F
 17F3 003F
-AA53 003F
+1813 003F
+1949 003F
+19D3 003F
+1A83 003F
+1A93 003F
 1B53 003F
-A9D3 003F
 1BB3 003F
-1813 003F
+1C43 003F
 1C53 003F
-A623 003F
-110F3 003F
 3023 003F
+A623 003F
+A8D3 003F
+A903 003F
+A9D3 003F
+AA53 003F
+ABF3 003F
 10109 003F
+104A3 003F
+1085A 003F
+1091B 003F
+10A42 003F
+10B5A 003F
+10B7A 003F
+10E62 003F
+11054 003F
+11069 003F
+110F3 003F
+11139 003F
+111D3 003F
+116C3 003F
 12401 003F
 12408 003F
 12417 003F
@@ -32740,16 +32733,22 @@ A623 003F
 1243B 003F
 1244B 003F
 12451 003F
-1091B 003F
-1085A 003F
-10B5A 003F
-10B7A 003F
-111D3 003F
-116C3 003F
-11069 003F
-11054 003F
-10A42 003F
+12457 003F
 1D362 003F
+FF13 003F
+0F2C 003F
+1D7D1 003F
+1D7DB 003F
+1D7E5 003F
+1D7EF 003F
+1D7F9 003F
+2462 003F
+24F7 003F
+2778 003F
+2782 003F
+278C 003F
+00B3 003F
+2083 003F
 248A 0021
 248A 003F
 248A 0061
@@ -32836,121 +32835,58 @@ A623 003F
 32B4 0041
 32B4 0062
 0033 0061
-0033 0041
-FF13 0061
-FF13 0041
-1D7D1 0061
-1D7DB 0061
-1D7E5 0061
-1D7EF 0061
-1D7F9 0061
-1D7D1 0041
-1D7DB 0041
-1D7E5 0041
-1D7EF 0041
-1D7F9 0041
-2462 0061
-24F7 0061
-2778 0061
-2782 0061
-278C 0061
-2462 0041
-24F7 0041
-2778 0041
-2782 0041
-278C 0041
-00B3 0061
-00B3 0041
-2083 0061
-2083 0041
 0663 0061
-0663 0041
 06F3 0061
-06F3 0041
-10E62 0061
-10E62 0041
 07C3 0061
-07C3 0041
-136B 0061
-136B 0041
-104A3 0061
-104A3 0041
 0969 0061
-0969 0041
 09E9 0061
-09E9 0041
 0A69 0061
-0A69 0041
 0AE9 0061
-0AE9 0041
 0B69 0061
-0B69 0041
 0BE9 0061
-0BE9 0041
 0C69 0061
 0C7B 0061
 0C7E 0061
-0C69 0041
-0C7B 0041
-0C7E 0041
 0CE9 0061
-0CE9 0041
 0D69 0061
-0D69 0041
-ABF3 0061
-ABF3 0041
-A8D3 0061
-A8D3 0041
-1949 0061
-1949 0041
-19D3 0061
-19D3 0041
-1A83 0061
-1A83 0041
-1A93 0061
-1A93 0041
 0E53 0061
-0E53 0041
 0ED3 0061
-0ED3 0041
 0F23 0061
-0F23 0041
-0F2C 0061
-0F2C 0041
-1C43 0061
-1C43 0041
-A903 0061
-A903 0041
 1043 0061
-1043 0041
 1093 0061
-1093 0041
-11139 0061
-11139 0041
+136B 0061
 17E3 0061
-17E3 0041
 17F3 0061
-17F3 0041
-AA53 0061
-AA53 0041
+1813 0061
+1949 0061
+19D3 0061
+1A83 0061
+1A93 0061
 1B53 0061
-1B53 0041
-A9D3 0061
-A9D3 0041
 1BB3 0061
-1BB3 0041
-1813 0061
-1813 0041
+1C43 0061
 1C53 0061
-1C53 0041
-A623 0061
-A623 0041
-110F3 0061
-110F3 0041
 3023 0061
-3023 0041
+A623 0061
+A8D3 0061
+A903 0061
+A9D3 0061
+AA53 0061
+ABF3 0061
 10109 0061
-10109 0041
+104A3 0061
+1085A 0061
+1091B 0061
+10A42 0061
+10B5A 0061
+10B7A 0061
+10E62 0061
+11054 0061
+11069 0061
+110F3 0061
+11139 0061
+111D3 0061
+116C3 0061
 12401 0061
 12408 0061
 12417 0061
@@ -32965,6 +32901,61 @@ A623 0041
 1243B 0061
 1244B 0061
 12451 0061
+12457 0061
+1D362 0061
+0033 0041
+0663 0041
+06F3 0041
+07C3 0041
+0969 0041
+09E9 0041
+0A69 0041
+0AE9 0041
+0B69 0041
+0BE9 0041
+0C69 0041
+0C7B 0041
+0C7E 0041
+0CE9 0041
+0D69 0041
+0E53 0041
+0ED3 0041
+0F23 0041
+1043 0041
+1093 0041
+136B 0041
+17E3 0041
+17F3 0041
+1813 0041
+1949 0041
+19D3 0041
+1A83 0041
+1A93 0041
+1B53 0041
+1BB3 0041
+1C43 0041
+1C53 0041
+3023 0041
+A623 0041
+A8D3 0041
+A903 0041
+A9D3 0041
+AA53 0041
+ABF3 0041
+10109 0041
+104A3 0041
+1085A 0041
+1091B 0041
+10A42 0041
+10B5A 0041
+10B7A 0041
+10E62 0041
+11054 0041
+11069 0041
+110F3 0041
+11139 0041
+111D3 0041
+116C3 0041
 12401 0041
 12408 0041
 12417 0041
@@ -32979,46 +32970,40 @@ A623 0041
 1243B 0041
 1244B 0041
 12451 0041
-1091B 0061
-1091B 0041
-1085A 0061
-1085A 0041
-10B5A 0061
-10B5A 0041
-10B7A 0061
-10B7A 0041
-111D3 0061
-111D3 0041
-116C3 0061
-116C3 0041
-11069 0061
-11069 0041
-11054 0061
-11054 0041
-10A42 0061
-10A42 0041
-1D362 0061
+12457 0041
 1D362 0041
+FF13 0061
+FF13 0041
+0F2C 0061
+0F2C 0041
+1D7D1 0061
+1D7DB 0061
+1D7E5 0061
+1D7EF 0061
+1D7F9 0061
+1D7D1 0041
+1D7DB 0041
+1D7E5 0041
+1D7EF 0041
+1D7F9 0041
+2462 0061
+24F7 0061
+2778 0061
+2782 0061
+278C 0061
+2462 0041
+24F7 0041
+2778 0041
+2782 0041
+278C 0041
+00B3 0061
+00B3 0041
+2083 0061
+2083 0041
 0033 0062
-FF13 0062
-1D7D1 0062
-1D7DB 0062
-1D7E5 0062
-1D7EF 0062
-1D7F9 0062
-2462 0062
-24F7 0062
-2778 0062
-2782 0062
-278C 0062
-00B3 0062
-2083 0062
 0663 0062
 06F3 0062
-10E62 0062
 07C3 0062
-136B 0062
-104A3 0062
 0969 0062
 09E9 0062
 0A69 0062
@@ -33030,33 +33015,44 @@ FF13 0062
 0C7E 0062
 0CE9 0062
 0D69 0062
-ABF3 0062
-A8D3 0062
-1949 0062
-19D3 0062
-1A83 0062
-1A93 0062
 0E53 0062
 0ED3 0062
 0F23 0062
-0F2C 0062
-1C43 0062
-A903 0062
 1043 0062
 1093 0062
-11139 0062
+136B 0062
 17E3 0062
 17F3 0062
-AA53 0062
+1813 0062
+1949 0062
+19D3 0062
+1A83 0062
+1A93 0062
 1B53 0062
-A9D3 0062
 1BB3 0062
-1813 0062
+1C43 0062
 1C53 0062
-A623 0062
-110F3 0062
 3023 0062
+A623 0062
+A8D3 0062
+A903 0062
+A9D3 0062
+AA53 0062
+ABF3 0062
 10109 0062
+104A3 0062
+1085A 0062
+1091B 0062
+10A42 0062
+10B5A 0062
+10B7A 0062
+10E62 0062
+11054 0062
+11069 0062
+110F3 0062
+11139 0062
+111D3 0062
+116C3 0062
 12401 0062
 12408 0062
 12417 0062
@@ -33071,16 +33067,22 @@ A623 0062
 1243B 0062
 1244B 0062
 12451 0062
-1091B 0062
-1085A 0062
-10B5A 0062
-10B7A 0062
-111D3 0062
-116C3 0062
-11069 0062
-11054 0062
-10A42 0062
+12457 0062
 1D362 0062
+FF13 0062
+0F2C 0062
+1D7D1 0062
+1D7DB 0062
+1D7E5 0062
+1D7EF 0062
+1D7F9 0062
+2462 0062
+24F7 0062
+2778 0062
+2782 0062
+278C 0062
+00B3 0062
+2083 0062
 33E2 0021
 33E2 003F
 33E2 0061
@@ -33102,25 +33104,9 @@ A623 0062
 1F105 0041
 1F105 0062
 0034 0021
-FF14 0021
-1D7D2 0021
-1D7DC 0021
-1D7E6 0021
-1D7F0 0021
-1D7FA 0021
-2463 0021
-24F8 0021
-2779 0021
-2783 0021
-278D 0021
-2074 0021
-2084 0021
 0664 0021
 06F4 0021
-10E63 0021
 07C4 0021
-136C 0021
-104A4 0021
 096A 0021
 09EA 0021
 0A6A 0021
@@ -33130,33 +33116,42 @@ FF14 0021
 0C6A 0021
 0CEA 0021
 0D6A 0021
-ABF4 0021
-A8D4 0021
-194A 0021
-19D4 0021
-1A84 0021
-1A94 0021
 0E54 0021
 0ED4 0021
 0F24 0021
-0F2D 0021
-1C44 0021
-A904 0021
 1044 0021
 1094 0021
-1113A 0021
+136C 0021
 17E4 0021
 17F4 0021
-AA54 0021
+1814 0021
+194A 0021
+19D4 0021
+1A84 0021
+1A94 0021
 1B54 0021
-A9D4 0021
 1BB4 0021
-1814 0021
+1C44 0021
 1C54 0021
-A624 0021
-110F4 0021
 3024 0021
+A624 0021
+A8D4 0021
+A904 0021
+A9D4 0021
+AA54 0021
+ABF4 0021
 1010A 0021
+104A4 0021
+10A43 0021
+10B5B 0021
+10B7B 0021
+10E63 0021
+11055 0021
+1106A 0021
+110F4 0021
+1113A 0021
+111D4 0021
+116C4 0021
 12402 0021
 12409 0021
 1240F 0021
@@ -33172,34 +33167,25 @@ A624 0021
 1244C 0021
 12452 0021
 12453 0021
-10B5B 0021
-10B7B 0021
-111D4 0021
-116C4 0021
-1106A 0021
-11055 0021
-10A43 0021
 1D363 0021
+FF14 0021
+0F2D 0021
+1D7D2 0021
+1D7DC 0021
+1D7E6 0021
+1D7F0 0021
+1D7FA 0021
+2463 0021
+24F8 0021
+2779 0021
+2783 0021
+278D 0021
+2074 0021
+2084 0021
 0034 003F
-FF14 003F
-1D7D2 003F
-1D7DC 003F
-1D7E6 003F
-1D7F0 003F
-1D7FA 003F
-2463 003F
-24F8 003F
-2779 003F
-2783 003F
-278D 003F
-2074 003F
-2084 003F
 0664 003F
 06F4 003F
-10E63 003F
 07C4 003F
-136C 003F
-104A4 003F
 096A 003F
 09EA 003F
 0A6A 003F
@@ -33209,33 +33195,42 @@ FF14 003F
 0C6A 003F
 0CEA 003F
 0D6A 003F
-ABF4 003F
-A8D4 003F
-194A 003F
-19D4 003F
-1A84 003F
-1A94 003F
 0E54 003F
 0ED4 003F
 0F24 003F
-0F2D 003F
-1C44 003F
-A904 003F
 1044 003F
 1094 003F
-1113A 003F
+136C 003F
 17E4 003F
 17F4 003F
-AA54 003F
+1814 003F
+194A 003F
+19D4 003F
+1A84 003F
+1A94 003F
 1B54 003F
-A9D4 003F
 1BB4 003F
-1814 003F
+1C44 003F
 1C54 003F
-A624 003F
-110F4 003F
 3024 003F
+A624 003F
+A8D4 003F
+A904 003F
+A9D4 003F
+AA54 003F
+ABF4 003F
 1010A 003F
+104A4 003F
+10A43 003F
+10B5B 003F
+10B7B 003F
+10E63 003F
+11055 003F
+1106A 003F
+110F4 003F
+1113A 003F
+111D4 003F
+116C4 003F
 12402 003F
 12409 003F
 1240F 003F
@@ -33251,14 +33246,21 @@ A624 003F
 1244C 003F
 12452 003F
 12453 003F
-10B5B 003F
-10B7B 003F
-111D4 003F
-116C4 003F
-1106A 003F
-11055 003F
-10A43 003F
 1D363 003F
+FF14 003F
+0F2D 003F
+1D7D2 003F
+1D7DC 003F
+1D7E6 003F
+1D7F0 003F
+1D7FA 003F
+2463 003F
+24F8 003F
+2779 003F
+2783 003F
+278D 003F
+2074 003F
+2084 003F
 248B 0021
 248B 003F
 248B 0061
@@ -33325,117 +33327,54 @@ A624 003F
 32BE 0041
 32BE 0062
 0034 0061
-0034 0041
-FF14 0061
-FF14 0041
-1D7D2 0061
-1D7DC 0061
-1D7E6 0061
-1D7F0 0061
-1D7FA 0061
-1D7D2 0041
-1D7DC 0041
-1D7E6 0041
-1D7F0 0041
-1D7FA 0041
-2463 0061
-24F8 0061
-2779 0061
-2783 0061
-278D 0061
-2463 0041
-24F8 0041
-2779 0041
-2783 0041
-278D 0041
-2074 0061
-2074 0041
-2084 0061
-2084 0041
 0664 0061
-0664 0041
 06F4 0061
-06F4 0041
-10E63 0061
-10E63 0041
 07C4 0061
-07C4 0041
-136C 0061
-136C 0041
-104A4 0061
-104A4 0041
 096A 0061
-096A 0041
 09EA 0061
-09EA 0041
 0A6A 0061
-0A6A 0041
 0AEA 0061
-0AEA 0041
 0B6A 0061
-0B6A 0041
 0BEA 0061
-0BEA 0041
 0C6A 0061
-0C6A 0041
 0CEA 0061
-0CEA 0041
 0D6A 0061
-0D6A 0041
-ABF4 0061
-ABF4 0041
-A8D4 0061
-A8D4 0041
-194A 0061
-194A 0041
-19D4 0061
-19D4 0041
-1A84 0061
-1A84 0041
-1A94 0061
-1A94 0041
 0E54 0061
-0E54 0041
 0ED4 0061
-0ED4 0041
 0F24 0061
-0F24 0041
-0F2D 0061
-0F2D 0041
-1C44 0061
-1C44 0041
-A904 0061
-A904 0041
 1044 0061
-1044 0041
 1094 0061
-1094 0041
-1113A 0061
-1113A 0041
+136C 0061
 17E4 0061
-17E4 0041
 17F4 0061
-17F4 0041
-AA54 0061
-AA54 0041
+1814 0061
+194A 0061
+19D4 0061
+1A84 0061
+1A94 0061
 1B54 0061
-1B54 0041
-A9D4 0061
-A9D4 0041
 1BB4 0061
-1BB4 0041
-1814 0061
-1814 0041
+1C44 0061
 1C54 0061
-1C54 0041
-A624 0061
-A624 0041
-110F4 0061
-110F4 0041
 3024 0061
-3024 0041
+A624 0061
+A8D4 0061
+A904 0061
+A9D4 0061
+AA54 0061
+ABF4 0061
 1010A 0061
-1010A 0041
+104A4 0061
+10A43 0061
+10B5B 0061
+10B7B 0061
+10E63 0061
+11055 0061
+1106A 0061
+110F4 0061
+1113A 0061
+111D4 0061
+116C4 0061
 12402 0061
 12409 0061
 1240F 0061
@@ -33451,6 +33390,56 @@ A624 0041
 1244C 0061
 12452 0061
 12453 0061
+1D363 0061
+0034 0041
+0664 0041
+06F4 0041
+07C4 0041
+096A 0041
+09EA 0041
+0A6A 0041
+0AEA 0041
+0B6A 0041
+0BEA 0041
+0C6A 0041
+0CEA 0041
+0D6A 0041
+0E54 0041
+0ED4 0041
+0F24 0041
+1044 0041
+1094 0041
+136C 0041
+17E4 0041
+17F4 0041
+1814 0041
+194A 0041
+19D4 0041
+1A84 0041
+1A94 0041
+1B54 0041
+1BB4 0041
+1C44 0041
+1C54 0041
+3024 0041
+A624 0041
+A8D4 0041
+A904 0041
+A9D4 0041
+AA54 0041
+ABF4 0041
+1010A 0041
+104A4 0041
+10A43 0041
+10B5B 0041
+10B7B 0041
+10E63 0041
+11055 0041
+1106A 0041
+110F4 0041
+1113A 0041
+111D4 0041
+116C4 0041
 12402 0041
 12409 0041
 1240F 0041
@@ -33466,42 +33455,39 @@ A624 0041
 1244C 0041
 12452 0041
 12453 0041
-10B5B 0061
-10B5B 0041
-10B7B 0061
-10B7B 0041
-111D4 0061
-111D4 0041
-116C4 0061
-116C4 0041
-1106A 0061
-1106A 0041
-11055 0061
-11055 0041
-10A43 0061
-10A43 0041
-1D363 0061
 1D363 0041
+FF14 0061
+FF14 0041
+0F2D 0061
+0F2D 0041
+1D7D2 0061
+1D7DC 0061
+1D7E6 0061
+1D7F0 0061
+1D7FA 0061
+1D7D2 0041
+1D7DC 0041
+1D7E6 0041
+1D7F0 0041
+1D7FA 0041
+2463 0061
+24F8 0061
+2779 0061
+2783 0061
+278D 0061
+2463 0041
+24F8 0041
+2779 0041
+2783 0041
+278D 0041
+2074 0061
+2074 0041
+2084 0061
+2084 0041
 0034 0062
-FF14 0062
-1D7D2 0062
-1D7DC 0062
-1D7E6 0062
-1D7F0 0062
-1D7FA 0062
-2463 0062
-24F8 0062
-2779 0062
-2783 0062
-278D 0062
-2074 0062
-2084 0062
 0664 0062
 06F4 0062
-10E63 0062
 07C4 0062
-136C 0062
-104A4 0062
 096A 0062
 09EA 0062
 0A6A 0062
@@ -33511,33 +33497,42 @@ FF14 0062
 0C6A 0062
 0CEA 0062
 0D6A 0062
-ABF4 0062
-A8D4 0062
-194A 0062
-19D4 0062
-1A84 0062
-1A94 0062
 0E54 0062
 0ED4 0062
 0F24 0062
-0F2D 0062
-1C44 0062
-A904 0062
 1044 0062
 1094 0062
-1113A 0062
+136C 0062
 17E4 0062
 17F4 0062
-AA54 0062
+1814 0062
+194A 0062
+19D4 0062
+1A84 0062
+1A94 0062
 1B54 0062
-A9D4 0062
 1BB4 0062
-1814 0062
+1C44 0062
 1C54 0062
-A624 0062
-110F4 0062
 3024 0062
+A624 0062
+A8D4 0062
+A904 0062
+A9D4 0062
+AA54 0062
+ABF4 0062
 1010A 0062
+104A4 0062
+10A43 0062
+10B5B 0062
+10B7B 0062
+10E63 0062
+11055 0062
+1106A 0062
+110F4 0062
+1113A 0062
+111D4 0062
+116C4 0062
 12402 0062
 12409 0062
 1240F 0062
@@ -33553,14 +33548,21 @@ A624 0062
 1244C 0062
 12452 0062
 12453 0062
-10B5B 0062
-10B7B 0062
-111D4 0062
-116C4 0062
-1106A 0062
-11055 0062
-10A43 0062
 1D363 0062
+FF14 0062
+0F2D 0062
+1D7D2 0062
+1D7DC 0062
+1D7E6 0062
+1D7F0 0062
+1D7FA 0062
+2463 0062
+24F8 0062
+2779 0062
+2783 0062
+278D 0062
+2074 0062
+2084 0062
 33E3 0021
 33E3 003F
 33E3 0061
@@ -33582,25 +33584,9 @@ A624 0062
 1F106 0041
 1F106 0062
 0035 0021
-FF15 0021
-1D7D3 0021
-1D7DD 0021
-1D7E7 0021
-1D7F1 0021
-1D7FB 0021
-2464 0021
-24F9 0021
-277A 0021
-2784 0021
-278E 0021
-2075 0021
-2085 0021
 0665 0021
 06F5 0021
-10E64 0021
 07C5 0021
-136D 0021
-104A5 0021
 096B 0021
 09EB 0021
 0A6B 0021
@@ -33610,32 +33596,30 @@ FF15 0021
 0C6B 0021
 0CEB 0021
 0D6B 0021
-ABF5 0021
-A8D5 0021
-194B 0021
-19D5 0021
-1A85 0021
-1A95 0021
 0E55 0021
 0ED5 0021
 0F25 0021
-0F2E 0021
-1C45 0021
-A905 0021
 1045 0021
 1095 0021
-1113B 0021
+136D 0021
 17E5 0021
 17F5 0021
-AA55 0021
+1815 0021
+194B 0021
+19D5 0021
+1A85 0021
+1A95 0021
 1B55 0021
-A9D5 0021
 1BB5 0021
-1815 0021
+1C45 0021
 1C55 0021
-A625 0021
-110F5 0021
 3025 0021
+A625 0021
+A8D5 0021
+A905 0021
+A9D5 0021
+AA55 0021
+ABF5 0021
 1010B 0021
 10143 0021
 10148 0021
@@ -33643,6 +33627,14 @@ A625 0021
 1015F 0021
 10173 0021
 10321 0021
+104A5 0021
+10E64 0021
+11056 0021
+1106B 0021
+110F5 0021
+1113B 0021
+111D5 0021
+116C5 0021
 12403 0021
 1240A 0021
 12410 0021
@@ -33654,31 +33646,25 @@ A625 0021
 1244D 0021
 12454 0021
 12455 0021
-111D5 0021
-116C5 0021
-1106B 0021
-11056 0021
 1D364 0021
+FF15 0021
+0F2E 0021
+1D7D3 0021
+1D7DD 0021
+1D7E7 0021
+1D7F1 0021
+1D7FB 0021
+2464 0021
+24F9 0021
+277A 0021
+2784 0021
+278E 0021
+2075 0021
+2085 0021
 0035 003F
-FF15 003F
-1D7D3 003F
-1D7DD 003F
-1D7E7 003F
-1D7F1 003F
-1D7FB 003F
-2464 003F
-24F9 003F
-277A 003F
-2784 003F
-278E 003F
-2075 003F
-2085 003F
 0665 003F
 06F5 003F
-10E64 003F
 07C5 003F
-136D 003F
-104A5 003F
 096B 003F
 09EB 003F
 0A6B 003F
@@ -33688,32 +33674,30 @@ FF15 003F
 0C6B 003F
 0CEB 003F
 0D6B 003F
-ABF5 003F
-A8D5 003F
-194B 003F
-19D5 003F
-1A85 003F
-1A95 003F
 0E55 003F
 0ED5 003F
 0F25 003F
-0F2E 003F
-1C45 003F
-A905 003F
 1045 003F
 1095 003F
-1113B 003F
+136D 003F
 17E5 003F
 17F5 003F
-AA55 003F
+1815 003F
+194B 003F
+19D5 003F
+1A85 003F
+1A95 003F
 1B55 003F
-A9D5 003F
 1BB5 003F
-1815 003F
+1C45 003F
 1C55 003F
-A625 003F
-110F5 003F
 3025 003F
+A625 003F
+A8D5 003F
+A905 003F
+A9D5 003F
+AA55 003F
+ABF5 003F
 1010B 003F
 10143 003F
 10148 003F
@@ -33721,6 +33705,14 @@ A625 003F
 1015F 003F
 10173 003F
 10321 003F
+104A5 003F
+10E64 003F
+11056 003F
+1106B 003F
+110F5 003F
+1113B 003F
+111D5 003F
+116C5 003F
 12403 003F
 1240A 003F
 12410 003F
@@ -33732,11 +33724,21 @@ A625 003F
 1244D 003F
 12454 003F
 12455 003F
-111D5 003F
-116C5 003F
-1106B 003F
-11056 003F
 1D364 003F
+FF15 003F
+0F2E 003F
+1D7D3 003F
+1D7DD 003F
+1D7E7 003F
+1D7F1 003F
+1D7FB 003F
+2464 003F
+24F9 003F
+277A 003F
+2784 003F
+278E 003F
+2075 003F
+2085 003F
 248C 0021
 248C 003F
 248C 0061
@@ -33763,129 +33765,57 @@ A625 003F
 324C 0062
 32BF 0062
 0035 0061
-0035 0041
-FF15 0061
-FF15 0041
-1D7D3 0061
-1D7DD 0061
-1D7E7 0061
-1D7F1 0061
-1D7FB 0061
-1D7D3 0041
-1D7DD 0041
-1D7E7 0041
-1D7F1 0041
-1D7FB 0041
-2464 0061
-24F9 0061
-277A 0061
-2784 0061
-278E 0061
-2464 0041
-24F9 0041
-277A 0041
-2784 0041
-278E 0041
-2075 0061
-2075 0041
-2085 0061
-2085 0041
 0665 0061
-0665 0041
 06F5 0061
-06F5 0041
-10E64 0061
-10E64 0041
 07C5 0061
-07C5 0041
-136D 0061
-136D 0041
-104A5 0061
-104A5 0041
 096B 0061
-096B 0041
 09EB 0061
-09EB 0041
 0A6B 0061
-0A6B 0041
 0AEB 0061
-0AEB 0041
 0B6B 0061
-0B6B 0041
 0BEB 0061
-0BEB 0041
 0C6B 0061
-0C6B 0041
 0CEB 0061
-0CEB 0041
 0D6B 0061
-0D6B 0041
-ABF5 0061
-ABF5 0041
-A8D5 0061
-A8D5 0041
-194B 0061
-194B 0041
-19D5 0061
-19D5 0041
-1A85 0061
-1A85 0041
-1A95 0061
-1A95 0041
 0E55 0061
-0E55 0041
 0ED5 0061
-0ED5 0041
 0F25 0061
-0F25 0041
-0F2E 0061
-0F2E 0041
-1C45 0061
-1C45 0041
-A905 0061
-A905 0041
 1045 0061
-1045 0041
 1095 0061
-1095 0041
-1113B 0061
-1113B 0041
+136D 0061
 17E5 0061
-17E5 0041
 17F5 0061
-17F5 0041
-AA55 0061
-AA55 0041
+1815 0061
+194B 0061
+19D5 0061
+1A85 0061
+1A95 0061
 1B55 0061
-1B55 0041
-A9D5 0061
-A9D5 0041
 1BB5 0061
-1BB5 0041
-1815 0061
-1815 0041
+1C45 0061
 1C55 0061
-1C55 0041
-A625 0061
-A625 0041
-110F5 0061
-110F5 0041
 3025 0061
-3025 0041
+A625 0061
+A8D5 0061
+A905 0061
+A9D5 0061
+AA55 0061
+ABF5 0061
 1010B 0061
-1010B 0041
 10143 0061
 10148 0061
 1014F 0061
 1015F 0061
 10173 0061
-10143 0041
-10148 0041
-1014F 0041
-1015F 0041
-10173 0041
 10321 0061
-10321 0041
+104A5 0061
+10E64 0061
+11056 0061
+1106B 0061
+110F5 0061
+1113B 0061
+111D5 0061
+116C5 0061
 12403 0061
 1240A 0061
 12410 0061
@@ -33897,6 +33827,59 @@ A625 0041
 1244D 0061
 12454 0061
 12455 0061
+1D364 0061
+0035 0041
+0665 0041
+06F5 0041
+07C5 0041
+096B 0041
+09EB 0041
+0A6B 0041
+0AEB 0041
+0B6B 0041
+0BEB 0041
+0C6B 0041
+0CEB 0041
+0D6B 0041
+0E55 0041
+0ED5 0041
+0F25 0041
+1045 0041
+1095 0041
+136D 0041
+17E5 0041
+17F5 0041
+1815 0041
+194B 0041
+19D5 0041
+1A85 0041
+1A95 0041
+1B55 0041
+1BB5 0041
+1C45 0041
+1C55 0041
+3025 0041
+A625 0041
+A8D5 0041
+A905 0041
+A9D5 0041
+AA55 0041
+ABF5 0041
+1010B 0041
+10143 0041
+10148 0041
+1014F 0041
+1015F 0041
+10173 0041
+10321 0041
+104A5 0041
+10E64 0041
+11056 0041
+1106B 0041
+110F5 0041
+1113B 0041
+111D5 0041
+116C5 0041
 12403 0041
 1240A 0041
 12410 0041
@@ -33908,36 +33891,39 @@ A625 0041
 1244D 0041
 12454 0041
 12455 0041
-111D5 0061
-111D5 0041
-116C5 0061
-116C5 0041
-1106B 0061
-1106B 0041
-11056 0061
-11056 0041
-1D364 0061
 1D364 0041
+FF15 0061
+FF15 0041
+0F2E 0061
+0F2E 0041
+1D7D3 0061
+1D7DD 0061
+1D7E7 0061
+1D7F1 0061
+1D7FB 0061
+1D7D3 0041
+1D7DD 0041
+1D7E7 0041
+1D7F1 0041
+1D7FB 0041
+2464 0061
+24F9 0061
+277A 0061
+2784 0061
+278E 0061
+2464 0041
+24F9 0041
+277A 0041
+2784 0041
+278E 0041
+2075 0061
+2075 0041
+2085 0061
+2085 0041
 0035 0062
-FF15 0062
-1D7D3 0062
-1D7DD 0062
-1D7E7 0062
-1D7F1 0062
-1D7FB 0062
-2464 0062
-24F9 0062
-277A 0062
-2784 0062
-278E 0062
-2075 0062
-2085 0062
 0665 0062
 06F5 0062
-10E64 0062
 07C5 0062
-136D 0062
-104A5 0062
 096B 0062
 09EB 0062
 0A6B 0062
@@ -33947,32 +33933,30 @@ FF15 0062
 0C6B 0062
 0CEB 0062
 0D6B 0062
-ABF5 0062
-A8D5 0062
-194B 0062
-19D5 0062
-1A85 0062
-1A95 0062
 0E55 0062
 0ED5 0062
 0F25 0062
-0F2E 0062
-1C45 0062
-A905 0062
 1045 0062
 1095 0062
-1113B 0062
+136D 0062
 17E5 0062
 17F5 0062
-AA55 0062
+1815 0062
+194B 0062
+19D5 0062
+1A85 0062
+1A95 0062
 1B55 0062
-A9D5 0062
 1BB5 0062
-1815 0062
+1C45 0062
 1C55 0062
-A625 0062
-110F5 0062
 3025 0062
+A625 0062
+A8D5 0062
+A905 0062
+A9D5 0062
+AA55 0062
+ABF5 0062
 1010B 0062
 10143 0062
 10148 0062
@@ -33980,6 +33964,14 @@ A625 0062
 1015F 0062
 10173 0062
 10321 0062
+104A5 0062
+10E64 0062
+11056 0062
+1106B 0062
+110F5 0062
+1113B 0062
+111D5 0062
+116C5 0062
 12403 0062
 1240A 0062
 12410 0062
@@ -33991,11 +33983,21 @@ A625 0062
 1244D 0062
 12454 0062
 12455 0062
-111D5 0062
-116C5 0062
-1106B 0062
-11056 0062
 1D364 0062
+FF15 0062
+0F2E 0062
+1D7D3 0062
+1D7DD 0062
+1D7E7 0062
+1D7F1 0062
+1D7FB 0062
+2464 0062
+24F9 0062
+277A 0062
+2784 0062
+278E 0062
+2075 0062
+2085 0062
 33E4 0021
 33E4 003F
 33E4 0061
@@ -34017,25 +34019,9 @@ A625 0062
 1F107 0041
 1F107 0062
 0036 0021
-FF16 0021
-1D7D4 0021
-1D7DE 0021
-1D7E8 0021
-1D7F2 0021
-1D7FC 0021
-2465 0021
-24FA 0021
-277B 0021
-2785 0021
-278F 0021
-2076 0021
-2086 0021
 0666 0021
 06F6 0021
-10E65 0021
 07C6 0021
-136E 0021
-104A6 0021
 096C 0021
 09EC 0021
 0A6C 0021
@@ -34045,34 +34031,40 @@ FF16 0021
 0C6C 0021
 0CEC 0021
 0D6C 0021
-ABF6 0021
-A8D6 0021
-194C 0021
-19D6 0021
-1A86 0021
-1A96 0021
 0E56 0021
 0ED6 0021
 0F26 0021
-0F2F 0021
-1C46 0021
-A906 0021
 1046 0021
 1096 0021
-1113C 0021
+136E 0021
 17E6 0021
 17F6 0021
-AA56 0021
+1816 0021
+194C 0021
+19D6 0021
+1A86 0021
+1A96 0021
 1B56 0021
-A9D6 0021
 1BB6 0021
-1816 0021
+1C46 0021
 1C56 0021
-A626 0021
-110F6 0021
+2185 0021
 3026 0021
+A626 0021
+A8D6 0021
+A906 0021
+A9D6 0021
+AA56 0021
+ABF6 0021
 1010C 0021
-2185 0021
+104A6 0021
+10E65 0021
+11057 0021
+1106C 0021
+110F6 0021
+1113C 0021
+111D6 0021
+116C6 0021
 12404 0021
 1240B 0021
 12411 0021
@@ -34080,31 +34072,25 @@ A626 0021
 12428 0021
 12440 0021
 1244E 0021
-111D6 0021
-116C6 0021
-1106C 0021
-11057 0021
 1D365 0021
+FF16 0021
+0F2F 0021
+1D7D4 0021
+1D7DE 0021
+1D7E8 0021
+1D7F2 0021
+1D7FC 0021
+2465 0021
+24FA 0021
+277B 0021
+2785 0021
+278F 0021
+2076 0021
+2086 0021
 0036 003F
-FF16 003F
-1D7D4 003F
-1D7DE 003F
-1D7E8 003F
-1D7F2 003F
-1D7FC 003F
-2465 003F
-24FA 003F
-277B 003F
-2785 003F
-278F 003F
-2076 003F
-2086 003F
 0666 003F
 06F6 003F
-10E65 003F
 07C6 003F
-136E 003F
-104A6 003F
 096C 003F
 09EC 003F
 0A6C 003F
@@ -34114,34 +34100,40 @@ FF16 003F
 0C6C 003F
 0CEC 003F
 0D6C 003F
-ABF6 003F
-A8D6 003F
-194C 003F
-19D6 003F
-1A86 003F
-1A96 003F
 0E56 003F
 0ED6 003F
 0F26 003F
-0F2F 003F
-1C46 003F
-A906 003F
 1046 003F
 1096 003F
-1113C 003F
+136E 003F
 17E6 003F
 17F6 003F
-AA56 003F
+1816 003F
+194C 003F
+19D6 003F
+1A86 003F
+1A96 003F
 1B56 003F
-A9D6 003F
 1BB6 003F
-1816 003F
+1C46 003F
 1C56 003F
-A626 003F
-110F6 003F
+2185 003F
 3026 003F
+A626 003F
+A8D6 003F
+A906 003F
+A9D6 003F
+AA56 003F
+ABF6 003F
 1010C 003F
-2185 003F
+104A6 003F
+10E65 003F
+11057 003F
+1106C 003F
+110F6 003F
+1113C 003F
+111D6 003F
+116C6 003F
 12404 003F
 1240B 003F
 12411 003F
@@ -34149,11 +34141,21 @@ A626 003F
 12428 003F
 12440 003F
 1244E 003F
-111D6 003F
-116C6 003F
-1106C 003F
-11057 003F
 1D365 003F
+FF16 003F
+0F2F 003F
+1D7D4 003F
+1D7DE 003F
+1D7E8 003F
+1D7F2 003F
+1D7FC 003F
+2465 003F
+24FA 003F
+277B 003F
+2785 003F
+278F 003F
+2076 003F
+2086 003F
 248D 0021
 248D 003F
 248D 0061
@@ -34165,119 +34167,52 @@ A626 003F
 324D 0041
 324D 0062
 0036 0061
-0036 0041
-FF16 0061
-FF16 0041
-1D7D4 0061
-1D7DE 0061
-1D7E8 0061
-1D7F2 0061
-1D7FC 0061
-1D7D4 0041
-1D7DE 0041
-1D7E8 0041
-1D7F2 0041
-1D7FC 0041
-2465 0061
-24FA 0061
-277B 0061
-2785 0061
-278F 0061
-2465 0041
-24FA 0041
-277B 0041
-2785 0041
-278F 0041
-2076 0061
-2076 0041
-2086 0061
-2086 0041
 0666 0061
-0666 0041
 06F6 0061
-06F6 0041
-10E65 0061
-10E65 0041
 07C6 0061
-07C6 0041
-136E 0061
-136E 0041
-104A6 0061
-104A6 0041
 096C 0061
-096C 0041
 09EC 0061
-09EC 0041
 0A6C 0061
-0A6C 0041
 0AEC 0061
-0AEC 0041
 0B6C 0061
-0B6C 0041
 0BEC 0061
-0BEC 0041
 0C6C 0061
-0C6C 0041
 0CEC 0061
-0CEC 0041
 0D6C 0061
-0D6C 0041
-ABF6 0061
-ABF6 0041
-A8D6 0061
-A8D6 0041
-194C 0061
-194C 0041
-19D6 0061
-19D6 0041
-1A86 0061
-1A86 0041
-1A96 0061
-1A96 0041
 0E56 0061
-0E56 0041
 0ED6 0061
-0ED6 0041
 0F26 0061
-0F26 0041
-0F2F 0061
-0F2F 0041
-1C46 0061
-1C46 0041
-A906 0061
-A906 0041
 1046 0061
-1046 0041
 1096 0061
-1096 0041
-1113C 0061
-1113C 0041
+136E 0061
 17E6 0061
-17E6 0041
 17F6 0061
-17F6 0041
-AA56 0061
-AA56 0041
+1816 0061
+194C 0061
+19D6 0061
+1A86 0061
+1A96 0061
 1B56 0061
-1B56 0041
-A9D6 0061
-A9D6 0041
 1BB6 0061
-1BB6 0041
-1816 0061
-1816 0041
+1C46 0061
 1C56 0061
-1C56 0041
-A626 0061
-A626 0041
-110F6 0061
-110F6 0041
+2185 0061
 3026 0061
-3026 0041
+A626 0061
+A8D6 0061
+A906 0061
+A9D6 0061
+AA56 0061
+ABF6 0061
 1010C 0061
-1010C 0041
-2185 0061
-2185 0041
+104A6 0061
+10E65 0061
+11057 0061
+1106C 0061
+110F6 0061
+1113C 0061
+111D6 0061
+116C6 0061
 12404 0061
 1240B 0061
 12411 0061
@@ -34285,6 +34220,54 @@ A626 0041
 12428 0061
 12440 0061
 1244E 0061
+1D365 0061
+0036 0041
+0666 0041
+06F6 0041
+07C6 0041
+096C 0041
+09EC 0041
+0A6C 0041
+0AEC 0041
+0B6C 0041
+0BEC 0041
+0C6C 0041
+0CEC 0041
+0D6C 0041
+0E56 0041
+0ED6 0041
+0F26 0041
+1046 0041
+1096 0041
+136E 0041
+17E6 0041
+17F6 0041
+1816 0041
+194C 0041
+19D6 0041
+1A86 0041
+1A96 0041
+1B56 0041
+1BB6 0041
+1C46 0041
+1C56 0041
+2185 0041
+3026 0041
+A626 0041
+A8D6 0041
+A906 0041
+A9D6 0041
+AA56 0041
+ABF6 0041
+1010C 0041
+104A6 0041
+10E65 0041
+11057 0041
+1106C 0041
+110F6 0041
+1113C 0041
+111D6 0041
+116C6 0041
 12404 0041
 1240B 0041
 12411 0041
@@ -34292,36 +34275,39 @@ A626 0041
 12428 0041
 12440 0041
 1244E 0041
-111D6 0061
-111D6 0041
-116C6 0061
-116C6 0041
-1106C 0061
-1106C 0041
-11057 0061
-11057 0041
-1D365 0061
 1D365 0041
+FF16 0061
+FF16 0041
+0F2F 0061
+0F2F 0041
+1D7D4 0061
+1D7DE 0061
+1D7E8 0061
+1D7F2 0061
+1D7FC 0061
+1D7D4 0041
+1D7DE 0041
+1D7E8 0041
+1D7F2 0041
+1D7FC 0041
+2465 0061
+24FA 0061
+277B 0061
+2785 0061
+278F 0061
+2465 0041
+24FA 0041
+277B 0041
+2785 0041
+278F 0041
+2076 0061
+2076 0041
+2086 0061
+2086 0041
 0036 0062
-FF16 0062
-1D7D4 0062
-1D7DE 0062
-1D7E8 0062
-1D7F2 0062
-1D7FC 0062
-2465 0062
-24FA 0062
-277B 0062
-2785 0062
-278F 0062
-2076 0062
-2086 0062
 0666 0062
 06F6 0062
-10E65 0062
 07C6 0062
-136E 0062
-104A6 0062
 096C 0062
 09EC 0062
 0A6C 0062
@@ -34331,34 +34317,40 @@ FF16 0062
 0C6C 0062
 0CEC 0062
 0D6C 0062
-ABF6 0062
-A8D6 0062
-194C 0062
-19D6 0062
-1A86 0062
-1A96 0062
 0E56 0062
 0ED6 0062
 0F26 0062
-0F2F 0062
-1C46 0062
-A906 0062
 1046 0062
 1096 0062
-1113C 0062
+136E 0062
 17E6 0062
 17F6 0062
-AA56 0062
+1816 0062
+194C 0062
+19D6 0062
+1A86 0062
+1A96 0062
 1B56 0062
-A9D6 0062
 1BB6 0062
-1816 0062
+1C46 0062
 1C56 0062
-A626 0062
-110F6 0062
+2185 0062
 3026 0062
+A626 0062
+A8D6 0062
+A906 0062
+A9D6 0062
+AA56 0062
+ABF6 0062
 1010C 0062
-2185 0062
+104A6 0062
+10E65 0062
+11057 0062
+1106C 0062
+110F6 0062
+1113C 0062
+111D6 0062
+116C6 0062
 12404 0062
 1240B 0062
 12411 0062
@@ -34366,11 +34358,21 @@ A626 0062
 12428 0062
 12440 0062
 1244E 0062
-111D6 0062
-116C6 0062
-1106C 0062
-11057 0062
 1D365 0062
+FF16 0062
+0F2F 0062
+1D7D4 0062
+1D7DE 0062
+1D7E8 0062
+1D7F2 0062
+1D7FC 0062
+2465 0062
+24FA 0062
+277B 0062
+2785 0062
+278F 0062
+2076 0062
+2086 0062
 33E5 0021
 33E5 003F
 33E5 0061
@@ -34392,25 +34394,9 @@ A626 0062
 1F108 0041
 1F108 0062
 0037 0021
-FF17 0021
-1D7D5 0021
-1D7DF 0021
-1D7E9 0021
-1D7F3 0021
-1D7FD 0021
-2466 0021
-24FB 0021
-277C 0021
-2786 0021
-2790 0021
-2077 0021
-2087 0021
 0667 0021
 06F7 0021
-10E66 0021
 07C7 0021
-136F 0021
-104A7 0021
 096D 0021
 09ED 0021
 0A6D 0021
@@ -34420,33 +34406,39 @@ FF17 0021
 0C6D 0021
 0CED 0021
 0D6D 0021
-ABF7 0021
-A8D7 0021
-194D 0021
-19D7 0021
-1A87 0021
-1A97 0021
 0E57 0021
 0ED7 0021
 0F27 0021
-0F30 0021
-1C47 0021
-A907 0021
 1047 0021
 1097 0021
-1113D 0021
+136F 0021
 17E7 0021
 17F7 0021
-AA57 0021
+1817 0021
+194D 0021
+19D7 0021
+1A87 0021
+1A97 0021
 1B57 0021
-A9D7 0021
 1BB7 0021
-1817 0021
+1C47 0021
 1C57 0021
-A627 0021
-110F7 0021
 3027 0021
+A627 0021
+A8D7 0021
+A907 0021
+A9D7 0021
+AA57 0021
+ABF7 0021
 1010D 0021
+104A7 0021
+10E66 0021
+11058 0021
+1106D 0021
+110F7 0021
+1113D 0021
+111D7 0021
+116C7 0021
 12405 0021
 1240C 0021
 12412 0021
@@ -34455,31 +34447,25 @@ A627 0021
 12441 0021
 12442 0021
 12443 0021
-111D7 0021
-116C7 0021
-1106D 0021
-11058 0021
 1D366 0021
+FF17 0021
+0F30 0021
+1D7D5 0021
+1D7DF 0021
+1D7E9 0021
+1D7F3 0021
+1D7FD 0021
+2466 0021
+24FB 0021
+277C 0021
+2786 0021
+2790 0021
+2077 0021
+2087 0021
 0037 003F
-FF17 003F
-1D7D5 003F
-1D7DF 003F
-1D7E9 003F
-1D7F3 003F
-1D7FD 003F
-2466 003F
-24FB 003F
-277C 003F
-2786 003F
-2790 003F
-2077 003F
-2087 003F
 0667 003F
 06F7 003F
-10E66 003F
 07C7 003F
-136F 003F
-104A7 003F
 096D 003F
 09ED 003F
 0A6D 003F
@@ -34489,33 +34475,39 @@ FF17 003F
 0C6D 003F
 0CED 003F
 0D6D 003F
-ABF7 003F
-A8D7 003F
-194D 003F
-19D7 003F
-1A87 003F
-1A97 003F
 0E57 003F
 0ED7 003F
 0F27 003F
-0F30 003F
-1C47 003F
-A907 003F
 1047 003F
 1097 003F
-1113D 003F
+136F 003F
 17E7 003F
 17F7 003F
-AA57 003F
+1817 003F
+194D 003F
+19D7 003F
+1A87 003F
+1A97 003F
 1B57 003F
-A9D7 003F
 1BB7 003F
-1817 003F
+1C47 003F
 1C57 003F
-A627 003F
-110F7 003F
 3027 003F
+A627 003F
+A8D7 003F
+A907 003F
+A9D7 003F
+AA57 003F
+ABF7 003F
 1010D 003F
+104A7 003F
+10E66 003F
+11058 003F
+1106D 003F
+110F7 003F
+1113D 003F
+111D7 003F
+116C7 003F
 12405 003F
 1240C 003F
 12412 003F
@@ -34524,11 +34516,21 @@ A627 003F
 12441 003F
 12442 003F
 12443 003F
-111D7 003F
-116C7 003F
-1106D 003F
-11058 003F
 1D366 003F
+FF17 003F
+0F30 003F
+1D7D5 003F
+1D7DF 003F
+1D7E9 003F
+1D7F3 003F
+1D7FD 003F
+2466 003F
+24FB 003F
+277C 003F
+2786 003F
+2790 003F
+2077 003F
+2087 003F
 248E 0021
 248E 003F
 248E 0061
@@ -34545,117 +34547,51 @@ A627 003F
 324E 0041
 324E 0062
 0037 0061
-0037 0041
-FF17 0061
-FF17 0041
-1D7D5 0061
-1D7DF 0061
-1D7E9 0061
-1D7F3 0061
-1D7FD 0061
-1D7D5 0041
-1D7DF 0041
-1D7E9 0041
-1D7F3 0041
-1D7FD 0041
-2466 0061
-24FB 0061
-277C 0061
-2786 0061
-2790 0061
-2466 0041
-24FB 0041
-277C 0041
-2786 0041
-2790 0041
-2077 0061
-2077 0041
-2087 0061
-2087 0041
 0667 0061
-0667 0041
 06F7 0061
-06F7 0041
-10E66 0061
-10E66 0041
 07C7 0061
-07C7 0041
-136F 0061
-136F 0041
-104A7 0061
-104A7 0041
 096D 0061
-096D 0041
 09ED 0061
-09ED 0041
 0A6D 0061
-0A6D 0041
 0AED 0061
-0AED 0041
 0B6D 0061
-0B6D 0041
 0BED 0061
-0BED 0041
 0C6D 0061
-0C6D 0041
 0CED 0061
-0CED 0041
 0D6D 0061
-0D6D 0041
-ABF7 0061
-ABF7 0041
-A8D7 0061
-A8D7 0041
-194D 0061
-194D 0041
-19D7 0061
-19D7 0041
-1A87 0061
-1A87 0041
-1A97 0061
-1A97 0041
 0E57 0061
-0E57 0041
 0ED7 0061
-0ED7 0041
 0F27 0061
-0F27 0041
-0F30 0061
-0F30 0041
-1C47 0061
-1C47 0041
-A907 0061
-A907 0041
 1047 0061
-1047 0041
 1097 0061
-1097 0041
-1113D 0061
-1113D 0041
+136F 0061
 17E7 0061
-17E7 0041
 17F7 0061
-17F7 0041
-AA57 0061
-AA57 0041
+1817 0061
+194D 0061
+19D7 0061
+1A87 0061
+1A97 0061
 1B57 0061
-1B57 0041
-A9D7 0061
-A9D7 0041
 1BB7 0061
-1BB7 0041
-1817 0061
-1817 0041
+1C47 0061
 1C57 0061
-1C57 0041
-A627 0061
-A627 0041
-110F7 0061
-110F7 0041
 3027 0061
-3027 0041
+A627 0061
+A8D7 0061
+A907 0061
+A9D7 0061
+AA57 0061
+ABF7 0061
 1010D 0061
-1010D 0041
+104A7 0061
+10E66 0061
+11058 0061
+1106D 0061
+110F7 0061
+1113D 0061
+111D7 0061
+116C7 0061
 12405 0061
 1240C 0061
 12412 0061
@@ -34664,6 +34600,53 @@ A627 0041
 12441 0061
 12442 0061
 12443 0061
+1D366 0061
+0037 0041
+0667 0041
+06F7 0041
+07C7 0041
+096D 0041
+09ED 0041
+0A6D 0041
+0AED 0041
+0B6D 0041
+0BED 0041
+0C6D 0041
+0CED 0041
+0D6D 0041
+0E57 0041
+0ED7 0041
+0F27 0041
+1047 0041
+1097 0041
+136F 0041
+17E7 0041
+17F7 0041
+1817 0041
+194D 0041
+19D7 0041
+1A87 0041
+1A97 0041
+1B57 0041
+1BB7 0041
+1C47 0041
+1C57 0041
+3027 0041
+A627 0041
+A8D7 0041
+A907 0041
+A9D7 0041
+AA57 0041
+ABF7 0041
+1010D 0041
+104A7 0041
+10E66 0041
+11058 0041
+1106D 0041
+110F7 0041
+1113D 0041
+111D7 0041
+116C7 0041
 12405 0041
 1240C 0041
 12412 0041
@@ -34672,36 +34655,39 @@ A627 0041
 12441 0041
 12442 0041
 12443 0041
-111D7 0061
-111D7 0041
-116C7 0061
-116C7 0041
-1106D 0061
-1106D 0041
-11058 0061
-11058 0041
-1D366 0061
 1D366 0041
+FF17 0061
+FF17 0041
+0F30 0061
+0F30 0041
+1D7D5 0061
+1D7DF 0061
+1D7E9 0061
+1D7F3 0061
+1D7FD 0061
+1D7D5 0041
+1D7DF 0041
+1D7E9 0041
+1D7F3 0041
+1D7FD 0041
+2466 0061
+24FB 0061
+277C 0061
+2786 0061
+2790 0061
+2466 0041
+24FB 0041
+277C 0041
+2786 0041
+2790 0041
+2077 0061
+2077 0041
+2087 0061
+2087 0041
 0037 0062
-FF17 0062
-1D7D5 0062
-1D7DF 0062
-1D7E9 0062
-1D7F3 0062
-1D7FD 0062
-2466 0062
-24FB 0062
-277C 0062
-2786 0062
-2790 0062
-2077 0062
-2087 0062
 0667 0062
 06F7 0062
-10E66 0062
 07C7 0062
-136F 0062
-104A7 0062
 096D 0062
 09ED 0062
 0A6D 0062
@@ -34711,33 +34697,39 @@ FF17 0062
 0C6D 0062
 0CED 0062
 0D6D 0062
-ABF7 0062
-A8D7 0062
-194D 0062
-19D7 0062
-1A87 0062
-1A97 0062
 0E57 0062
 0ED7 0062
 0F27 0062
-0F30 0062
-1C47 0062
-A907 0062
 1047 0062
 1097 0062
-1113D 0062
+136F 0062
 17E7 0062
 17F7 0062
-AA57 0062
+1817 0062
+194D 0062
+19D7 0062
+1A87 0062
+1A97 0062
 1B57 0062
-A9D7 0062
 1BB7 0062
-1817 0062
+1C47 0062
 1C57 0062
-A627 0062
-110F7 0062
 3027 0062
+A627 0062
+A8D7 0062
+A907 0062
+A9D7 0062
+AA57 0062
+ABF7 0062
 1010D 0062
+104A7 0062
+10E66 0062
+11058 0062
+1106D 0062
+110F7 0062
+1113D 0062
+111D7 0062
+116C7 0062
 12405 0062
 1240C 0062
 12412 0062
@@ -34746,11 +34738,21 @@ A627 0062
 12441 0062
 12442 0062
 12443 0062
-111D7 0062
-116C7 0062
-1106D 0062
-11058 0062
 1D366 0062
+FF17 0062
+0F30 0062
+1D7D5 0062
+1D7DF 0062
+1D7E9 0062
+1D7F3 0062
+1D7FD 0062
+2466 0062
+24FB 0062
+277C 0062
+2786 0062
+2790 0062
+2077 0062
+2087 0062
 33E6 0021
 33E6 003F
 33E6 0061
@@ -34772,25 +34774,9 @@ A627 0062
 1F109 0041
 1F109 0062
 0038 0021
-FF18 0021
-1D7D6 0021
-1D7E0 0021
-1D7EA 0021
-1D7F4 0021
-1D7FE 0021
-2467 0021
-24FC 0021
-277D 0021
-2787 0021
-2791 0021
-2078 0021
-2088 0021
 0668 0021
 06F8 0021
-10E67 0021
 07C8 0021
-1370 0021
-104A8 0021
 096E 0021
 09EE 0021
 0A6E 0021
@@ -34800,33 +34786,39 @@ FF18 0021
 0C6E 0021
 0CEE 0021
 0D6E 0021
-ABF8 0021
-A8D8 0021
-194E 0021
-19D8 0021
-1A88 0021
-1A98 0021
 0E58 0021
 0ED8 0021
 0F28 0021
-0F31 0021
-1C48 0021
-A908 0021
 1048 0021
 1098 0021
-1113E 0021
+1370 0021
 17E8 0021
 17F8 0021
-AA58 0021
+1818 0021
+194E 0021
+19D8 0021
+1A88 0021
+1A98 0021
 1B58 0021
-A9D8 0021
 1BB8 0021
-1818 0021
+1C48 0021
 1C58 0021
-A628 0021
-110F8 0021
 3028 0021
+A628 0021
+A8D8 0021
+A908 0021
+A9D8 0021
+AA58 0021
+ABF8 0021
 1010E 0021
+104A8 0021
+10E67 0021
+11059 0021
+1106E 0021
+110F8 0021
+1113E 0021
+111D8 0021
+116C8 0021
 12406 0021
 1240D 0021
 12413 0021
@@ -34834,31 +34826,25 @@ A628 0021
 1242A 0021
 12444 0021
 12445 0021
-111D8 0021
-116C8 0021
-1106E 0021
-11059 0021
 1D367 0021
+FF18 0021
+0F31 0021
+1D7D6 0021
+1D7E0 0021
+1D7EA 0021
+1D7F4 0021
+1D7FE 0021
+2467 0021
+24FC 0021
+277D 0021
+2787 0021
+2791 0021
+2078 0021
+2088 0021
 0038 003F
-FF18 003F
-1D7D6 003F
-1D7E0 003F
-1D7EA 003F
-1D7F4 003F
-1D7FE 003F
-2467 003F
-24FC 003F
-277D 003F
-2787 003F
-2791 003F
-2078 003F
-2088 003F
 0668 003F
 06F8 003F
-10E67 003F
 07C8 003F
-1370 003F
-104A8 003F
 096E 003F
 09EE 003F
 0A6E 003F
@@ -34868,33 +34854,39 @@ FF18 003F
 0C6E 003F
 0CEE 003F
 0D6E 003F
-ABF8 003F
-A8D8 003F
-194E 003F
-19D8 003F
-1A88 003F
-1A98 003F
 0E58 003F
 0ED8 003F
 0F28 003F
-0F31 003F
-1C48 003F
-A908 003F
 1048 003F
 1098 003F
-1113E 003F
+1370 003F
 17E8 003F
 17F8 003F
-AA58 003F
+1818 003F
+194E 003F
+19D8 003F
+1A88 003F
+1A98 003F
 1B58 003F
-A9D8 003F
 1BB8 003F
-1818 003F
+1C48 003F
 1C58 003F
-A628 003F
-110F8 003F
 3028 003F
+A628 003F
+A8D8 003F
+A908 003F
+A9D8 003F
+AA58 003F
+ABF8 003F
 1010E 003F
+104A8 003F
+10E67 003F
+11059 003F
+1106E 003F
+110F8 003F
+1113E 003F
+111D8 003F
+116C8 003F
 12406 003F
 1240D 003F
 12413 003F
@@ -34902,11 +34894,21 @@ A628 003F
 1242A 003F
 12444 003F
 12445 003F
-111D8 003F
-116C8 003F
-1106E 003F
-11059 003F
 1D367 003F
+FF18 003F
+0F31 003F
+1D7D6 003F
+1D7E0 003F
+1D7EA 003F
+1D7F4 003F
+1D7FE 003F
+2467 003F
+24FC 003F
+277D 003F
+2787 003F
+2791 003F
+2078 003F
+2088 003F
 248F 0021
 248F 003F
 248F 0061
@@ -34918,117 +34920,51 @@ A628 003F
 324F 0041
 324F 0062
 0038 0061
-0038 0041
-FF18 0061
-FF18 0041
-1D7D6 0061
-1D7E0 0061
-1D7EA 0061
-1D7F4 0061
-1D7FE 0061
-1D7D6 0041
-1D7E0 0041
-1D7EA 0041
-1D7F4 0041
-1D7FE 0041
-2467 0061
-24FC 0061
-277D 0061
-2787 0061
-2791 0061
-2467 0041
-24FC 0041
-277D 0041
-2787 0041
-2791 0041
-2078 0061
-2078 0041
-2088 0061
-2088 0041
 0668 0061
-0668 0041
 06F8 0061
-06F8 0041
-10E67 0061
-10E67 0041
 07C8 0061
-07C8 0041
-1370 0061
-1370 0041
-104A8 0061
-104A8 0041
 096E 0061
-096E 0041
 09EE 0061
-09EE 0041
 0A6E 0061
-0A6E 0041
 0AEE 0061
-0AEE 0041
 0B6E 0061
-0B6E 0041
 0BEE 0061
-0BEE 0041
 0C6E 0061
-0C6E 0041
 0CEE 0061
-0CEE 0041
 0D6E 0061
-0D6E 0041
-ABF8 0061
-ABF8 0041
-A8D8 0061
-A8D8 0041
-194E 0061
-194E 0041
-19D8 0061
-19D8 0041
-1A88 0061
-1A88 0041
-1A98 0061
-1A98 0041
 0E58 0061
-0E58 0041
 0ED8 0061
-0ED8 0041
 0F28 0061
-0F28 0041
-0F31 0061
-0F31 0041
-1C48 0061
-1C48 0041
-A908 0061
-A908 0041
 1048 0061
-1048 0041
 1098 0061
-1098 0041
-1113E 0061
-1113E 0041
+1370 0061
 17E8 0061
-17E8 0041
 17F8 0061
-17F8 0041
-AA58 0061
-AA58 0041
+1818 0061
+194E 0061
+19D8 0061
+1A88 0061
+1A98 0061
 1B58 0061
-1B58 0041
-A9D8 0061
-A9D8 0041
 1BB8 0061
-1BB8 0041
-1818 0061
-1818 0041
+1C48 0061
 1C58 0061
-1C58 0041
-A628 0061
-A628 0041
-110F8 0061
-110F8 0041
 3028 0061
-3028 0041
+A628 0061
+A8D8 0061
+A908 0061
+A9D8 0061
+AA58 0061
+ABF8 0061
 1010E 0061
-1010E 0041
+104A8 0061
+10E67 0061
+11059 0061
+1106E 0061
+110F8 0061
+1113E 0061
+111D8 0061
+116C8 0061
 12406 0061
 1240D 0061
 12413 0061
@@ -35036,6 +34972,53 @@ A628 0041
 1242A 0061
 12444 0061
 12445 0061
+1D367 0061
+0038 0041
+0668 0041
+06F8 0041
+07C8 0041
+096E 0041
+09EE 0041
+0A6E 0041
+0AEE 0041
+0B6E 0041
+0BEE 0041
+0C6E 0041
+0CEE 0041
+0D6E 0041
+0E58 0041
+0ED8 0041
+0F28 0041
+1048 0041
+1098 0041
+1370 0041
+17E8 0041
+17F8 0041
+1818 0041
+194E 0041
+19D8 0041
+1A88 0041
+1A98 0041
+1B58 0041
+1BB8 0041
+1C48 0041
+1C58 0041
+3028 0041
+A628 0041
+A8D8 0041
+A908 0041
+A9D8 0041
+AA58 0041
+ABF8 0041
+1010E 0041
+104A8 0041
+10E67 0041
+11059 0041
+1106E 0041
+110F8 0041
+1113E 0041
+111D8 0041
+116C8 0041
 12406 0041
 1240D 0041
 12413 0041
@@ -35043,36 +35026,39 @@ A628 0041
 1242A 0041
 12444 0041
 12445 0041
-111D8 0061
-111D8 0041
-116C8 0061
-116C8 0041
-1106E 0061
-1106E 0041
-11059 0061
-11059 0041
-1D367 0061
 1D367 0041
+FF18 0061
+FF18 0041
+0F31 0061
+0F31 0041
+1D7D6 0061
+1D7E0 0061
+1D7EA 0061
+1D7F4 0061
+1D7FE 0061
+1D7D6 0041
+1D7E0 0041
+1D7EA 0041
+1D7F4 0041
+1D7FE 0041
+2467 0061
+24FC 0061
+277D 0061
+2787 0061
+2791 0061
+2467 0041
+24FC 0041
+277D 0041
+2787 0041
+2791 0041
+2078 0061
+2078 0041
+2088 0061
+2088 0041
 0038 0062
-FF18 0062
-1D7D6 0062
-1D7E0 0062
-1D7EA 0062
-1D7F4 0062
-1D7FE 0062
-2467 0062
-24FC 0062
-277D 0062
-2787 0062
-2791 0062
-2078 0062
-2088 0062
 0668 0062
 06F8 0062
-10E67 0062
 07C8 0062
-1370 0062
-104A8 0062
 096E 0062
 09EE 0062
 0A6E 0062
@@ -35082,33 +35068,39 @@ FF18 0062
 0C6E 0062
 0CEE 0062
 0D6E 0062
-ABF8 0062
-A8D8 0062
-194E 0062
-19D8 0062
-1A88 0062
-1A98 0062
 0E58 0062
 0ED8 0062
 0F28 0062
-0F31 0062
-1C48 0062
-A908 0062
 1048 0062
 1098 0062
-1113E 0062
+1370 0062
 17E8 0062
 17F8 0062
-AA58 0062
+1818 0062
+194E 0062
+19D8 0062
+1A88 0062
+1A98 0062
 1B58 0062
-A9D8 0062
 1BB8 0062
-1818 0062
+1C48 0062
 1C58 0062
-A628 0062
-110F8 0062
 3028 0062
+A628 0062
+A8D8 0062
+A908 0062
+A9D8 0062
+AA58 0062
+ABF8 0062
 1010E 0062
+104A8 0062
+10E67 0062
+11059 0062
+1106E 0062
+110F8 0062
+1113E 0062
+111D8 0062
+116C8 0062
 12406 0062
 1240D 0062
 12413 0062
@@ -35116,11 +35108,21 @@ A628 0062
 1242A 0062
 12444 0062
 12445 0062
-111D8 0062
-116C8 0062
-1106E 0062
-11059 0062
 1D367 0062
+FF18 0062
+0F31 0062
+1D7D6 0062
+1D7E0 0062
+1D7EA 0062
+1D7F4 0062
+1D7FE 0062
+2467 0062
+24FC 0062
+277D 0062
+2787 0062
+2791 0062
+2078 0062
+2088 0062
 33E7 0021
 33E7 003F
 33E7 0061
@@ -35142,25 +35144,9 @@ A628 0062
 1F10A 0041
 1F10A 0062
 0039 0021
-FF19 0021
-1D7D7 0021
-1D7E1 0021
-1D7EB 0021
-1D7F5 0021
-1D7FF 0021
-2468 0021
-24FD 0021
-277E 0021
-2788 0021
-2792 0021
-2079 0021
-2089 0021
 0669 0021
 06F9 0021
-10E68 0021
 07C9 0021
-1371 0021
-104A9 0021
 096F 0021
 09EF 0021
 0A6F 0021
@@ -35170,33 +35156,39 @@ FF19 0021
 0C6F 0021
 0CEF 0021
 0D6F 0021
-ABF9 0021
-A8D9 0021
-194F 0021
-19D9 0021
-1A89 0021
-1A99 0021
 0E59 0021
 0ED9 0021
 0F29 0021
-0F32 0021
-1C49 0021
-A909 0021
 1049 0021
 1099 0021
-1113F 0021
+1371 0021
 17E9 0021
 17F9 0021
-AA59 0021
+1819 0021
+194F 0021
+19D9 0021
+1A89 0021
+1A99 0021
 1B59 0021
-A9D9 0021
 1BB9 0021
-1819 0021
+1C49 0021
 1C59 0021
-A629 0021
-110F9 0021
 3029 0021
+A629 0021
+A8D9 0021
+A909 0021
+A9D9 0021
+AA59 0021
+ABF9 0021
 1010F 0021
+104A9 0021
+10E68 0021
+1105A 0021
+1106F 0021
+110F9 0021
+1113F 0021
+111D9 0021
+116C9 0021
 12407 0021
 1240E 0021
 12414 0021
@@ -35206,31 +35198,25 @@ A629 0021
 12447 0021
 12448 0021
 12449 0021
-111D9 0021
-116C9 0021
-1106F 0021
-1105A 0021
 1D368 0021
+FF19 0021
+0F32 0021
+1D7D7 0021
+1D7E1 0021
+1D7EB 0021
+1D7F5 0021
+1D7FF 0021
+2468 0021
+24FD 0021
+277E 0021
+2788 0021
+2792 0021
+2079 0021
+2089 0021
 0039 003F
-FF19 003F
-1D7D7 003F
-1D7E1 003F
-1D7EB 003F
-1D7F5 003F
-1D7FF 003F
-2468 003F
-24FD 003F
-277E 003F
-2788 003F
-2792 003F
-2079 003F
-2089 003F
 0669 003F
 06F9 003F
-10E68 003F
 07C9 003F
-1371 003F
-104A9 003F
 096F 003F
 09EF 003F
 0A6F 003F
@@ -35240,33 +35226,39 @@ FF19 003F
 0C6F 003F
 0CEF 003F
 0D6F 003F
-ABF9 003F
-A8D9 003F
-194F 003F
-19D9 003F
-1A89 003F
-1A99 003F
 0E59 003F
 0ED9 003F
 0F29 003F
-0F32 003F
-1C49 003F
-A909 003F
 1049 003F
 1099 003F
-1113F 003F
+1371 003F
 17E9 003F
 17F9 003F
-AA59 003F
+1819 003F
+194F 003F
+19D9 003F
+1A89 003F
+1A99 003F
 1B59 003F
-A9D9 003F
 1BB9 003F
-1819 003F
+1C49 003F
 1C59 003F
-A629 003F
-110F9 003F
 3029 003F
+A629 003F
+A8D9 003F
+A909 003F
+A9D9 003F
+AA59 003F
+ABF9 003F
 1010F 003F
+104A9 003F
+10E68 003F
+1105A 003F
+1106F 003F
+110F9 003F
+1113F 003F
+111D9 003F
+116C9 003F
 12407 003F
 1240E 003F
 12414 003F
@@ -35276,20 +35268,142 @@ A629 003F
 12447 003F
 12448 003F
 12449 003F
-111D9 003F
-116C9 003F
-1106F 003F
-1105A 003F
 1D368 003F
+FF19 003F
+0F32 003F
+1D7D7 003F
+1D7E1 003F
+1D7EB 003F
+1D7F5 003F
+1D7FF 003F
+2468 003F
+24FD 003F
+277E 003F
+2788 003F
+2792 003F
+2079 003F
+2089 003F
 2490 0021
 2490 003F
 2490 0061
 2490 0041
 2490 0062
 0039 0061
+0669 0061
+06F9 0061
+07C9 0061
+096F 0061
+09EF 0061
+0A6F 0061
+0AEF 0061
+0B6F 0061
+0BEF 0061
+0C6F 0061
+0CEF 0061
+0D6F 0061
+0E59 0061
+0ED9 0061
+0F29 0061
+1049 0061
+1099 0061
+1371 0061
+17E9 0061
+17F9 0061
+1819 0061
+194F 0061
+19D9 0061
+1A89 0061
+1A99 0061
+1B59 0061
+1BB9 0061
+1C49 0061
+1C59 0061
+3029 0061
+A629 0061
+A8D9 0061
+A909 0061
+A9D9 0061
+AA59 0061
+ABF9 0061
+1010F 0061
+104A9 0061
+10E68 0061
+1105A 0061
+1106F 0061
+110F9 0061
+1113F 0061
+111D9 0061
+116C9 0061
+12407 0061
+1240E 0061
+12414 0061
+1241D 0061
+1242B 0061
+12446 0061
+12447 0061
+12448 0061
+12449 0061
+1D368 0061
 0039 0041
+0669 0041
+06F9 0041
+07C9 0041
+096F 0041
+09EF 0041
+0A6F 0041
+0AEF 0041
+0B6F 0041
+0BEF 0041
+0C6F 0041
+0CEF 0041
+0D6F 0041
+0E59 0041
+0ED9 0041
+0F29 0041
+1049 0041
+1099 0041
+1371 0041
+17E9 0041
+17F9 0041
+1819 0041
+194F 0041
+19D9 0041
+1A89 0041
+1A99 0041
+1B59 0041
+1BB9 0041
+1C49 0041
+1C59 0041
+3029 0041
+A629 0041
+A8D9 0041
+A909 0041
+A9D9 0041
+AA59 0041
+ABF9 0041
+1010F 0041
+104A9 0041
+10E68 0041
+1105A 0041
+1106F 0041
+110F9 0041
+1113F 0041
+111D9 0041
+116C9 0041
+12407 0041
+1240E 0041
+12414 0041
+1241D 0041
+1242B 0041
+12446 0041
+12447 0041
+12448 0041
+12449 0041
+1D368 0041
 FF19 0061
 FF19 0041
+0F32 0061
+0F32 0041
 1D7D7 0061
 1D7E1 0061
 1D7EB 0061
@@ -35314,138 +35428,10 @@ FF19 0041
 2079 0041
 2089 0061
 2089 0041
-0669 0061
-0669 0041
-06F9 0061
-06F9 0041
-10E68 0061
-10E68 0041
-07C9 0061
-07C9 0041
-1371 0061
-1371 0041
-104A9 0061
-104A9 0041
-096F 0061
-096F 0041
-09EF 0061
-09EF 0041
-0A6F 0061
-0A6F 0041
-0AEF 0061
-0AEF 0041
-0B6F 0061
-0B6F 0041
-0BEF 0061
-0BEF 0041
-0C6F 0061
-0C6F 0041
-0CEF 0061
-0CEF 0041
-0D6F 0061
-0D6F 0041
-ABF9 0061
-ABF9 0041
-A8D9 0061
-A8D9 0041
-194F 0061
-194F 0041
-19D9 0061
-19D9 0041
-1A89 0061
-1A89 0041
-1A99 0061
-1A99 0041
-0E59 0061
-0E59 0041
-0ED9 0061
-0ED9 0041
-0F29 0061
-0F29 0041
-0F32 0061
-0F32 0041
-1C49 0061
-1C49 0041
-A909 0061
-A909 0041
-1049 0061
-1049 0041
-1099 0061
-1099 0041
-1113F 0061
-1113F 0041
-17E9 0061
-17E9 0041
-17F9 0061
-17F9 0041
-AA59 0061
-AA59 0041
-1B59 0061
-1B59 0041
-A9D9 0061
-A9D9 0041
-1BB9 0061
-1BB9 0041
-1819 0061
-1819 0041
-1C59 0061
-1C59 0041
-A629 0061
-A629 0041
-110F9 0061
-110F9 0041
-3029 0061
-3029 0041
-1010F 0061
-1010F 0041
-12407 0061
-1240E 0061
-12414 0061
-1241D 0061
-1242B 0061
-12446 0061
-12447 0061
-12448 0061
-12449 0061
-12407 0041
-1240E 0041
-12414 0041
-1241D 0041
-1242B 0041
-12446 0041
-12447 0041
-12448 0041
-12449 0041
-111D9 0061
-111D9 0041
-116C9 0061
-116C9 0041
-1106F 0061
-1106F 0041
-1105A 0061
-1105A 0041
-1D368 0061
-1D368 0041
 0039 0062
-FF19 0062
-1D7D7 0062
-1D7E1 0062
-1D7EB 0062
-1D7F5 0062
-1D7FF 0062
-2468 0062
-24FD 0062
-277E 0062
-2788 0062
-2792 0062
-2079 0062
-2089 0062
 0669 0062
 06F9 0062
-10E68 0062
 07C9 0062
-1371 0062
-104A9 0062
 096F 0062
 09EF 0062
 0A6F 0062
@@ -35455,33 +35441,39 @@ FF19 0062
 0C6F 0062
 0CEF 0062
 0D6F 0062
-ABF9 0062
-A8D9 0062
-194F 0062
-19D9 0062
-1A89 0062
-1A99 0062
 0E59 0062
 0ED9 0062
 0F29 0062
-0F32 0062
-1C49 0062
-A909 0062
 1049 0062
 1099 0062
-1113F 0062
+1371 0062
 17E9 0062
 17F9 0062
-AA59 0062
+1819 0062
+194F 0062
+19D9 0062
+1A89 0062
+1A99 0062
 1B59 0062
-A9D9 0062
 1BB9 0062
-1819 0062
+1C49 0062
 1C59 0062
-A629 0062
-110F9 0062
 3029 0062
+A629 0062
+A8D9 0062
+A909 0062
+A9D9 0062
+AA59 0062
+ABF9 0062
 1010F 0062
+104A9 0062
+10E68 0062
+1105A 0062
+1106F 0062
+110F9 0062
+1113F 0062
+111D9 0062
+116C9 0062
 12407 0062
 1240E 0062
 12414 0062
@@ -35491,11 +35483,21 @@ A629 0062
 12447 0062
 12448 0062
 12449 0062
-111D9 0062
-116C9 0062
-1106F 0062
-1105A 0062
 1D368 0062
+FF19 0062
+0F32 0062
+1D7D7 0062
+1D7E1 0062
+1D7EB 0062
+1D7F5 0062
+1D7FF 0062
+2468 0062
+24FD 0062
+277E 0062
+2788 0062
+2792 0062
+2079 0062
+2089 0062
 33E8 0021
 33E8 003F
 33E8 0061
@@ -35624,6 +35626,7 @@ A629 0062
 0618 0061
 0619 0061
 061A 0061
+061C 0061
 0640 0061
 06D6 0061
 06D7 0061
@@ -35681,6 +35684,7 @@ A629 0062
 180B 0061
 180C 0061
 180D 0061
+180E 0061
 1A7F 0061
 1B6B 0061
 1B6C 0061
@@ -35732,6 +35736,10 @@ A629 0062
 2062 0061
 2063 0061
 2064 0061
+2066 0061
+2067 0061
+2068 0061
+2069 0061
 206A 0061
 206B 0061
 206C 0061
@@ -36278,6 +36286,7 @@ E01EF 0061
 0618 0041
 0619 0041
 061A 0041
+061C 0041
 0640 0041
 06D6 0041
 06D7 0041
@@ -36335,6 +36344,7 @@ E01EF 0061
 180B 0041
 180C 0041
 180D 0041
+180E 0041
 1A7F 0041
 1B6B 0041
 1B6C 0041
@@ -36386,6 +36396,10 @@ E01EF 0061
 2062 0041
 2063 0041
 2064 0041
+2066 0041
+2067 0041
+2068 0041
+2069 0041
 206A 0041
 206B 0041
 206C 0041
@@ -37306,6 +37320,16 @@ A67D 0041
 20E2 0041
 20E3 0041
 20E4 0041
+3099 0061
+3099 0041
+FF9E 0061
+FF9E 0041
+309A 0061
+309A 0041
+FF9F 0061
+FF9F 0041
+0335 0061
+0335 0041
 0305 0061
 0305 0041
 0309 0061
@@ -37344,8 +37368,6 @@ A67D 0041
 0334 0041
 0334 1DD3
 1DD3 0334
-0335 0061
-0335 0041
 0339 0061
 0339 0041
 0345 0061
@@ -37886,14 +37908,6 @@ A92D 0041
 302E 0041
 302F 0061
 302F 0041
-3099 0061
-3099 0041
-FF9E 0061
-FF9E 0041
-309A 0061
-309A 0041
-FF9F 0061
-FF9F 0041
 20D0 0061
 20D0 0041
 20D1 0061
@@ -38794,6 +38808,7 @@ A73C 0062
 0618 0062
 0619 0062
 061A 0062
+061C 0062
 0640 0062
 06D6 0062
 06D7 0062
@@ -38851,6 +38866,7 @@ A73C 0062
 180B 0062
 180C 0062
 180D 0062
+180E 0062
 1A7F 0062
 1B6B 0062
 1B6C 0062
@@ -38902,6 +38918,10 @@ A73C 0062
 2062 0062
 2063 0062
 2064 0062
+2066 0062
+2067 0062
+2068 0062
+2069 0062
 206A 0062
 206B 0062
 206C 0062
@@ -39494,6 +39514,11 @@ A67D 0062
 20E2 0062
 20E3 0062
 20E4 0062
+3099 0062
+FF9E 0062
+309A 0062
+FF9F 0062
+0335 0062
 0305 0062
 0309 0062
 030F 0062
@@ -39511,7 +39536,6 @@ A67D 0062
 0330 0062
 0331 0062
 0334 0062
-0335 0062
 0339 0062
 0345 0062
 0358 0062
@@ -39782,10 +39806,6 @@ A92D 0062
 302D 0062
 302E 0062
 302F 0062
-3099 0062
-FF9E 0062
-309A 0062
-FF9F 0062
 20D0 0062
 20D1 0062
 20D2 0062
@@ -40611,14 +40631,14 @@ FF24 0021
 1E0A 0021
 1E11 0021
 1E10 0021
+0111 0021
+0110 0021
 1E0D 0021
 1E0C 0021
 1E13 0021
 1E12 0021
 1E0F 0021
 1E0E 0021
-0111 0021
-0110 0021
 00F0 0021
 1DD9 0021
 00D0 0021
@@ -40674,14 +40694,14 @@ FF24 003F
 1E0A 003F
 1E11 003F
 1E10 003F
+0111 003F
+0110 003F
 1E0D 003F
 1E0C 003F
 1E13 003F
 1E12 003F
 1E0F 003F
 1E0E 003F
-0111 003F
-0110 003F
 00F0 003F
 1DD9 003F
 00D0 003F
@@ -40785,6 +40805,10 @@ FF24 0041
 1E11 0041
 1E10 0061
 1E10 0041
+0111 0061
+0111 0041
+0110 0061
+0110 0041
 1E0D 0061
 1E0D 0041
 1E0C 0061
@@ -40797,10 +40821,6 @@ FF24 0041
 1E0F 0041
 1E0E 0061
 1E0E 0041
-0111 0061
-0111 0041
-0110 0061
-0110 0041
 00F0 0061
 1DD9 0061
 00F0 0041
@@ -40868,14 +40888,14 @@ FF24 0062
 1E0A 0062
 1E11 0062
 1E10 0062
+0111 0062
+0110 0062
 1E0D 0062
 1E0C 0062
 1E13 0062
 1E12 0062
 1E0F 0062
 1E0E 0062
-0111 0062
-0110 0062
 00F0 0062
 1DD9 0062
 00D0 0062
@@ -42645,15 +42665,15 @@ FF28 0021
 1E22 0021
 1E29 0021
 1E28 0021
+0127 0021
+210F 0021
+0126 0021
+A7F8 0021
 1E25 0021
 1E24 0021
 1E2B 0021
 1E2A 0021
 1E96 0021
-0127 0021
-210F 0021
-0126 0021
-A7F8 0021
 0068 003F
 FF48 003F
 036A 003F
@@ -42703,15 +42723,15 @@ FF28 003F
 1E22 003F
 1E29 003F
 1E28 003F
+0127 003F
+210F 003F
+0126 003F
+A7F8 003F
 1E25 003F
 1E24 003F
 1E2B 003F
 1E2A 003F
 1E96 003F
-0127 003F
-210F 003F
-0126 003F
-A7F8 003F
 0068 0061
 0068 0041
 FF48 0061
@@ -42810,6 +42830,14 @@ FF28 0041
 1E29 0041
 1E28 0061
 1E28 0041
+0127 0061
+210F 0061
+0127 0041
+210F 0041
+0126 0061
+0126 0041
+A7F8 0061
+A7F8 0041
 1E25 0061
 1E25 0041
 1E24 0061
@@ -42820,14 +42848,6 @@ FF28 0041
 1E2A 0041
 1E96 0061
 1E96 0041
-0127 0061
-210F 0061
-0127 0041
-210F 0041
-0126 0061
-0126 0041
-A7F8 0061
-A7F8 0041
 33CA 0021
 33CA 003F
 33CA 0061
@@ -42882,15 +42902,15 @@ FF28 0062
 1E22 0062
 1E29 0062
 1E28 0062
+0127 0062
+210F 0062
+0126 0062
+A7F8 0062
 1E25 0062
 1E24 0062
 1E2B 0062
 1E2A 0062
 1E96 0062
-0127 0062
-210F 0062
-0126 0062
-A7F8 0062
 32CC 0021
 32CC 003F
 32CC 0061
@@ -43034,7 +43054,7 @@ A726 0062
 0069 0308 0301 0334
 0069 0308 0334 0341
 00EF 0301 0334
-1E2F 0334
+00EF 0334 0341
 0049 0308 0334 0301
 0049 0308 0341 0334
 00CF 0334 0301
@@ -44425,6 +44445,8 @@ FF2C 0021
 013D 0021
 013C 0021
 013B 0021
+0142 0021
+0141 0021
 1E37 0021
 1E36 0021
 1E39 0021
@@ -44433,8 +44455,6 @@ FF2C 0021
 1E3C 0021
 1E3B 0021
 1E3A 0021
-0142 0021
-0141 0021
 006C 00B7 0021
 006C 0387 0021
 0140 0021
@@ -44489,6 +44509,8 @@ FF2C 003F
 013D 003F
 013C 003F
 013B 003F
+0142 003F
+0141 003F
 1E37 003F
 1E36 003F
 1E39 003F
@@ -44497,8 +44519,6 @@ FF2C 003F
 1E3C 003F
 1E3B 003F
 1E3A 003F
-0142 003F
-0141 003F
 006C 00B7 003F
 006C 0387 003F
 0140 003F
@@ -44613,6 +44633,10 @@ FF2C 0041
 013C 0041
 013B 0061
 013B 0041
+0142 0061
+0142 0041
+0141 0061
+0141 0041
 1E37 0061
 1E37 0041
 1E36 0061
@@ -44629,10 +44653,6 @@ FF2C 0041
 1E3B 0041
 1E3A 0061
 1E3A 0041
-0142 0061
-0142 0041
-0141 0061
-0141 0041
 006C 00B7 0061
 006C 0387 0061
 0140 0061
@@ -44693,6 +44713,8 @@ FF2C 0062
 013D 0062
 013C 0062
 013B 0062
+0142 0062
+0141 0062
 1E37 0062
 1E36 0062
 1E39 0062
@@ -44701,8 +44723,6 @@ FF2C 0062
 1E3C 0062
 1E3B 0062
 1E3A 0062
-0142 0062
-0141 0062
 006C 00B7 0062
 006C 0387 0062
 0140 0062
@@ -49043,10 +49063,10 @@ A777 0062
 0075 0334 0344
 0075 0344 0334
 01D8 0334
-0055 0308 0341 0334
+0055 0308 0301 0334
 0055 0334 0308 0301
-0055 0334 0308 0341
 00DC 0301 0334
+00DC 0334 0301
 0075 0308 0340 0334
 0075 0334 0308 0340
 00FC 0300 0334
@@ -51958,10 +51978,10 @@ A724 0062
 0391 0334 0313 0340
 1F08 0300 0334
 1F0A 0334
-03B1 0313 0300 0334 0345
 03B1 0343 0300 0345 0334
 03B1 0343 0345 0334 0340
 03B1 0345 0313 0300 0334
+1F00 0345 0340 0334
 0391 0343 0334 0345 0340
 0391 0345 0313 0334 0340
 1F08 0300 0345 0334
@@ -52021,13 +52041,13 @@ A724 0062
 1F09 0300 0334
 1F09 0340 0334
 03B1 0314 0334 0300 0345
-03B1 0334 0314 0345 0300
-03B1 0345 0314 0300 0334
-03B1 0345 0334 0314 0340
+03B1 0314 0345 0340 0334
+1F81 0340 0334
+1F83 0334
 0391 0334 0345 0314 0300
 1F09 0334 0345 0300
-1F09 0345 0300 0334
 1F0B 0345 0334
+1FBC 0314 0300 0334
 03B1 0314 0334 0342
 03B1 0314 0342 0334
 03B1 0334 0314 0342
@@ -52987,9 +53007,9 @@ A724 0062
 0397 0334 0343
 1F28 0334
 03B7 0334 0313 0341
-03B7 0334 0343 0301
 03B7 0334 0343 0341
-1F20 0334 0341
+03B7 0343 0341 0334
+1F20 0341 0334
 0397 0313 0334 0301
 0397 0313 0341 0334
 0397 0334 0313 0301
@@ -53012,8 +53032,8 @@ A724 0062
 0397 0343 0300 0334
 03B7 0313 0345 0334 0300
 03B7 0313 0345 0340 0334
-03B7 0343 0340 0334 0345
 03B7 0343 0345 0340 0334
+1FC3 0334 0313 0300
 0397 0313 0334 0300 0345
 0397 0343 0334 0345 0340
 0397 0343 0340 0345 0334
@@ -53057,9 +53077,9 @@ A724 0062
 1F29 0334 0301
 1F2D 0334
 03B7 0314 0301 0345 0334
+03B7 0314 0334 0345 0301
 03B7 0314 0334 0345 0341
-1F21 0334 0341 0345
-1F21 0345 0301 0334
+03B7 0314 0345 0334 0301
 0397 0314 0334 0345 0341
 0397 0334 0314 0345 0301
 1F29 0334 0301 0345
@@ -54967,7 +54987,7 @@ A724 0062
 03C5 0334 0343 0341
 1F50 0334 0301
 1F50 0334 0341
-03C5 0334 0313 0340
+03C5 0313 0340 0334
 03C5 0334 0343 0340
 1F50 0334 0340
 1F52 0334
@@ -55043,9 +55063,9 @@ A724 0062
 03D2 0308 0334
 03D2 0334 0308
 03D4 0334
+03B0 0334
 03C5 0308 0341 0334
 03C5 0344 0334
-03CB 0334 0341
 03CB 0341 0334
 03C5 0308 0300 0334
 03C5 0308 0340 0334
@@ -55596,8 +55616,8 @@ A724 0062
 2126 0334 0314 0301
 2126 0334 0314 0341
 03C9 0314 0334 0345 0301
-1F61 0334 0301 0345
-1F61 0341 0345 0334
+03C9 0345 0314 0334 0301
+1F61 0301 0345 0334
 1F65 0345 0334
 03A9 0314 0301 0345 0334
 03A9 0345 0334 0314 0301
@@ -55612,9 +55632,9 @@ A724 0062
 2126 0314 0334 0340
 2126 0334 0314 0340
 03C9 0314 0334 0345 0300
-03C9 0314 0340 0334 0345
 03C9 0314 0345 0300 0334
-03C9 0334 0314 0340 0345
+03C9 0345 0314 0300 0334
+03C9 0345 0314 0334 0300
 03A9 0314 0300 0345 0334
 03A9 0345 0334 0314 0300
 1F6B 0345 0334
@@ -118348,6 +118368,16 @@ A4F7 0062
 12262 0061
 12262 0041
 12262 0062
+122D4 0021
+122D4 003F
+122D4 0061
+122D4 0041
+122D4 0062
+122D5 0021
+122D5 003F
+122D5 0061
+122D5 0041
+122D5 0062
 12263 0021
 12263 003F
 12263 0061
@@ -118913,16 +118943,6 @@ A4F7 0062
 122D3 0061
 122D3 0041
 122D3 0062
-122D4 0021
-122D4 003F
-122D4 0061
-122D4 0041
-122D4 0062
-122D5 0021
-122D5 003F
-122D5 0061
-122D5 0041
-122D5 0062
 122D6 0021
 122D6 003F
 122D6 0061
@@ -166353,6 +166373,11 @@ FFFFD 0062
 10FFFF 0061
 10FFFF 0041
 10FFFF 0062
+FFFD 0021
+FFFD 003F
+FFFD 0061
+FFFD 0041
+FFFD 0062
 FFFF 0021
 FFFF 003F
 FFFF 0061
index c155d132c3ab540f5820b2624f79313d612dd50f..f21df3b21c9cadb60628cafd805c0223d66b6d77 100644 (file)
@@ -1,7 +1,7 @@
 # File:        CollationTest_CLDR_SHIFTED_SHORT.txt
-# UCA Version: 6.2.0
-# UCD Version: 6.2.0
-# Generated:   2012-08-15, 21:43:28 GMT [MD]
+# UCA Version: 6.3.0
+# UCD Version: 6.3.0
+# Generated:   2013-09-03 [MS]
 # For a description of the format and usage, see CollationAuxiliary.html
 
 0009 0021
@@ -16,8 +16,6 @@
 000D 003F
 0085 0021
 0085 003F
-180E 0021
-180E 003F
 2028 0021
 2028 003F
 2029 0021
@@ -395,6 +393,7 @@ A6F4 003F
 0618 0021
 0619 0021
 061A 0021
+061C 0021
 0640 0021
 06D6 0021
 06D7 0021
@@ -452,6 +451,7 @@ A6F4 003F
 180B 0021
 180C 0021
 180D 0021
+180E 0021
 1A7F 0021
 1B6B 0021
 1B6C 0021
@@ -503,6 +503,10 @@ A6F4 003F
 2062 0021
 2063 0021
 2064 0021
+2066 0021
+2067 0021
+2068 0021
+2069 0021
 206A 0021
 206B 0021
 206C 0021
@@ -1069,6 +1073,7 @@ FF01 003F
 0618 003F
 0619 003F
 061A 003F
+061C 003F
 0640 003F
 06D6 003F
 06D7 003F
@@ -1126,6 +1131,7 @@ FF01 003F
 180B 003F
 180C 003F
 180D 003F
+180E 003F
 1A7F 003F
 1B6B 003F
 1B6C 003F
@@ -1177,6 +1183,10 @@ FF01 003F
 2062 003F
 2063 003F
 2064 003F
+2066 003F
+2067 003F
+2068 003F
+2069 003F
 206A 003F
 206B 003F
 206C 003F
@@ -2049,6 +2059,14 @@ FF5D 003F
 2045 003F
 2046 0021
 2046 003F
+2308 0021
+2308 003F
+2309 0021
+2309 003F
+230A 0021
+230A 003F
+230B 0021
+230B 003F
 29FC 0021
 29FC 003F
 29FD 0021
@@ -2965,6 +2983,17 @@ A67D 003F
 20E2 003F
 20E3 003F
 20E4 003F
+3099 0021
+3099 003F
+FF9E 0021
+FF9E 003F
+309A 0021
+309A 003F
+FF9F 0021
+FF9F 003F
+0335 0021
+0335 003F
+0335 0334
 0305 0021
 0305 003F
 0309 0021
@@ -3932,6 +3961,10 @@ A67D 0334
 20EF 0334
 0334 10A0D
 10A0D 0334
+0334 3099
+3099 0334
+0334 309A
+309A 0334
 0305 0334
 0334 0305
 0309 0334
@@ -4305,10 +4338,6 @@ A92D 0334
 302E 0334
 0334 302F
 302F 0334
-0334 3099
-3099 0334
-0334 309A
-309A 0334
 0334 20D0
 20D0 0334
 0334 20D1
@@ -4335,9 +4364,6 @@ A92D 0334
 20E9 0334
 0334 101FD
 101FD 0334
-0335 0021
-0335 003F
-0335 0334
 0339 0021
 0339 003F
 0345 0021
@@ -4891,14 +4917,6 @@ A92D 003F
 302E 003F
 302F 0021
 302F 003F
-3099 0021
-3099 003F
-FF9E 0021
-FF9E 003F
-309A 0021
-309A 003F
-FF9F 0021
-FF9F 003F
 20D0 0021
 20D0 003F
 20D1 0021
@@ -7278,14 +7296,14 @@ FE64 0062
 003D 003F
 FF1D 0021
 FF1D 003F
+2A74 0021
+2A74 003F
 FE66 0021
 FE66 003F
 207C 0021
 207C 003F
 208C 0021
 208C 003F
-2A74 0021
-2A74 003F
 2260 0021
 2260 003F
 003D 0338 0334
@@ -7304,22 +7322,22 @@ FE66 003F
 003D 0041
 FF1D 0061
 FF1D 0041
+2A74 0061
+2A74 0041
 FE66 0061
 FE66 0041
 207C 0061
 207C 0041
 208C 0061
 208C 0041
-2A74 0061
-2A74 0041
 2260 0061
 2260 0041
 003D 0062
 FF1D 0062
+2A74 0062
 FE66 0062
 207C 0062
 208C 0062
-2A74 0062
 2260 0062
 003E 0021
 003E 003F
@@ -8702,26 +8720,6 @@ FF5E 0062
 2307 0061
 2307 0041
 2307 0062
-2308 0021
-2308 003F
-2308 0061
-2308 0041
-2308 0062
-2309 0021
-2309 003F
-2309 0061
-2309 0041
-2309 0062
-230A 0021
-230A 003F
-230A 0061
-230A 0041
-230A 0062
-230B 0021
-230B 003F
-230B 0061
-230B 0041
-230B 0062
 230C 0021
 230C 003F
 230C 0061
@@ -28906,11 +28904,6 @@ FFFC 003F
 FFFC 0061
 FFFC 0041
 FFFC 0062
-FFFD 0021
-FFFD 003F
-FFFD 0061
-FFFD 0041
-FFFD 0062
 02D0 0021
 02D0 003F
 02D0 0061
@@ -29008,11 +29001,11 @@ AAF4 0062
 3035 0062
 309D 0021
 309D 003F
+309E 0021
+309E 003F
 309D 0334 3099
 309D 3099 0334
 309E 0334
-309E 0021
-309E 003F
 309D 0061
 309D 0041
 309E 0061
@@ -29031,11 +29024,11 @@ FF70 0041
 FF70 0062
 30FD 0021
 30FD 003F
+30FE 0021
+30FE 003F
 30FD 0334 3099
 30FD 3099 0334
 30FE 0334
-30FE 0021
-30FE 003F
 30FD 0061
 30FD 0041
 30FE 0061
@@ -30358,18 +30351,6 @@ A835 0062
 12433 0061
 12433 0041
 12433 0062
-12456 0021
-12456 003F
-12456 0334
-12456 0061
-12456 0041
-12456 0062
-12457 0021
-12457 003F
-12457 0334
-12457 0061
-12457 0041
-12457 0062
 1245A 0021
 1245A 003F
 1245A 0334
@@ -30479,269 +30460,256 @@ A835 0062
 1D371 0041
 1D371 0062
 0030 0021
-0030 003F
-FF10 0021
-FF10 003F
-1F101 0334
-1F101 0021
-1F101 003F
-1F100 0334
-1F100 0021
-1F100 003F
-1D7CE 0021
-1D7D8 0021
-1D7E2 0021
-1D7EC 0021
-1D7F6 0021
-1D7CE 003F
-1D7D8 003F
-1D7E2 003F
-1D7EC 003F
-1D7F6 003F
-24EA 0021
-24FF 0021
-24EA 003F
-24FF 003F
-2070 0021
-2070 003F
-2080 0021
-2080 003F
-1D7CE 0334
-1D7D8 0334
-1D7E2 0334
-1D7EC 0334
-1D7F6 0334
 0660 0021
-0660 003F
 06F0 0021
-06F0 003F
 07C0 0021
-07C0 003F
-104A0 0021
-104A0 003F
-104A0 0334
 0966 0021
-0966 003F
 09E6 0021
-09E6 003F
 0A66 0021
-0A66 003F
 0AE6 0021
-0AE6 003F
 0B66 0021
-0B66 003F
 0BE6 0021
-0BE6 003F
 0C66 0021
 0C78 0021
-0C66 003F
-0C78 003F
 0CE6 0021
-0CE6 003F
 0D66 0021
-0D66 003F
-ABF0 0021
-ABF0 003F
-A8D0 0021
-A8D0 003F
+0E50 0021
+0ED0 0021
+0F20 0021
+1040 0021
+1090 0021
+17E0 0021
+17F0 0021
+1810 0021
 1946 0021
-1946 003F
 19D0 0021
-19D0 003F
 1A80 0021
-1A80 003F
 1A90 0021
-1A90 003F
-0E50 0021
+1B50 0021
+1BB0 0021
+1C40 0021
+1C50 0021
+3007 0021
+A620 0021
+A8D0 0021
+A900 0021
+A9D0 0021
+AA50 0021
+ABF0 0021
+1018A 0021
+104A0 0021
+11066 0021
+110F0 0021
+11136 0021
+111D0 0021
+116C0 0021
+0030 003F
+0660 003F
+06F0 003F
+07C0 003F
+0966 003F
+09E6 003F
+0A66 003F
+0AE6 003F
+0B66 003F
+0BE6 003F
+0C66 003F
+0C78 003F
+0CE6 003F
+0D66 003F
 0E50 003F
-0ED0 0021
 0ED0 003F
-0F20 0021
 0F20 003F
-0F33 0021
-0F33 003F
-1C40 0021
-1C40 003F
-A900 0021
-A900 003F
-1040 0021
 1040 003F
-1090 0021
 1090 003F
-11136 0021
-11136 003F
-11136 0334
-17E0 0021
 17E0 003F
-17F0 0021
 17F0 003F
-AA50 0021
-AA50 003F
-1B50 0021
+1810 003F
+1946 003F
+19D0 003F
+1A80 003F
+1A90 003F
 1B50 003F
-A9D0 0021
-A9D0 003F
-1BB0 0021
 1BB0 003F
-1810 0021
-1810 003F
-1C50 0021
+1C40 003F
 1C50 003F
-A620 0021
-A620 003F
-110F0 0021
-110F0 003F
-110F0 0334
-3007 0021
 3007 003F
-1018A 0021
+A620 003F
+A8D0 003F
+A900 003F
+A9D0 003F
+AA50 003F
+ABF0 003F
 1018A 003F
-1018A 0334
-111D0 0021
+104A0 003F
+11066 003F
+110F0 003F
+11136 003F
 111D0 003F
-111D0 0334
-116C0 0021
 116C0 003F
-116C0 0334
-11066 0021
-11066 003F
+FF10 0021
+FF10 003F
+1F101 0334
+1F101 0021
+1F101 003F
+0F33 0021
+0F33 003F
+1F100 0334
+1F100 0021
+1F100 003F
+1D7CE 0021
+1D7D8 0021
+1D7E2 0021
+1D7EC 0021
+1D7F6 0021
+1D7CE 003F
+1D7D8 003F
+1D7E2 003F
+1D7EC 003F
+1D7F6 003F
+24EA 0021
+24FF 0021
+24EA 003F
+24FF 003F
+2070 0021
+2070 003F
+2080 0021
+2080 003F
+1018A 0334
+104A0 0334
 11066 0334
+110F0 0334
+11136 0334
+111D0 0334
+116C0 0334
+1D7CE 0334
+1D7D8 0334
+1D7E2 0334
+1D7EC 0334
+1D7F6 0334
 2189 0021
 2189 003F
 2189 0061
 2189 0041
 2189 0062
 0030 0061
-0030 0041
-FF10 0061
-FF10 0041
-1F101 0061
-1F100 0061
-1F101 0041
-1F100 0041
-1D7CE 0061
-1D7D8 0061
-1D7E2 0061
-1D7EC 0061
-1D7F6 0061
-1D7CE 0041
-1D7D8 0041
-1D7E2 0041
-1D7EC 0041
-1D7F6 0041
-24EA 0061
-24FF 0061
-24EA 0041
-24FF 0041
-2070 0061
-2070 0041
-2080 0061
-2080 0041
 0660 0061
-0660 0041
 06F0 0061
-06F0 0041
 07C0 0061
-07C0 0041
-104A0 0061
-104A0 0041
 0966 0061
-0966 0041
 09E6 0061
-09E6 0041
 0A66 0061
-0A66 0041
 0AE6 0061
-0AE6 0041
 0B66 0061
-0B66 0041
 0BE6 0061
-0BE6 0041
 0C66 0061
 0C78 0061
-0C66 0041
-0C78 0041
 0CE6 0061
-0CE6 0041
 0D66 0061
-0D66 0041
-ABF0 0061
-ABF0 0041
-A8D0 0061
-A8D0 0041
+0E50 0061
+0ED0 0061
+0F20 0061
+1040 0061
+1090 0061
+17E0 0061
+17F0 0061
+1810 0061
 1946 0061
-1946 0041
 19D0 0061
-19D0 0041
 1A80 0061
-1A80 0041
 1A90 0061
-1A90 0041
-0E50 0061
+1B50 0061
+1BB0 0061
+1C40 0061
+1C50 0061
+3007 0061
+A620 0061
+A8D0 0061
+A900 0061
+A9D0 0061
+AA50 0061
+ABF0 0061
+1018A 0061
+104A0 0061
+11066 0061
+110F0 0061
+11136 0061
+111D0 0061
+116C0 0061
+0030 0041
+0660 0041
+06F0 0041
+07C0 0041
+0966 0041
+09E6 0041
+0A66 0041
+0AE6 0041
+0B66 0041
+0BE6 0041
+0C66 0041
+0C78 0041
+0CE6 0041
+0D66 0041
 0E50 0041
-0ED0 0061
 0ED0 0041
-0F20 0061
 0F20 0041
-0F33 0061
-0F33 0041
-1C40 0061
-1C40 0041
-A900 0061
-A900 0041
-1040 0061
 1040 0041
-1090 0061
 1090 0041
-11136 0061
-11136 0041
-17E0 0061
 17E0 0041
-17F0 0061
 17F0 0041
-AA50 0061
-AA50 0041
-1B50 0061
+1810 0041
+1946 0041
+19D0 0041
+1A80 0041
+1A90 0041
 1B50 0041
-A9D0 0061
-A9D0 0041
-1BB0 0061
 1BB0 0041
-1810 0061
-1810 0041
-1C50 0061
+1C40 0041
 1C50 0041
-A620 0061
-A620 0041
-110F0 0061
-110F0 0041
-3007 0061
 3007 0041
-1018A 0061
+A620 0041
+A8D0 0041
+A900 0041
+A9D0 0041
+AA50 0041
+ABF0 0041
 1018A 0041
-111D0 0061
+104A0 0041
+11066 0041
+110F0 0041
+11136 0041
 111D0 0041
-116C0 0061
 116C0 0041
-11066 0061
-11066 0041
+FF10 0061
+FF10 0041
+1F101 0061
+1F100 0061
+0F33 0061
+1F101 0041
+1F100 0041
+0F33 0041
+1D7CE 0061
+1D7D8 0061
+1D7E2 0061
+1D7EC 0061
+1D7F6 0061
+1D7CE 0041
+1D7D8 0041
+1D7E2 0041
+1D7EC 0041
+1D7F6 0041
+24EA 0061
+24FF 0061
+24EA 0041
+24FF 0041
+2070 0061
+2070 0041
+2080 0061
+2080 0041
 0030 0062
-FF10 0062
-1F101 0062
-1F100 0062
-1D7CE 0062
-1D7D8 0062
-1D7E2 0062
-1D7EC 0062
-1D7F6 0062
-24EA 0062
-24FF 0062
-2070 0062
-2080 0062
 0660 0062
 06F0 0062
 07C0 0062
-104A0 0062
 0966 0062
 09E6 0062
 0A66 0062
@@ -30752,43 +30720,190 @@ FF10 0062
 0C78 0062
 0CE6 0062
 0D66 0062
-ABF0 0062
-A8D0 0062
-1946 0062
-19D0 0062
-1A80 0062
-1A90 0062
 0E50 0062
 0ED0 0062
 0F20 0062
-0F33 0062
-1C40 0062
-A900 0062
 1040 0062
 1090 0062
-11136 0062
 17E0 0062
 17F0 0062
-AA50 0062
+1810 0062
+1946 0062
+19D0 0062
+1A80 0062
+1A90 0062
 1B50 0062
-A9D0 0062
 1BB0 0062
-1810 0062
+1C40 0062
 1C50 0062
-A620 0062
-110F0 0062
 3007 0062
+A620 0062
+A8D0 0062
+A900 0062
+A9D0 0062
+AA50 0062
+ABF0 0062
 1018A 0062
+104A0 0062
+11066 0062
+110F0 0062
+11136 0062
 111D0 0062
 116C0 0062
-11066 0062
+FF10 0062
+1F101 0062
+1F100 0062
+0F33 0062
+1D7CE 0062
+1D7D8 0062
+1D7E2 0062
+1D7EC 0062
+1D7F6 0062
+24EA 0062
+24FF 0062
+2070 0062
+2080 0062
 3358 0021
 3358 003F
 3358 0061
 3358 0041
 3358 0062
 0031 0021
+0661 0021
+06F1 0021
+07C1 0021
+0967 0021
+09E7 0021
+0A67 0021
+0AE7 0021
+0B67 0021
+0BE7 0021
+0C67 0021
+0C79 0021
+0C7C 0021
+0CE7 0021
+0D67 0021
+0E51 0021
+0ED1 0021
+0F21 0021
+1041 0021
+1091 0021
+1369 0021
+17E1 0021
+17F1 0021
+1811 0021
+1947 0021
+19D1 0021
+19DA 0021
+1A81 0021
+1A91 0021
+1B51 0021
+1BB1 0021
+1C41 0021
+1C51 0021
+3021 0021
+A621 0021
+A8D1 0021
+A901 0021
+A9D1 0021
+AA51 0021
+ABF1 0021
+10107 0021
+10142 0021
+10158 0021
+10159 0021
+1015A 0021
+10320 0021
+103D1 0021
+104A1 0021
+10858 0021
+10916 0021
+10A40 0021
+10A7D 0021
+10B58 0021
+10B78 0021
+10E60 0021
+11052 0021
+11067 0021
+110F1 0021
+11137 0021
+111D1 0021
+116C1 0021
+12415 0021
+1241E 0021
+1242C 0021
+12434 0021
+1244F 0021
+12458 0021
+1D360 0021
 0031 003F
+0661 003F
+06F1 003F
+07C1 003F
+0967 003F
+09E7 003F
+0A67 003F
+0AE7 003F
+0B67 003F
+0BE7 003F
+0C67 003F
+0C79 003F
+0C7C 003F
+0CE7 003F
+0D67 003F
+0E51 003F
+0ED1 003F
+0F21 003F
+1041 003F
+1091 003F
+1369 003F
+17E1 003F
+17F1 003F
+1811 003F
+1947 003F
+19D1 003F
+19DA 003F
+1A81 003F
+1A91 003F
+1B51 003F
+1BB1 003F
+1C41 003F
+1C51 003F
+3021 003F
+A621 003F
+A8D1 003F
+A901 003F
+A9D1 003F
+AA51 003F
+ABF1 003F
+10107 003F
+10142 003F
+10158 003F
+10159 003F
+1015A 003F
+10320 003F
+103D1 003F
+104A1 003F
+10858 003F
+10916 003F
+10A40 003F
+10A7D 003F
+10B58 003F
+10B78 003F
+10E60 003F
+11052 003F
+11067 003F
+110F1 003F
+11137 003F
+111D1 003F
+116C1 003F
+12415 003F
+1241E 003F
+1242C 003F
+12434 003F
+1244F 003F
+12458 003F
+1D360 003F
 FF11 0021
 FF11 003F
 2474 0021
@@ -30796,6 +30911,8 @@ FF11 003F
 1F102 0334
 1F102 0021
 1F102 003F
+0F2A 0021
+0F2A 003F
 2488 0021
 2488 003F
 1D7CF 0021
@@ -30822,175 +30939,39 @@ FF11 003F
 00B9 003F
 2081 0021
 2081 003F
-1D7CF 0334
-1D7D9 0334
-1D7E3 0334
-1D7ED 0334
-1D7F7 0334
-0661 0021
-0661 003F
-06F1 0021
-06F1 003F
-10E60 0021
-10E60 003F
-10E60 0334
-07C1 0021
-07C1 003F
-1369 0021
-1369 003F
-104A1 0021
-104A1 003F
-104A1 0334
-0967 0021
-0967 003F
-09E7 0021
-09E7 003F
-0A67 0021
-0A67 003F
-0AE7 0021
-0AE7 003F
-0B67 0021
-0B67 003F
-0BE7 0021
-0BE7 003F
-0C67 0021
-0C79 0021
-0C7C 0021
-0C67 003F
-0C79 003F
-0C7C 003F
-0CE7 0021
-0CE7 003F
-0D67 0021
-0D67 003F
-ABF1 0021
-ABF1 003F
-A8D1 0021
-A8D1 003F
-1947 0021
-1947 003F
-19D1 0021
-19DA 0021
-19D1 003F
-19DA 003F
-1A81 0021
-1A81 003F
-1A91 0021
-1A91 003F
-0E51 0021
-0E51 003F
-0ED1 0021
-0ED1 003F
-0F21 0021
-0F21 003F
-0F2A 0021
-0F2A 003F
-1C41 0021
-1C41 003F
-A901 0021
-A901 003F
-1041 0021
-1041 003F
-1091 0021
-1091 003F
-11137 0021
-11137 003F
-11137 0334
-17E1 0021
-17E1 003F
-17F1 0021
-17F1 003F
-AA51 0021
-AA51 003F
-1B51 0021
-1B51 003F
-A9D1 0021
-A9D1 003F
-1BB1 0021
-1BB1 003F
-1811 0021
-1811 003F
-1C51 0021
-1C51 003F
-A621 0021
-A621 003F
-110F1 0021
-110F1 003F
-110F1 0334
-3021 0021
-3021 003F
-10107 0021
-10107 003F
 10107 0334
-10142 0021
-10158 0021
-10159 0021
-1015A 0021
-10142 003F
-10158 003F
-10159 003F
-1015A 003F
 10142 0334
 10158 0334
 10159 0334
 1015A 0334
-10320 0021
-10320 003F
 10320 0334
-103D1 0021
-103D1 003F
 103D1 0334
-12415 0021
-1241E 0021
-1242C 0021
-12434 0021
-1244F 0021
-12458 0021
-12415 003F
-1241E 003F
-1242C 003F
-12434 003F
-1244F 003F
-12458 003F
+104A1 0334
+10858 0334
+10916 0334
+10A40 0334
+10A7D 0334
+10B58 0334
+10B78 0334
+10E60 0334
+11052 0334
+11067 0334
+110F1 0334
+11137 0334
+111D1 0334
+116C1 0334
 12415 0334
 1241E 0334
 1242C 0334
 12434 0334
 1244F 0334
 12458 0334
-10A7D 0021
-10A7D 003F
-10A7D 0334
-10916 0021
-10916 003F
-10916 0334
-10858 0021
-10858 003F
-10858 0334
-10B58 0021
-10B58 003F
-10B58 0334
-10B78 0021
-10B78 003F
-10B78 0334
-111D1 0021
-111D1 003F
-111D1 0334
-116C1 0021
-116C1 003F
-116C1 0334
-11067 0021
-11067 003F
-11067 0334
-11052 0021
-11052 003F
-11052 0334
-10A40 0021
-10A40 003F
-10A40 0334
-1D360 0021
-1D360 003F
 1D360 0334
+1D7CF 0334
+1D7D9 0334
+1D7E3 0334
+1D7ED 0334
+1D7F7 0334
 215F 0021
 215F 003F
 2152 0021
@@ -31377,198 +31358,179 @@ A621 003F
 336B 0041
 336B 0062
 0031 0061
-0031 0041
-FF11 0061
-FF11 0041
-2474 0061
-1F102 0061
-2488 0061
-2474 0041
-1F102 0041
-2488 0041
-1D7CF 0061
-1D7D9 0061
-1D7E3 0061
-1D7ED 0061
-1D7F7 0061
-1D7CF 0041
-1D7D9 0041
-1D7E3 0041
-1D7ED 0041
-1D7F7 0041
-2460 0061
-24F5 0061
-2776 0061
-2780 0061
-278A 0061
-2460 0041
-24F5 0041
-2776 0041
-2780 0041
-278A 0041
-00B9 0061
-00B9 0041
-2081 0061
-2081 0041
 0661 0061
-0661 0041
 06F1 0061
-06F1 0041
-10E60 0061
-10E60 0041
 07C1 0061
-07C1 0041
-1369 0061
-1369 0041
-104A1 0061
-104A1 0041
 0967 0061
-0967 0041
 09E7 0061
-09E7 0041
 0A67 0061
-0A67 0041
 0AE7 0061
-0AE7 0041
 0B67 0061
-0B67 0041
 0BE7 0061
-0BE7 0041
 0C67 0061
 0C79 0061
 0C7C 0061
-0C67 0041
-0C79 0041
-0C7C 0041
 0CE7 0061
-0CE7 0041
 0D67 0061
-0D67 0041
-ABF1 0061
-ABF1 0041
-A8D1 0061
-A8D1 0041
-1947 0061
-1947 0041
-19D1 0061
-19DA 0061
-19D1 0041
-19DA 0041
-1A81 0061
-1A81 0041
-1A91 0061
-1A91 0041
 0E51 0061
-0E51 0041
 0ED1 0061
-0ED1 0041
 0F21 0061
-0F21 0041
-0F2A 0061
-0F2A 0041
-1C41 0061
-1C41 0041
-A901 0061
-A901 0041
 1041 0061
-1041 0041
 1091 0061
-1091 0041
-11137 0061
-11137 0041
+1369 0061
 17E1 0061
-17E1 0041
 17F1 0061
-17F1 0041
-AA51 0061
-AA51 0041
+1811 0061
+1947 0061
+19D1 0061
+19DA 0061
+1A81 0061
+1A91 0061
 1B51 0061
-1B51 0041
-A9D1 0061
-A9D1 0041
 1BB1 0061
-1BB1 0041
-1811 0061
-1811 0041
+1C41 0061
 1C51 0061
-1C51 0041
-A621 0061
-A621 0041
-110F1 0061
-110F1 0041
 3021 0061
-3021 0041
+A621 0061
+A8D1 0061
+A901 0061
+A9D1 0061
+AA51 0061
+ABF1 0061
 10107 0061
-10107 0041
 10142 0061
 10158 0061
 10159 0061
 1015A 0061
-10142 0041
-10158 0041
-10159 0041
-1015A 0041
 10320 0061
-10320 0041
 103D1 0061
-103D1 0041
+104A1 0061
+10858 0061
+10916 0061
+10A40 0061
+10A7D 0061
+10B58 0061
+10B78 0061
+10E60 0061
+11052 0061
+11067 0061
+110F1 0061
+11137 0061
+111D1 0061
+116C1 0061
 12415 0061
 1241E 0061
 1242C 0061
 12434 0061
 1244F 0061
 12458 0061
+1D360 0061
+0031 0041
+0661 0041
+06F1 0041
+07C1 0041
+0967 0041
+09E7 0041
+0A67 0041
+0AE7 0041
+0B67 0041
+0BE7 0041
+0C67 0041
+0C79 0041
+0C7C 0041
+0CE7 0041
+0D67 0041
+0E51 0041
+0ED1 0041
+0F21 0041
+1041 0041
+1091 0041
+1369 0041
+17E1 0041
+17F1 0041
+1811 0041
+1947 0041
+19D1 0041
+19DA 0041
+1A81 0041
+1A91 0041
+1B51 0041
+1BB1 0041
+1C41 0041
+1C51 0041
+3021 0041
+A621 0041
+A8D1 0041
+A901 0041
+A9D1 0041
+AA51 0041
+ABF1 0041
+10107 0041
+10142 0041
+10158 0041
+10159 0041
+1015A 0041
+10320 0041
+103D1 0041
+104A1 0041
+10858 0041
+10916 0041
+10A40 0041
+10A7D 0041
+10B58 0041
+10B78 0041
+10E60 0041
+11052 0041
+11067 0041
+110F1 0041
+11137 0041
+111D1 0041
+116C1 0041
 12415 0041
 1241E 0041
 1242C 0041
 12434 0041
 1244F 0041
 12458 0041
-10A7D 0061
-10A7D 0041
-10916 0061
-10916 0041
-10858 0061
-10858 0041
-10B58 0061
-10B58 0041
-10B78 0061
-10B78 0041
-111D1 0061
-111D1 0041
-116C1 0061
-116C1 0041
-11067 0061
-11067 0041
-11052 0061
-11052 0041
-10A40 0061
-10A40 0041
-1D360 0061
 1D360 0041
+FF11 0061
+FF11 0041
+2474 0061
+1F102 0061
+2488 0061
+0F2A 0061
+2474 0041
+1F102 0041
+2488 0041
+0F2A 0041
+1D7CF 0061
+1D7D9 0061
+1D7E3 0061
+1D7ED 0061
+1D7F7 0061
+1D7CF 0041
+1D7D9 0041
+1D7E3 0041
+1D7ED 0041
+1D7F7 0041
+2460 0061
+24F5 0061
+2776 0061
+2780 0061
+278A 0061
+2460 0041
+24F5 0041
+2776 0041
+2780 0041
+278A 0041
+00B9 0061
+00B9 0041
+2081 0061
+2081 0041
 0031 0062
-FF11 0062
-2474 0062
-1F102 0062
-2488 0062
-1D7CF 0062
-1D7D9 0062
-1D7E3 0062
-1D7ED 0062
-1D7F7 0062
-2460 0062
-24F5 0062
-2776 0062
-2780 0062
-278A 0062
-00B9 0062
-2081 0062
 0661 0062
 06F1 0062
-10E60 0062
 07C1 0062
-1369 0062
-104A1 0062
 0967 0062
 09E7 0062
 0A67 0062
@@ -31580,33 +31542,31 @@ FF11 0062
 0C7C 0062
 0CE7 0062
 0D67 0062
-ABF1 0062
-A8D1 0062
-1947 0062
-19D1 0062
-19DA 0062
-1A81 0062
-1A91 0062
 0E51 0062
 0ED1 0062
 0F21 0062
-0F2A 0062
-1C41 0062
-A901 0062
 1041 0062
 1091 0062
-11137 0062
+1369 0062
 17E1 0062
 17F1 0062
-AA51 0062
+1811 0062
+1947 0062
+19D1 0062
+19DA 0062
+1A81 0062
+1A91 0062
 1B51 0062
-A9D1 0062
 1BB1 0062
-1811 0062
+1C41 0062
 1C51 0062
-A621 0062
-110F1 0062
 3021 0062
+A621 0062
+A8D1 0062
+A901 0062
+A9D1 0062
+AA51 0062
+ABF1 0062
 10107 0062
 10142 0062
 10158 0062
@@ -31614,23 +31574,44 @@ A621 0062
 1015A 0062
 10320 0062
 103D1 0062
+104A1 0062
+10858 0062
+10916 0062
+10A40 0062
+10A7D 0062
+10B58 0062
+10B78 0062
+10E60 0062
+11052 0062
+11067 0062
+110F1 0062
+11137 0062
+111D1 0062
+116C1 0062
 12415 0062
 1241E 0062
 1242C 0062
 12434 0062
 1244F 0062
 12458 0062
-10A7D 0062
-10916 0062
-10858 0062
-10B58 0062
-10B78 0062
-111D1 0062
-116C1 0062
-11067 0062
-11052 0062
-10A40 0062
 1D360 0062
+FF11 0062
+2474 0062
+1F102 0062
+2488 0062
+0F2A 0062
+1D7CF 0062
+1D7D9 0062
+1D7E3 0062
+1D7ED 0062
+1D7F7 0062
+2460 0062
+24F5 0062
+2776 0062
+2780 0062
+278A 0062
+00B9 0062
+2081 0062
 33E0 0021
 33E0 003F
 33E0 0061
@@ -31647,153 +31628,63 @@ A621 0062
 3359 0041
 3359 0062
 0032 0021
-0032 003F
-FF12 0021
-FF12 003F
-2475 0021
-2475 003F
-1F103 0334
-1F103 0021
-1F103 003F
-2489 0021
-2489 003F
-1D7D0 0021
-1D7DA 0021
-1D7E4 0021
-1D7EE 0021
-1D7F8 0021
-1D7D0 003F
-1D7DA 003F
-1D7E4 003F
-1D7EE 003F
-1D7F8 003F
-2461 0021
-24F6 0021
-2777 0021
-2781 0021
-278B 0021
-2461 003F
-24F6 003F
-2777 003F
-2781 003F
-278B 003F
-00B2 0021
-00B2 003F
-2082 0021
-2082 003F
-1D7D0 0334
-1D7DA 0334
-1D7E4 0334
-1D7EE 0334
-1D7F8 0334
 0662 0021
-0662 003F
 06F2 0021
-06F2 003F
-10E61 0021
-10E61 003F
-10E61 0334
 07C2 0021
-07C2 003F
-136A 0021
-136A 003F
-104A2 0021
-104A2 003F
-104A2 0334
 0968 0021
-0968 003F
 09E8 0021
-09E8 003F
 0A68 0021
-0A68 003F
 0AE8 0021
-0AE8 003F
 0B68 0021
-0B68 003F
 0BE8 0021
-0BE8 003F
 0C68 0021
 0C7A 0021
 0C7D 0021
-0C68 003F
-0C7A 003F
-0C7D 003F
 0CE8 0021
-0CE8 003F
 0D68 0021
-0D68 003F
-ABF2 0021
-ABF2 003F
-A8D2 0021
-A8D2 003F
-1948 0021
-1948 003F
-19D2 0021
-19D2 003F
-1A82 0021
-1A82 003F
-1A92 0021
-1A92 003F
 0E52 0021
-0E52 003F
 0ED2 0021
-0ED2 003F
 0F22 0021
-0F22 003F
-0F2B 0021
-0F2B 003F
-1C42 0021
-1C42 003F
-A902 0021
-A902 003F
 1042 0021
-1042 003F
 1092 0021
-1092 003F
-11138 0021
-11138 003F
-11138 0334
+136A 0021
 17E2 0021
-17E2 003F
 17F2 0021
-17F2 003F
-AA52 0021
-AA52 003F
+1812 0021
+1948 0021
+19D2 0021
+1A82 0021
+1A92 0021
 1B52 0021
-1B52 003F
-A9D2 0021
-A9D2 003F
 1BB2 0021
-1BB2 003F
-1812 0021
-1812 003F
+1C42 0021
 1C52 0021
-1C52 003F
-A622 0021
-A622 003F
-110F2 0021
-110F2 003F
-110F2 0334
 3022 0021
-3022 003F
+A622 0021
+A8D2 0021
+A902 0021
+A9D2 0021
+AA52 0021
+ABF2 0021
 10108 0021
-10108 003F
-10108 0334
 1015B 0021
 1015C 0021
 1015D 0021
 1015E 0021
-1015B 003F
-1015C 003F
-1015D 003F
-1015E 003F
-1015B 0334
-1015C 0334
-1015D 0334
-1015E 0334
 103D2 0021
-103D2 003F
-103D2 0334
+104A2 0021
+10859 0021
+1091A 0021
+10A41 0021
+10B59 0021
+10B79 0021
+10E61 0021
+11053 0021
+11068 0021
+110F2 0021
+11138 0021
+111D2 0021
+116C2 0021
 12400 0021
 12416 0021
 1241F 0021
@@ -31802,7 +31693,67 @@ A622 003F
 12435 0021
 1244A 0021
 12450 0021
+12456 0021
 12459 0021
+1D361 0021
+0032 003F
+0662 003F
+06F2 003F
+07C2 003F
+0968 003F
+09E8 003F
+0A68 003F
+0AE8 003F
+0B68 003F
+0BE8 003F
+0C68 003F
+0C7A 003F
+0C7D 003F
+0CE8 003F
+0D68 003F
+0E52 003F
+0ED2 003F
+0F22 003F
+1042 003F
+1092 003F
+136A 003F
+17E2 003F
+17F2 003F
+1812 003F
+1948 003F
+19D2 003F
+1A82 003F
+1A92 003F
+1B52 003F
+1BB2 003F
+1C42 003F
+1C52 003F
+3022 003F
+A622 003F
+A8D2 003F
+A902 003F
+A9D2 003F
+AA52 003F
+ABF2 003F
+10108 003F
+1015B 003F
+1015C 003F
+1015D 003F
+1015E 003F
+103D2 003F
+104A2 003F
+10859 003F
+1091A 003F
+10A41 003F
+10B59 003F
+10B79 003F
+10E61 003F
+11053 003F
+11068 003F
+110F2 003F
+11138 003F
+111D2 003F
+116C2 003F
 12400 003F
 12416 003F
 1241F 003F
@@ -31811,7 +31762,63 @@ A622 003F
 12435 003F
 1244A 003F
 12450 003F
+12456 003F
 12459 003F
+1D361 003F
+FF12 0021
+FF12 003F
+2475 0021
+2475 003F
+1F103 0334
+1F103 0021
+1F103 003F
+0F2B 0021
+0F2B 003F
+2489 0021
+2489 003F
+1D7D0 0021
+1D7DA 0021
+1D7E4 0021
+1D7EE 0021
+1D7F8 0021
+1D7D0 003F
+1D7DA 003F
+1D7E4 003F
+1D7EE 003F
+1D7F8 003F
+2461 0021
+24F6 0021
+2777 0021
+2781 0021
+278B 0021
+2461 003F
+24F6 003F
+2777 003F
+2781 003F
+278B 003F
+00B2 0021
+00B2 003F
+2082 0021
+2082 003F
+10108 0334
+1015B 0334
+1015C 0334
+1015D 0334
+1015E 0334
+103D2 0334
+104A2 0334
+10859 0334
+1091A 0334
+10A41 0334
+10B59 0334
+10B79 0334
+10E61 0334
+11053 0334
+11068 0334
+110F2 0334
+11138 0334
+111D2 0334
+116C2 0334
 12400 0334
 12416 0334
 1241F 0334
@@ -31820,37 +31827,14 @@ A622 003F
 12435 0334
 1244A 0334
 12450 0334
+12456 0334
 12459 0334
-1091A 0021
-1091A 003F
-1091A 0334
-10859 0021
-10859 003F
-10859 0334
-10B59 0021
-10B59 003F
-10B59 0334
-10B79 0021
-10B79 003F
-10B79 0334
-111D2 0021
-111D2 003F
-111D2 0334
-116C2 0021
-116C2 003F
-116C2 0334
-11068 0021
-11068 003F
-11068 0334
-11053 0021
-11053 003F
-11053 0334
-10A41 0021
-10A41 003F
-10A41 0334
-1D361 0021
-1D361 003F
 1D361 0334
+1D7D0 0334
+1D7DA 0334
+1D7E4 0334
+1D7EE 0334
+1D7F8 0334
 2154 0021
 2154 003F
 2154 0061
@@ -32007,137 +31991,63 @@ A622 003F
 33FC 0041
 33FC 0062
 0032 0061
-0032 0041
-FF12 0061
-FF12 0041
-2475 0061
-1F103 0061
-2489 0061
-2475 0041
-1F103 0041
-2489 0041
-1D7D0 0061
-1D7DA 0061
-1D7E4 0061
-1D7EE 0061
-1D7F8 0061
-1D7D0 0041
-1D7DA 0041
-1D7E4 0041
-1D7EE 0041
-1D7F8 0041
-2461 0061
-24F6 0061
-2777 0061
-2781 0061
-278B 0061
-2461 0041
-24F6 0041
-2777 0041
-2781 0041
-278B 0041
-00B2 0061
-00B2 0041
-2082 0061
-2082 0041
 0662 0061
-0662 0041
 06F2 0061
-06F2 0041
-10E61 0061
-10E61 0041
 07C2 0061
-07C2 0041
-136A 0061
-136A 0041
-104A2 0061
-104A2 0041
 0968 0061
-0968 0041
 09E8 0061
-09E8 0041
 0A68 0061
-0A68 0041
 0AE8 0061
-0AE8 0041
 0B68 0061
-0B68 0041
 0BE8 0061
-0BE8 0041
 0C68 0061
 0C7A 0061
 0C7D 0061
-0C68 0041
-0C7A 0041
-0C7D 0041
 0CE8 0061
-0CE8 0041
 0D68 0061
-0D68 0041
-ABF2 0061
-ABF2 0041
-A8D2 0061
-A8D2 0041
-1948 0061
-1948 0041
-19D2 0061
-19D2 0041
-1A82 0061
-1A82 0041
-1A92 0061
-1A92 0041
 0E52 0061
-0E52 0041
 0ED2 0061
-0ED2 0041
 0F22 0061
-0F22 0041
-0F2B 0061
-0F2B 0041
-1C42 0061
-1C42 0041
-A902 0061
-A902 0041
 1042 0061
-1042 0041
 1092 0061
-1092 0041
-11138 0061
-11138 0041
+136A 0061
 17E2 0061
-17E2 0041
 17F2 0061
-17F2 0041
-AA52 0061
-AA52 0041
+1812 0061
+1948 0061
+19D2 0061
+1A82 0061
+1A92 0061
 1B52 0061
-1B52 0041
-A9D2 0061
-A9D2 0041
 1BB2 0061
-1BB2 0041
-1812 0061
-1812 0041
+1C42 0061
 1C52 0061
-1C52 0041
-A622 0061
-A622 0041
-110F2 0061
-110F2 0041
 3022 0061
-3022 0041
+A622 0061
+A8D2 0061
+A902 0061
+A9D2 0061
+AA52 0061
+ABF2 0061
 10108 0061
-10108 0041
 1015B 0061
 1015C 0061
 1015D 0061
 1015E 0061
-1015B 0041
-1015C 0041
-1015D 0041
-1015E 0041
 103D2 0061
-103D2 0041
+104A2 0061
+10859 0061
+1091A 0061
+10A41 0061
+10B59 0061
+10B79 0061
+10E61 0061
+11053 0061
+11068 0061
+110F2 0061
+11138 0061
+111D2 0061
+116C2 0061
 12400 0061
 12416 0061
 1241F 0061
@@ -32146,7 +32056,67 @@ A622 0041
 12435 0061
 1244A 0061
 12450 0061
+12456 0061
 12459 0061
+1D361 0061
+0032 0041
+0662 0041
+06F2 0041
+07C2 0041
+0968 0041
+09E8 0041
+0A68 0041
+0AE8 0041
+0B68 0041
+0BE8 0041
+0C68 0041
+0C7A 0041
+0C7D 0041
+0CE8 0041
+0D68 0041
+0E52 0041
+0ED2 0041
+0F22 0041
+1042 0041
+1092 0041
+136A 0041
+17E2 0041
+17F2 0041
+1812 0041
+1948 0041
+19D2 0041
+1A82 0041
+1A92 0041
+1B52 0041
+1BB2 0041
+1C42 0041
+1C52 0041
+3022 0041
+A622 0041
+A8D2 0041
+A902 0041
+A9D2 0041
+AA52 0041
+ABF2 0041
+10108 0041
+1015B 0041
+1015C 0041
+1015D 0041
+1015E 0041
+103D2 0041
+104A2 0041
+10859 0041
+1091A 0041
+10A41 0041
+10B59 0041
+10B79 0041
+10E61 0041
+11053 0041
+11068 0041
+110F2 0041
+11138 0041
+111D2 0041
+116C2 0041
 12400 0041
 12416 0041
 1241F 0041
@@ -32155,50 +32125,47 @@ A622 0041
 12435 0041
 1244A 0041
 12450 0041
+12456 0041
 12459 0041
-1091A 0061
-1091A 0041
-10859 0061
-10859 0041
-10B59 0061
-10B59 0041
-10B79 0061
-10B79 0041
-111D2 0061
-111D2 0041
-116C2 0061
-116C2 0041
-11068 0061
-11068 0041
-11053 0061
-11053 0041
-10A41 0061
-10A41 0041
-1D361 0061
 1D361 0041
-0032 0062
-FF12 0062
-2475 0062
-1F103 0062
-2489 0062
-1D7D0 0062
-1D7DA 0062
-1D7E4 0062
-1D7EE 0062
-1D7F8 0062
-2461 0062
-24F6 0062
-2777 0062
-2781 0062
-278B 0062
-00B2 0062
-2082 0062
+FF12 0061
+FF12 0041
+2475 0061
+1F103 0061
+2489 0061
+0F2B 0061
+2475 0041
+1F103 0041
+2489 0041
+0F2B 0041
+1D7D0 0061
+1D7DA 0061
+1D7E4 0061
+1D7EE 0061
+1D7F8 0061
+1D7D0 0041
+1D7DA 0041
+1D7E4 0041
+1D7EE 0041
+1D7F8 0041
+2461 0061
+24F6 0061
+2777 0061
+2781 0061
+278B 0061
+2461 0041
+24F6 0041
+2777 0041
+2781 0041
+278B 0041
+00B2 0061
+00B2 0041
+2082 0061
+2082 0041
+0032 0062
 0662 0062
 06F2 0062
-10E61 0062
 07C2 0062
-136A 0062
-104A2 0062
 0968 0062
 09E8 0062
 0A68 0062
@@ -32210,38 +32177,49 @@ FF12 0062
 0C7D 0062
 0CE8 0062
 0D68 0062
-ABF2 0062
-A8D2 0062
-1948 0062
-19D2 0062
-1A82 0062
-1A92 0062
 0E52 0062
 0ED2 0062
 0F22 0062
-0F2B 0062
-1C42 0062
-A902 0062
 1042 0062
 1092 0062
-11138 0062
+136A 0062
 17E2 0062
 17F2 0062
-AA52 0062
+1812 0062
+1948 0062
+19D2 0062
+1A82 0062
+1A92 0062
 1B52 0062
-A9D2 0062
 1BB2 0062
-1812 0062
+1C42 0062
 1C52 0062
-A622 0062
-110F2 0062
 3022 0062
+A622 0062
+A8D2 0062
+A902 0062
+A9D2 0062
+AA52 0062
+ABF2 0062
 10108 0062
 1015B 0062
 1015C 0062
 1015D 0062
 1015E 0062
 103D2 0062
+104A2 0062
+10859 0062
+1091A 0062
+10A41 0062
+10B59 0062
+10B79 0062
+10E61 0062
+11053 0062
+11068 0062
+110F2 0062
+11138 0062
+111D2 0062
+116C2 0062
 12400 0062
 12416 0062
 1241F 0062
@@ -32250,17 +32228,26 @@ A622 0062
 12435 0062
 1244A 0062
 12450 0062
+12456 0062
 12459 0062
-1091A 0062
-10859 0062
-10B59 0062
-10B79 0062
-111D2 0062
-116C2 0062
-11068 0062
-11053 0062
-10A41 0062
 1D361 0062
+FF12 0062
+2475 0062
+1F103 0062
+2489 0062
+0F2B 0062
+1D7D0 0062
+1D7DA 0062
+1D7E4 0062
+1D7EE 0062
+1D7F8 0062
+2461 0062
+24F6 0062
+2777 0062
+2781 0062
+278B 0062
+00B2 0062
+2082 0062
 33E1 0021
 33E1 003F
 33E1 0061
@@ -32277,138 +32264,58 @@ A622 0062
 335A 0041
 335A 0062
 0033 0021
-0033 003F
-FF13 0021
-FF13 003F
-2476 0021
-2476 003F
-1F104 0334
-1F104 0021
-1F104 003F
-248A 0021
-248A 003F
-1D7D1 0021
-1D7DB 0021
-1D7E5 0021
-1D7EF 0021
-1D7F9 0021
-1D7D1 003F
-1D7DB 003F
-1D7E5 003F
-1D7EF 003F
-1D7F9 003F
-2462 0021
-24F7 0021
-2778 0021
-2782 0021
-278C 0021
-2462 003F
-24F7 003F
-2778 003F
-2782 003F
-278C 003F
-00B3 0021
-00B3 003F
-2083 0021
-2083 003F
-1D7D1 0334
-1D7DB 0334
-1D7E5 0334
-1D7EF 0334
-1D7F9 0334
 0663 0021
-0663 003F
 06F3 0021
-06F3 003F
-10E62 0021
-10E62 003F
-10E62 0334
 07C3 0021
-07C3 003F
-136B 0021
-136B 003F
-104A3 0021
-104A3 003F
-104A3 0334
 0969 0021
-0969 003F
 09E9 0021
-09E9 003F
 0A69 0021
-0A69 003F
 0AE9 0021
-0AE9 003F
 0B69 0021
-0B69 003F
 0BE9 0021
-0BE9 003F
 0C69 0021
 0C7B 0021
 0C7E 0021
-0C69 003F
-0C7B 003F
-0C7E 003F
 0CE9 0021
-0CE9 003F
 0D69 0021
-0D69 003F
-ABF3 0021
-ABF3 003F
-A8D3 0021
-A8D3 003F
-1949 0021
-1949 003F
-19D3 0021
-19D3 003F
-1A83 0021
-1A83 003F
-1A93 0021
-1A93 003F
 0E53 0021
-0E53 003F
 0ED3 0021
-0ED3 003F
 0F23 0021
-0F23 003F
-0F2C 0021
-0F2C 003F
-1C43 0021
-1C43 003F
-A903 0021
-A903 003F
 1043 0021
-1043 003F
 1093 0021
-1093 003F
-11139 0021
-11139 003F
-11139 0334
+136B 0021
 17E3 0021
-17E3 003F
 17F3 0021
-17F3 003F
-AA53 0021
-AA53 003F
+1813 0021
+1949 0021
+19D3 0021
+1A83 0021
+1A93 0021
 1B53 0021
-1B53 003F
-A9D3 0021
-A9D3 003F
 1BB3 0021
-1BB3 003F
-1813 0021
-1813 003F
+1C43 0021
 1C53 0021
-1C53 003F
-A623 0021
-A623 003F
-110F3 0021
-110F3 003F
-110F3 0334
 3023 0021
-3023 003F
+A623 0021
+A8D3 0021
+A903 0021
+A9D3 0021
+AA53 0021
+ABF3 0021
 10109 0021
-10109 003F
-10109 0334
+104A3 0021
+1085A 0021
+1091B 0021
+10A42 0021
+10B5A 0021
+10B7A 0021
+10E62 0021
+11054 0021
+11069 0021
+110F3 0021
+11139 0021
+111D3 0021
+116C3 0021
 12401 0021
 12408 0021
 12417 0021
@@ -32423,6 +32330,61 @@ A623 003F
 1243B 0021
 1244B 0021
 12451 0021
+12457 0021
+1D362 0021
+0033 003F
+0663 003F
+06F3 003F
+07C3 003F
+0969 003F
+09E9 003F
+0A69 003F
+0AE9 003F
+0B69 003F
+0BE9 003F
+0C69 003F
+0C7B 003F
+0C7E 003F
+0CE9 003F
+0D69 003F
+0E53 003F
+0ED3 003F
+0F23 003F
+1043 003F
+1093 003F
+136B 003F
+17E3 003F
+17F3 003F
+1813 003F
+1949 003F
+19D3 003F
+1A83 003F
+1A93 003F
+1B53 003F
+1BB3 003F
+1C43 003F
+1C53 003F
+3023 003F
+A623 003F
+A8D3 003F
+A903 003F
+A9D3 003F
+AA53 003F
+ABF3 003F
+10109 003F
+104A3 003F
+1085A 003F
+1091B 003F
+10A42 003F
+10B5A 003F
+10B7A 003F
+10E62 003F
+11054 003F
+11069 003F
+110F3 003F
+11139 003F
+111D3 003F
+116C3 003F
 12401 003F
 12408 003F
 12417 003F
@@ -32437,6 +32399,57 @@ A623 003F
 1243B 003F
 1244B 003F
 12451 003F
+12457 003F
+1D362 003F
+FF13 0021
+FF13 003F
+2476 0021
+2476 003F
+1F104 0334
+1F104 0021
+1F104 003F
+0F2C 0021
+0F2C 003F
+248A 0021
+248A 003F
+1D7D1 0021
+1D7DB 0021
+1D7E5 0021
+1D7EF 0021
+1D7F9 0021
+1D7D1 003F
+1D7DB 003F
+1D7E5 003F
+1D7EF 003F
+1D7F9 003F
+2462 0021
+24F7 0021
+2778 0021
+2782 0021
+278C 0021
+2462 003F
+24F7 003F
+2778 003F
+2782 003F
+278C 003F
+00B3 0021
+00B3 003F
+2083 0021
+2083 003F
+10109 0334
+104A3 0334
+1085A 0334
+1091B 0334
+10A42 0334
+10B5A 0334
+10B7A 0334
+10E62 0334
+11054 0334
+11069 0334
+110F3 0334
+11139 0334
+111D3 0334
+116C3 0334
 12401 0334
 12408 0334
 12417 0334
@@ -32451,36 +32464,13 @@ A623 003F
 1243B 0334
 1244B 0334
 12451 0334
-1091B 0021
-1091B 003F
-1091B 0334
-1085A 0021
-1085A 003F
-1085A 0334
-10B5A 0021
-10B5A 003F
-10B5A 0334
-10B7A 0021
-10B7A 003F
-10B7A 0334
-111D3 0021
-111D3 003F
-111D3 0334
-116C3 0021
-116C3 003F
-116C3 0334
-11069 0021
-11069 003F
-11069 0334
-11054 0021
-11054 003F
-11054 0334
-10A42 0021
-10A42 003F
-10A42 0334
-1D362 0021
-1D362 003F
+12457 0334
 1D362 0334
+1D7D1 0334
+1D7DB 0334
+1D7E5 0334
+1D7EF 0334
+1D7F9 0334
 00BE 0021
 00BE 003F
 00BE 0061
@@ -32562,127 +32552,58 @@ A623 003F
 32B4 0041
 32B4 0062
 0033 0061
-0033 0041
-FF13 0061
-FF13 0041
-2476 0061
-1F104 0061
-248A 0061
-2476 0041
-1F104 0041
-248A 0041
-1D7D1 0061
-1D7DB 0061
-1D7E5 0061
-1D7EF 0061
-1D7F9 0061
-1D7D1 0041
-1D7DB 0041
-1D7E5 0041
-1D7EF 0041
-1D7F9 0041
-2462 0061
-24F7 0061
-2778 0061
-2782 0061
-278C 0061
-2462 0041
-24F7 0041
-2778 0041
-2782 0041
-278C 0041
-00B3 0061
-00B3 0041
-2083 0061
-2083 0041
 0663 0061
-0663 0041
 06F3 0061
-06F3 0041
-10E62 0061
-10E62 0041
 07C3 0061
-07C3 0041
-136B 0061
-136B 0041
-104A3 0061
-104A3 0041
 0969 0061
-0969 0041
 09E9 0061
-09E9 0041
 0A69 0061
-0A69 0041
 0AE9 0061
-0AE9 0041
 0B69 0061
-0B69 0041
 0BE9 0061
-0BE9 0041
 0C69 0061
 0C7B 0061
 0C7E 0061
-0C69 0041
-0C7B 0041
-0C7E 0041
 0CE9 0061
-0CE9 0041
 0D69 0061
-0D69 0041
-ABF3 0061
-ABF3 0041
-A8D3 0061
-A8D3 0041
-1949 0061
-1949 0041
-19D3 0061
-19D3 0041
-1A83 0061
-1A83 0041
-1A93 0061
-1A93 0041
 0E53 0061
-0E53 0041
 0ED3 0061
-0ED3 0041
 0F23 0061
-0F23 0041
-0F2C 0061
-0F2C 0041
-1C43 0061
-1C43 0041
-A903 0061
-A903 0041
 1043 0061
-1043 0041
 1093 0061
-1093 0041
-11139 0061
-11139 0041
+136B 0061
 17E3 0061
-17E3 0041
 17F3 0061
-17F3 0041
-AA53 0061
-AA53 0041
+1813 0061
+1949 0061
+19D3 0061
+1A83 0061
+1A93 0061
 1B53 0061
-1B53 0041
-A9D3 0061
-A9D3 0041
 1BB3 0061
-1BB3 0041
-1813 0061
-1813 0041
+1C43 0061
 1C53 0061
-1C53 0041
-A623 0061
-A623 0041
-110F3 0061
-110F3 0041
 3023 0061
-3023 0041
+A623 0061
+A8D3 0061
+A903 0061
+A9D3 0061
+AA53 0061
+ABF3 0061
 10109 0061
-10109 0041
+104A3 0061
+1085A 0061
+1091B 0061
+10A42 0061
+10B5A 0061
+10B7A 0061
+10E62 0061
+11054 0061
+11069 0061
+110F3 0061
+11139 0061
+111D3 0061
+116C3 0061
 12401 0061
 12408 0061
 12417 0061
@@ -32697,6 +32618,61 @@ A623 0041
 1243B 0061
 1244B 0061
 12451 0061
+12457 0061
+1D362 0061
+0033 0041
+0663 0041
+06F3 0041
+07C3 0041
+0969 0041
+09E9 0041
+0A69 0041
+0AE9 0041
+0B69 0041
+0BE9 0041
+0C69 0041
+0C7B 0041
+0C7E 0041
+0CE9 0041
+0D69 0041
+0E53 0041
+0ED3 0041
+0F23 0041
+1043 0041
+1093 0041
+136B 0041
+17E3 0041
+17F3 0041
+1813 0041
+1949 0041
+19D3 0041
+1A83 0041
+1A93 0041
+1B53 0041
+1BB3 0041
+1C43 0041
+1C53 0041
+3023 0041
+A623 0041
+A8D3 0041
+A903 0041
+A9D3 0041
+AA53 0041
+ABF3 0041
+10109 0041
+104A3 0041
+1085A 0041
+1091B 0041
+10A42 0041
+10B5A 0041
+10B7A 0041
+10E62 0041
+11054 0041
+11069 0041
+110F3 0041
+11139 0041
+111D3 0041
+116C3 0041
 12401 0041
 12408 0041
 12417 0041
@@ -32711,49 +32687,46 @@ A623 0041
 1243B 0041
 1244B 0041
 12451 0041
-1091B 0061
-1091B 0041
-1085A 0061
-1085A 0041
-10B5A 0061
-10B5A 0041
-10B7A 0061
-10B7A 0041
-111D3 0061
-111D3 0041
-116C3 0061
-116C3 0041
-11069 0061
-11069 0041
-11054 0061
-11054 0041
-10A42 0061
-10A42 0041
-1D362 0061
+12457 0041
 1D362 0041
+FF13 0061
+FF13 0041
+2476 0061
+1F104 0061
+248A 0061
+0F2C 0061
+2476 0041
+1F104 0041
+248A 0041
+0F2C 0041
+1D7D1 0061
+1D7DB 0061
+1D7E5 0061
+1D7EF 0061
+1D7F9 0061
+1D7D1 0041
+1D7DB 0041
+1D7E5 0041
+1D7EF 0041
+1D7F9 0041
+2462 0061
+24F7 0061
+2778 0061
+2782 0061
+278C 0061
+2462 0041
+24F7 0041
+2778 0041
+2782 0041
+278C 0041
+00B3 0061
+00B3 0041
+2083 0061
+2083 0041
 0033 0062
-FF13 0062
-2476 0062
-1F104 0062
-248A 0062
-1D7D1 0062
-1D7DB 0062
-1D7E5 0062
-1D7EF 0062
-1D7F9 0062
-2462 0062
-24F7 0062
-2778 0062
-2782 0062
-278C 0062
-00B3 0062
-2083 0062
 0663 0062
 06F3 0062
-10E62 0062
 07C3 0062
-136B 0062
-104A3 0062
 0969 0062
 09E9 0062
 0A69 0062
@@ -32765,33 +32738,44 @@ FF13 0062
 0C7E 0062
 0CE9 0062
 0D69 0062
-ABF3 0062
-A8D3 0062
-1949 0062
-19D3 0062
-1A83 0062
-1A93 0062
 0E53 0062
 0ED3 0062
 0F23 0062
-0F2C 0062
-1C43 0062
-A903 0062
 1043 0062
 1093 0062
-11139 0062
+136B 0062
 17E3 0062
 17F3 0062
-AA53 0062
+1813 0062
+1949 0062
+19D3 0062
+1A83 0062
+1A93 0062
 1B53 0062
-A9D3 0062
 1BB3 0062
-1813 0062
+1C43 0062
 1C53 0062
-A623 0062
-110F3 0062
 3023 0062
+A623 0062
+A8D3 0062
+A903 0062
+A9D3 0062
+AA53 0062
+ABF3 0062
 10109 0062
+104A3 0062
+1085A 0062
+1091B 0062
+10A42 0062
+10B5A 0062
+10B7A 0062
+10E62 0062
+11054 0062
+11069 0062
+110F3 0062
+11139 0062
+111D3 0062
+116C3 0062
 12401 0062
 12408 0062
 12417 0062
@@ -32806,16 +32790,25 @@ A623 0062
 1243B 0062
 1244B 0062
 12451 0062
-1091B 0062
-1085A 0062
-10B5A 0062
-10B7A 0062
-111D3 0062
-116C3 0062
-11069 0062
-11054 0062
-10A42 0062
+12457 0062
 1D362 0062
+FF13 0062
+2476 0062
+1F104 0062
+248A 0062
+0F2C 0062
+1D7D1 0062
+1D7DB 0062
+1D7E5 0062
+1D7EF 0062
+1D7F9 0062
+2462 0062
+24F7 0062
+2778 0062
+2782 0062
+278C 0062
+00B3 0062
+2083 0062
 33E2 0021
 33E2 003F
 33E2 0061
@@ -32832,134 +32825,54 @@ A623 0062
 335B 0041
 335B 0062
 0034 0021
-0034 003F
-FF14 0021
-FF14 003F
-2477 0021
-2477 003F
-1F105 0334
-1F105 0021
-1F105 003F
-248B 0021
-248B 003F
-1D7D2 0021
-1D7DC 0021
-1D7E6 0021
-1D7F0 0021
-1D7FA 0021
-1D7D2 003F
-1D7DC 003F
-1D7E6 003F
-1D7F0 003F
-1D7FA 003F
-2463 0021
-24F8 0021
-2779 0021
-2783 0021
-278D 0021
-2463 003F
-24F8 003F
-2779 003F
-2783 003F
-278D 003F
-2074 0021
-2074 003F
-2084 0021
-2084 003F
-1D7D2 0334
-1D7DC 0334
-1D7E6 0334
-1D7F0 0334
-1D7FA 0334
 0664 0021
-0664 003F
 06F4 0021
-06F4 003F
-10E63 0021
-10E63 003F
-10E63 0334
 07C4 0021
-07C4 003F
-136C 0021
-136C 003F
-104A4 0021
-104A4 003F
-104A4 0334
 096A 0021
-096A 003F
 09EA 0021
-09EA 003F
 0A6A 0021
-0A6A 003F
 0AEA 0021
-0AEA 003F
 0B6A 0021
-0B6A 003F
 0BEA 0021
-0BEA 003F
 0C6A 0021
-0C6A 003F
 0CEA 0021
-0CEA 003F
 0D6A 0021
-0D6A 003F
-ABF4 0021
-ABF4 003F
-A8D4 0021
-A8D4 003F
-194A 0021
-194A 003F
-19D4 0021
-19D4 003F
-1A84 0021
-1A84 003F
-1A94 0021
-1A94 003F
 0E54 0021
-0E54 003F
 0ED4 0021
-0ED4 003F
 0F24 0021
-0F24 003F
-0F2D 0021
-0F2D 003F
-1C44 0021
-1C44 003F
-A904 0021
-A904 003F
 1044 0021
-1044 003F
 1094 0021
-1094 003F
-1113A 0021
-1113A 003F
-1113A 0334
+136C 0021
 17E4 0021
-17E4 003F
 17F4 0021
-17F4 003F
-AA54 0021
-AA54 003F
+1814 0021
+194A 0021
+19D4 0021
+1A84 0021
+1A94 0021
 1B54 0021
-1B54 003F
-A9D4 0021
-A9D4 003F
 1BB4 0021
-1BB4 003F
-1814 0021
-1814 003F
+1C44 0021
 1C54 0021
-1C54 003F
-A624 0021
-A624 003F
-110F4 0021
-110F4 003F
-110F4 0334
 3024 0021
-3024 003F
+A624 0021
+A8D4 0021
+A904 0021
+A9D4 0021
+AA54 0021
+ABF4 0021
 1010A 0021
-1010A 003F
-1010A 0334
+104A4 0021
+10A43 0021
+10B5B 0021
+10B7B 0021
+10E63 0021
+11055 0021
+1106A 0021
+110F4 0021
+1113A 0021
+111D4 0021
+116C4 0021
 12402 0021
 12409 0021
 1240F 0021
@@ -32975,6 +32888,56 @@ A624 003F
 1244C 0021
 12452 0021
 12453 0021
+1D363 0021
+0034 003F
+0664 003F
+06F4 003F
+07C4 003F
+096A 003F
+09EA 003F
+0A6A 003F
+0AEA 003F
+0B6A 003F
+0BEA 003F
+0C6A 003F
+0CEA 003F
+0D6A 003F
+0E54 003F
+0ED4 003F
+0F24 003F
+1044 003F
+1094 003F
+136C 003F
+17E4 003F
+17F4 003F
+1814 003F
+194A 003F
+19D4 003F
+1A84 003F
+1A94 003F
+1B54 003F
+1BB4 003F
+1C44 003F
+1C54 003F
+3024 003F
+A624 003F
+A8D4 003F
+A904 003F
+A9D4 003F
+AA54 003F
+ABF4 003F
+1010A 003F
+104A4 003F
+10A43 003F
+10B5B 003F
+10B7B 003F
+10E63 003F
+11055 003F
+1106A 003F
+110F4 003F
+1113A 003F
+111D4 003F
+116C4 003F
 12402 003F
 12409 003F
 1240F 003F
@@ -32990,6 +32953,54 @@ A624 003F
 1244C 003F
 12452 003F
 12453 003F
+1D363 003F
+FF14 0021
+FF14 003F
+2477 0021
+2477 003F
+1F105 0334
+1F105 0021
+1F105 003F
+0F2D 0021
+0F2D 003F
+248B 0021
+248B 003F
+1D7D2 0021
+1D7DC 0021
+1D7E6 0021
+1D7F0 0021
+1D7FA 0021
+1D7D2 003F
+1D7DC 003F
+1D7E6 003F
+1D7F0 003F
+1D7FA 003F
+2463 0021
+24F8 0021
+2779 0021
+2783 0021
+278D 0021
+2463 003F
+24F8 003F
+2779 003F
+2783 003F
+278D 003F
+2074 0021
+2074 003F
+2084 0021
+2084 003F
+1010A 0334
+104A4 0334
+10A43 0334
+10B5B 0334
+10B7B 0334
+10E63 0334
+11055 0334
+1106A 0334
+110F4 0334
+1113A 0334
+111D4 0334
+116C4 0334
 12402 0334
 12409 0334
 1240F 0334
@@ -33005,30 +33016,12 @@ A624 003F
 1244C 0334
 12452 0334
 12453 0334
-10B5B 0021
-10B5B 003F
-10B5B 0334
-10B7B 0021
-10B7B 003F
-10B7B 0334
-111D4 0021
-111D4 003F
-111D4 0334
-116C4 0021
-116C4 003F
-116C4 0334
-1106A 0021
-1106A 003F
-1106A 0334
-11055 0021
-11055 003F
-11055 0334
-10A43 0021
-10A43 003F
-10A43 0334
-1D363 0021
-1D363 003F
 1D363 0334
+1D7D2 0334
+1D7DC 0334
+1D7E6 0334
+1D7F0 0334
+1D7FA 0334
 2158 0021
 2158 003F
 2158 0061
@@ -33090,123 +33083,54 @@ A624 003F
 32BE 0041
 32BE 0062
 0034 0061
-0034 0041
-FF14 0061
-FF14 0041
-2477 0061
-1F105 0061
-248B 0061
-2477 0041
-1F105 0041
-248B 0041
-1D7D2 0061
-1D7DC 0061
-1D7E6 0061
-1D7F0 0061
-1D7FA 0061
-1D7D2 0041
-1D7DC 0041
-1D7E6 0041
-1D7F0 0041
-1D7FA 0041
-2463 0061
-24F8 0061
-2779 0061
-2783 0061
-278D 0061
-2463 0041
-24F8 0041
-2779 0041
-2783 0041
-278D 0041
-2074 0061
-2074 0041
-2084 0061
-2084 0041
 0664 0061
-0664 0041
 06F4 0061
-06F4 0041
-10E63 0061
-10E63 0041
 07C4 0061
-07C4 0041
-136C 0061
-136C 0041
-104A4 0061
-104A4 0041
 096A 0061
-096A 0041
 09EA 0061
-09EA 0041
 0A6A 0061
-0A6A 0041
 0AEA 0061
-0AEA 0041
 0B6A 0061
-0B6A 0041
 0BEA 0061
-0BEA 0041
 0C6A 0061
-0C6A 0041
 0CEA 0061
-0CEA 0041
 0D6A 0061
-0D6A 0041
-ABF4 0061
-ABF4 0041
-A8D4 0061
-A8D4 0041
+0E54 0061
+0ED4 0061
+0F24 0061
+1044 0061
+1094 0061
+136C 0061
+17E4 0061
+17F4 0061
+1814 0061
 194A 0061
-194A 0041
 19D4 0061
-19D4 0041
 1A84 0061
-1A84 0041
 1A94 0061
-1A94 0041
-0E54 0061
-0E54 0041
-0ED4 0061
-0ED4 0041
-0F24 0061
-0F24 0041
-0F2D 0061
-0F2D 0041
-1C44 0061
-1C44 0041
-A904 0061
-A904 0041
-1044 0061
-1044 0041
-1094 0061
-1094 0041
-1113A 0061
-1113A 0041
-17E4 0061
-17E4 0041
-17F4 0061
-17F4 0041
-AA54 0061
-AA54 0041
 1B54 0061
-1B54 0041
-A9D4 0061
-A9D4 0041
 1BB4 0061
-1BB4 0041
-1814 0061
-1814 0041
+1C44 0061
 1C54 0061
-1C54 0041
-A624 0061
-A624 0041
-110F4 0061
-110F4 0041
 3024 0061
-3024 0041
+A624 0061
+A8D4 0061
+A904 0061
+A9D4 0061
+AA54 0061
+ABF4 0061
 1010A 0061
-1010A 0041
+104A4 0061
+10A43 0061
+10B5B 0061
+10B7B 0061
+10E63 0061
+11055 0061
+1106A 0061
+110F4 0061
+1113A 0061
+111D4 0061
+116C4 0061
 12402 0061
 12409 0061
 1240F 0061
@@ -33222,6 +33146,56 @@ A624 0041
 1244C 0061
 12452 0061
 12453 0061
+1D363 0061
+0034 0041
+0664 0041
+06F4 0041
+07C4 0041
+096A 0041
+09EA 0041
+0A6A 0041
+0AEA 0041
+0B6A 0041
+0BEA 0041
+0C6A 0041
+0CEA 0041
+0D6A 0041
+0E54 0041
+0ED4 0041
+0F24 0041
+1044 0041
+1094 0041
+136C 0041
+17E4 0041
+17F4 0041
+1814 0041
+194A 0041
+19D4 0041
+1A84 0041
+1A94 0041
+1B54 0041
+1BB4 0041
+1C44 0041
+1C54 0041
+3024 0041
+A624 0041
+A8D4 0041
+A904 0041
+A9D4 0041
+AA54 0041
+ABF4 0041
+1010A 0041
+104A4 0041
+10A43 0041
+10B5B 0041
+10B7B 0041
+10E63 0041
+11055 0041
+1106A 0041
+110F4 0041
+1113A 0041
+111D4 0041
+116C4 0041
 12402 0041
 12409 0041
 1240F 0041
@@ -33237,45 +33211,45 @@ A624 0041
 1244C 0041
 12452 0041
 12453 0041
-10B5B 0061
-10B5B 0041
-10B7B 0061
-10B7B 0041
-111D4 0061
-111D4 0041
-116C4 0061
-116C4 0041
-1106A 0061
-1106A 0041
-11055 0061
-11055 0041
-10A43 0061
-10A43 0041
-1D363 0061
 1D363 0041
+FF14 0061
+FF14 0041
+2477 0061
+1F105 0061
+248B 0061
+0F2D 0061
+2477 0041
+1F105 0041
+248B 0041
+0F2D 0041
+1D7D2 0061
+1D7DC 0061
+1D7E6 0061
+1D7F0 0061
+1D7FA 0061
+1D7D2 0041
+1D7DC 0041
+1D7E6 0041
+1D7F0 0041
+1D7FA 0041
+2463 0061
+24F8 0061
+2779 0061
+2783 0061
+278D 0061
+2463 0041
+24F8 0041
+2779 0041
+2783 0041
+278D 0041
+2074 0061
+2074 0041
+2084 0061
+2084 0041
 0034 0062
-FF14 0062
-2477 0062
-1F105 0062
-248B 0062
-1D7D2 0062
-1D7DC 0062
-1D7E6 0062
-1D7F0 0062
-1D7FA 0062
-2463 0062
-24F8 0062
-2779 0062
-2783 0062
-278D 0062
-2074 0062
-2084 0062
 0664 0062
 06F4 0062
-10E63 0062
 07C4 0062
-136C 0062
-104A4 0062
 096A 0062
 09EA 0062
 0A6A 0062
@@ -33285,33 +33259,42 @@ FF14 0062
 0C6A 0062
 0CEA 0062
 0D6A 0062
-ABF4 0062
-A8D4 0062
-194A 0062
-19D4 0062
-1A84 0062
-1A94 0062
 0E54 0062
 0ED4 0062
 0F24 0062
-0F2D 0062
-1C44 0062
-A904 0062
 1044 0062
 1094 0062
-1113A 0062
+136C 0062
 17E4 0062
 17F4 0062
-AA54 0062
+1814 0062
+194A 0062
+19D4 0062
+1A84 0062
+1A94 0062
 1B54 0062
-A9D4 0062
 1BB4 0062
-1814 0062
+1C44 0062
 1C54 0062
-A624 0062
-110F4 0062
 3024 0062
+A624 0062
+A8D4 0062
+A904 0062
+A9D4 0062
+AA54 0062
+ABF4 0062
 1010A 0062
+104A4 0062
+10A43 0062
+10B5B 0062
+10B7B 0062
+10E63 0062
+11055 0062
+1106A 0062
+110F4 0062
+1113A 0062
+111D4 0062
+116C4 0062
 12402 0062
 12409 0062
 1240F 0062
@@ -33327,14 +33310,24 @@ A624 0062
 1244C 0062
 12452 0062
 12453 0062
-10B5B 0062
-10B7B 0062
-111D4 0062
-116C4 0062
-1106A 0062
-11055 0062
-10A43 0062
 1D363 0062
+FF14 0062
+2477 0062
+1F105 0062
+248B 0062
+0F2D 0062
+1D7D2 0062
+1D7DC 0062
+1D7E6 0062
+1D7F0 0062
+1D7FA 0062
+2463 0062
+24F8 0062
+2779 0062
+2783 0062
+278D 0062
+2074 0062
+2084 0062
 33E3 0021
 33E3 003F
 33E3 0061
@@ -33351,152 +33344,57 @@ A624 0062
 335C 0041
 335C 0062
 0035 0021
-0035 003F
-FF15 0021
-FF15 003F
-2478 0021
-2478 003F
-1F106 0334
-1F106 0021
-1F106 003F
-248C 0021
-248C 003F
-1D7D3 0021
-1D7DD 0021
-1D7E7 0021
-1D7F1 0021
-1D7FB 0021
-1D7D3 003F
-1D7DD 003F
-1D7E7 003F
-1D7F1 003F
-1D7FB 003F
-2464 0021
-24F9 0021
-277A 0021
-2784 0021
-278E 0021
-2464 003F
-24F9 003F
-277A 003F
-2784 003F
-278E 003F
-2075 0021
-2075 003F
-2085 0021
-2085 003F
-1D7D3 0334
-1D7DD 0334
-1D7E7 0334
-1D7F1 0334
-1D7FB 0334
 0665 0021
-0665 003F
 06F5 0021
-06F5 003F
-10E64 0021
-10E64 003F
-10E64 0334
 07C5 0021
-07C5 003F
-136D 0021
-136D 003F
-104A5 0021
-104A5 003F
-104A5 0334
 096B 0021
-096B 003F
 09EB 0021
-09EB 003F
 0A6B 0021
-0A6B 003F
 0AEB 0021
-0AEB 003F
 0B6B 0021
-0B6B 003F
 0BEB 0021
-0BEB 003F
 0C6B 0021
-0C6B 003F
 0CEB 0021
-0CEB 003F
 0D6B 0021
-0D6B 003F
-ABF5 0021
-ABF5 003F
-A8D5 0021
-A8D5 003F
-194B 0021
-194B 003F
-19D5 0021
-19D5 003F
-1A85 0021
-1A85 003F
-1A95 0021
-1A95 003F
 0E55 0021
-0E55 003F
 0ED5 0021
-0ED5 003F
 0F25 0021
-0F25 003F
-0F2E 0021
-0F2E 003F
-1C45 0021
-1C45 003F
-A905 0021
-A905 003F
 1045 0021
-1045 003F
 1095 0021
-1095 003F
-1113B 0021
-1113B 003F
-1113B 0334
+136D 0021
 17E5 0021
-17E5 003F
 17F5 0021
-17F5 003F
-AA55 0021
-AA55 003F
+1815 0021
+194B 0021
+19D5 0021
+1A85 0021
+1A95 0021
 1B55 0021
-1B55 003F
-A9D5 0021
-A9D5 003F
 1BB5 0021
-1BB5 003F
-1815 0021
-1815 003F
+1C45 0021
 1C55 0021
-1C55 003F
-A625 0021
-A625 003F
-110F5 0021
-110F5 003F
-110F5 0334
 3025 0021
-3025 003F
+A625 0021
+A8D5 0021
+A905 0021
+A9D5 0021
+AA55 0021
+ABF5 0021
 1010B 0021
-1010B 003F
-1010B 0334
 10143 0021
 10148 0021
 1014F 0021
 1015F 0021
 10173 0021
-10143 003F
-10148 003F
-1014F 003F
-1015F 003F
-10173 003F
-10143 0334
-10148 0334
-1014F 0334
-1015F 0334
-10173 0334
 10321 0021
-10321 003F
-10321 0334
+104A5 0021
+10E64 0021
+11056 0021
+1106B 0021
+110F5 0021
+1113B 0021
+111D5 0021
+116C5 0021
 12403 0021
 1240A 0021
 12410 0021
@@ -33508,6 +33406,59 @@ A625 003F
 1244D 0021
 12454 0021
 12455 0021
+1D364 0021
+0035 003F
+0665 003F
+06F5 003F
+07C5 003F
+096B 003F
+09EB 003F
+0A6B 003F
+0AEB 003F
+0B6B 003F
+0BEB 003F
+0C6B 003F
+0CEB 003F
+0D6B 003F
+0E55 003F
+0ED5 003F
+0F25 003F
+1045 003F
+1095 003F
+136D 003F
+17E5 003F
+17F5 003F
+1815 003F
+194B 003F
+19D5 003F
+1A85 003F
+1A95 003F
+1B55 003F
+1BB5 003F
+1C45 003F
+1C55 003F
+3025 003F
+A625 003F
+A8D5 003F
+A905 003F
+A9D5 003F
+AA55 003F
+ABF5 003F
+1010B 003F
+10143 003F
+10148 003F
+1014F 003F
+1015F 003F
+10173 003F
+10321 003F
+104A5 003F
+10E64 003F
+11056 003F
+1106B 003F
+110F5 003F
+1113B 003F
+111D5 003F
+116C5 003F
 12403 003F
 1240A 003F
 12410 003F
@@ -33519,6 +33470,57 @@ A625 003F
 1244D 003F
 12454 003F
 12455 003F
+1D364 003F
+FF15 0021
+FF15 003F
+2478 0021
+2478 003F
+1F106 0334
+1F106 0021
+1F106 003F
+0F2E 0021
+0F2E 003F
+248C 0021
+248C 003F
+1D7D3 0021
+1D7DD 0021
+1D7E7 0021
+1D7F1 0021
+1D7FB 0021
+1D7D3 003F
+1D7DD 003F
+1D7E7 003F
+1D7F1 003F
+1D7FB 003F
+2464 0021
+24F9 0021
+277A 0021
+2784 0021
+278E 0021
+2464 003F
+24F9 003F
+277A 003F
+2784 003F
+278E 003F
+2075 0021
+2075 003F
+2085 0021
+2085 003F
+1010B 0334
+10143 0334
+10148 0334
+1014F 0334
+1015F 0334
+10173 0334
+10321 0334
+104A5 0334
+10E64 0334
+11056 0334
+1106B 0334
+110F5 0334
+1113B 0334
+111D5 0334
+116C5 0334
 12403 0334
 1240A 0334
 12410 0334
@@ -33530,21 +33532,12 @@ A625 003F
 1244D 0334
 12454 0334
 12455 0334
-111D5 0021
-111D5 003F
-111D5 0334
-116C5 0021
-116C5 003F
-116C5 0334
-1106B 0021
-1106B 003F
-1106B 0334
-11056 0021
-11056 003F
-11056 0334
-1D364 0021
-1D364 003F
 1D364 0334
+1D7D3 0334
+1D7DD 0334
+1D7E7 0334
+1D7F1 0334
+1D7FB 0334
 215A 0021
 215A 003F
 215A 0061
@@ -33566,135 +33559,57 @@ A625 003F
 324C 0062
 32BF 0062
 0035 0061
-0035 0041
-FF15 0061
-FF15 0041
-2478 0061
-1F106 0061
-248C 0061
-2478 0041
-1F106 0041
-248C 0041
-1D7D3 0061
-1D7DD 0061
-1D7E7 0061
-1D7F1 0061
-1D7FB 0061
-1D7D3 0041
-1D7DD 0041
-1D7E7 0041
-1D7F1 0041
-1D7FB 0041
-2464 0061
-24F9 0061
-277A 0061
-2784 0061
-278E 0061
-2464 0041
-24F9 0041
-277A 0041
-2784 0041
-278E 0041
-2075 0061
-2075 0041
-2085 0061
-2085 0041
 0665 0061
-0665 0041
 06F5 0061
-06F5 0041
-10E64 0061
-10E64 0041
 07C5 0061
-07C5 0041
-136D 0061
-136D 0041
-104A5 0061
-104A5 0041
 096B 0061
-096B 0041
 09EB 0061
-09EB 0041
 0A6B 0061
-0A6B 0041
 0AEB 0061
-0AEB 0041
 0B6B 0061
-0B6B 0041
 0BEB 0061
-0BEB 0041
 0C6B 0061
-0C6B 0041
 0CEB 0061
-0CEB 0041
 0D6B 0061
-0D6B 0041
-ABF5 0061
-ABF5 0041
-A8D5 0061
-A8D5 0041
-194B 0061
-194B 0041
-19D5 0061
-19D5 0041
-1A85 0061
-1A85 0041
-1A95 0061
-1A95 0041
 0E55 0061
-0E55 0041
 0ED5 0061
-0ED5 0041
 0F25 0061
-0F25 0041
-0F2E 0061
-0F2E 0041
-1C45 0061
-1C45 0041
-A905 0061
-A905 0041
 1045 0061
-1045 0041
 1095 0061
-1095 0041
-1113B 0061
-1113B 0041
+136D 0061
 17E5 0061
-17E5 0041
 17F5 0061
-17F5 0041
-AA55 0061
-AA55 0041
+1815 0061
+194B 0061
+19D5 0061
+1A85 0061
+1A95 0061
 1B55 0061
-1B55 0041
-A9D5 0061
-A9D5 0041
 1BB5 0061
-1BB5 0041
-1815 0061
-1815 0041
+1C45 0061
 1C55 0061
-1C55 0041
-A625 0061
-A625 0041
-110F5 0061
-110F5 0041
 3025 0061
-3025 0041
+A625 0061
+A8D5 0061
+A905 0061
+A9D5 0061
+AA55 0061
+ABF5 0061
 1010B 0061
-1010B 0041
 10143 0061
 10148 0061
 1014F 0061
 1015F 0061
 10173 0061
-10143 0041
-10148 0041
-1014F 0041
-1015F 0041
-10173 0041
 10321 0061
-10321 0041
+104A5 0061
+10E64 0061
+11056 0061
+1106B 0061
+110F5 0061
+1113B 0061
+111D5 0061
+116C5 0061
 12403 0061
 1240A 0061
 12410 0061
@@ -33706,6 +33621,59 @@ A625 0041
 1244D 0061
 12454 0061
 12455 0061
+1D364 0061
+0035 0041
+0665 0041
+06F5 0041
+07C5 0041
+096B 0041
+09EB 0041
+0A6B 0041
+0AEB 0041
+0B6B 0041
+0BEB 0041
+0C6B 0041
+0CEB 0041
+0D6B 0041
+0E55 0041
+0ED5 0041
+0F25 0041
+1045 0041
+1095 0041
+136D 0041
+17E5 0041
+17F5 0041
+1815 0041
+194B 0041
+19D5 0041
+1A85 0041
+1A95 0041
+1B55 0041
+1BB5 0041
+1C45 0041
+1C55 0041
+3025 0041
+A625 0041
+A8D5 0041
+A905 0041
+A9D5 0041
+AA55 0041
+ABF5 0041
+1010B 0041
+10143 0041
+10148 0041
+1014F 0041
+1015F 0041
+10173 0041
+10321 0041
+104A5 0041
+10E64 0041
+11056 0041
+1106B 0041
+110F5 0041
+1113B 0041
+111D5 0041
+116C5 0041
 12403 0041
 1240A 0041
 12410 0041
@@ -33717,39 +33685,45 @@ A625 0041
 1244D 0041
 12454 0041
 12455 0041
-111D5 0061
-111D5 0041
-116C5 0061
-116C5 0041
-1106B 0061
-1106B 0041
-11056 0061
-11056 0041
-1D364 0061
 1D364 0041
+FF15 0061
+FF15 0041
+2478 0061
+1F106 0061
+248C 0061
+0F2E 0061
+2478 0041
+1F106 0041
+248C 0041
+0F2E 0041
+1D7D3 0061
+1D7DD 0061
+1D7E7 0061
+1D7F1 0061
+1D7FB 0061
+1D7D3 0041
+1D7DD 0041
+1D7E7 0041
+1D7F1 0041
+1D7FB 0041
+2464 0061
+24F9 0061
+277A 0061
+2784 0061
+278E 0061
+2464 0041
+24F9 0041
+277A 0041
+2784 0041
+278E 0041
+2075 0061
+2075 0041
+2085 0061
+2085 0041
 0035 0062
-FF15 0062
-2478 0062
-1F106 0062
-248C 0062
-1D7D3 0062
-1D7DD 0062
-1D7E7 0062
-1D7F1 0062
-1D7FB 0062
-2464 0062
-24F9 0062
-277A 0062
-2784 0062
-278E 0062
-2075 0062
-2085 0062
 0665 0062
 06F5 0062
-10E64 0062
 07C5 0062
-136D 0062
-104A5 0062
 096B 0062
 09EB 0062
 0A6B 0062
@@ -33759,32 +33733,30 @@ FF15 0062
 0C6B 0062
 0CEB 0062
 0D6B 0062
-ABF5 0062
-A8D5 0062
-194B 0062
-19D5 0062
-1A85 0062
-1A95 0062
 0E55 0062
 0ED5 0062
 0F25 0062
-0F2E 0062
-1C45 0062
-A905 0062
 1045 0062
 1095 0062
-1113B 0062
+136D 0062
 17E5 0062
 17F5 0062
-AA55 0062
+1815 0062
+194B 0062
+19D5 0062
+1A85 0062
+1A95 0062
 1B55 0062
-A9D5 0062
 1BB5 0062
-1815 0062
+1C45 0062
 1C55 0062
-A625 0062
-110F5 0062
 3025 0062
+A625 0062
+A8D5 0062
+A905 0062
+A9D5 0062
+AA55 0062
+ABF5 0062
 1010B 0062
 10143 0062
 10148 0062
@@ -33792,6 +33764,14 @@ A625 0062
 1015F 0062
 10173 0062
 10321 0062
+104A5 0062
+10E64 0062
+11056 0062
+1106B 0062
+110F5 0062
+1113B 0062
+111D5 0062
+116C5 0062
 12403 0062
 1240A 0062
 12410 0062
@@ -33803,11 +33783,24 @@ A625 0062
 1244D 0062
 12454 0062
 12455 0062
-111D5 0062
-116C5 0062
-1106B 0062
-11056 0062
 1D364 0062
+FF15 0062
+2478 0062
+1F106 0062
+248C 0062
+0F2E 0062
+1D7D3 0062
+1D7DD 0062
+1D7E7 0062
+1D7F1 0062
+1D7FB 0062
+2464 0062
+24F9 0062
+277A 0062
+2784 0062
+278E 0062
+2075 0062
+2085 0062
 33E4 0021
 33E4 003F
 33E4 0061
@@ -33824,136 +33817,52 @@ A625 0062
 335D 0041
 335D 0062
 0036 0021
-0036 003F
-FF16 0021
-FF16 003F
-2479 0021
-2479 003F
-1F107 0334
-1F107 0021
-1F107 003F
-248D 0021
-248D 003F
-1D7D4 0021
-1D7DE 0021
-1D7E8 0021
-1D7F2 0021
-1D7FC 0021
-1D7D4 003F
-1D7DE 003F
-1D7E8 003F
-1D7F2 003F
-1D7FC 003F
-2465 0021
-24FA 0021
-277B 0021
-2785 0021
-278F 0021
-2465 003F
-24FA 003F
-277B 003F
-2785 003F
-278F 003F
-2076 0021
-2076 003F
-2086 0021
-2086 003F
-1D7D4 0334
-1D7DE 0334
-1D7E8 0334
-1D7F2 0334
-1D7FC 0334
 0666 0021
-0666 003F
 06F6 0021
-06F6 003F
-10E65 0021
-10E65 003F
-10E65 0334
 07C6 0021
-07C6 003F
-136E 0021
-136E 003F
-104A6 0021
-104A6 003F
-104A6 0334
 096C 0021
-096C 003F
 09EC 0021
-09EC 003F
 0A6C 0021
-0A6C 003F
 0AEC 0021
-0AEC 003F
 0B6C 0021
-0B6C 003F
 0BEC 0021
-0BEC 003F
 0C6C 0021
-0C6C 003F
 0CEC 0021
-0CEC 003F
 0D6C 0021
-0D6C 003F
-ABF6 0021
-ABF6 003F
-A8D6 0021
-A8D6 003F
-194C 0021
-194C 003F
-19D6 0021
-19D6 003F
-1A86 0021
-1A86 003F
-1A96 0021
-1A96 003F
 0E56 0021
-0E56 003F
 0ED6 0021
-0ED6 003F
 0F26 0021
-0F26 003F
-0F2F 0021
-0F2F 003F
-1C46 0021
-1C46 003F
-A906 0021
-A906 003F
 1046 0021
-1046 003F
 1096 0021
-1096 003F
-1113C 0021
-1113C 003F
-1113C 0334
+136E 0021
 17E6 0021
-17E6 003F
 17F6 0021
-17F6 003F
-AA56 0021
-AA56 003F
+1816 0021
+194C 0021
+19D6 0021
+1A86 0021
+1A96 0021
 1B56 0021
-1B56 003F
-A9D6 0021
-A9D6 003F
 1BB6 0021
-1BB6 003F
-1816 0021
-1816 003F
+1C46 0021
 1C56 0021
-1C56 003F
-A626 0021
-A626 003F
-110F6 0021
-110F6 003F
-110F6 0334
+2185 0021
 3026 0021
-3026 003F
+A626 0021
+A8D6 0021
+A906 0021
+A9D6 0021
+AA56 0021
+ABF6 0021
 1010C 0021
-1010C 003F
-1010C 0334
-2185 0021
-2185 003F
+104A6 0021
+10E65 0021
+11057 0021
+1106C 0021
+110F6 0021
+1113C 0021
+111D6 0021
+116C6 0021
 12404 0021
 1240B 0021
 12411 0021
@@ -33961,6 +33870,54 @@ A626 003F
 12428 0021
 12440 0021
 1244E 0021
+1D365 0021
+0036 003F
+0666 003F
+06F6 003F
+07C6 003F
+096C 003F
+09EC 003F
+0A6C 003F
+0AEC 003F
+0B6C 003F
+0BEC 003F
+0C6C 003F
+0CEC 003F
+0D6C 003F
+0E56 003F
+0ED6 003F
+0F26 003F
+1046 003F
+1096 003F
+136E 003F
+17E6 003F
+17F6 003F
+1816 003F
+194C 003F
+19D6 003F
+1A86 003F
+1A96 003F
+1B56 003F
+1BB6 003F
+1C46 003F
+1C56 003F
+2185 003F
+3026 003F
+A626 003F
+A8D6 003F
+A906 003F
+A9D6 003F
+AA56 003F
+ABF6 003F
+1010C 003F
+104A6 003F
+10E65 003F
+11057 003F
+1106C 003F
+110F6 003F
+1113C 003F
+111D6 003F
+116C6 003F
 12404 003F
 1240B 003F
 12411 003F
@@ -33968,6 +33925,51 @@ A626 003F
 12428 003F
 12440 003F
 1244E 003F
+1D365 003F
+FF16 0021
+FF16 003F
+2479 0021
+2479 003F
+1F107 0334
+1F107 0021
+1F107 003F
+0F2F 0021
+0F2F 003F
+248D 0021
+248D 003F
+1D7D4 0021
+1D7DE 0021
+1D7E8 0021
+1D7F2 0021
+1D7FC 0021
+1D7D4 003F
+1D7DE 003F
+1D7E8 003F
+1D7F2 003F
+1D7FC 003F
+2465 0021
+24FA 0021
+277B 0021
+2785 0021
+278F 0021
+2465 003F
+24FA 003F
+277B 003F
+2785 003F
+278F 003F
+2076 0021
+2076 003F
+2086 0021
+2086 003F
+1010C 0334
+104A6 0334
+10E65 0334
+11057 0334
+1106C 0334
+110F6 0334
+1113C 0334
+111D6 0334
+116C6 0334
 12404 0334
 1240B 0334
 12411 0334
@@ -33975,146 +33977,64 @@ A626 003F
 12428 0334
 12440 0334
 1244E 0334
-111D6 0021
-111D6 003F
-111D6 0334
-116C6 0021
-116C6 003F
-116C6 0334
-1106C 0021
-1106C 003F
-1106C 0334
-11057 0021
-11057 003F
-11057 0334
-1D365 0021
-1D365 003F
 1D365 0334
-324D 0021
-324D 003F
-324D 0061
+1D7D4 0334
+1D7DE 0334
+1D7E8 0334
+1D7F2 0334
+1D7FC 0334
+324D 0021
+324D 003F
+324D 0061
 324D 0041
 324D 0062
 0036 0061
-0036 0041
-FF16 0061
-FF16 0041
-2479 0061
-1F107 0061
-248D 0061
-2479 0041
-1F107 0041
-248D 0041
-1D7D4 0061
-1D7DE 0061
-1D7E8 0061
-1D7F2 0061
-1D7FC 0061
-1D7D4 0041
-1D7DE 0041
-1D7E8 0041
-1D7F2 0041
-1D7FC 0041
-2465 0061
-24FA 0061
-277B 0061
-2785 0061
-278F 0061
-2465 0041
-24FA 0041
-277B 0041
-2785 0041
-278F 0041
-2076 0061
-2076 0041
-2086 0061
-2086 0041
 0666 0061
-0666 0041
 06F6 0061
-06F6 0041
-10E65 0061
-10E65 0041
 07C6 0061
-07C6 0041
-136E 0061
-136E 0041
-104A6 0061
-104A6 0041
 096C 0061
-096C 0041
 09EC 0061
-09EC 0041
 0A6C 0061
-0A6C 0041
 0AEC 0061
-0AEC 0041
 0B6C 0061
-0B6C 0041
 0BEC 0061
-0BEC 0041
 0C6C 0061
-0C6C 0041
 0CEC 0061
-0CEC 0041
 0D6C 0061
-0D6C 0041
-ABF6 0061
-ABF6 0041
-A8D6 0061
-A8D6 0041
-194C 0061
-194C 0041
-19D6 0061
-19D6 0041
-1A86 0061
-1A86 0041
-1A96 0061
-1A96 0041
 0E56 0061
-0E56 0041
 0ED6 0061
-0ED6 0041
 0F26 0061
-0F26 0041
-0F2F 0061
-0F2F 0041
-1C46 0061
-1C46 0041
-A906 0061
-A906 0041
 1046 0061
-1046 0041
 1096 0061
-1096 0041
-1113C 0061
-1113C 0041
+136E 0061
 17E6 0061
-17E6 0041
 17F6 0061
-17F6 0041
-AA56 0061
-AA56 0041
+1816 0061
+194C 0061
+19D6 0061
+1A86 0061
+1A96 0061
 1B56 0061
-1B56 0041
-A9D6 0061
-A9D6 0041
 1BB6 0061
-1BB6 0041
-1816 0061
-1816 0041
+1C46 0061
 1C56 0061
-1C56 0041
-A626 0061
-A626 0041
-110F6 0061
-110F6 0041
+2185 0061
 3026 0061
-3026 0041
+A626 0061
+A8D6 0061
+A906 0061
+A9D6 0061
+AA56 0061
+ABF6 0061
 1010C 0061
-1010C 0041
-2185 0061
-2185 0041
+104A6 0061
+10E65 0061
+11057 0061
+1106C 0061
+110F6 0061
+1113C 0061
+111D6 0061
+116C6 0061
 12404 0061
 1240B 0061
 12411 0061
@@ -34122,6 +34042,54 @@ A626 0041
 12428 0061
 12440 0061
 1244E 0061
+1D365 0061
+0036 0041
+0666 0041
+06F6 0041
+07C6 0041
+096C 0041
+09EC 0041
+0A6C 0041
+0AEC 0041
+0B6C 0041
+0BEC 0041
+0C6C 0041
+0CEC 0041
+0D6C 0041
+0E56 0041
+0ED6 0041
+0F26 0041
+1046 0041
+1096 0041
+136E 0041
+17E6 0041
+17F6 0041
+1816 0041
+194C 0041
+19D6 0041
+1A86 0041
+1A96 0041
+1B56 0041
+1BB6 0041
+1C46 0041
+1C56 0041
+2185 0041
+3026 0041
+A626 0041
+A8D6 0041
+A906 0041
+A9D6 0041
+AA56 0041
+ABF6 0041
+1010C 0041
+104A6 0041
+10E65 0041
+11057 0041
+1106C 0041
+110F6 0041
+1113C 0041
+111D6 0041
+116C6 0041
 12404 0041
 1240B 0041
 12411 0041
@@ -34129,39 +34097,45 @@ A626 0041
 12428 0041
 12440 0041
 1244E 0041
-111D6 0061
-111D6 0041
-116C6 0061
-116C6 0041
-1106C 0061
-1106C 0041
-11057 0061
-11057 0041
-1D365 0061
 1D365 0041
+FF16 0061
+FF16 0041
+2479 0061
+1F107 0061
+248D 0061
+0F2F 0061
+2479 0041
+1F107 0041
+248D 0041
+0F2F 0041
+1D7D4 0061
+1D7DE 0061
+1D7E8 0061
+1D7F2 0061
+1D7FC 0061
+1D7D4 0041
+1D7DE 0041
+1D7E8 0041
+1D7F2 0041
+1D7FC 0041
+2465 0061
+24FA 0061
+277B 0061
+2785 0061
+278F 0061
+2465 0041
+24FA 0041
+277B 0041
+2785 0041
+278F 0041
+2076 0061
+2076 0041
+2086 0061
+2086 0041
 0036 0062
-FF16 0062
-2479 0062
-1F107 0062
-248D 0062
-1D7D4 0062
-1D7DE 0062
-1D7E8 0062
-1D7F2 0062
-1D7FC 0062
-2465 0062
-24FA 0062
-277B 0062
-2785 0062
-278F 0062
-2076 0062
-2086 0062
 0666 0062
 06F6 0062
-10E65 0062
 07C6 0062
-136E 0062
-104A6 0062
 096C 0062
 09EC 0062
 0A6C 0062
@@ -34171,34 +34145,40 @@ FF16 0062
 0C6C 0062
 0CEC 0062
 0D6C 0062
-ABF6 0062
-A8D6 0062
-194C 0062
-19D6 0062
-1A86 0062
-1A96 0062
 0E56 0062
 0ED6 0062
 0F26 0062
-0F2F 0062
-1C46 0062
-A906 0062
 1046 0062
 1096 0062
-1113C 0062
+136E 0062
 17E6 0062
 17F6 0062
-AA56 0062
+1816 0062
+194C 0062
+19D6 0062
+1A86 0062
+1A96 0062
 1B56 0062
-A9D6 0062
 1BB6 0062
-1816 0062
+1C46 0062
 1C56 0062
-A626 0062
-110F6 0062
+2185 0062
 3026 0062
+A626 0062
+A8D6 0062
+A906 0062
+A9D6 0062
+AA56 0062
+ABF6 0062
 1010C 0062
-2185 0062
+104A6 0062
+10E65 0062
+11057 0062
+1106C 0062
+110F6 0062
+1113C 0062
+111D6 0062
+116C6 0062
 12404 0062
 1240B 0062
 12411 0062
@@ -34206,11 +34186,24 @@ A626 0062
 12428 0062
 12440 0062
 1244E 0062
-111D6 0062
-116C6 0062
-1106C 0062
-11057 0062
 1D365 0062
+FF16 0062
+2479 0062
+1F107 0062
+248D 0062
+0F2F 0062
+1D7D4 0062
+1D7DE 0062
+1D7E8 0062
+1D7F2 0062
+1D7FC 0062
+2465 0062
+24FA 0062
+277B 0062
+2785 0062
+278F 0062
+2076 0062
+2086 0062
 33E5 0021
 33E5 003F
 33E5 0061
@@ -34227,134 +34220,51 @@ A626 0062
 335E 0041
 335E 0062
 0037 0021
-0037 003F
-FF17 0021
-FF17 003F
-247A 0021
-247A 003F
-1F108 0334
-1F108 0021
-1F108 003F
-248E 0021
-248E 003F
-1D7D5 0021
-1D7DF 0021
-1D7E9 0021
-1D7F3 0021
-1D7FD 0021
-1D7D5 003F
-1D7DF 003F
-1D7E9 003F
-1D7F3 003F
-1D7FD 003F
-2466 0021
-24FB 0021
-277C 0021
-2786 0021
-2790 0021
-2466 003F
-24FB 003F
-277C 003F
-2786 003F
-2790 003F
-2077 0021
-2077 003F
-2087 0021
-2087 003F
-1D7D5 0334
-1D7DF 0334
-1D7E9 0334
-1D7F3 0334
-1D7FD 0334
 0667 0021
-0667 003F
 06F7 0021
-06F7 003F
-10E66 0021
-10E66 003F
-10E66 0334
 07C7 0021
-07C7 003F
-136F 0021
-136F 003F
-104A7 0021
-104A7 003F
-104A7 0334
 096D 0021
-096D 003F
 09ED 0021
-09ED 003F
 0A6D 0021
-0A6D 003F
 0AED 0021
-0AED 003F
 0B6D 0021
-0B6D 003F
 0BED 0021
-0BED 003F
 0C6D 0021
-0C6D 003F
 0CED 0021
-0CED 003F
 0D6D 0021
-0D6D 003F
-ABF7 0021
-ABF7 003F
-A8D7 0021
-A8D7 003F
-194D 0021
-194D 003F
-19D7 0021
-19D7 003F
-1A87 0021
-1A87 003F
-1A97 0021
-1A97 003F
 0E57 0021
-0E57 003F
 0ED7 0021
-0ED7 003F
 0F27 0021
-0F27 003F
-0F30 0021
-0F30 003F
-1C47 0021
-1C47 003F
-A907 0021
-A907 003F
 1047 0021
-1047 003F
 1097 0021
-1097 003F
-1113D 0021
-1113D 003F
-1113D 0334
+136F 0021
 17E7 0021
-17E7 003F
 17F7 0021
-17F7 003F
-AA57 0021
-AA57 003F
+1817 0021
+194D 0021
+19D7 0021
+1A87 0021
+1A97 0021
 1B57 0021
-1B57 003F
-A9D7 0021
-A9D7 003F
 1BB7 0021
-1BB7 003F
-1817 0021
-1817 003F
+1C47 0021
 1C57 0021
-1C57 003F
-A627 0021
-A627 003F
-110F7 0021
-110F7 003F
-110F7 0334
 3027 0021
-3027 003F
+A627 0021
+A8D7 0021
+A907 0021
+A9D7 0021
+AA57 0021
+ABF7 0021
 1010D 0021
-1010D 003F
-1010D 0334
+104A7 0021
+10E66 0021
+11058 0021
+1106D 0021
+110F7 0021
+1113D 0021
+111D7 0021
+116C7 0021
 12405 0021
 1240C 0021
 12412 0021
@@ -34363,6 +34273,53 @@ A627 003F
 12441 0021
 12442 0021
 12443 0021
+1D366 0021
+0037 003F
+0667 003F
+06F7 003F
+07C7 003F
+096D 003F
+09ED 003F
+0A6D 003F
+0AED 003F
+0B6D 003F
+0BED 003F
+0C6D 003F
+0CED 003F
+0D6D 003F
+0E57 003F
+0ED7 003F
+0F27 003F
+1047 003F
+1097 003F
+136F 003F
+17E7 003F
+17F7 003F
+1817 003F
+194D 003F
+19D7 003F
+1A87 003F
+1A97 003F
+1B57 003F
+1BB7 003F
+1C47 003F
+1C57 003F
+3027 003F
+A627 003F
+A8D7 003F
+A907 003F
+A9D7 003F
+AA57 003F
+ABF7 003F
+1010D 003F
+104A7 003F
+10E66 003F
+11058 003F
+1106D 003F
+110F7 003F
+1113D 003F
+111D7 003F
+116C7 003F
 12405 003F
 1240C 003F
 12412 003F
@@ -34371,6 +34328,51 @@ A627 003F
 12441 003F
 12442 003F
 12443 003F
+1D366 003F
+FF17 0021
+FF17 003F
+247A 0021
+247A 003F
+1F108 0334
+1F108 0021
+1F108 003F
+0F30 0021
+0F30 003F
+248E 0021
+248E 003F
+1D7D5 0021
+1D7DF 0021
+1D7E9 0021
+1D7F3 0021
+1D7FD 0021
+1D7D5 003F
+1D7DF 003F
+1D7E9 003F
+1D7F3 003F
+1D7FD 003F
+2466 0021
+24FB 0021
+277C 0021
+2786 0021
+2790 0021
+2466 003F
+24FB 003F
+277C 003F
+2786 003F
+2790 003F
+2077 0021
+2077 003F
+2087 0021
+2087 003F
+1010D 0334
+104A7 0334
+10E66 0334
+11058 0334
+1106D 0334
+110F7 0334
+1113D 0334
+111D7 0334
+116C7 0334
 12405 0334
 1240C 0334
 12412 0334
@@ -34379,21 +34381,12 @@ A627 003F
 12441 0334
 12442 0334
 12443 0334
-111D7 0021
-111D7 003F
-111D7 0334
-116C7 0021
-116C7 003F
-116C7 0334
-1106D 0021
-1106D 003F
-1106D 0334
-11058 0021
-11058 003F
-11058 0334
-1D366 0021
-1D366 003F
 1D366 0334
+1D7D5 0334
+1D7DF 0334
+1D7E9 0334
+1D7F3 0334
+1D7FD 0334
 215E 0021
 215E 003F
 215E 0061
@@ -34405,123 +34398,51 @@ A627 003F
 324E 0041
 324E 0062
 0037 0061
-0037 0041
-FF17 0061
-FF17 0041
-247A 0061
-1F108 0061
-248E 0061
-247A 0041
-1F108 0041
-248E 0041
-1D7D5 0061
-1D7DF 0061
-1D7E9 0061
-1D7F3 0061
-1D7FD 0061
-1D7D5 0041
-1D7DF 0041
-1D7E9 0041
-1D7F3 0041
-1D7FD 0041
-2466 0061
-24FB 0061
-277C 0061
-2786 0061
-2790 0061
-2466 0041
-24FB 0041
-277C 0041
-2786 0041
-2790 0041
-2077 0061
-2077 0041
-2087 0061
-2087 0041
 0667 0061
-0667 0041
 06F7 0061
-06F7 0041
-10E66 0061
-10E66 0041
 07C7 0061
-07C7 0041
-136F 0061
-136F 0041
-104A7 0061
-104A7 0041
 096D 0061
-096D 0041
 09ED 0061
-09ED 0041
 0A6D 0061
-0A6D 0041
 0AED 0061
-0AED 0041
 0B6D 0061
-0B6D 0041
 0BED 0061
-0BED 0041
 0C6D 0061
-0C6D 0041
 0CED 0061
-0CED 0041
 0D6D 0061
-0D6D 0041
-ABF7 0061
-ABF7 0041
-A8D7 0061
-A8D7 0041
-194D 0061
-194D 0041
-19D7 0061
-19D7 0041
-1A87 0061
-1A87 0041
-1A97 0061
-1A97 0041
 0E57 0061
-0E57 0041
 0ED7 0061
-0ED7 0041
 0F27 0061
-0F27 0041
-0F30 0061
-0F30 0041
-1C47 0061
-1C47 0041
-A907 0061
-A907 0041
 1047 0061
-1047 0041
 1097 0061
-1097 0041
-1113D 0061
-1113D 0041
+136F 0061
 17E7 0061
-17E7 0041
 17F7 0061
-17F7 0041
-AA57 0061
-AA57 0041
+1817 0061
+194D 0061
+19D7 0061
+1A87 0061
+1A97 0061
 1B57 0061
-1B57 0041
-A9D7 0061
-A9D7 0041
 1BB7 0061
-1BB7 0041
-1817 0061
-1817 0041
+1C47 0061
 1C57 0061
-1C57 0041
-A627 0061
-A627 0041
-110F7 0061
-110F7 0041
 3027 0061
-3027 0041
+A627 0061
+A8D7 0061
+A907 0061
+A9D7 0061
+AA57 0061
+ABF7 0061
 1010D 0061
-1010D 0041
+104A7 0061
+10E66 0061
+11058 0061
+1106D 0061
+110F7 0061
+1113D 0061
+111D7 0061
+116C7 0061
 12405 0061
 1240C 0061
 12412 0061
@@ -34530,6 +34451,53 @@ A627 0041
 12441 0061
 12442 0061
 12443 0061
+1D366 0061
+0037 0041
+0667 0041
+06F7 0041
+07C7 0041
+096D 0041
+09ED 0041
+0A6D 0041
+0AED 0041
+0B6D 0041
+0BED 0041
+0C6D 0041
+0CED 0041
+0D6D 0041
+0E57 0041
+0ED7 0041
+0F27 0041
+1047 0041
+1097 0041
+136F 0041
+17E7 0041
+17F7 0041
+1817 0041
+194D 0041
+19D7 0041
+1A87 0041
+1A97 0041
+1B57 0041
+1BB7 0041
+1C47 0041
+1C57 0041
+3027 0041
+A627 0041
+A8D7 0041
+A907 0041
+A9D7 0041
+AA57 0041
+ABF7 0041
+1010D 0041
+104A7 0041
+10E66 0041
+11058 0041
+1106D 0041
+110F7 0041
+1113D 0041
+111D7 0041
+116C7 0041
 12405 0041
 1240C 0041
 12412 0041
@@ -34538,39 +34506,45 @@ A627 0041
 12441 0041
 12442 0041
 12443 0041
-111D7 0061
-111D7 0041
-116C7 0061
-116C7 0041
-1106D 0061
-1106D 0041
-11058 0061
-11058 0041
-1D366 0061
 1D366 0041
+FF17 0061
+FF17 0041
+247A 0061
+1F108 0061
+248E 0061
+0F30 0061
+247A 0041
+1F108 0041
+248E 0041
+0F30 0041
+1D7D5 0061
+1D7DF 0061
+1D7E9 0061
+1D7F3 0061
+1D7FD 0061
+1D7D5 0041
+1D7DF 0041
+1D7E9 0041
+1D7F3 0041
+1D7FD 0041
+2466 0061
+24FB 0061
+277C 0061
+2786 0061
+2790 0061
+2466 0041
+24FB 0041
+277C 0041
+2786 0041
+2790 0041
+2077 0061
+2077 0041
+2087 0061
+2087 0041
 0037 0062
-FF17 0062
-247A 0062
-1F108 0062
-248E 0062
-1D7D5 0062
-1D7DF 0062
-1D7E9 0062
-1D7F3 0062
-1D7FD 0062
-2466 0062
-24FB 0062
-277C 0062
-2786 0062
-2790 0062
-2077 0062
-2087 0062
 0667 0062
 06F7 0062
-10E66 0062
 07C7 0062
-136F 0062
-104A7 0062
 096D 0062
 09ED 0062
 0A6D 0062
@@ -34580,33 +34554,39 @@ FF17 0062
 0C6D 0062
 0CED 0062
 0D6D 0062
-ABF7 0062
-A8D7 0062
-194D 0062
-19D7 0062
-1A87 0062
-1A97 0062
 0E57 0062
 0ED7 0062
 0F27 0062
-0F30 0062
-1C47 0062
-A907 0062
 1047 0062
 1097 0062
-1113D 0062
+136F 0062
 17E7 0062
 17F7 0062
-AA57 0062
+1817 0062
+194D 0062
+19D7 0062
+1A87 0062
+1A97 0062
 1B57 0062
-A9D7 0062
 1BB7 0062
-1817 0062
+1C47 0062
 1C57 0062
-A627 0062
-110F7 0062
 3027 0062
+A627 0062
+A8D7 0062
+A907 0062
+A9D7 0062
+AA57 0062
+ABF7 0062
 1010D 0062
+104A7 0062
+10E66 0062
+11058 0062
+1106D 0062
+110F7 0062
+1113D 0062
+111D7 0062
+116C7 0062
 12405 0062
 1240C 0062
 12412 0062
@@ -34615,11 +34595,24 @@ A627 0062
 12441 0062
 12442 0062
 12443 0062
-111D7 0062
-116C7 0062
-1106D 0062
-11058 0062
 1D366 0062
+FF17 0062
+247A 0062
+1F108 0062
+248E 0062
+0F30 0062
+1D7D5 0062
+1D7DF 0062
+1D7E9 0062
+1D7F3 0062
+1D7FD 0062
+2466 0062
+24FB 0062
+277C 0062
+2786 0062
+2790 0062
+2077 0062
+2087 0062
 33E6 0021
 33E6 003F
 33E6 0061
@@ -34636,134 +34629,51 @@ A627 0062
 335F 0041
 335F 0062
 0038 0021
-0038 003F
-FF18 0021
-FF18 003F
-247B 0021
-247B 003F
-1F109 0334
-1F109 0021
-1F109 003F
-248F 0021
-248F 003F
-1D7D6 0021
-1D7E0 0021
-1D7EA 0021
-1D7F4 0021
-1D7FE 0021
-1D7D6 003F
-1D7E0 003F
-1D7EA 003F
-1D7F4 003F
-1D7FE 003F
-2467 0021
-24FC 0021
-277D 0021
-2787 0021
-2791 0021
-2467 003F
-24FC 003F
-277D 003F
-2787 003F
-2791 003F
-2078 0021
-2078 003F
-2088 0021
-2088 003F
-1D7D6 0334
-1D7E0 0334
-1D7EA 0334
-1D7F4 0334
-1D7FE 0334
 0668 0021
-0668 003F
 06F8 0021
-06F8 003F
-10E67 0021
-10E67 003F
-10E67 0334
 07C8 0021
-07C8 003F
-1370 0021
-1370 003F
-104A8 0021
-104A8 003F
-104A8 0334
 096E 0021
-096E 003F
 09EE 0021
-09EE 003F
 0A6E 0021
-0A6E 003F
 0AEE 0021
-0AEE 003F
 0B6E 0021
-0B6E 003F
 0BEE 0021
-0BEE 003F
 0C6E 0021
-0C6E 003F
 0CEE 0021
-0CEE 003F
 0D6E 0021
-0D6E 003F
-ABF8 0021
-ABF8 003F
-A8D8 0021
-A8D8 003F
-194E 0021
-194E 003F
-19D8 0021
-19D8 003F
-1A88 0021
-1A88 003F
-1A98 0021
-1A98 003F
 0E58 0021
-0E58 003F
 0ED8 0021
-0ED8 003F
 0F28 0021
-0F28 003F
-0F31 0021
-0F31 003F
-1C48 0021
-1C48 003F
-A908 0021
-A908 003F
 1048 0021
-1048 003F
 1098 0021
-1098 003F
-1113E 0021
-1113E 003F
-1113E 0334
+1370 0021
 17E8 0021
-17E8 003F
 17F8 0021
-17F8 003F
-AA58 0021
-AA58 003F
+1818 0021
+194E 0021
+19D8 0021
+1A88 0021
+1A98 0021
 1B58 0021
-1B58 003F
-A9D8 0021
-A9D8 003F
 1BB8 0021
-1BB8 003F
-1818 0021
-1818 003F
+1C48 0021
 1C58 0021
-1C58 003F
-A628 0021
-A628 003F
-110F8 0021
-110F8 003F
-110F8 0334
 3028 0021
-3028 003F
+A628 0021
+A8D8 0021
+A908 0021
+A9D8 0021
+AA58 0021
+ABF8 0021
 1010E 0021
-1010E 003F
-1010E 0334
+104A8 0021
+10E67 0021
+11059 0021
+1106E 0021
+110F8 0021
+1113E 0021
+111D8 0021
+116C8 0021
 12406 0021
 1240D 0021
 12413 0021
@@ -34771,6 +34681,53 @@ A628 003F
 1242A 0021
 12444 0021
 12445 0021
+1D367 0021
+0038 003F
+0668 003F
+06F8 003F
+07C8 003F
+096E 003F
+09EE 003F
+0A6E 003F
+0AEE 003F
+0B6E 003F
+0BEE 003F
+0C6E 003F
+0CEE 003F
+0D6E 003F
+0E58 003F
+0ED8 003F
+0F28 003F
+1048 003F
+1098 003F
+1370 003F
+17E8 003F
+17F8 003F
+1818 003F
+194E 003F
+19D8 003F
+1A88 003F
+1A98 003F
+1B58 003F
+1BB8 003F
+1C48 003F
+1C58 003F
+3028 003F
+A628 003F
+A8D8 003F
+A908 003F
+A9D8 003F
+AA58 003F
+ABF8 003F
+1010E 003F
+104A8 003F
+10E67 003F
+11059 003F
+1106E 003F
+110F8 003F
+1113E 003F
+111D8 003F
+116C8 003F
 12406 003F
 1240D 003F
 12413 003F
@@ -34778,6 +34735,51 @@ A628 003F
 1242A 003F
 12444 003F
 12445 003F
+1D367 003F
+FF18 0021
+FF18 003F
+247B 0021
+247B 003F
+1F109 0334
+1F109 0021
+1F109 003F
+0F31 0021
+0F31 003F
+248F 0021
+248F 003F
+1D7D6 0021
+1D7E0 0021
+1D7EA 0021
+1D7F4 0021
+1D7FE 0021
+1D7D6 003F
+1D7E0 003F
+1D7EA 003F
+1D7F4 003F
+1D7FE 003F
+2467 0021
+24FC 0021
+277D 0021
+2787 0021
+2791 0021
+2467 003F
+24FC 003F
+277D 003F
+2787 003F
+2791 003F
+2078 0021
+2078 003F
+2088 0021
+2088 003F
+1010E 0334
+104A8 0334
+10E67 0334
+11059 0334
+1106E 0334
+110F8 0334
+1113E 0334
+111D8 0334
+116C8 0334
 12406 0334
 1240D 0334
 12413 0334
@@ -34785,144 +34787,63 @@ A628 003F
 1242A 0334
 12444 0334
 12445 0334
-111D8 0021
-111D8 003F
-111D8 0334
-116C8 0021
-116C8 003F
-116C8 0334
-1106E 0021
-1106E 003F
-1106E 0334
-11059 0021
-11059 003F
-11059 0334
-1D367 0021
-1D367 003F
 1D367 0334
+1D7D6 0334
+1D7E0 0334
+1D7EA 0334
+1D7F4 0334
+1D7FE 0334
 324F 0021
 324F 003F
 324F 0061
 324F 0041
 324F 0062
 0038 0061
-0038 0041
-FF18 0061
-FF18 0041
-247B 0061
-1F109 0061
-248F 0061
-247B 0041
-1F109 0041
-248F 0041
-1D7D6 0061
-1D7E0 0061
-1D7EA 0061
-1D7F4 0061
-1D7FE 0061
-1D7D6 0041
-1D7E0 0041
-1D7EA 0041
-1D7F4 0041
-1D7FE 0041
-2467 0061
-24FC 0061
-277D 0061
-2787 0061
-2791 0061
-2467 0041
-24FC 0041
-277D 0041
-2787 0041
-2791 0041
-2078 0061
-2078 0041
-2088 0061
-2088 0041
 0668 0061
-0668 0041
 06F8 0061
-06F8 0041
-10E67 0061
-10E67 0041
 07C8 0061
-07C8 0041
-1370 0061
-1370 0041
-104A8 0061
-104A8 0041
 096E 0061
-096E 0041
 09EE 0061
-09EE 0041
 0A6E 0061
-0A6E 0041
 0AEE 0061
-0AEE 0041
 0B6E 0061
-0B6E 0041
 0BEE 0061
-0BEE 0041
 0C6E 0061
-0C6E 0041
 0CEE 0061
-0CEE 0041
 0D6E 0061
-0D6E 0041
-ABF8 0061
-ABF8 0041
-A8D8 0061
-A8D8 0041
-194E 0061
-194E 0041
-19D8 0061
-19D8 0041
-1A88 0061
-1A88 0041
-1A98 0061
-1A98 0041
 0E58 0061
-0E58 0041
 0ED8 0061
-0ED8 0041
 0F28 0061
-0F28 0041
-0F31 0061
-0F31 0041
-1C48 0061
-1C48 0041
-A908 0061
-A908 0041
 1048 0061
-1048 0041
 1098 0061
-1098 0041
-1113E 0061
-1113E 0041
+1370 0061
 17E8 0061
-17E8 0041
 17F8 0061
-17F8 0041
-AA58 0061
-AA58 0041
+1818 0061
+194E 0061
+19D8 0061
+1A88 0061
+1A98 0061
 1B58 0061
-1B58 0041
-A9D8 0061
-A9D8 0041
 1BB8 0061
-1BB8 0041
-1818 0061
-1818 0041
+1C48 0061
 1C58 0061
-1C58 0041
-A628 0061
-A628 0041
-110F8 0061
-110F8 0041
 3028 0061
-3028 0041
+A628 0061
+A8D8 0061
+A908 0061
+A9D8 0061
+AA58 0061
+ABF8 0061
 1010E 0061
-1010E 0041
+104A8 0061
+10E67 0061
+11059 0061
+1106E 0061
+110F8 0061
+1113E 0061
+111D8 0061
+116C8 0061
 12406 0061
 1240D 0061
 12413 0061
@@ -34930,6 +34851,53 @@ A628 0041
 1242A 0061
 12444 0061
 12445 0061
+1D367 0061
+0038 0041
+0668 0041
+06F8 0041
+07C8 0041
+096E 0041
+09EE 0041
+0A6E 0041
+0AEE 0041
+0B6E 0041
+0BEE 0041
+0C6E 0041
+0CEE 0041
+0D6E 0041
+0E58 0041
+0ED8 0041
+0F28 0041
+1048 0041
+1098 0041
+1370 0041
+17E8 0041
+17F8 0041
+1818 0041
+194E 0041
+19D8 0041
+1A88 0041
+1A98 0041
+1B58 0041
+1BB8 0041
+1C48 0041
+1C58 0041
+3028 0041
+A628 0041
+A8D8 0041
+A908 0041
+A9D8 0041
+AA58 0041
+ABF8 0041
+1010E 0041
+104A8 0041
+10E67 0041
+11059 0041
+1106E 0041
+110F8 0041
+1113E 0041
+111D8 0041
+116C8 0041
 12406 0041
 1240D 0041
 12413 0041
@@ -34937,39 +34905,45 @@ A628 0041
 1242A 0041
 12444 0041
 12445 0041
-111D8 0061
-111D8 0041
-116C8 0061
-116C8 0041
-1106E 0061
-1106E 0041
-11059 0061
-11059 0041
-1D367 0061
 1D367 0041
+FF18 0061
+FF18 0041
+247B 0061
+1F109 0061
+248F 0061
+0F31 0061
+247B 0041
+1F109 0041
+248F 0041
+0F31 0041
+1D7D6 0061
+1D7E0 0061
+1D7EA 0061
+1D7F4 0061
+1D7FE 0061
+1D7D6 0041
+1D7E0 0041
+1D7EA 0041
+1D7F4 0041
+1D7FE 0041
+2467 0061
+24FC 0061
+277D 0061
+2787 0061
+2791 0061
+2467 0041
+24FC 0041
+277D 0041
+2787 0041
+2791 0041
+2078 0061
+2078 0041
+2088 0061
+2088 0041
 0038 0062
-FF18 0062
-247B 0062
-1F109 0062
-248F 0062
-1D7D6 0062
-1D7E0 0062
-1D7EA 0062
-1D7F4 0062
-1D7FE 0062
-2467 0062
-24FC 0062
-277D 0062
-2787 0062
-2791 0062
-2078 0062
-2088 0062
 0668 0062
 06F8 0062
-10E67 0062
 07C8 0062
-1370 0062
-104A8 0062
 096E 0062
 09EE 0062
 0A6E 0062
@@ -34979,33 +34953,39 @@ FF18 0062
 0C6E 0062
 0CEE 0062
 0D6E 0062
-ABF8 0062
-A8D8 0062
-194E 0062
-19D8 0062
-1A88 0062
-1A98 0062
 0E58 0062
 0ED8 0062
 0F28 0062
-0F31 0062
-1C48 0062
-A908 0062
 1048 0062
 1098 0062
-1113E 0062
+1370 0062
 17E8 0062
 17F8 0062
-AA58 0062
+1818 0062
+194E 0062
+19D8 0062
+1A88 0062
+1A98 0062
 1B58 0062
-A9D8 0062
 1BB8 0062
-1818 0062
+1C48 0062
 1C58 0062
-A628 0062
-110F8 0062
 3028 0062
+A628 0062
+A8D8 0062
+A908 0062
+A9D8 0062
+AA58 0062
+ABF8 0062
 1010E 0062
+104A8 0062
+10E67 0062
+11059 0062
+1106E 0062
+110F8 0062
+1113E 0062
+111D8 0062
+116C8 0062
 12406 0062
 1240D 0062
 12413 0062
@@ -35013,11 +34993,24 @@ A628 0062
 1242A 0062
 12444 0062
 12445 0062
-111D8 0062
-116C8 0062
-1106E 0062
-11059 0062
 1D367 0062
+FF18 0062
+247B 0062
+1F109 0062
+248F 0062
+0F31 0062
+1D7D6 0062
+1D7E0 0062
+1D7EA 0062
+1D7F4 0062
+1D7FE 0062
+2467 0062
+24FC 0062
+277D 0062
+2787 0062
+2791 0062
+2078 0062
+2088 0062
 33E7 0021
 33E7 003F
 33E7 0061
@@ -35034,134 +35027,51 @@ A628 0062
 3360 0041
 3360 0062
 0039 0021
-0039 003F
-FF19 0021
-FF19 003F
-247C 0021
-247C 003F
-1F10A 0334
-1F10A 0021
-1F10A 003F
-2490 0021
-2490 003F
-1D7D7 0021
-1D7E1 0021
-1D7EB 0021
-1D7F5 0021
-1D7FF 0021
-1D7D7 003F
-1D7E1 003F
-1D7EB 003F
-1D7F5 003F
-1D7FF 003F
-2468 0021
-24FD 0021
-277E 0021
-2788 0021
-2792 0021
-2468 003F
-24FD 003F
-277E 003F
-2788 003F
-2792 003F
-2079 0021
-2079 003F
-2089 0021
-2089 003F
-1D7D7 0334
-1D7E1 0334
-1D7EB 0334
-1D7F5 0334
-1D7FF 0334
 0669 0021
-0669 003F
 06F9 0021
-06F9 003F
-10E68 0021
-10E68 003F
-10E68 0334
 07C9 0021
-07C9 003F
-1371 0021
-1371 003F
-104A9 0021
-104A9 003F
-104A9 0334
 096F 0021
-096F 003F
 09EF 0021
-09EF 003F
 0A6F 0021
-0A6F 003F
 0AEF 0021
-0AEF 003F
 0B6F 0021
-0B6F 003F
 0BEF 0021
-0BEF 003F
 0C6F 0021
-0C6F 003F
 0CEF 0021
-0CEF 003F
 0D6F 0021
-0D6F 003F
-ABF9 0021
-ABF9 003F
-A8D9 0021
-A8D9 003F
-194F 0021
-194F 003F
-19D9 0021
-19D9 003F
-1A89 0021
-1A89 003F
-1A99 0021
-1A99 003F
 0E59 0021
-0E59 003F
 0ED9 0021
-0ED9 003F
 0F29 0021
-0F29 003F
-0F32 0021
-0F32 003F
-1C49 0021
-1C49 003F
-A909 0021
-A909 003F
 1049 0021
-1049 003F
 1099 0021
-1099 003F
-1113F 0021
-1113F 003F
-1113F 0334
+1371 0021
 17E9 0021
-17E9 003F
 17F9 0021
-17F9 003F
-AA59 0021
-AA59 003F
+1819 0021
+194F 0021
+19D9 0021
+1A89 0021
+1A99 0021
 1B59 0021
-1B59 003F
-A9D9 0021
-A9D9 003F
 1BB9 0021
-1BB9 003F
-1819 0021
-1819 003F
+1C49 0021
 1C59 0021
-1C59 003F
-A629 0021
-A629 003F
-110F9 0021
-110F9 003F
-110F9 0334
 3029 0021
-3029 003F
+A629 0021
+A8D9 0021
+A909 0021
+A9D9 0021
+AA59 0021
+ABF9 0021
 1010F 0021
-1010F 003F
-1010F 0334
+104A9 0021
+10E68 0021
+1105A 0021
+1106F 0021
+110F9 0021
+1113F 0021
+111D9 0021
+116C9 0021
 12407 0021
 1240E 0021
 12414 0021
@@ -35171,6 +35081,53 @@ A629 003F
 12447 0021
 12448 0021
 12449 0021
+1D368 0021
+0039 003F
+0669 003F
+06F9 003F
+07C9 003F
+096F 003F
+09EF 003F
+0A6F 003F
+0AEF 003F
+0B6F 003F
+0BEF 003F
+0C6F 003F
+0CEF 003F
+0D6F 003F
+0E59 003F
+0ED9 003F
+0F29 003F
+1049 003F
+1099 003F
+1371 003F
+17E9 003F
+17F9 003F
+1819 003F
+194F 003F
+19D9 003F
+1A89 003F
+1A99 003F
+1B59 003F
+1BB9 003F
+1C49 003F
+1C59 003F
+3029 003F
+A629 003F
+A8D9 003F
+A909 003F
+A9D9 003F
+AA59 003F
+ABF9 003F
+1010F 003F
+104A9 003F
+10E68 003F
+1105A 003F
+1106F 003F
+110F9 003F
+1113F 003F
+111D9 003F
+116C9 003F
 12407 003F
 1240E 003F
 12414 003F
@@ -35180,6 +35137,51 @@ A629 003F
 12447 003F
 12448 003F
 12449 003F
+1D368 003F
+FF19 0021
+FF19 003F
+247C 0021
+247C 003F
+1F10A 0334
+1F10A 0021
+1F10A 003F
+0F32 0021
+0F32 003F
+2490 0021
+2490 003F
+1D7D7 0021
+1D7E1 0021
+1D7EB 0021
+1D7F5 0021
+1D7FF 0021
+1D7D7 003F
+1D7E1 003F
+1D7EB 003F
+1D7F5 003F
+1D7FF 003F
+2468 0021
+24FD 0021
+277E 0021
+2788 0021
+2792 0021
+2468 003F
+24FD 003F
+277E 003F
+2788 003F
+2792 003F
+2079 0021
+2079 003F
+2089 0021
+2089 003F
+1010F 0334
+104A9 0334
+10E68 0334
+1105A 0334
+1106F 0334
+110F9 0334
+1113F 0334
+111D9 0334
+116C9 0334
 12407 0334
 1240E 0334
 12414 0334
@@ -35189,31 +35191,134 @@ A629 003F
 12447 0334
 12448 0334
 12449 0334
-111D9 0021
-111D9 003F
-111D9 0334
-116C9 0021
-116C9 003F
-116C9 0334
-1106F 0021
-1106F 003F
-1106F 0334
-1105A 0021
-1105A 003F
-1105A 0334
-1D368 0021
-1D368 003F
 1D368 0334
+1D7D7 0334
+1D7E1 0334
+1D7EB 0334
+1D7F5 0334
+1D7FF 0334
 0039 0061
+0669 0061
+06F9 0061
+07C9 0061
+096F 0061
+09EF 0061
+0A6F 0061
+0AEF 0061
+0B6F 0061
+0BEF 0061
+0C6F 0061
+0CEF 0061
+0D6F 0061
+0E59 0061
+0ED9 0061
+0F29 0061
+1049 0061
+1099 0061
+1371 0061
+17E9 0061
+17F9 0061
+1819 0061
+194F 0061
+19D9 0061
+1A89 0061
+1A99 0061
+1B59 0061
+1BB9 0061
+1C49 0061
+1C59 0061
+3029 0061
+A629 0061
+A8D9 0061
+A909 0061
+A9D9 0061
+AA59 0061
+ABF9 0061
+1010F 0061
+104A9 0061
+10E68 0061
+1105A 0061
+1106F 0061
+110F9 0061
+1113F 0061
+111D9 0061
+116C9 0061
+12407 0061
+1240E 0061
+12414 0061
+1241D 0061
+1242B 0061
+12446 0061
+12447 0061
+12448 0061
+12449 0061
+1D368 0061
 0039 0041
+0669 0041
+06F9 0041
+07C9 0041
+096F 0041
+09EF 0041
+0A6F 0041
+0AEF 0041
+0B6F 0041
+0BEF 0041
+0C6F 0041
+0CEF 0041
+0D6F 0041
+0E59 0041
+0ED9 0041
+0F29 0041
+1049 0041
+1099 0041
+1371 0041
+17E9 0041
+17F9 0041
+1819 0041
+194F 0041
+19D9 0041
+1A89 0041
+1A99 0041
+1B59 0041
+1BB9 0041
+1C49 0041
+1C59 0041
+3029 0041
+A629 0041
+A8D9 0041
+A909 0041
+A9D9 0041
+AA59 0041
+ABF9 0041
+1010F 0041
+104A9 0041
+10E68 0041
+1105A 0041
+1106F 0041
+110F9 0041
+1113F 0041
+111D9 0041
+116C9 0041
+12407 0041
+1240E 0041
+12414 0041
+1241D 0041
+1242B 0041
+12446 0041
+12447 0041
+12448 0041
+12449 0041
+1D368 0041
 FF19 0061
 FF19 0041
 247C 0061
 1F10A 0061
 2490 0061
+0F32 0061
 247C 0041
 1F10A 0041
 2490 0041
+0F32 0041
 1D7D7 0061
 1D7E1 0061
 1D7EB 0061
@@ -35238,141 +35343,10 @@ FF19 0041
 2079 0041
 2089 0061
 2089 0041
-0669 0061
-0669 0041
-06F9 0061
-06F9 0041
-10E68 0061
-10E68 0041
-07C9 0061
-07C9 0041
-1371 0061
-1371 0041
-104A9 0061
-104A9 0041
-096F 0061
-096F 0041
-09EF 0061
-09EF 0041
-0A6F 0061
-0A6F 0041
-0AEF 0061
-0AEF 0041
-0B6F 0061
-0B6F 0041
-0BEF 0061
-0BEF 0041
-0C6F 0061
-0C6F 0041
-0CEF 0061
-0CEF 0041
-0D6F 0061
-0D6F 0041
-ABF9 0061
-ABF9 0041
-A8D9 0061
-A8D9 0041
-194F 0061
-194F 0041
-19D9 0061
-19D9 0041
-1A89 0061
-1A89 0041
-1A99 0061
-1A99 0041
-0E59 0061
-0E59 0041
-0ED9 0061
-0ED9 0041
-0F29 0061
-0F29 0041
-0F32 0061
-0F32 0041
-1C49 0061
-1C49 0041
-A909 0061
-A909 0041
-1049 0061
-1049 0041
-1099 0061
-1099 0041
-1113F 0061
-1113F 0041
-17E9 0061
-17E9 0041
-17F9 0061
-17F9 0041
-AA59 0061
-AA59 0041
-1B59 0061
-1B59 0041
-A9D9 0061
-A9D9 0041
-1BB9 0061
-1BB9 0041
-1819 0061
-1819 0041
-1C59 0061
-1C59 0041
-A629 0061
-A629 0041
-110F9 0061
-110F9 0041
-3029 0061
-3029 0041
-1010F 0061
-1010F 0041
-12407 0061
-1240E 0061
-12414 0061
-1241D 0061
-1242B 0061
-12446 0061
-12447 0061
-12448 0061
-12449 0061
-12407 0041
-1240E 0041
-12414 0041
-1241D 0041
-1242B 0041
-12446 0041
-12447 0041
-12448 0041
-12449 0041
-111D9 0061
-111D9 0041
-116C9 0061
-116C9 0041
-1106F 0061
-1106F 0041
-1105A 0061
-1105A 0041
-1D368 0061
-1D368 0041
 0039 0062
-FF19 0062
-247C 0062
-1F10A 0062
-2490 0062
-1D7D7 0062
-1D7E1 0062
-1D7EB 0062
-1D7F5 0062
-1D7FF 0062
-2468 0062
-24FD 0062
-277E 0062
-2788 0062
-2792 0062
-2079 0062
-2089 0062
 0669 0062
 06F9 0062
-10E68 0062
 07C9 0062
-1371 0062
-104A9 0062
 096F 0062
 09EF 0062
 0A6F 0062
@@ -35382,33 +35356,39 @@ FF19 0062
 0C6F 0062
 0CEF 0062
 0D6F 0062
-ABF9 0062
-A8D9 0062
-194F 0062
-19D9 0062
-1A89 0062
-1A99 0062
 0E59 0062
 0ED9 0062
 0F29 0062
-0F32 0062
-1C49 0062
-A909 0062
 1049 0062
 1099 0062
-1113F 0062
+1371 0062
 17E9 0062
 17F9 0062
-AA59 0062
+1819 0062
+194F 0062
+19D9 0062
+1A89 0062
+1A99 0062
 1B59 0062
-A9D9 0062
 1BB9 0062
-1819 0062
+1C49 0062
 1C59 0062
-A629 0062
-110F9 0062
 3029 0062
+A629 0062
+A8D9 0062
+A909 0062
+A9D9 0062
+AA59 0062
+ABF9 0062
 1010F 0062
+104A9 0062
+10E68 0062
+1105A 0062
+1106F 0062
+110F9 0062
+1113F 0062
+111D9 0062
+116C9 0062
 12407 0062
 1240E 0062
 12414 0062
@@ -35418,11 +35398,24 @@ A629 0062
 12447 0062
 12448 0062
 12449 0062
-111D9 0062
-116C9 0062
-1106F 0062
-1105A 0062
 1D368 0062
+FF19 0062
+247C 0062
+1F10A 0062
+2490 0062
+0F32 0062
+1D7D7 0062
+1D7E1 0062
+1D7EB 0062
+1D7F5 0062
+1D7FF 0062
+2468 0062
+24FD 0062
+277E 0062
+2788 0062
+2792 0062
+2079 0062
+2089 0062
 33E8 0021
 33E8 003F
 33E8 0061
@@ -35444,7 +35437,6 @@ A629 0062
 000C 0061
 000D 0061
 0085 0061
-180E 0061
 2028 0061
 2029 0061
 0020 0061
@@ -35790,6 +35782,10 @@ FF5D 0061
 169C 0061
 2045 0061
 2046 0061
+2308 0061
+2309 0061
+230A 0061
+230B 0061
 29FC 0061
 29FD 0061
 2983 0061
@@ -36207,6 +36203,7 @@ AA5C 0061
 0618 0061
 0619 0061
 061A 0061
+061C 0061
 0640 0061
 06D6 0061
 06D7 0061
@@ -36264,6 +36261,7 @@ AA5C 0061
 180B 0061
 180C 0061
 180D 0061
+180E 0061
 1A7F 0061
 1B6B 0061
 1B6C 0061
@@ -36315,6 +36313,10 @@ AA5C 0061
 2062 0061
 2063 0061
 2064 0061
+2066 0061
+2067 0061
+2068 0061
+2069 0061
 206A 0061
 206B 0061
 206C 0061
@@ -36790,7 +36792,6 @@ FF41 003F
 000C 0041
 000D 0041
 0085 0041
-180E 0041
 2028 0041
 2029 0041
 0020 0041
@@ -37136,6 +37137,10 @@ FF5D 0041
 169C 0041
 2045 0041
 2046 0041
+2308 0041
+2309 0041
+230A 0041
+230B 0041
 29FC 0041
 29FD 0041
 2983 0041
@@ -37553,6 +37558,7 @@ AA5C 0041
 0618 0041
 0619 0041
 061A 0041
+061C 0041
 0640 0041
 06D6 0041
 06D7 0041
@@ -37610,6 +37616,7 @@ AA5C 0041
 180B 0041
 180C 0041
 180D 0041
+180E 0041
 1A7F 0041
 1B6B 0041
 1B6C 0041
@@ -37661,6 +37668,10 @@ AA5C 0041
 2062 0041
 2063 0041
 2064 0041
+2066 0041
+2067 0041
+2068 0041
+2069 0041
 206A 0041
 206B 0041
 206C 0041
@@ -38779,6 +38790,16 @@ A67D 0041
 20E2 0041
 20E3 0041
 20E4 0041
+3099 0061
+3099 0041
+FF9E 0061
+FF9E 0041
+309A 0061
+309A 0041
+FF9F 0061
+FF9F 0041
+0335 0061
+0335 0041
 0305 0061
 0305 0041
 0309 0061
@@ -38817,8 +38838,6 @@ A67D 0041
 0334 0041
 0334 1DD3
 1DD3 0334
-0335 0061
-0335 0041
 0339 0061
 0339 0041
 0345 0061
@@ -39359,14 +39378,6 @@ A92D 0041
 302E 0041
 302F 0061
 302F 0041
-3099 0061
-3099 0041
-FF9E 0061
-FF9E 0041
-309A 0061
-309A 0041
-FF9F 0061
-FF9F 0041
 20D0 0061
 20D0 0041
 20D1 0061
@@ -39967,7 +39978,6 @@ A73C 0062
 000C 0062
 000D 0062
 0085 0062
-180E 0062
 2028 0062
 2029 0062
 0020 0062
@@ -40313,6 +40323,10 @@ FF5D 0062
 169C 0062
 2045 0062
 2046 0062
+2308 0062
+2309 0062
+230A 0062
+230B 0062
 29FC 0062
 29FD 0062
 2983 0062
@@ -40730,6 +40744,7 @@ AA5C 0062
 0618 0062
 0619 0062
 061A 0062
+061C 0062
 0640 0062
 06D6 0062
 06D7 0062
@@ -40787,6 +40802,7 @@ AA5C 0062
 180B 0062
 180C 0062
 180D 0062
+180E 0062
 1A7F 0062
 1B6B 0062
 1B6C 0062
@@ -40838,6 +40854,10 @@ AA5C 0062
 2062 0062
 2063 0062
 2064 0062
+2066 0062
+2067 0062
+2068 0062
+2069 0062
 206A 0062
 206B 0062
 206C 0062
@@ -41549,6 +41569,11 @@ A67D 0062
 20E2 0062
 20E3 0062
 20E4 0062
+3099 0062
+FF9E 0062
+309A 0062
+FF9F 0062
+0335 0062
 0305 0062
 0309 0062
 030F 0062
@@ -41566,7 +41591,6 @@ A67D 0062
 0330 0062
 0331 0062
 0334 0062
-0335 0062
 0339 0062
 0345 0062
 0358 0062
@@ -41837,10 +41861,6 @@ A92D 0062
 302D 0062
 302E 0062
 302F 0062
-3099 0062
-FF9E 0062
-309A 0062
-FF9F 0062
 20D0 0062
 20D1 0062
 20D2 0062
@@ -42639,6 +42659,10 @@ FF24 003F
 1E11 003F
 1E10 0021
 1E10 003F
+0111 0021
+0111 003F
+0110 0021
+0110 003F
 1E0D 0021
 1E0D 003F
 1E0C 0021
@@ -42716,10 +42740,6 @@ FF24 003F
 0044 0331 0334
 0044 0334 0331
 1E0E 0334
-0111 0021
-0111 003F
-0110 0021
-0110 003F
 00F0 0021
 1DD9 0021
 00F0 003F
@@ -42842,6 +42862,10 @@ FF24 0041
 1E11 0041
 1E10 0061
 1E10 0041
+0111 0061
+0111 0041
+0110 0061
+0110 0041
 1E0D 0061
 1E0D 0041
 1E0C 0061
@@ -42854,10 +42878,6 @@ FF24 0041
 1E0F 0041
 1E0E 0061
 1E0E 0041
-0111 0061
-0111 0041
-0110 0061
-0110 0041
 00F0 0061
 1DD9 0061
 00F0 0041
@@ -42929,14 +42949,14 @@ FF24 0062
 1E0A 0062
 1E11 0062
 1E10 0062
+0111 0062
+0110 0062
 1E0D 0062
 1E0C 0062
 1E13 0062
 1E12 0062
 1E0F 0062
 1E0E 0062
-0111 0062
-0110 0062
 00F0 0062
 1DD9 0062
 00D0 0062
@@ -44827,6 +44847,14 @@ FF28 003F
 1E29 003F
 1E28 0021
 1E28 003F
+0127 0021
+210F 0021
+0127 003F
+210F 003F
+0126 0021
+0126 003F
+A7F8 0021
+A7F8 003F
 1E25 0021
 1E25 003F
 1E24 0021
@@ -44907,14 +44935,6 @@ FF28 003F
 0068 0331 0334
 0068 0334 0331
 1E96 0334
-0127 0021
-210F 0021
-0127 003F
-210F 003F
-0126 0021
-0126 003F
-A7F8 0021
-A7F8 003F
 0334 036A
 036A 0334
 0068 0061
@@ -45021,6 +45041,14 @@ FF28 0041
 1E29 0041
 1E28 0061
 1E28 0041
+0127 0061
+210F 0061
+0127 0041
+210F 0041
+0126 0061
+0126 0041
+A7F8 0061
+A7F8 0041
 1E25 0061
 1E25 0041
 1E24 0061
@@ -45031,14 +45059,6 @@ FF28 0041
 1E2A 0041
 1E96 0061
 1E96 0041
-0127 0061
-210F 0061
-0127 0041
-210F 0041
-0126 0061
-0126 0041
-A7F8 0061
-A7F8 0041
 33CA 0061
 33CA 0041
 33CA 0062
@@ -45093,15 +45113,15 @@ FF28 0062
 1E22 0062
 1E29 0062
 1E28 0062
+0127 0062
+210F 0062
+0126 0062
+A7F8 0062
 1E25 0062
 1E24 0062
 1E2B 0062
 1E2A 0062
 1E96 0062
-0127 0062
-210F 0062
-0126 0062
-A7F8 0062
 32CC 0021
 32CC 003F
 32CC 0061
@@ -45426,7 +45446,7 @@ FF29 003F
 0069 0308 0301 0334
 0069 0308 0334 0341
 00EF 0301 0334
-1E2F 0334
+00EF 0334 0341
 0049 0308 0334 0301
 0049 0308 0341 0334
 00CF 0334 0301
@@ -46764,6 +46784,10 @@ FF2C 003F
 013C 003F
 013B 0021
 013B 003F
+0142 0021
+0142 003F
+0141 0021
+0141 003F
 1E37 0021
 1E37 003F
 1E36 0021
@@ -46854,10 +46878,6 @@ FF2C 003F
 004C 0331 0334
 004C 0334 0331
 1E3A 0334
-0142 0021
-0142 003F
-0141 0021
-0141 003F
 006C 00B7 0021
 006C 0387 0021
 0140 0021
@@ -46984,6 +47004,10 @@ FF2C 0041
 013C 0041
 013B 0061
 013B 0041
+0142 0061
+0142 0041
+0141 0061
+0141 0041
 1E37 0061
 1E37 0041
 1E36 0061
@@ -47000,10 +47024,6 @@ FF2C 0041
 1E3B 0041
 1E3A 0061
 1E3A 0041
-0142 0061
-0142 0041
-0141 0061
-0141 0041
 006C 00B7 0061
 006C 0387 0061
 0140 0061
@@ -47066,6 +47086,8 @@ FF2C 0062
 013D 0062
 013C 0062
 013B 0062
+0142 0062
+0141 0062
 1E37 0062
 1E36 0062
 1E39 0062
@@ -47074,8 +47096,6 @@ FF2C 0062
 1E3C 0062
 1E3B 0062
 1E3A 0062
-0142 0062
-0141 0062
 006C 00B7 0062
 006C 0387 0062
 0140 0062
@@ -51980,10 +52000,10 @@ FF35 003F
 0075 0334 0344
 0075 0344 0334
 01D8 0334
-0055 0308 0341 0334
+0055 0308 0301 0334
 0055 0334 0308 0301
-0055 0334 0308 0341
 00DC 0301 0334
+00DC 0334 0301
 0075 0308 0340 0334
 0075 0334 0308 0340
 00FC 0300 0334
@@ -55032,10 +55052,10 @@ A724 0062
 0391 0334 0313 0340
 1F08 0300 0334
 1F0A 0334
-03B1 0313 0300 0334 0345
 03B1 0343 0300 0345 0334
 03B1 0343 0345 0334 0340
 03B1 0345 0313 0300 0334
+1F00 0345 0340 0334
 0391 0343 0334 0345 0340
 0391 0345 0313 0334 0340
 1F08 0300 0345 0334
@@ -55095,13 +55115,13 @@ A724 0062
 1F09 0300 0334
 1F09 0340 0334
 03B1 0314 0334 0300 0345
-03B1 0334 0314 0345 0300
-03B1 0345 0314 0300 0334
-03B1 0345 0334 0314 0340
+03B1 0314 0345 0340 0334
+1F81 0340 0334
+1F83 0334
 0391 0334 0345 0314 0300
 1F09 0334 0345 0300
-1F09 0345 0300 0334
 1F0B 0345 0334
+1FBC 0314 0300 0334
 03B1 0314 0334 0342
 03B1 0314 0342 0334
 03B1 0334 0314 0342
@@ -56120,9 +56140,9 @@ A724 0062
 0397 0334 0343
 1F28 0334
 03B7 0334 0313 0341
-03B7 0334 0343 0301
 03B7 0334 0343 0341
-1F20 0334 0341
+03B7 0343 0341 0334
+1F20 0341 0334
 0397 0313 0334 0301
 0397 0313 0341 0334
 0397 0334 0313 0301
@@ -56145,8 +56165,8 @@ A724 0062
 0397 0343 0300 0334
 03B7 0313 0345 0334 0300
 03B7 0313 0345 0340 0334
-03B7 0343 0340 0334 0345
 03B7 0343 0345 0340 0334
+1FC3 0334 0313 0300
 0397 0313 0334 0300 0345
 0397 0343 0334 0345 0340
 0397 0343 0340 0345 0334
@@ -56190,9 +56210,9 @@ A724 0062
 1F29 0334 0301
 1F2D 0334
 03B7 0314 0301 0345 0334
+03B7 0314 0334 0345 0301
 03B7 0314 0334 0345 0341
-1F21 0334 0341 0345
-1F21 0345 0301 0334
+03B7 0314 0345 0334 0301
 0397 0314 0334 0345 0341
 0397 0334 0314 0345 0301
 1F29 0334 0301 0345
@@ -58240,7 +58260,7 @@ A724 0062
 03C5 0334 0343 0341
 1F50 0334 0301
 1F50 0334 0341
-03C5 0334 0313 0340
+03C5 0313 0340 0334
 03C5 0334 0343 0340
 1F50 0334 0340
 1F52 0334
@@ -58316,9 +58336,9 @@ A724 0062
 03D2 0308 0334
 03D2 0334 0308
 03D4 0334
+03B0 0334
 03C5 0308 0341 0334
 03C5 0344 0334
-03CB 0334 0341
 03CB 0341 0334
 03C5 0308 0300 0334
 03C5 0308 0340 0334
@@ -58936,8 +58956,8 @@ A724 0062
 2126 0334 0314 0301
 2126 0334 0314 0341
 03C9 0314 0334 0345 0301
-1F61 0334 0301 0345
-1F61 0341 0345 0334
+03C9 0345 0314 0334 0301
+1F61 0301 0345 0334
 1F65 0345 0334
 03A9 0314 0301 0345 0334
 03A9 0345 0334 0314 0301
@@ -58952,9 +58972,9 @@ A724 0062
 2126 0314 0334 0340
 2126 0334 0314 0340
 03C9 0314 0334 0345 0300
-03C9 0314 0340 0334 0345
 03C9 0314 0345 0300 0334
-03C9 0334 0314 0340 0345
+03C9 0345 0314 0300 0334
+03C9 0345 0314 0334 0300
 03A9 0314 0300 0345 0334
 03A9 0345 0334 0314 0300
 1F6B 0345 0334
@@ -106580,16 +106600,16 @@ FF73 0021
 FF73 003F
 32D2 0021
 32D2 003F
+3094 0021
+3094 003F
+30F4 0021
+30F4 003F
 3046 0334 3099
 3046 3099 0334
 3094 0334
 30A6 0334 3099
 30A6 3099 0334
 30F4 0334
-3094 0021
-3094 003F
-30F4 0021
-30F4 003F
 3045 0061
 3045 0041
 3046 0061
@@ -106730,16 +106750,16 @@ FF76 0021
 FF76 003F
 32D5 0021
 32D5 003F
+304C 0021
+304C 003F
+30AC 0021
+30AC 003F
 304B 0334 3099
 304B 3099 0334
 304C 0334
 30AB 0334 3099
 30AB 3099 0334
 30AC 0334
-304C 0021
-304C 003F
-30AC 0021
-30AC 003F
 3095 0061
 3095 0041
 304B 0061
@@ -106797,16 +106817,16 @@ FF77 0021
 FF77 003F
 32D6 0021
 32D6 003F
+304E 0021
+304E 003F
+30AE 0021
+30AE 003F
 304D 0334 3099
 304D 3099 0334
 304E 0334
 30AD 0334 3099
 30AD 3099 0334
 30AE 0334
-304E 0021
-304E 003F
-30AE 0021
-30AE 003F
 304D 0061
 304D 0041
 30AD 0061
@@ -106875,16 +106895,16 @@ FF78 0021
 FF78 003F
 32D7 0021
 32D7 003F
+3050 0021
+3050 003F
+30B0 0021
+30B0 003F
 304F 0334 3099
 304F 3099 0334
 3050 0334
 30AF 0334 3099
 30AF 3099 0334
 30B0 0334
-3050 0021
-3050 003F
-30B0 0021
-30B0 003F
 304F 0061
 304F 0041
 31F0 0061
@@ -106938,16 +106958,16 @@ FF79 0021
 FF79 003F
 32D8 0021
 32D8 003F
+3052 0021
+3052 003F
+30B2 0021
+30B2 003F
 3051 0334 3099
 3051 3099 0334
 3052 0334
 30B1 0334 3099
 30B1 3099 0334
 30B2 0334
-3052 0021
-3052 003F
-30B2 0021
-30B2 003F
 331C 0021
 331C 003F
 331C 0061
@@ -106985,16 +107005,16 @@ FF7A 0021
 FF7A 003F
 32D9 0021
 32D9 003F
+3054 0021
+3054 003F
+30B4 0021
+30B4 003F
 3053 0334 3099
 3053 3099 0334
 3054 0334
 30B3 0334 3099
 30B3 3099 0334
 30B4 0334
-3054 0021
-3054 003F
-30B4 0021
-30B4 003F
 331E 0021
 331E 003F
 331E 0061
@@ -107044,6 +107064,10 @@ FF7B 003F
 32DA 003F
 1F202 0021
 1F202 003F
+3056 0021
+3056 003F
+30B6 0021
+30B6 003F
 1F202 0334
 3055 0334 3099
 3055 3099 0334
@@ -107051,10 +107075,6 @@ FF7B 003F
 30B5 0334 3099
 30B5 3099 0334
 30B6 0334
-3056 0021
-3056 003F
-30B6 0021
-30B6 003F
 3055 0061
 3055 0041
 30B5 0061
@@ -107096,16 +107116,16 @@ FF7C 0021
 FF7C 003F
 32DB 0021
 32DB 003F
+3058 0021
+3058 003F
+30B8 0021
+30B8 003F
 3057 0334 3099
 3057 3099 0334
 3058 0334
 30B7 0334 3099
 30B7 3099 0334
 30B8 0334
-3058 0021
-3058 003F
-30B8 0021
-30B8 003F
 3057 0061
 3057 0041
 31F1 0061
@@ -107147,16 +107167,16 @@ FF7D 0021
 FF7D 003F
 32DC 0021
 32DC 003F
+305A 0021
+305A 003F
+30BA 0021
+30BA 003F
 3059 0334 3099
 3059 3099 0334
 305A 0334
 30B9 0334 3099
 30B9 3099 0334
 30BA 0334
-305A 0021
-305A 003F
-30BA 0021
-30BA 003F
 3059 0061
 3059 0041
 31F2 0061
@@ -107186,16 +107206,16 @@ FF7E 0021
 FF7E 003F
 32DD 0021
 32DD 003F
+305C 0021
+305C 003F
+30BC 0021
+30BC 003F
 305B 0334 3099
 305B 3099 0334
 305C 0334
 30BB 0334 3099
 30BB 3099 0334
 30BC 0334
-305C 0021
-305C 003F
-30BC 0021
-30BC 003F
 305B 0061
 305B 0041
 30BB 0061
@@ -107232,16 +107252,16 @@ FF7F 0021
 FF7F 003F
 32DE 0021
 32DE 003F
+305E 0021
+305E 003F
+30BE 0021
+30BE 003F
 305D 0334 3099
 305D 3099 0334
 305E 0334
 30BD 0334 3099
 30BD 3099 0334
 30BE 0334
-305E 0021
-305E 003F
-30BE 0021
-30BE 003F
 305D 0061
 305D 0041
 30BD 0061
@@ -107268,16 +107288,16 @@ FF80 0021
 FF80 003F
 32DF 0021
 32DF 003F
+3060 0021
+3060 003F
+30C0 0021
+30C0 003F
 305F 0334 3099
 305F 3099 0334
 3060 0334
 30BF 0334 3099
 30BF 3099 0334
 30C0 0334
-3060 0021
-3060 003F
-30C0 0021
-30C0 003F
 3324 0021
 3324 003F
 3324 0061
@@ -107309,16 +107329,16 @@ FF81 0021
 FF81 003F
 32E0 0021
 32E0 003F
+3062 0021
+3062 003F
+30C2 0021
+30C2 003F
 3061 0334 3099
 3061 3099 0334
 3062 0334
 30C1 0334 3099
 30C1 3099 0334
 30C2 0334
-3062 0021
-3062 003F
-30C2 0021
-30C2 003F
 3061 0061
 3061 0041
 30C1 0061
@@ -107351,16 +107371,16 @@ FF82 0021
 FF82 003F
 32E1 0021
 32E1 003F
+3065 0021
+3065 003F
+30C5 0021
+30C5 003F
 3064 0334 3099
 3064 3099 0334
 3065 0334
 30C4 0334 3099
 30C4 3099 0334
 30C5 0334
-3065 0021
-3065 003F
-30C5 0021
-30C5 003F
 3063 0061
 3063 0041
 3064 0061
@@ -107396,12 +107416,6 @@ FF83 0021
 FF83 003F
 32E2 0021
 32E2 003F
-3066 0334 3099
-3066 3099 0334
-3067 0334
-30C6 0334 3099
-30C6 3099 0334
-30C7 0334
 3067 0021
 3067 003F
 30C7 0021
@@ -107409,6 +107423,12 @@ FF83 003F
 1F213 0021
 1F213 003F
 1F213 0334
+3066 0334 3099
+3066 3099 0334
+3067 0334
+30C6 0334 3099
+30C6 3099 0334
+30C7 0334
 3066 0061
 3066 0041
 30C6 0061
@@ -107445,16 +107465,16 @@ FF84 0021
 FF84 003F
 32E3 0021
 32E3 003F
+3069 0021
+3069 003F
+30C9 0021
+30C9 003F
 3068 0334 3099
 3068 3099 0334
 3069 0334
 30C8 0334 3099
 30C8 3099 0334
 30C9 0334
-3069 0021
-3069 003F
-30C9 0021
-30C9 003F
 3068 0061
 3068 0041
 31F3 0061
@@ -107611,6 +107631,14 @@ FF8A 0021
 FF8A 003F
 32E9 0021
 32E9 003F
+3070 0021
+3070 003F
+30D0 0021
+30D0 003F
+3071 0021
+3071 003F
+30D1 0021
+30D1 003F
 306F 0334 3099
 306F 3099 0334
 3070 0334
@@ -107623,14 +107651,6 @@ FF8A 003F
 30CF 0334 309A
 30CF 309A 0334
 30D1 0334
-3070 0021
-3070 003F
-30D0 0021
-30D0 003F
-3071 0021
-3071 003F
-30D1 0021
-30D1 003F
 332B 0021
 332B 003F
 332B 0061
@@ -107688,6 +107708,14 @@ FF8B 0021
 FF8B 003F
 32EA 0021
 32EA 003F
+3073 0021
+3073 003F
+30D3 0021
+30D3 003F
+3074 0021
+3074 003F
+30D4 0021
+30D4 003F
 3072 0334 3099
 3072 3099 0334
 3073 0334
@@ -107700,14 +107728,6 @@ FF8B 003F
 30D2 0334 309A
 30D2 309A 0334
 30D4 0334
-3073 0021
-3073 003F
-30D3 0021
-30D3 003F
-3074 0021
-3074 003F
-30D4 0021
-30D4 003F
 3072 0061
 3072 0041
 31F6 0061
@@ -107765,6 +107785,14 @@ FF8C 0021
 FF8C 003F
 32EB 0021
 32EB 003F
+3076 0021
+3076 003F
+30D6 0021
+30D6 003F
+3077 0021
+3077 003F
+30D7 0021
+30D7 003F
 3075 0334 3099
 3075 3099 0334
 3076 0334
@@ -107777,14 +107805,6 @@ FF8C 003F
 30D5 0334 309A
 30D5 309A 0334
 30D7 0334
-3076 0021
-3076 003F
-30D6 0021
-30D6 003F
-3077 0021
-3077 003F
-30D7 0021
-30D7 003F
 3075 0061
 3075 0041
 31F7 0061
@@ -107842,6 +107862,14 @@ FF8D 0021
 FF8D 003F
 32EC 0021
 32EC 003F
+3079 0021
+3079 003F
+30D9 0021
+30D9 003F
+307A 0021
+307A 003F
+30DA 0021
+30DA 003F
 3078 0334 3099
 3078 3099 0334
 3079 0334
@@ -107854,14 +107882,6 @@ FF8D 003F
 30D8 0334 309A
 30D8 309A 0334
 30DA 0334
-3079 0021
-3079 003F
-30D9 0021
-30D9 003F
-307A 0021
-307A 003F
-30DA 0021
-30DA 003F
 333B 0021
 333B 003F
 333B 0061
@@ -107934,6 +107954,14 @@ FF8E 0021
 FF8E 003F
 32ED 0021
 32ED 003F
+307C 0021
+307C 003F
+30DC 0021
+30DC 003F
+307D 0021
+307D 003F
+30DD 0021
+30DD 003F
 307B 0334 3099
 307B 3099 0334
 307C 0334
@@ -107946,14 +107974,6 @@ FF8E 003F
 30DB 0334 309A
 30DB 309A 0334
 30DD 0334
-307C 0021
-307C 003F
-30DC 0021
-30DC 003F
-307D 0021
-307D 003F
-30DD 0021
-30DD 003F
 3341 0021
 3341 003F
 3341 0061
@@ -108480,11 +108500,11 @@ FF9C 0021
 FF9C 003F
 32FB 0021
 32FB 003F
+30F7 0021
+30F7 003F
 30EF 0334 3099
 30EF 3099 0334
 30F7 0334
-30F7 0021
-30F7 003F
 308E 0061
 308E 0041
 308F 0061
@@ -108517,11 +108537,11 @@ FF9C 0062
 30F0 003F
 32FC 0021
 32FC 003F
+30F8 0021
+30F8 003F
 30F0 0334 3099
 30F0 3099 0334
 30F8 0334
-30F8 0021
-30F8 003F
 3090 0061
 3090 0041
 30F0 0061
@@ -108540,11 +108560,11 @@ FF9C 0062
 30F1 003F
 32FD 0021
 32FD 003F
+30F9 0021
+30F9 003F
 30F1 0334 3099
 30F1 3099 0334
 30F9 0334
-30F9 0021
-30F9 003F
 3091 0061
 3091 0041
 30F1 0061
@@ -108565,11 +108585,11 @@ FF66 0021
 FF66 003F
 32FE 0021
 32FE 003F
+30FA 0021
+30FA 003F
 30F2 0334 3099
 30F2 3099 0334
 30FA 0334
-30FA 0021
-30FA 003F
 3092 0061
 3092 0041
 30F2 0061
@@ -124445,6 +124465,18 @@ A4F7 0062
 12262 0061
 12262 0041
 12262 0062
+122D4 0021
+122D4 003F
+122D4 0334
+122D4 0061
+122D4 0041
+122D4 0062
+122D5 0021
+122D5 003F
+122D5 0334
+122D5 0061
+122D5 0041
+122D5 0062
 12263 0021
 12263 003F
 12263 0334
@@ -125123,18 +125155,6 @@ A4F7 0062
 122D3 0061
 122D3 0041
 122D3 0062
-122D4 0021
-122D4 003F
-122D4 0334
-122D4 0061
-122D4 0041
-122D4 0062
-122D5 0021
-122D5 003F
-122D5 0334
-122D5 0061
-122D5 0041
-122D5 0062
 122D6 0021
 122D6 003F
 122D6 0334
@@ -174788,6 +174808,11 @@ FFFFD 0062
 10FFFF 0061
 10FFFF 0041
 10FFFF 0062
+FFFD 0021
+FFFD 003F
+FFFD 0061
+FFFD 0041
+FFFD 0062
 FFFF 0021
 FFFF 003F
 FFFF 0061
diff --git a/icu4c/source/test/testdata/DataDrivenCollationTest.txt b/icu4c/source/test/testdata/DataDrivenCollationTest.txt
deleted file mode 100644 (file)
index 41dd044..0000000
+++ /dev/null
@@ -1,539 +0,0 @@
-// Copyright (c) 2001-2010 International Business Machines
-// Corporation and others. All Rights Reserved.
-DataDrivenCollationTest:table(nofallback) {
-    Info {
-        Headers { "sequence" }
-        Description { "These are the data driven tests" }
-        LongDescription {     "The following entries are separate tests containing test data for various locales."
-                      "Each entry has the following fields: "
-                      "Info/Description - short descrioption of the test"
-                      "Settings - settings for the test."
-                      "Settings/TestLocale - locale for the collator OR"
-                      "Settings/Rules - rules for the collator (can't have both)"
-                      "Settings/Arguments - arguments to be passed to the collator before testing. Use rule syntax."
-                      "Cases - set of test cases, which are sequences of strings that will be parsed"
-                      "Sequences must not change the sign of relation, i.e. we can only have < and = or"
-                      "> and = in single sequence. Cannot mix < and > in the same sequence. Whitespace is"
-                      "is ignored unless quoted."
-                     }
-    }
-    TestData {
-               TestMorePinyin {
-                       Info {
-                               Description { "Testing the primary strength." }
-                       }
-                       Settings {
-                               {
-                                       TestLocale { "zh" }
-                                       Arguments { "[strength 1]" }
-                               }
-                       }
-                       Cases { "lā = lĀ = Lā = LĀ < lān = lĀn < lē = lĒ = Lē = LĒ < lēn = lĒn" }
-                       
-               }
-        TestLithuanian {
-            Info {
-                Description { "Lithuanian sort order." }
-            }
-            Settings {
-                {
-                    TestLocale { "lt" }
-                }
-            }
-            Cases { "cz<č<d<iz<j<sz<š<t<zz<ž" } 
-        }
-        TestLatvian {
-            Info {
-                Description { "Latvian sort order." }
-            }
-            Settings {
-                {
-                    TestLocale { "lv" }
-                }
-            }
-            Cases { "cz<č<d<gz<ģ<h<iz<j<kz<ķ<l<lz<ļ<m<nz<ņ<o<rz<ŗ<s<sz<š<t<zz<ž" }
-        }
-        TestEstonian {
-            Info {
-                Description { "Estonian sort order." }
-            }
-            Settings {
-                {
-                    TestLocale { "et" }
-                }
-            }
-            Cases { "sy<š<šy<z<zy<ž<v<w<va<õ<õy<ä<äy<ö<öy<ü<üy<x" }
-        }
-        TestAlbanian {
-            Info {
-                Description { "Albanian sort order." }
-            }
-            Settings {
-                {
-                    TestLocale { "sq" }
-                }
-            }
-            Cases { "cz<ç<d<dz<dh<e<ez<ë<f<gz<gj<h<lz<ll<m<nz<nj<o<rz<rr<s<sz<sh<t<tz<th<u<xz<xh<y<zz<zh" }
-         }
-         
-         TestSimplifiedChineseOrder {
-            Info {
-                Description { "Sorted file has different order." }
-            }
-            Settings {
-                {
-                    TestLocale { "root" }
-                   Arguments { "[normalization on]" }
-                }
-            }
-
-            Cases { "\u5F20<\u5F20\u4E00\u8E3F"  }
-        }
-        
-        TestTibetanNormalizedIterativeCrash {
-            Info {
-                Description { "This pretty much crashes." }
-            }
-            Settings {
-                {
-                    TestLocale { "root" }
-                }
-            }
-
-            Cases { "\u0f71\u0f72\u0f80\u0f71\u0f72"
-                    "<\u0f80"
-            }
-        }
-        TestThaiPartialSortKeyProblems {
-            Info {
-                Description { "These are examples of strings that caused trouble in partial sort key testing." }
-            }
-            Settings {
-                {
-                    TestLocale { "th_TH" }
-                }
-            }
-            // TODO: the tests that are commented out should be enabled when j2720 is fixed
-            Cases { "\u0E01\u0E01\u0E38\u0E18\u0E20\u0E31\u0E13\u0E11\u0E4C"
-                    "<\u0E01\u0E01\u0E38\u0E2A\u0E31\u0E19\u0E42\u0E18",
-                    "\u0E01\u0E07\u0E01\u0E32\u0E23"
-                    "<\u0E01\u0E07\u0E42\u0E01\u0E49",
-                    "\u0E01\u0E23\u0E19\u0E17\u0E32"
-                    "<\u0E01\u0E23\u0E19\u0E19\u0E40\u0E0A\u0E49\u0E32",
-                    "\u0E01\u0E23\u0E30\u0E40\u0E08\u0E35\u0E22\u0E27"
-                    "<\u0E01\u0E23\u0E30\u0E40\u0E08\u0E35\u0E4A\u0E22\u0E27",
-                    "\u0E01\u0E23\u0E23\u0E40\u0E0A\u0E2D"
-                    "<\u0E01\u0E23\u0E23\u0E40\u0E0A\u0E49\u0E32"
-          }
-        }
-        TestJavaStyleRule {
-            Info {
-                Description { "java.text allows rules to start as '<<<x<<<y...' "
-                              "we emulate this by assuming a &[first tertiary ignorable] "
-                              "in this case."
-                }
-            }
-            Settings {
-                {
-                    Rules { "=equal<<<z<<x<<<w<y &[first tertiary ignorable]=a &[first primary ignorable]=b" }
-                }
-            }
-            Cases { "a = equal < z < x < w < b < y" }
-        }
-        TestShiftedIgnorable {
-            Info {
-                Description { "New UCA states that primary ignorables should be completely "
-                              "ignorable when following a shifted code point."
-                            }
-            }
-            Settings {
-                {
-                    TestLocale { "root" }
-                    Arguments { "[alternate shifted][strength 4]" }
-                }
-            }
-            Cases {
-                "a' 'b="
-                "a' '\u0300b="
-                "a' '\u0301b<"
-                "a_b="
-                "a_\u0300b="
-                "a_\u0301b<"
-                "A' 'b="
-                "A' '\u0300b="
-                "A' '\u0301b<"
-                "A_b="
-                "A_\u0300b="
-                "A_\u0301b<"
-                "a\u0301b<"
-                "A\u0301b<"
-                "a\u0300b<"
-                "A\u0300b"
-
-            }
-        }
-
-        TestNShiftedIgnorable {
-            Info {
-                Description { "New UCA states that primary ignorables should be completely "
-                              "ignorable when following a shifted code point."
-                            }
-            }
-            Settings {
-                {
-                    TestLocale { "root" }
-                    Arguments { "[alternate non-ignorable][strength 3]" }
-                }
-            }
-            Cases {
-                "a' 'b<"
-                "A' 'b<"
-                "a' '\u0301b<"
-                "A' '\u0301b<"
-                "a' '\u0300b<"
-                "A' '\u0300b<"
-                "a_b<"
-                "A_b<"
-                "a_\u0301b<"
-                "A_\u0301b<"
-                "a_\u0300b<"
-                "A_\u0300b<"
-                "a\u0301b<"
-                "A\u0301b<"
-                "a\u0300b<"
-                "A\u0300b<"
-            }
-        }
-
-        TestSafeSurrogates {
-            Info {
-                Description { "It turned out that surrogates were not skipped properly "
-                              "when iterating backwards if they were in the middle of a "
-                              "contraction. This test assures that this is fixed."
-                            }
-            }
-            Settings {
-                {
-                    Rules {
-                                "&a < x\ud800\udc00b"
-                    }
-                }
-            }
-            Cases {
-                "a<x\ud800\udc00b"
-            }
-        }
-/*
-       UCA 4.1 removes skipping of ignorable code points in contractions!
-        TestCIgnorableContraction {
-            Info {
-                Description { "Checks whether completely ignorable code points are "
-                              "skipped in contractions."
-                              }
-            }
-            Settings {
-                {
-                    TestLocale { "sh" }
-                }
-                {
-                    Rules {
-                                "& L < lj, Lj <<< LJ"
-                                "& N < nj, Nj <<< NJ "
-                    }
-                }
-            }
-            Cases {
-                "njiva=n\ud834\udd65jiva=n\uD834\uDD79jiva=n\u0000\u0000\u0000jiva=n\u0000jiva=n\ud800jiva=n\ufffejiva",
-                "ljubav=l\u0000jubav=l\uD834\uDD79jubav=l\u0000\u0000\u0000jubav=l\ud800jubav=l\ufffejubav",
-                "Ljubav=L\u0000jubav=L\uD834\uDD79jubav=L\u0000\u0000\u0000jubav=L\ud800jubav=L\ufffejubav",
-            }
-        }
-                
-*/
-/*
-       UCA 4.1 removes skipping of ignorable code points in contractions!
-        TestCIgnorablePrefix {
-            Info {
-                Description { "Checks whether completely ignorable code points are "
-                              "skipped in prefix processing."
-                              }
-            }
-            Settings {
-                {
-                    TestLocale { "ja" }
-                }
-            }
-            Cases {
-               "\u30A1\u30FC"
-               "= \u30A1\uDB40\uDC30\u30FC"
-               "= \u30A1\uD800\u30FC"
-               "= \u30A1\uFFFE\u30FC"
-               "= \u30A1\uD834\uDD79\u30FC"
-               "= \u30A1\u0000\u0000\u0000\u30FC"
-               "= \u30A1\u0000\u30FC"
-               "= \u30A1\u30FC"
-               "= \u30A1\u0000\u059a\u30FC"
-               "= \u30A1\u30FC"
-            }
-        }
-*/
-        da_TestPrimary {
-            Info {
-                Description { "This test goes through primary strength cases" }
-            }
-            Settings {
-                {
-                    TestLocale { "da" }
-                    Arguments { "[strength 1]" }
-                }
-            }
-            Cases {
-                "Lvi<Lwi",
-                "L\u00e4vi<L\u00f6wi",
-                "L\u00fcbeck=Lybeck",
-            }
-        }
-        da_TestTertiary {
-            Info {
-                Description { "This test goes through tertiary strength cases" }
-            }
-            Settings {
-                {
-                    TestLocale { "da" }
-                    Arguments { "[strength 3]" }
-                }
-            }
-            Cases {
-                "Luc<luck",
-                "luck<L\u00fcbeck",
-                "L\u00fcbeck>lybeck",
-                "L\u00e4vi<L\u00f6we",
-                "L\u00f6ww<mast",
-                // constUCharCollationDanishTest::testBugs[][CollationDanishTest::MAX_TOKEN_LEN]="
-                "A/S<"
-                "ANDRE<"
-                "ANDR\u00c9<"
-                "ANDREAS<"
-                "AS<"
-                "CA<"
-                "\u00c7A<"
-                "CB<"
-                "\u00c7C<"
-                "D.S.B.<"
-                "DA<"
-                "\u00d0A<"
-                "DB<"
-                "\u00d0C<"
-                "DSB<"
-                "DSC<"
-                "EKSTRA_ARBEJDE<"
-                "EKSTRABUD0<"
-                "H\u00d8ST<"
-                "HAAG<"
-                "H\u00c5NDBOG<"
-                "HAANDV\u00c6RKSBANKEN<"
-                "Karl<"
-                "karl<"
-                "'NIELS J\u00d8RGEN'<"
-                "NIELS-J\u00d8RGEN<"
-                "NIELSEN<"
-                "'R\u00c9E, A'<"
-                "'REE, B'<"
-                "'R\u00c9E, L'<"
-                "'REE, V'<"
-                "'SCHYTT, B'<"
-                "'SCHYTT, H'<"
-                "'SCH\u00dcTT, H'<"
-                "'SCHYTT, L'<"
-                "'SCH\u00dcTT, M'<"
-                "SS<"
-                "\u00df<"
-                "SSA<"
-                "'STORE VILDMOSE'<"
-                "STOREK\u00c6R0<"
-                "'STORM PETERSEN'<"
-                "STORMLY<"
-                "THORVALD<"
-                "THORVARDUR<"
-                "\u00feORVAR\u00d0UR<"
-                "THYGESEN<"
-                "'VESTERG\u00c5RD, A'<"
-                "'VESTERGAARD, A'<"
-                "'VESTERG\u00c5RD, B'<"
-                "\u00c6BLE<"
-                "\u00c4BLE<"
-                "\u00d8BERG<"
-                "\u00d6BERG",
-
-                // constUCharCollationDanishTest::testNTList[][CollationDanishTest::MAX_TOKEN_LEN]="
-                "andere<"
-                "chaque<"
-                "chemin<"
-                "cote<"
-                "cot\u00e9<"
-                "c\u00f4te<"
-                "c\u00f4t\u00e9<"
-                "\u010du\u010d\u0113t<"
-                "Czech<"
-                "hi\u0161a<"
-                "irdisch<"
-                "lie<"
-                "lire<"
-                "llama<"
-                "l\u00f5ug<"
-                "l\u00f2za<"
-                "lu\u010d<"
-                "luck<"
-                "L\u00fcbeck<"
-                "lye<"
-                "l\u00e4vi<"
-                "L\u00f6wen<"
-                "m\u00e0\u0161ta<"
-                "m\u00eer<"
-                "myndig<"
-                "M\u00e4nner<"
-                "m\u00f6chten<"
-                "pi\u00f1a<"
-                "pint<"
-                "pylon<"
-                "\u0161\u00e0ran<"
-                "savoir<"
-                "\u0160erb\u016bra<"
-                "Sietla<"
-                "\u015blub<"
-                "subtle<"
-                "symbol<"
-                "s\u00e4mtlich<"
-                "verkehrt<"
-                "vox<"
-                "v\u00e4ga<"
-                "waffle<"
-                "wood<"
-                "yen<"
-                "yuan<"
-                "yucca<"
-                "\u017eal<"
-                "\u017eena<"
-                "\u017den\u0113va<"
-                "zoo0<"
-                "Zviedrija<"
-                "Z\u00fcrich<"
-                "zysk0<"
-                "\u00e4ndere"
-            }
-        }
-        hi_TestNewRules {
-            Info {
-                Description { "This test goes through new rules and tests against old rules" }
-            }
-            Settings {
-                {
-                    TestLocale { "hi" }
-                }
-            }
-            Cases {
-                                               "कॐ<कं<कँ<कः"
-// This data is left over from the rules that were in place prior to CLDR 1.9M1
-//                                             "०<१<२<३"
-//                 "<४<५<६<७<८<९<अ<आ"
-//                 "<इ<ई<उ<ऊ<ऋ<ॠ<ऌ<ॡ"
-//                 "<ऍ<ऎ<ए<ऐ<ऑ<ऒ<ओ<औ"
-//                 "<क<क़=क़<कँ<कं<कः<क॑<क॒"
-//                 "<क॓<क॔<कऽ<क्<का<कि<की<कु"
-//                 "<कू<कृ<कॄ<कॢ<कॣ<कॅ<कॆ<के"
-//                 "<कै<कॉ<कॊ<को<कौ<ख<ख़ =ख़<खँ<खं<खः"
-//                 "<ख॑<ख॒<ख॓<ख॔<खऽ<ख्<खा<खि"
-//                 "<खी<खु<खू<खृ<खॄ<खॢ<खॣ<खॅ"
-//                 "<खॆ<खे<खै<खॉ<खॊ<खो<खौ<ग"
-//                 "<ग़=ग़<गँ<गं<गः<ग॑<ग॒<ग॓<ग॔"
-//                 "<गऽ<ग्<गा<गि<गी<गु<गू<गृ"
-//                 "<गॄ<गॢ<गॣ<गॅ<गॆ<गे<गै<गॉ"
-//                 "<गॊ<गो<गौ<घ<ङ<च<छ<ज<ज़ =ज़<जँ<जं<जः"
-//                 "<ज॑<ज॒<ज॓<ज॔<जऽ<ज्<जा<जि"
-//                 "<जी<जु<जू<जृ<जॄ<जॢ<जॣ<जॅ"
-//                 "<जॆ<जे<जै<जॉ<जॊ<जो<जौ<झ"
-//                 "<ञ<ट<ठ<ड<ड़=ड़<डँ<डं<डः<ड॑<ड॒<ड॓<ड॔"
-//                 "<डऽ<ड्<डा<डि<डी<डु<डू<डृ"
-//                 "<डॄ<डॢ<डॣ<डॅ<डॆ<डे<डै<डॉ"
-//                 "<डॊ<डो<डौ<ढ<ढ़=ढ़<ढँ<ढं<ढः"
-//                 "<ढ॑<ढ॒<ढ॓<ढ॔<ढऽ<ढ्<ढा<ढि"
-//                 "<ढी<ढु<ढू<ढृ<ढॄ<ढॢ<ढॣ<ढॅ"
-//                 "<ढॆ<ढे<ढै<ढॉ<ढॊ<ढो<ढौ<ण"
-//                 "<त<थ<द<ध<न<ऩ =ऩ< नँ<नं< नः"
-//                 "<न॑<न॒<न॓<न॔<नऽ<न्<ना<नि"
-//                 "<नी<नु<नू<नृ<नॄ<नॢ<नॣ<नॅ"
-//                 "<नॆ<ने<नै<नॉ<नॊ<नो<नौ"
-//                 "<प<फ<फ़=फ़<फँ<फं<फः<फ॑<फ॒"
-//                 "<फ॓<फ॔<फऽ<फ्<फा<फि<फी<फु<फू<फृ"
-//                 "<फॄ<फॢ<फॣ<फॅ<फॆ<फे<फै<फॉ"
-//                 "<फॊ<फो<फौ<ब<भ<म<य<य़=य़ "
-//                 "<यँ<यं<यः<य॑<य॒<य॓<य॔"
-//                 "<यऽ<य्<या<यि<यी<यु<यू<यृ"
-//                 "<यॄ<यॢ<यॣ<यॅ<यॆ<ये<यै<यॉ"
-//                 "<यॊ<यो<यौ<र<ऱ=ऱ<रँ<रं<रः"
-//                 "<र॑<र॒<र॓<र॔<रऽ<र्<रा<रि"
-//                 "<री<रु<रू<रृ<रॄ<रॢ<रॣ<रॅ"
-//                 "<रॆ<रे<रै<रॉ<रॊ<रो<रौ"
-//                 "<ल<ळ<ऴ=ऴ<ळँ<ळं<ळः<ळ॑<ळ॒"
-//                 "<ळ॓<ळ॔<ळऽ<ळ्<ळा<ळि<ळी<ळु"
-//                 "<ळू<ळृ<ळॄ<ळॢ<ळॣ<ळॅ<ळॆ<ळे"
-//                 "<ळै<ळॉ<ळॊ<ळो<ळौ<व<श<ष<स<ह"
-//                 "<़<ँ<ं<ः<॑<॒<॓<॔<ऽ<्<ा<ि<ी"
-//                 "<ु<ू<ृ<ॄ<ॢ<ॣ<ॅ<ॆ"
-//                 "<े<ै<ॉ<ॊ<ो<ौ"
-           }
-        }
-//        fi_TestNewRules {
-//           Info {
-//              Description { "This test goes through new rules and tests against old rules" }
-//         }
-//        Settings {
-//           {
-//              TestLocale { "fi" }
-//         }
-//    }
-//   Cases { 
-//      "xa<xA<Xa<XA<xá<Xá<xax<xAx<xáx<xd<Xd<xð<xÐ<Xð<XÐ<xđ<xĐ<Xđ<XĐ<"
-//     "xdx<xðx<xÐx<xđx<xĐx<xe<Xe<xex<xn<Xn<xŋ<xŊ<Xŋ<XŊ<xnx<xŋx<xŊx<"
-//    "xo<Xo<xó<Xó<xox<xóx<xs<Xs<xß<Xß<xßx<xsx<xt<Xt<xþ<xÞ<Xþ<XÞ<xþx<"
-//   "xÞx<xtx<xu<Xu<xú<Xú<xux<xúx<xv<Xv<xw<Xw<xvx<xwx<xy<Xy<xü<Xü<"
-//  "xű<Xű<xyx<xüx<xűx<xz<Xz<xzx<xå<Xå<xåx<xä<Xä<xæ<xÆ<Xæ<XÆ<xäx<"
-//              "xæx<xÆx<xö<Xö<xø<Xø<xő<Xő<xõ<Xõ<xœ<xŒ<Xœ<XŒ<xöx<xøx<xőx<xõx<xœx<xŒx"
-//}
-//}
-        ro_TestNewRules {
-            Info {
-                Description { "This test goes through new rules and tests against old rules" }
-            }
-            Settings {
-                {
-                    TestLocale { "ro" }
-                }
-            }
-            Cases { 
-                "xAx<xă<xĂ<Xă<XĂ<xăx<xĂx<xâ<xÂ<Xâ<XÂ<xâx<xÂx<xb<xIx<xî<xÎ<Xî<XÎ<xîx<xÎx<"
-                "xj<xSx<xș=xş<xȘ=xŞ<Xș=Xş<XȘ=XŞ<xșx=xşx<xȘx=xŞx<xT<xTx<xț=xţ<xȚ=xŢ<Xț=Xţ<XȚ"
-                "=XŢ<xțx=xţx<xȚx=xŢx<xU"
-            }
-        }
-        
-        testOffsets {
-            Info {
-                Description { "This tests cases where forwards and backwards iteration get different offsets" }
-            }
-            
-            Settings {
-                {
-                    TestLocale { "en" }
-                    Arguments  { "[strength 3]" }
-                }
-            }
-                
-            Cases {
-                "a\uD800\uDC00\uDC00<b\uD800\uDC00\uDC00",
-                "\u0301A\u0301\u0301<\u0301B\u0301\u0301",
-                "abcd\r\u0301<abce\r\u0301"
-            }
-        }    
-    }
-}
diff --git a/icu4c/source/test/testdata/collationtest.txt b/icu4c/source/test/testdata/collationtest.txt
new file mode 100644 (file)
index 0000000..d6c759c
--- /dev/null
@@ -0,0 +1,2235 @@
+# Copyright (c) 2012-2014 International Business Machines
+# Corporation and others. All Rights Reserved.
+#
+# This file should be in UTF-8 with a signature byte sequence ("BOM").
+#
+# collationtest.txt: Collation test data.
+#
+# created on: 2012apr13
+# created by: Markus W. Scherer
+
+# A line with "** test: description" is used for verbose and error output.
+
+# A collator can be set with "@ root" or "@ locale language-tag",
+# for example "@ locale de-u-co-phonebk".
+
+# A collator can be built with "@ rules".
+# An "@ rules" line is followed by one or more lines with the tailoring rules.
+
+# A collator can be modified with "% attribute=value".
+
+# "* compare" tests the order (= or <) of the following strings.
+# The relation can be "=" or "<" (the level of the difference is not specified)
+# or "<1", "<2", "<c", "<3", "<4" (indicating the level of the difference).
+
+# Test sections ("* compare") are terminated by
+# definitions of new collators, changing attributes, or new test sections.
+
+** test: simple CEs & expansions
+# Many types of mappings are tested elsewhere, including via the UCA conformance tests.
+# Here we mostly cover a few unusual mappings.
+@ rules
+&\x01                           # most control codes are ignorable
+<<<\u0300                       # tertiary CE
+&9<\x00                         # NUL not ignorable
+&\uA00A\uA00B=\uA002            # two long-primary CEs
+&\uA00A\uA00B\u00050005=\uA003  # three CEs, require 64 bits
+
+* compare
+=  \x01
+=  \x02
+<3 \u0300
+<1 9
+<1 \x00
+=  \x01\x00\x02
+<1 a
+<3 a\u0300
+<2 a\u0308
+=  ä
+<1 b
+<1 か        # Hiragana Ka (U+304B)
+<2 か\u3099  # plus voiced sound mark
+=  が        # Hiragana Ga (U+304C)
+<1 \uA00A\uA00B
+=  \uA002
+<1 \uA00A\uA00B\u00050004
+<1 \uA00A\uA00B\u00050005
+=  \uA003
+<1 \uA00A\uA00B\u00050006
+
+** test: contractions
+# Create some interesting mappings, and map some normalization-inert characters
+# (which are not subject to canonical reordering)
+# to some of the same CEs to check the sequence of CEs.
+@ rules
+
+# Contractions starting with 'a' should not continue with any character < U+0300
+# so that we can test a shortcut for that.
+&a=ⓐ
+&b<bz=ⓑ
+&d<dz\u0301=ⓓ           # d+z+acute
+&z
+<a\u0301=Ⓐ              # a+acute sorts after z
+<a\u0301\u0301=Ⓑ        # a+acute+acute
+<a\u0301\u0301\u0358=Ⓒ  # a+acute+acute+dot above right
+<a\u030a=Ⓓ              # a+ring
+<a\u0323=Ⓔ              # a+dot below
+<a\u0323\u0358=Ⓕ        # a+dot below+dot above right
+<a\u0327\u0323\u030a=Ⓖ  # a+cedilla+dot below+ring
+<a\u0327\u0323bz=Ⓗ      # a+cedilla+dot below+b+z
+
+&\U0001D158=⁰           # musical notehead black (has a symbol primary)
+<\U0001D158\U0001D165=¼ # musical quarter note
+
+# deliberately missing prefix contractions:
+# dz
+# a\u0327
+# a\u0327\u0323
+# a\u0327\u0323b
+
+&\x01
+<<<\U0001D165=¹         # musical stem (ccc=216)
+<<<\U0001D16D=²         # musical augmentation dot (ccc=226)
+<<<\U0001D165\U0001D16D=³  # stem+dot (ccc=216 226)
+&\u0301=❶               # acute (ccc=230)
+&\u030a=❷               # ring (ccc=230)
+&\u0308=❸               # diaeresis (ccc=230)
+<<\u0308\u0301=❹        # diaeresis+acute (=dialytika tonos) (ccc=230 230)
+&\u0327=❺               # cedilla (ccc=202)
+&\u0323=❻               # dot below (ccc=220)
+&\u0331=❼               # macron below (ccc=220)
+<<\u0331\u0358=❽        # macron below+dot above right (ccc=220 232)
+&\u0334=❾               # tilde overlay (ccc=1)
+&\u0358=❿               # dot above right (ccc=232)
+
+&\u0f71=①               # tibetan vowel sign aa
+&\u0f72=②               # tibetan vowel sign i
+#  \u0f71\u0f72         # tibetan vowel sign aa + i = ii = U+0F73
+&\u0f73=③               # tibetan vowel sign ii (ccc=0 but lccc=129)
+
+** test: simple contractions
+
+# Some strings are chosen to cause incremental contiguous contraction matching to
+# go into partial matches for prefixes of contractions
+# (where the prefixes are deliberately not also contractions).
+# When there is no complete match, then the matching code must back out of those
+# so that discontiguous contractions work as specified.
+
+* compare
+# contraction starter with no following text, or mismatch, or blocked
+<1 a
+=  ⓐ
+<1 aa
+=  ⓐⓐ
+<1 ab
+=  ⓐb
+<1 az
+=  ⓐz
+
+* compare
+<1 a
+<2 a\u0308\u030a  # ring blocked by diaeresis
+=  ⓐ❸❷
+<2 a\u0327
+=  ⓐ❺
+
+* compare
+<2 \u0308
+=  ❸
+<2 \u0308\u030a\u0301  # acute blocked by ring
+=  ❸❷❶
+
+* compare
+<1 \U0001D158
+=  ⁰
+<1 \U0001D158\U0001D165
+=  ¼
+
+# no discontiguous contraction because of missing prefix contraction d+z,
+# and a starter ('z') after the 'd'
+* compare
+<1 dz\u0323\u0301
+=  dz❻❶
+
+# contiguous contractions
+* compare
+<1 abz
+=  ⓐⓑ
+<1 abzz
+=  ⓐⓑz
+
+* compare
+<1 a
+<1 z
+<1 a\u0301
+=  Ⓐ
+<1 a\u0301\u0301
+=  Ⓑ
+<1 a\u0301\u0301\u0358
+=  Ⓒ
+<1 a\u030a
+=  Ⓓ
+<1 a\u0323\u0358
+=  Ⓕ
+<1 a\u0327\u0323\u030a  # match despite missing prefix
+=  Ⓖ
+<1 a\u0327\u0323bz
+=  Ⓗ
+
+* compare
+<2 \u0308\u0308\u0301  # acute blocked from first diaeresis, contracts with second
+=  ❸❹
+
+* compare
+<1 \U0001D158\U0001D165
+=  ¼
+
+* compare
+<3 \U0001D165\U0001D16D
+=  ³
+
+** test: discontiguous contractions
+* compare
+<1 a\u0327\u030a                # a+ring skips cedilla
+=  Ⓓ❺
+<2 a\u0327\u0327\u030a          # a+ring skips 2 cedillas
+=  Ⓓ❺❺
+<2 a\u0327\u0327\u0327\u030a    # a+ring skips 3 cedillas
+=  Ⓓ❺❺❺
+<2 a\u0334\u0327\u0327\u030a    # a+ring skips tilde overlay & 2 cedillas
+=  Ⓓ❾❺❺
+<1 a\u0327\u0323                # a+dot below skips cedilla
+=  Ⓔ❺
+<1 a\u0323\u0301\u0358          # a+dot below+dot ab.r.: 2-char match, then skips acute
+=  Ⓕ❶
+<2 a\u0334\u0323\u0358          # a+dot below skips tilde overlay
+=  Ⓕ❾
+
+* compare
+<2 \u0331\u0331\u0358           # macron below+dot ab.r. skips the second macron below
+=  ❽❼
+
+* compare
+<1 a\u0327\u0331\u0323\u030a    # a+ring skips cedilla, macron below, dot below (dot blocked by macron)
+=  Ⓓ❺❼❻
+<1 a\u0327\u0323\U0001D16D\u030a  # a+dot below skips cedilla
+=  Ⓔ❺²❷
+<2 a\u0327\u0327\u0323\u030a    # a+dot below skips 2 cedillas
+=  Ⓔ❺❺❷
+<2 a\u0327\u0323\u0323\u030a    # a+dot below skips cedilla
+=  Ⓔ❺❻❷
+<2 a\u0334\u0327\u0323\u030a    # a+dot below skips tilde overlay & cedilla
+=  Ⓔ❾❺❷
+
+* compare
+<1 \U0001D158\u0327\U0001D165   # quarter note skips cedilla
+=  ¼❺
+<1 a\U0001D165\u0323            # a+dot below skips stem
+=  Ⓔ¹
+
+# partial contiguous match, backs up, matches discontiguous contraction
+<1 a\u0327\u0323b
+=  Ⓔ❺b
+<1 a\u0327\u0323ba
+=  Ⓔ❺bⓐ
+
+# a+acute+acute+dot above right skips cedilla, continues matching 2 same-ccc combining marks
+* compare
+<1 a\u0327\u0301\u0301\u0358
+=  Ⓒ❺
+
+# FCD but not NFD
+* compare
+<1 a\u0f73\u0301                # a+acute skips tibetan ii
+=  Ⓐ③
+
+# FCD but the 0f71 inside the 0f73 must be skipped
+# to match the discontiguous contraction of the first 0f71 with the trailing 0f72 inside the 0f73
+* compare
+<1 \u0f71\u0f73                 # == \u0f73\u0f71 == \u0f71\u0f71\u0f72
+=  ③①
+
+** test: discontiguous contractions with nested contractions
+* compare
+<1 a\u0323\u0308\u0301\u0358
+=  Ⓕ❹
+<2 a\u0323\u0308\u0301\u0308\u0301\u0358
+=  Ⓕ❹❹
+
+** test: discontiguous contractions with interleaved contractions
+* compare
+# a+ring & cedilla & macron below+dot above right
+<1 a\u0327\u0331\u030a\u0358
+=  Ⓓ❺❽
+
+# a+ring & 1x..3x macron below+dot above right
+<2 a\u0331\u030a\u0358
+=  Ⓓ❽
+<2 a\u0331\u0331\u030a\u0358\u0358
+=  Ⓓ❽❽
+# also skips acute
+<2 a\u0331\u0331\u0331\u030a\u0301\u0358\u0358\u0358
+=  Ⓓ❽❽❽❶
+
+# a+dot below & stem+augmentation dot, followed by contiguous d+z+acute
+<1 a\U0001D165\u0323\U0001D16Ddz\u0301
+=  Ⓔ³ⓓ
+
+** test: some simple string comparisons
+@ root
+* compare
+# first string compares against ""
+= \u0000
+< a
+<1 b
+<3 B
+= \u0000B\u0000
+
+** test: compare with strength=primary
+% strength=primary
+* compare
+<1 a
+<1 b
+= B
+
+** test: compare with strength=secondary
+% strength=secondary
+* compare
+<1 a
+<1 b
+= B
+
+** test: compare with strength=tertiary
+% strength=tertiary
+* compare
+<1 a
+<1 b
+<3 B
+
+** test: compare with strength=quaternary
+% strength=quaternary
+* compare
+<1 a
+<1 b
+<3 B
+
+** test: compare with strength=identical
+% strength=identical
+* compare
+<1 a
+<1 b
+<3 B
+
+** test: côté with forwards secondary
+@ root
+* compare
+<1 cote
+<2 coté
+<2 côte
+<2 côté
+
+** test: côté with forwards secondary vs. U+FFFE merge separator
+# Merged sort keys: On each level, any difference in the first segment
+# must trump any further difference.
+* compare
+<1 cote\uFFFEcôté
+<2 coté\uFFFEcôte
+<2 côte\uFFFEcoté
+<2 côté\uFFFEcote
+
+** test: côté with backwards secondary
+% backwards=on
+* compare
+<1 cote
+<2 côte
+<2 coté
+<2 côté
+
+** test: côté with backwards secondary vs. U+FFFE merge separator
+# Merged sort keys: On each level, any difference in the first segment
+# must trump any further difference.
+* compare
+<1 cote\uFFFEcôté
+<2 côte\uFFFEcoté
+<2 coté\uFFFEcôte
+<2 côté\uFFFEcote
+
+** test: U+FFFE on identical level
+@ root
+% strength=identical
+* compare
+# All of these control codes are completely-ignorable, so that
+# their low code points are compared with the merge separator.
+# The merge separator must compare less than any other character.
+<1 \uFFFE\u0001\u0002\u0003
+<i \u0001\uFFFE\u0002\u0003
+<i \u0001\u0002\uFFFE\u0003
+<i \u0001\u0002\u0003\uFFFE
+
+* compare
+# The merge separator must even compare less than U+0000.
+<1 \uFFFE\u0000\u0000
+<i \u0000\uFFFE\u0000
+<i \u0000\u0000\uFFFE
+
+** test: Hani < surrogates < U+FFFD
+# Note: compareUTF8() treats unpaired surrogates like U+FFFD,
+# so with that the strings with surrogates will compare equal to each other
+# and equal to the string with U+FFFD.
+@ root
+% strength=identical
+* compare
+<1 abz
+<1 a\u4e00z
+<1 a\U00020000z
+<1 a\ud800z
+<1 a\udbffz
+<1 a\udc00z
+<1 a\udfffz
+<1 a\ufffdz
+
+** test: script reordering
+@ root
+% reorder Hani Zzzz digit
+* compare
+<1 ?
+<1 +
+<1 丂
+<1 a
+<1 α
+<1 5
+
+% reorder default
+* compare
+<1 ?
+<1 +
+<1 5
+<1 a
+<1 α
+<1 丂
+
+** test: empty rules
+@ rules
+* compare
+<1 a
+<2 ä
+<3 Ä
+<1 b
+
+** test: very simple rules
+@ rules
+&a=e<<<<q<<<<r<x<<<X<<y<<<Y;z,Z
+% strength=quaternary
+* compare
+<1 a
+=  e
+<4 q
+<4 r
+<1 x
+<3 X
+<2 y
+<3 Y
+<2 z
+<3 Z
+
+** test: tailoring twice before a root position: primary
+@ rules
+&[before 1]b<p
+&[before 1]b<q
+* compare
+<1 a
+<1 p
+<1 q
+<1 b
+
+** test: tailoring twice before a root position: secondary
+@ rules
+&[before 2]ſ<<p
+&[before 2]ſ<<q
+* compare
+<1 s
+<2 p
+<2 q
+<2 ſ
+
+# secondary-before common weight
+@ rules
+&[before 2]b<<p
+&[before 2]b<<q
+* compare
+<1 a
+<1 p
+<2 q
+<2 b
+
+** test: tailoring twice before a root position: tertiary
+@ rules
+&[before 3]B<<<p
+&[before 3]B<<<q
+* compare
+<1 b
+<3 p
+<3 q
+<3 B
+
+# tertiary-before common weight
+@ rules
+&[before 3]b<<<p
+&[before 3]b<<<q
+* compare
+<1 a
+<1 p
+<3 q
+<3 b
+
+@ rules
+&[before 2]b<<s
+&[before 3]s<<<p
+&[before 3]s<<<q
+* compare
+<1 a
+<1 p
+<3 q
+<3 s
+<2 b
+
+** test: tailor after completely ignorable
+@ rules
+&\x00<<<x<<y
+* compare
+= \x00
+= \x1F
+<3 x
+<2 y
+
+** test: secondary tailoring gaps, ICU ticket 9362
+@ rules
+&[before 2]s<<'_'
+&s<<r  # secondary between s and ſ (long s)
+&ſ<<*a-q  # more than 15 between ſ and secondary CE boundary
+&[before 2][first primary ignorable]<<u<<v  # between secondary CE boundary & lowest secondary CE
+&[last primary ignorable]<<y<<z
+
+* compare
+<2 u
+<2 v
+<2 \u0332  # lowest secondary CE
+<2 \u0308
+<2 y
+<2 z
+<1 s_
+<2 ss
+<2 sr
+<2 sſ
+<2 sa
+<2 sb
+<2 sp
+<2 sq
+<2 sus
+<2 svs
+<2 rs
+
+** test: tertiary tailoring gaps, ICU ticket 9362
+@ rules
+&[before 3]t<<<'_'
+&t<<<r  # tertiary between t and fullwidth t
+&ᵀ<<<*a-q  # more than 15 between ᵀ (modifier letter T) and tertiary CE boundary
+&[before 3][first secondary ignorable]<<<u<<<v  # between tertiary CE boundary & lowest tertiary CE
+&[last secondary ignorable]<<<y<<<z
+
+* compare
+<3 u
+<3 v
+# Note: The root collator currently does not map any characters to tertiary CEs.
+<3 y
+<3 z
+<1 t_
+<3 tt
+<3 tr
+<3 tt
+<3 tᵀ
+<3 ta
+<3 tb
+<3 tp
+<3 tq
+<3 tut
+<3 tvt
+<3 rt
+
+** test: secondary & tertiary around root character
+@ rules
+&[before 2]m<<r
+&m<<s
+&[before 3]m<<<u
+&m<<<v
+* compare
+<1 l
+<1 r
+<2 u
+<3 m
+<3 v
+<2 s
+<1 n
+
+** test: secondary & tertiary around tailored item
+@ rules
+&m<x
+&[before 2]x<<r
+&x<<s
+&[before 3]x<<<u
+&x<<<v
+* compare
+<1 m
+<1 r
+<2 u
+<3 x
+<3 v
+<2 s
+<1 n
+
+** test: more nesting of secondary & tertiary before
+@ rules
+&[before 3]m<<<u
+&[before 2]m<<r
+&[before 3]r<<<q
+&m<<<w
+&m<<t
+&[before 3]w<<<v
+&w<<<x
+&w<<s
+* compare
+<1 l
+<1 q
+<3 r
+<2 u
+<3 m
+<3 v
+<3 w
+<3 x
+<2 s
+<2 t
+<1 n
+
+** test: case bits
+@ rules
+&w<x  # tailored CE getting case bits
+  =uv=uV=Uv=UV  # 2 chars -> 1 CE
+&ae=ch=cH=Ch=CH  # 2 chars -> 2 CEs
+&rst=yz=yZ=Yz=YZ  # 2 chars -> 3 CEs
+% caseFirst=lower
+* compare
+<1 ae
+=  ch
+<3 cH
+<3 Ch
+<3 CH
+<1 rst
+=  yz
+<3 yZ
+<3 Yz
+<3 YZ
+<1 w
+<1 x
+=  uv
+<3 uV
+=  Uv  # mixed case on single CE cannot distinguish variations
+<3 UV
+
+** test: tertiary CEs, tertiary, caseLevel=off, caseFirst=lower
+@ rules
+&\u0001<<<t<<<T  # tertiary CEs
+% caseFirst=lower
+* compare
+<1 aa
+<3 aat
+<3 aaT
+<3 aA
+<3 aAt
+<3 ata
+<3 aTa
+
+** test: tertiary CEs, tertiary, caseLevel=off, caseFirst=upper
+% caseFirst=upper
+* compare
+<1 aA
+<3 aAt
+<3 aa
+<3 aat
+<3 aaT
+<3 ata
+<3 aTa
+
+** test: reset on expansion, ICU tickets 9415 & 9593
+@ rules
+&æ<x    # tailor the last primary CE so that x sorts between ae and af
+&æb=bæ  # copy all reset CEs to make bæ sort the same
+&각<h    # copy/tailor 3 CEs to make h sort before the next Hangul syllable 갂
+&⒀<<y   # copy/tailor 4 CEs to make y sort with only a secondary difference
+&l·=z   # handle the pre-context for · when fetching reset CEs
+   <<u  # copy/tailor 2 CEs
+
+* compare
+<1 ae
+<2 æ
+<1 x
+<1 af
+
+* compare
+<1 aeb
+<2 æb
+=  bæ
+
+* compare
+<1 각
+<1 h
+<1 갂
+<1 갃
+
+* compare
+<1 ·    # by itself: primary CE
+<1 l
+<2 l·   # l+middle dot has only a secondary difference from l
+=  z
+<2 u
+
+* compare
+<1 (13)
+<3 ⒀  # DUCET sets special tertiary weights in all CEs
+<2 y
+<1 (13[
+
+% alternate=shifted
+* compare
+<1 (13)
+=  13
+<3 ⒀
+=  y  # alternate=shifted removes the tailoring difference on the last CE
+<1 14
+
+** test: contraction inside extension, ICU ticket 9378
+@ rules
+&а<<х/й     # all letters are Cyrillic
+* compare
+<1 ай
+<2 х
+
+** test: no duplicate tailored CEs for different reset positions with same CEs, ICU ticket 10104
+@ rules
+&t<x &ᵀ<y           # same primary weights
+&q<u &[before 1]ꝗ<v # q and ꝗ are primary adjacent
+* compare
+<1 q
+<1 u
+<1 v
+<1 ꝗ
+<1 t
+<3 ᵀ
+<1 y
+<1 x
+
+# Principle: Each rule builds on the state of preceding rules and ignores following rules.
+
+** test: later rule does not affect earlier reset position, ICU ticket 10105
+@ rules
+&a < u < v < w  &ov < x  &b < v
+* compare
+<1 oa
+<1 ou
+<1 x    # CE(o) followed by CE between u and w
+<1 ow
+<1 ob
+<1 ov
+
+** test: later rule does not affect earlier extension (1), ICU ticket 10105
+@ rules
+&a=x/b &v=b
+% strength=secondary
+* compare
+<1 B
+<1 c
+<1 v
+=  b
+* compare
+<1 AB
+=  x
+<1 ac
+<1 av
+=  ab
+
+** test: later rule does not affect earlier extension (2), ICU ticket 10105
+@ rules
+&a <<< c / e &g <<< e / l
+% strength=secondary
+* compare
+<1 AE
+=  c
+<2 æ
+<1 agl
+=  ae
+
+** test: later rule does not affect earlier extension (3), ICU ticket 10105
+@ rules
+&a = b / c  &d = c / e
+% strength=secondary
+* compare
+<1 AC  # C is still only tertiary different from the original c
+=  b
+<1 ade
+=  ac
+
+** test: extension contains tailored character, ICU ticket 10105
+@ rules
+&a=e &b=u/e
+* compare
+<1 a
+=  e
+<1 ba
+=  be
+=  u
+
+** test: add simple mappings for characters with root context
+@ rules
+&z=·    # middle dot has a prefix mapping in the CLDR root
+&n=и    # и (U+0438) has contractions in the root
+* compare
+<1 l
+<2 l·   # root mapping for l|· still works
+<1 z
+=  ·
+* compare
+<1 n
+=  и
+<1 И
+<1 и\u0306  # root mapping for й=и\u0306 still works
+=  й
+<3 Й
+
+** test: add context mappings around characters with root context
+@ rules
+&z=·h   # middle dot has a prefix mapping in the CLDR root
+&n=ә|и  # и (U+0438) has contractions in the root
+* compare
+<1 l
+<2 l·   # root mapping for l|· still works
+<1 z
+=  ·h
+* compare
+<1 и
+<3 И
+<1 и\u0306  # root mapping for й=и\u0306 still works
+=  й
+* compare
+<1 әn
+=  әи
+<1 әo
+
+** test: many secondary CEs at the top of their range
+@ rules
+&[last primary ignorable]<<*\u2801-\u28ff
+* compare
+<2 \u0308
+<2 \u2801
+<2 \u2802
+<2 \u2803
+<2 \u2804
+<2 \u28fd
+<2 \u28fe
+<2 \u28ff
+<1 \x20
+
+** test: many tertiary CEs at the top of their range
+@ rules
+&[last secondary ignorable]<<<*a-z
+* compare
+<3 a
+<3 b
+<3 c
+<3 d
+# e..w
+<3 x
+<3 y
+<3 z
+<2 \u0308
+
+** test: tailor contraction together with nearly equivalent prefix, ICU ticket 10101
+@ rules
+&a=p|x &b=px &c=op
+* compare
+<1 b
+=  px
+<3 B
+<1 c
+=  op
+<3 C
+* compare
+<1 ca
+=  opx  # first contraction op, then prefix p|x
+<3 cA
+<3 Ca
+
+** test: reset position with prefix (pre-context), ICU ticket 10102
+@ rules
+&a=p|x &px=y
+* compare
+<1 pa
+=  px
+=  y
+<3 pA
+<1 q
+<1 x
+
+** test: prefix+contraction together (1), ICU ticket 10071
+@ rules
+&x=a|bc
+* compare
+<1 ab
+<1 Abc
+<1 abd
+<1 ac
+<1 aw
+<1 ax
+=  abc
+<3 aX
+<3 Ax
+<1 b
+<1 bb
+<1 bc
+<3 bC
+<3 Bc
+<1 bd
+
+** test: prefix+contraction together (2), ICU ticket 10071
+@ rules
+&w=bc &x=a|b
+* compare
+<1 w
+=  bc
+<3 W
+* compare
+<1 aw
+<1 ax
+=  ab
+<3 aX
+<1 axb
+<1 axc
+=  abc  # prefix match a|b takes precedence over contraction match bc
+<3 abC
+<1 abd
+<1 ay
+
+** test: prefix+contraction together (3), ICU ticket 10071
+@ rules
+&x=a|b &w=bc    # reverse order of rules as previous test, order should not matter here
+* compare       # same "compare" sequences as previous test
+<1 w
+=  bc
+<3 W
+* compare
+<1 aw
+<1 ax
+=  ab
+<3 aX
+<1 axb
+<1 axc
+=  abc  # prefix match a|b takes precedence over contraction match bc
+<3 abC
+<1 abd
+<1 ay
+
+** test: no mapping p|c, falls back to contraction ch, CLDR ticket 5962
+@ rules
+&d=ch &v=p|ci
+* compare
+<1 pc
+<3 pC
+<1 pcH
+<1 pcI
+<1 pd
+=  pch  # no-prefix contraction ch matches
+<3 pD
+<1 pv
+=  pci  # prefix+contraction p|ci matches
+<3 pV
+
+** test: tailor in & around compact ranges of root primaries
+# The Ogham characters U+1681..U+169A are in simple ascending order of primary CEs
+# which should be reliably encoded as one range in the root elements data.
+@ rules
+&[before 1]ᚁ<a
+&ᚁ<b
+&[before 1]ᚂ<c
+&ᚂ<d
+&[before 1]ᚚ<y
+&ᚚ<z
+&[before 2]ᚁ<<r
+&ᚁ<<s
+&[before 3]ᚚ<<<t
+&ᚚ<<<u
+* compare
+<1 ᣵ    # U+18F5 last Canadian Aboriginal
+<1 a
+<1 r
+<2 ᚁ
+<2 s
+<1 b
+<1 c
+<1 ᚂ
+<1 d
+<1 ᚃ
+<1 ᚙ
+<1 y
+<1 t
+<3 ᚚ
+<3 u
+<1 z
+<1 ᚠ    # U+16A0 first Runic
+
+** test: suppressContractions
+@ rules
+&z<ch<әж [suppressContractions [·cә]]
+* compare
+<1 ch
+<3 cH   # ch was suppressed
+<1 l
+<1 l·   # primary difference, not secondary, because l|· was suppressed
+<1 ә
+<2 ә\u0308  # secondary difference, not primary, because contractions for ә were suppressed
+<1 әж
+<3 әЖ
+
+** test: Hangul & Jamo
+@ rules
+&L=\u1100  # first Jamo L
+&V=\u1161  # first Jamo V
+&T=\u11A8  # first Jamo T
+&\uAC01<<*\u4E00-\u4EFF  # first Hangul LVT syllable & lots of secondary diffs
+* compare
+<1 Lv
+<3 LV
+=  \u1100\u1161
+=  \uAC00
+<1 LVt
+<3 LVT
+=  \u1100\u1161\u11A8
+=  \uAC00\u11A8
+=  \uAC01
+<2 LVT\u0308
+<2 \u4E00
+<2 \u4E01
+<2 \u4E80
+<2 \u4EFF
+<2 LV\u0308T
+<1 \uAC02
+
+** test: adjust special reset positions according to previous rules, CLDR ticket 6070
+@ rules
+&[last variable]<x
+[maxVariable space]  # has effect only after building, no effect on following rules
+&[last variable]<y
+&[before 1][first regular]<z
+* compare
+<1 ?  # some punctuation
+<1 x
+<1 y
+<1 z
+<1 $  # some symbol
+
+@ rules
+&[last primary ignorable]<<x<<<y
+&[last primary ignorable]<<z
+* compare
+<2 \u0358
+<2 x
+<3 y
+<2 z
+<1 \x20
+
+@ rules
+&[last secondary ignorable]<<<x
+&[last secondary ignorable]<<<y
+* compare
+<3 x
+<3 y
+<2 \u0358
+
+@ rules
+&[before 2][first variable]<<z
+&[before 2][first variable]<<y
+&[before 3][first variable]<<<x
+&[before 3][first variable]<<<w
+&[before 1][first variable]<v
+&[before 2][first variable]<<u
+&[before 3][first variable]<<<t
+&[before 2]\uFDD1\xA0<<s  # FractionalUCA.txt: FDD1 00A0, SPACE first primary
+* compare
+<2 \u0358
+<1 s
+<2 \uFDD1\xA0
+<1 t
+<3 u
+<2 v
+<1 w
+<3 x
+<3 y
+<2 z
+<2 \t
+
+@ rules
+&[before 2][first regular]<<z
+&[before 3][first regular]<<<y
+&[before 1][first regular]<x
+&[before 3][first regular]<<<w
+&[before 2]\uFDD1\u263A<<v  # FractionalUCA.txt: FDD1 263A, SYMBOL first primary
+&[before 3][first regular]<<<u
+&[before 1][first regular]<p  # primary before the boundary: becomes variable
+&[before 3][first regular]<<<t  # not affected by p
+&[last variable]<q              # after p!
+* compare
+<1 ?
+<1 p
+<1 q
+<1 t
+<3 u
+<3 v
+<1 w
+<3 x
+<1 y
+<3 z
+<1 $
+
+# check that p & q are indeed variable
+% alternate=shifted
+* compare
+=  ?
+=  p
+=  q
+<1 t
+<3 u
+<3 v
+<1 w
+<3 x
+<1 y
+<3 z
+<1 $
+
+@ rules
+&[before 2][first trailing]<<z
+&[before 1][first trailing]<y
+&[before 3][first trailing]<<<x
+* compare
+<1 \u4E00  # first Han, first implicit
+<1 \uFDD1\uFDD0  # FractionalUCA.txt: unassigned first primary
+# Note: The root collator currently does not map any characters to the trailing first boundary primary.
+<1 x
+<3 y
+<1 z
+<2 \uFFFD  # The root collator currently maps U+FFFD to the first real trailing primary.
+
+@ rules
+&[before 2][first primary ignorable]<<z
+&[before 2][first primary ignorable]<<y
+&[before 3][first primary ignorable]<<<x
+&[before 3][first primary ignorable]<<<w
+* compare
+=  \x01
+<2 w
+<3 x
+<3 y
+<2 z
+<2 \u0301
+
+@ rules
+&[before 3][first secondary ignorable]<<<y
+&[before 3][first secondary ignorable]<<<x
+* compare
+=  \x01
+<3 x
+<3 y
+<2 \u0301
+
+** test: canonical closure
+@ rules
+&X=A &U=Â
+* compare
+<1 U
+=  Â
+=  A\u0302
+<2 Ú  # U with acute
+=  U\u0301
+=  Ấ  # A with circumflex & acute
+=  Â\u0301
+=  A\u0302\u0301
+<1 X
+=  A
+<2 X\u030A  # with ring above
+=  Å
+=  A\u030A
+=  \u212B  # Angstrom sign
+
+@ rules
+&x=\u5140\u55C0
+* compare
+<1 x
+=  \u5140\u55C0
+=  \u5140\uFA0D
+=  \uFA0C\u55C0
+=  \uFA0C\uFA0D  # CJK compatibility characters
+<3 X
+
+# canonical closure on prefix rules, ICU ticket 9444
+@ rules
+&x=ä|ŝ
+* compare
+<1 äs  # not tailored
+<1 äx
+=  äŝ
+=  a\u0308s\u0302
+=  a\u0308ŝ
+=  äs\u0302
+<3 äX
+
+** test: conjoining Jamo map to expansions
+@ rules
+&gg=\u1101  # Jamo Lead consonant GG
+&nj=\u11AC  # Jamo Trail consonant NJ
+* compare
+<1 gg\u1161nj
+=  \u1101\u1161\u11AC
+=  \uAE4C\u11AC
+=  \uAE51
+<3 gg\u1161nJ
+<1 \u1100\u1100
+
+** test: canonical tail closure, ICU ticket 5913
+@ rules
+&a<â
+* compare
+<1 a
+<1 â              # tailored
+=  a\u0302
+<2 a\u0323\u0302  # discontiguous contraction
+=  ạ\u0302        # equivalent
+=  ậ              # equivalent
+<1 b
+
+@ rules
+&a<ạ
+* compare
+<1 a
+<1 ạ              # tailored
+=  a\u0323
+<2 a\u0323\u0302  # contiguous contraction plus extra diacritic
+=  ạ\u0302        # equivalent
+=  ậ              # equivalent
+<1 b
+
+# Tail closure should work even if there is a prefix and/or contraction.
+@ rules
+&a<\u5140|câ
+# In order to find discontiguous contractions for \u5140|câ
+# there must exist a mapping for \u5140|ca, regardless of what it maps to.
+# (This follows from the UCA spec.)
+&x=\u5140|ca
+* compare
+<1 \u5140a
+=  \uFA0Ca
+<1 \u5140câ              # tailored
+=  \uFA0Ccâ
+=  \u5140ca\u0302
+=  \uFA0Cca\u0302
+<2 \u5140ca\u0323\u0302  # discontiguous contraction
+=  \uFA0Cca\u0323\u0302
+=  \u5140cạ\u0302
+=  \uFA0Ccạ\u0302
+=  \u5140cậ
+=  \uFA0Ccậ
+<1 \u5140b
+=  \uFA0Cb
+<1 \u5140x
+=  \u5140ca
+
+# Double-check that without the extra mapping there will be no discontiguous match.
+@ rules
+&a<\u5140|câ
+* compare
+<1 \u5140a
+=  \uFA0Ca
+<1 \u5140câ              # tailored
+=  \uFA0Ccâ
+=  \u5140ca\u0302
+=  \uFA0Cca\u0302
+<1 \u5140b
+=  \uFA0Cb
+<1 \u5140ca\u0323\u0302  # no discontiguous contraction
+=  \uFA0Cca\u0323\u0302
+=  \u5140cạ\u0302
+=  \uFA0Ccạ\u0302
+=  \u5140cậ
+=  \uFA0Ccậ
+
+@ rules
+&a<cạ
+* compare
+<1 a
+<1 cạ              # tailored
+=  ca\u0323
+<2 ca\u0323\u0302  # contiguous contraction plus extra diacritic
+=  cạ\u0302        # equivalent
+=  cậ              # equivalent
+<1 b
+
+# ᾢ = U+1FA2 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+#   = 03C9 0313 0300 0345
+# ccc = 0, 230, 230, 240
+@ rules
+&δ=αῳ
+# In order to find discontiguous contractions for αῳ
+# there must exist a mapping for αω, regardless of what it maps to.
+# (This follows from the UCA spec.)
+&ε=αω
+* compare
+<1 δ
+=  αῳ
+=  αω\u0345
+<2 αω\u0313\u0300\u0345  # discontiguous contraction
+=  αὠ\u0300\u0345
+=  αὢ\u0345
+=  αᾢ
+<2 αω\u0300\u0313\u0345
+=  αὼ\u0313\u0345
+=  αῲ\u0313  # not FCD
+<1 ε
+=  αω
+
+# Double-check that without the extra mapping there will be no discontiguous match.
+@ rules
+&δ=αῳ
+* compare
+<1 αω\u0313\u0300\u0345  # no discontiguous contraction
+=  αὠ\u0300\u0345
+=  αὢ\u0345
+=  αᾢ
+<2 αω\u0300\u0313\u0345
+=  αὼ\u0313\u0345
+=  αῲ\u0313  # not FCD
+<1 δ
+=  αῳ
+=  αω\u0345
+
+# Add U+0315 COMBINING COMMA ABOVE RIGHT which has ccc=232.
+# Tests code paths where the tailored string has a combining mark
+# that does not occur in any composite's decomposition.
+@ rules
+&δ=αὼ\u0315
+* compare
+<1 αω\u0313\u0300\u0315  # Not tailored: The grave accent blocks the comma above.
+=  αὠ\u0300\u0315
+=  αὢ\u0315
+<1 δ
+=  αὼ\u0315
+=  αω\u0300\u0315
+<2 αω\u0300\u0315\u0345
+=  αὼ\u0315\u0345
+=  αῲ\u0315  # not FCD
+
+** test: danish a+a vs. a-umlaut, ICU ticket 9319
+@ rules
+&z<aa
+* compare
+<1 z
+<1 aa
+<2 aa\u0308
+=  aä
+
+** test: Jamo L with and in prefix
+# Useful for the Korean "searchjl" tailoring (instead of contractions of pairs of Jamo L).
+@ rules
+# Jamo Lead consonant G after G or GG
+&[last primary ignorable]<<\u1100|\u1100=\u1101|\u1100
+# Jamo Lead consonant GG sorts like G+G
+&\u1100\u1100=\u1101
+# Note: Making G|GG and GG|GG sort the same as G|G+G
+# would require the ability to reset on G|G+G,
+# or we could make G-after-G equal to some secondary-CE character,
+# and reset on a pair of those.
+# (It does not matter much if there are at most two G in a row in real text.)
+* compare
+<1 \u1100
+<2 \u1100\u1100  # only one primary from a sequence of G lead consonants
+=  \u1101
+<2 \u1100\u1100\u1100
+=  \u1101\u1100
+# but not = \u1100\u1101, see above
+<1 \u1100\u1161
+=  \uAC00
+<2 \u1100\u1100\u1161
+=  \u1100\uAC00  # prefix match from the L of the LV syllable
+=  \u1101\u1161
+=  \uAE4C
+
+** test: proposed Korean "searchjl" tailoring with prefixes, CLDR ticket 6546
+@ rules
+# Low secondary CEs for Jamo V & T.
+# Note: T should sort before V for proper syllable order.
+&\u0332  # COMBINING LOW LINE (first primary ignorable)
+<<\u1161<<\u1162
+
+# Korean Jamo lead consonant search rules, part 2:
+# Make modern compound L jamo primary equivalent to non-compound forms.
+
+# Secondary CEs for Jamo L-after-L, greater than Jamo V & T.
+&\u0313  # COMBINING COMMA ABOVE (second primary ignorable)
+=\u1100|\u1100
+=\u1103|\u1103
+=\u1107|\u1107
+=\u1109|\u1109
+=\u110C|\u110C
+
+# Compound L Jamo map to equivalent expansions of primary+secondary CE.
+&\u1100\u0313=\u1101<<<\u3132  # HANGUL CHOSEONG SSANGKIYEOK, HANGUL LETTER SSANGKIYEOK
+&\u1103\u0313=\u1104<<<\u3138  # HANGUL CHOSEONG SSANGTIKEUT, HANGUL LETTER SSANGTIKEUT
+&\u1107\u0313=\u1108<<<\u3143  # HANGUL CHOSEONG SSANGPIEUP, HANGUL LETTER SSANGPIEUP
+&\u1109\u0313=\u110A<<<\u3146  # HANGUL CHOSEONG SSANGSIOS, HANGUL LETTER SSANGSIOS
+&\u110C\u0313=\u110D<<<\u3149  # HANGUL CHOSEONG SSANGCIEUC, HANGUL LETTER SSANGCIEUC
+
+* compare
+<1 \u1100\u1161
+=  \uAC00
+<2 \u1100\u1162
+=  \uAC1C
+<2 \u1100\u1100\u1161
+=  \u1100\uAC00
+=  \u1101\u1161
+=  \uAE4C
+<3 \u3132\u1161
+
+** test: Hangul syllables in prefix & in the interior of a contraction
+@ rules
+&x=\u1100\u1161|a\u1102\u1162z
+* compare
+<1 \u1100\u1161x
+=  \u1100\u1161a\u1102\u1162z
+=  \u1100\u1161a\uB0B4z
+=  \uAC00a\u1102\u1162z
+=  \uAC00a\uB0B4z
+
+** test: digits are unsafe-backwards when numeric=on
+@ root
+% numeric=on
+* compare
+# If digits are not unsafe, then numeric collation sees "1"=="01" and "b">"a".
+# We need to back up before the identical prefix "1" and compare the full numbers.
+<1 11b
+<1 101a
+
+** test: simple locale data test
+@ locale de
+* compare
+<1 a
+<2 ä
+<1 ae
+<2 æ
+
+@ locale de-u-co-phonebk
+* compare
+<1 a
+<1 ae
+<2 ä
+<2 æ
+
+# The following test cases were moved here from ICU 52's DataDrivenCollationTest.txt.
+
+** test: DataDrivenCollationTest/TestMorePinyin
+# Testing the primary strength.
+@ locale zh
+% strength=primary
+* compare
+< lā
+= lĀ
+= Lā
+= LĀ
+< lān
+= lĀn
+< lē
+= lĒ
+= Lē
+= LĒ
+< lēn
+= lĒn
+
+** test: DataDrivenCollationTest/TestLithuanian
+# Lithuanian sort order.
+@ locale lt
+* compare
+< cz
+< č
+< d
+< iz
+< j
+< sz
+< š
+< t
+< zz
+< ž
+
+** test: DataDrivenCollationTest/TestLatvian
+# Latvian sort order.
+@ locale lv
+* compare
+< cz
+< č
+< d
+< gz
+< ģ
+< h
+< iz
+< j
+< kz
+< ķ
+< l
+< lz
+< ļ
+< m
+< nz
+< ņ
+< o
+< rz
+< ŗ
+< s
+< sz
+< š
+< t
+< zz
+< ž
+
+** test: DataDrivenCollationTest/TestEstonian
+# Estonian sort order.
+@ locale et
+* compare
+< sy
+< š
+< šy
+< z
+< zy
+< ž
+< v
+< w
+< va
+< õ
+< õy
+< ä
+< äy
+< ö
+< öy
+< ü
+< üy
+< x
+
+** test: DataDrivenCollationTest/TestAlbanian
+# Albanian sort order.
+@ locale sq
+* compare
+< cz
+< ç
+< d
+< dz
+< dh
+< e
+< ez
+< ë
+< f
+< gz
+< gj
+< h
+< lz
+< ll
+< m
+< nz
+< nj
+< o
+< rz
+< rr
+< s
+< sz
+< sh
+< t
+< tz
+< th
+< u
+< xz
+< xh
+< y
+< zz
+< zh
+
+** test: DataDrivenCollationTest/TestSimplifiedChineseOrder
+# Sorted file has different order.
+@ root
+# normalization=on turned on & off automatically.
+* compare
+< \u5F20
+< \u5F20\u4E00\u8E3F
+
+** test: DataDrivenCollationTest/TestTibetanNormalizedIterativeCrash
+# This pretty much crashes.
+@ root
+* compare
+< \u0f71\u0f72\u0f80\u0f71\u0f72
+< \u0f80
+
+** test: DataDrivenCollationTest/TestThaiPartialSortKeyProblems
+# These are examples of strings that caused trouble in partial sort key testing.
+@ locale th-TH
+* compare
+< \u0E01\u0E01\u0E38\u0E18\u0E20\u0E31\u0E13\u0E11\u0E4C
+< \u0E01\u0E01\u0E38\u0E2A\u0E31\u0E19\u0E42\u0E18
+* compare
+< \u0E01\u0E07\u0E01\u0E32\u0E23
+< \u0E01\u0E07\u0E42\u0E01\u0E49
+* compare
+< \u0E01\u0E23\u0E19\u0E17\u0E32
+< \u0E01\u0E23\u0E19\u0E19\u0E40\u0E0A\u0E49\u0E32
+* compare
+< \u0E01\u0E23\u0E30\u0E40\u0E08\u0E35\u0E22\u0E27
+< \u0E01\u0E23\u0E30\u0E40\u0E08\u0E35\u0E4A\u0E22\u0E27
+* compare
+< \u0E01\u0E23\u0E23\u0E40\u0E0A\u0E2D
+< \u0E01\u0E23\u0E23\u0E40\u0E0A\u0E49\u0E32
+
+** test: DataDrivenCollationTest/TestJavaStyleRule
+# java.text allows rules to start as '<<<x<<<y...'
+# we emulate this by assuming a &[first tertiary ignorable] in this case.
+@ rules
+&\u0001=equal<<<z<<x<<<w &[first tertiary ignorable]=a &[first primary ignorable]=b
+* compare
+= a
+= equal
+< z
+< x
+= b  # x had become the new first primary ignorable
+< w
+
+** test: DataDrivenCollationTest/TestShiftedIgnorable
+# The UCA states that primary ignorables should be completely
+# ignorable when following a shifted code point.
+@ root
+% alternate=shifted
+% strength=quaternary
+* compare
+< a\u0020b
+= a\u0020\u0300b
+= a\u0020\u0301b
+< a_b
+= a_\u0300b
+= a_\u0301b
+< A\u0020b
+= A\u0020\u0300b
+= A\u0020\u0301b
+< A_b
+= A_\u0300b
+= A_\u0301b
+< a\u0301b
+< A\u0301b
+< a\u0300b
+< A\u0300b
+
+** test: DataDrivenCollationTest/TestNShiftedIgnorable
+# The UCA states that primary ignorables should be completely
+# ignorable when following a shifted code point.
+@ root
+% alternate=non-ignorable
+% strength=tertiary
+* compare
+< a\u0020b
+< A\u0020b
+< a\u0020\u0301b
+< A\u0020\u0301b
+< a\u0020\u0300b
+< A\u0020\u0300b
+< a_b
+< A_b
+< a_\u0301b
+< A_\u0301b
+< a_\u0300b
+< A_\u0300b
+< a\u0301b
+< A\u0301b
+< a\u0300b
+< A\u0300b
+
+** test: DataDrivenCollationTest/TestSafeSurrogates
+# It turned out that surrogates were not skipped properly
+# when iterating backwards if they were in the middle of a
+# contraction. This test assures that this is fixed.
+@ rules
+&a < x\ud800\udc00b
+* compare
+< a
+< x\ud800\udc00b
+
+** test: DataDrivenCollationTest/da_TestPrimary
+# This test goes through primary strength cases
+@ locale da
+% strength=primary
+* compare
+< Lvi
+< Lwi
+* compare
+< L\u00e4vi
+< L\u00f6wi
+* compare
+< L\u00fcbeck
+= Lybeck
+
+** test: DataDrivenCollationTest/da_TestTertiary
+# This test goes through tertiary strength cases
+@ locale da
+% strength=tertiary
+* compare
+< Luc
+< luck
+* compare
+< luck
+< L\u00fcbeck
+* compare
+< lybeck
+< L\u00fcbeck
+* compare
+< L\u00e4vi
+< L\u00f6we
+* compare
+< L\u00f6ww
+< mast
+
+* compare
+< A/S
+< ANDRE
+< ANDR\u00c9
+< ANDREAS
+< AS
+< CA
+< \u00c7A
+< CB
+< \u00c7C
+< D.S.B.
+< DA
+< \u00d0A
+< DB
+< \u00d0C
+< DSB
+< DSC
+< EKSTRA_ARBEJDE
+< EKSTRABUD0
+< H\u00d8ST
+< HAAG
+< H\u00c5NDBOG
+< HAANDV\u00c6RKSBANKEN
+< Karl
+< karl
+< NIELS\u0020J\u00d8RGEN
+< NIELS-J\u00d8RGEN
+< NIELSEN
+< R\u00c9E,\u0020A
+< REE,\u0020B
+< R\u00c9E,\u0020L
+< REE,\u0020V
+< SCHYTT,\u0020B
+< SCHYTT,\u0020H
+< SCH\u00dcTT,\u0020H
+< SCHYTT,\u0020L
+< SCH\u00dcTT,\u0020M
+< SS
+< \u00df
+< SSA
+< STORE\u0020VILDMOSE
+< STOREK\u00c6R0
+< STORM\u0020PETERSEN
+< STORMLY
+< THORVALD
+< THORVARDUR
+< \u00feORVAR\u00d0UR
+< THYGESEN
+< VESTERG\u00c5RD,\u0020A
+< VESTERGAARD,\u0020A
+< VESTERG\u00c5RD,\u0020B
+< \u00c6BLE
+< \u00c4BLE
+< \u00d8BERG
+< \u00d6BERG
+
+* compare
+< andere
+< chaque
+< chemin
+< cote
+< cot\u00e9
+< c\u00f4te
+< c\u00f4t\u00e9
+< \u010du\u010d\u0113t
+< Czech
+< hi\u0161a
+< irdisch
+< lie
+< lire
+< llama
+< l\u00f5ug
+< l\u00f2za
+< lu\u010d
+< luck
+< L\u00fcbeck
+< lye
+< l\u00e4vi
+< L\u00f6wen
+< m\u00e0\u0161ta
+< m\u00eer
+< myndig
+< M\u00e4nner
+< m\u00f6chten
+< pi\u00f1a
+< pint
+< pylon
+< \u0161\u00e0ran
+< savoir
+< \u0160erb\u016bra
+< Sietla
+< \u015blub
+< subtle
+< symbol
+< s\u00e4mtlich
+< verkehrt
+< vox
+< v\u00e4ga
+< waffle
+< wood
+< yen
+< yuan
+< yucca
+< \u017eal
+< \u017eena
+< \u017den\u0113va
+< zoo0
+< Zviedrija
+< Z\u00fcrich
+< zysk0
+< \u00e4ndere
+
+** test: DataDrivenCollationTest/hi_TestNewRules
+# This test goes through new rules and tests against old rules
+@ locale hi
+* compare
+< कॐ
+< कं
+< कँ
+< कः
+
+** test: DataDrivenCollationTest/ro_TestNewRules
+# This test goes through new rules and tests against old rules
+@ locale ro
+* compare
+< xAx
+< xă
+< xĂ
+< Xă
+< XĂ
+< xăx
+< xĂx
+< xâ
+< xÂ
+< Xâ
+< XÂ
+< xâx
+< xÂx
+< xb
+< xIx
+< xî
+< xÎ
+< Xî
+< XÎ
+< xîx
+< xÎx
+< xj
+< xSx
+< xș
+= xş
+< xȘ
+= xŞ
+< Xș
+= Xş
+< XȘ
+= XŞ
+< xșx
+= xşx
+< xȘx
+= xŞx
+< xT
+< xTx
+< xț
+= xţ
+< xȚ
+= xŢ
+< Xț
+= Xţ
+< XȚ
+= XŢ
+< xțx
+= xţx
+< xȚx
+= xŢx
+< xU
+
+** test: DataDrivenCollationTest/testOffsets
+# This tests cases where forwards and backwards iteration get different offsets
+@ locale en
+% strength=tertiary
+* compare
+< a\uD800\uDC00\uDC00
+< b\uD800\uDC00\uDC00
+* compare
+< \u0301A\u0301\u0301
+< \u0301B\u0301\u0301
+* compare
+< abcd\r\u0301
+< abce\r\u0301
+# TODO: test offsets in new CollationTest
+
+# End of test cases moved here from ICU 52's DataDrivenCollationTest.txt.
+
+** test: was ICU 52 cmsccoll/TestRedundantRules
+@ rules
+& a < b < c < d& [before 1] c < m
+* compare
+<1 a
+<1 b
+<1 m
+<1 c
+<1 d
+
+@ rules
+& a < b <<< c << d <<< e& [before 3] e <<< x
+* compare
+<1 a
+<1 b
+<3 c
+<2 d
+<3 x
+<3 e
+
+@ rules
+& a < b <<< c << d <<< e <<< f < g& [before 1] g < x
+* compare
+<1 a
+<1 b
+<3 c
+<2 d
+<3 e
+<3 f
+<1 x
+<1 g
+
+@ rules
+& a <<< b << c < d& a < m
+* compare
+<1 a
+<3 b
+<2 c
+<1 m
+<1 d
+
+@ rules
+&a<b<<b\u0301 &z<b
+* compare
+<1 a
+<1 b\u0301
+<1 z
+<1 b
+
+@ rules
+&z<m<<<q<<<m
+* compare
+<1 z
+<1 q
+<3 m
+
+@ rules
+&z<<<m<q<<<m
+* compare
+<1 z
+<1 q
+<3 m
+
+@ rules
+& a < b < c < d& r < c
+* compare
+<1 a
+<1 b
+<1 d
+<1 r
+<1 c
+
+@ rules
+& a < b < c < d& c < m
+* compare
+<1 a
+<1 b
+<1 c
+<1 m
+<1 d
+
+@ rules
+& a < b < c < d& a < m
+* compare
+<1 a
+<1 m
+<1 b
+<1 c
+<1 d
+
+** test: was ICU 52 cmsccoll/TestExpansionSyntax
+# The following two rules should sort the particular list of strings the same.
+@ rules
+&AE <<< a << b <<< c &d <<< f
+* compare
+<1 AE
+<3 a
+<2 b
+<3 c
+<1 d
+<3 f
+
+@ rules
+&A <<< a / E << b / E <<< c /E  &d <<< f
+* compare
+<1 AE
+<3 a
+<2 b
+<3 c
+<1 d
+<3 f
+
+# The following two rules should sort the particular list of strings the same.
+@ rules
+&AE <<< a <<< b << c << d < e < f <<< g
+* compare
+<1 AE
+<3 a
+<3 b
+<2 c
+<2 d
+<1 e
+<1 f
+<3 g
+
+@ rules
+&A <<< a / E <<< b / E << c / E << d / E < e < f <<< g
+* compare
+<1 AE
+<3 a
+<3 b
+<2 c
+<2 d
+<1 e
+<1 f
+<3 g
+
+# The following two rules should sort the particular list of strings the same.
+@ rules
+&AE <<< B <<< C / D <<< F
+* compare
+<1 AE
+<3 B
+<3 F
+<1 AED
+<3 C
+
+@ rules
+&A <<< B / E <<< C / ED <<< F / E
+* compare
+<1 AE
+<3 B
+<3 F
+<1 AED
+<3 C
+
+** test: never reorder trailing primaries
+@ root
+% reorder Zzzz Grek
+* compare
+<1 L
+<1 字
+<1 Ω
+<1 \uFFFD
+<1 \uFFFF
+
+** test: fall back to mappings with shorter prefixes, not immediately to ones with no prefixes
+@ rules
+&u=ab|cd
+&v=b|ce
+* compare
+<1 abc
+<1 abcc
+<1 abcf
+<1 abcd
+=  abu
+<1 abce
+=  abv
+
+# With the following rules, there is only one prefix per composite ĉ or ç,
+# but both prefixes apply to just c in NFD form.
+# We would get different results for composed vs. NFD input
+# if we fell back directly from longest-prefix mappings to no-prefix mappings.
+@ rules
+&x=op|ĉ
+&y=p|ç
+* compare
+<1 opc
+<2 opć
+<1 opcz
+<1 opd
+<1 opĉ
+=  opc\u0302
+=  opx
+<1 opç
+=  opc\u0327
+=  opy
+
+# The mapping is used which has the longest matching prefix for which
+# there is also a suffix match, with the longest suffix match among several for that prefix.
+@ rules
+&❶=d
+&❷=de
+&❸=def
+&①=c|d
+&②=c|de
+&③=c|def
+&④=bc|d
+&⑤=bc|de
+&⑥=bc|def
+&⑦=abc|d
+&⑧=abc|de
+&⑨=abc|def
+* compare
+<1 9aadzz
+=  9aa❶zz
+<1 9aadez
+=  9aa❷z
+<1 9aadef
+=  9aa❸
+<1 9acdzz
+=  9ac①zz
+<1 9acdez
+=  9ac②z
+<1 9acdef
+=  9ac③
+<1 9bcdzz
+=  9bc④zz
+<1 9bcdez
+=  9bc⑤z
+<1 9bcdef
+=  9bc⑥
+<1 abcdzz
+=  abc⑦zz
+<1 abcdez
+=  abc⑧z
+<1 abcdef
+=  abc⑨
+
+** test: prefix + discontiguous contraction with missing prefix contraction
+# Unfortunate terminology: The first "prefix" here is the pre-context,
+# the second "prefix" refers to the contraction/relation string that is
+# one shorter than the one being tested.
+@ rules
+&x=p|e
+&y=p|ê
+&z=op|ê
+# No mapping for op|e:
+# Discontiguous contraction matching should not match op|ê in opệ
+# because it would have to skip the dot below and extend a match on op|e by the circumflex,
+# but there is no match on op|e.
+* compare
+<1 oPe
+<1 ope
+=  opx
+<1 opệ
+=  opy\u0323  # y not z
+<1 opê
+=  opz
+
+# We cannot test for fallback by whether the contraction default CE32
+# is for another contraction. With the following rules, there is no mapping for op|e,
+# and the fallback to prefix p has no contractions.
+@ rules
+&x=p|e
+&z=op|ê
+* compare
+<1 oPe
+<1 ope
+=  opx
+<2 opệ
+=  opx\u0323\u0302  # x not z
+<1 opê
+=  opz
+
+# One more variation: Fallback to the simple code point, no shorter non-empty prefix.
+@ rules
+&x=e
+&z=op|ê
+* compare
+<1 ope
+=  opx
+<3 oPe
+=  oPx
+<2 opệ
+=  opx\u0323\u0302  # x not z
+<1 opê
+=  opz
+
+** test: maxVariable via rules
+@ rules
+[maxVariable space][alternate shifted]
+* compare
+=  \u0020
+=  \u000A
+<1 .
+<1 °  # degree sign
+<1 $
+<1 0
+
+** test: maxVariable via setting
+@ root
+% maxVariable=currency
+% alternate=shifted
+* compare
+=  \u0020
+=  \u000A
+=  .
+=  °  # degree sign
+=  $
+<1 0
+
+** test: ICU4J CollationMiscTest/TestContractionClosure (ää)
+# This tests canonical closure, but it also tests that CollationFastLatin
+# bails out properly for contractions with combining marks.
+# For that we need pairs of strings that remain in the Latin fastpath
+# long enough, hence the extra "= b" lines.
+@ rules
+&b=\u00e4\u00e4
+* compare
+<1 b
+=  \u00e4\u00e4
+=  b
+=  a\u0308a\u0308
+=  b
+=  \u00e4a\u0308
+=  b
+=  a\u0308\u00e4
+
+** test: ICU4J CollationMiscTest/TestContractionClosure (Å)
+@ rules
+&b=\u00C5
+* compare
+<1 b
+=  \u00C5
+=  b
+=  A\u030A
+=  b
+=  \u212B
index d38a19ff995715b245653ac43296774cea71a371..1f3999bb424c0705ea08cd36b4f651b0fc93d57b 100644 (file)
@@ -1,5 +1,5 @@
 #**********************************************************************
-#* Copyright (C) 1999-2012, International Business Machines Corporation
+#* Copyright (C) 1999-2014, International Business Machines Corporation
 #* and others.  All Rights Reserved.
 #**********************************************************************
 #
@@ -28,7 +28,7 @@ ALL : "$(TESTDATAOUT)\testdata.dat"
 
 TEST_RES_FILES = $(TEST_RES_SOURCE:.txt=.res)
 
-"$(TESTDATAOUT)\testdata.dat" : $(TEST_RES_FILES) "$(TESTDATABLD)\casing.res" "$(TESTDATABLD)\conversion.res" "$(TESTDATABLD)\icuio.res" "$(TESTDATABLD)\mc.res" "$(TESTDATABLD)\structLocale.res" "$(TESTDATABLD)\root.res" "$(TESTDATABLD)\sh.res" "$(TESTDATABLD)\sh_YU.res"  "$(TESTDATABLD)\te.res" "$(TESTDATABLD)\te_IN.res" "$(TESTDATABLD)\te_IN_REVISED.res" "$(TESTDATABLD)\testaliases.res" "$(TESTDATABLD)\testtypes.res" "$(TESTDATABLD)\testempty.res" "$(TESTDATABLD)\iscii.res" "$(TESTDATABLD)\idna_rules.res" "$(TESTDATABLD)\DataDrivenCollationTest.res" "$(TESTDATABLD)\test.icu" "$(TESTDATABLD)\testtable32.res" "$(TESTDATABLD)\test1.cnv" "$(TESTDATABLD)\test1bmp.cnv" "$(TESTDATABLD)\test2.cnv" "$(TESTDATABLD)\test3.cnv" "$(TESTDATABLD)\test4.cnv" "$(TESTDATABLD)\test4x.cnv" "$(TESTDATABLD)\test5.cnv" "$(TESTDATABLD)\ibm9027.cnv" "$(TESTDATABLD)\nfscsi.spp" "$(TESTDATABLD)\nfscss.spp" "$(TESTDATABLD)\nfscis.spp" "$(TESTDATABLD)\nfsmxs.spp" "$(TESTDATABLD)\nfsmxp.spp" "$(TESTDATABLD)\testnorm.nrm"
+"$(TESTDATAOUT)\testdata.dat" : $(TEST_RES_FILES) "$(TESTDATABLD)\casing.res" "$(TESTDATABLD)\conversion.res" "$(TESTDATABLD)\icuio.res" "$(TESTDATABLD)\mc.res" "$(TESTDATABLD)\structLocale.res" "$(TESTDATABLD)\root.res" "$(TESTDATABLD)\sh.res" "$(TESTDATABLD)\sh_YU.res"  "$(TESTDATABLD)\te.res" "$(TESTDATABLD)\te_IN.res" "$(TESTDATABLD)\te_IN_REVISED.res" "$(TESTDATABLD)\testaliases.res" "$(TESTDATABLD)\testtypes.res" "$(TESTDATABLD)\testempty.res" "$(TESTDATABLD)\iscii.res" "$(TESTDATABLD)\idna_rules.res" "$(TESTDATABLD)\test.icu" "$(TESTDATABLD)\testtable32.res" "$(TESTDATABLD)\test1.cnv" "$(TESTDATABLD)\test1bmp.cnv" "$(TESTDATABLD)\test2.cnv" "$(TESTDATABLD)\test3.cnv" "$(TESTDATABLD)\test4.cnv" "$(TESTDATABLD)\test4x.cnv" "$(TESTDATABLD)\test5.cnv" "$(TESTDATABLD)\ibm9027.cnv" "$(TESTDATABLD)\nfscsi.spp" "$(TESTDATABLD)\nfscss.spp" "$(TESTDATABLD)\nfscis.spp" "$(TESTDATABLD)\nfsmxs.spp" "$(TESTDATABLD)\nfsmxp.spp" "$(TESTDATABLD)\testnorm.nrm"
        @echo Building test data
        @copy "$(TESTDATABLD)\te.res" "$(TESTDATAOUT)\$(TESTDT)\nam.typ"
        @copy "$(TESTDATA)\old_l_testtypes.res" "$(TESTDATABLD)"
index 8ba8d45593cd2db0a33b273ab6f9b1138cca27ed..ada751f021f85dd40ce47f1d54d1ff021a9702d2 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2007, International Business Machines Corporation and others.  All Rights Reserved.
+# Copyright (C) 2007-2014, International Business Machines Corporation and others.  All Rights Reserved.
 #
 # TEST_RES_SOURCE defines data driven tests and other resource files to be included with 
 # the testdata package. For ordinary resource bundles, they only need to be referenced here.
@@ -6,5 +6,5 @@
 # Not everything has been moved to this file yet, as this is a new facility.
 #
 
-TEST_RES_SOURCE=DataDrivenCollationTest.txt calendar.txt format.txt
+TEST_RES_SOURCE=calendar.txt format.txt
 
diff --git a/icu4c/source/tools/dumpce/Makefile.in b/icu4c/source/tools/dumpce/Makefile.in
deleted file mode 100644 (file)
index 81f6808..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-## Makefile.in for ICU - tools/dumpce
-## Copyright (c) 2001, International Business Machines Corporation and
-## others. All Rights Reserved.
-
-## Source directory information
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-
-top_builddir = ../..
-
-include $(top_builddir)/icudefs.mk
-
-## Build directory information
-subdir = tools/dumpce
-
-## Extra files to remove for 'make clean'
-CLEANFILES = *~ $(DEPS)
-
-## Target information
-TARGET = dumpce
-
-CPPFLAGS += -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/tools/toolutil
-LIBS = $(LIBICUI18N) $(LIBICUUC) $(LIBICUTOOLUTIL) $(DEFAULT_LIBS) $(LIB_M)
-
-OBJECTS = dumpce.o
-
-DEPS = $(OBJECTS:.o=.d)
-
-## List of phony targets
-.PHONY : all all-local install install-local clean clean-local \
-distclean distclean-local dist dist-local check check-local
-
-## Clear suffix list
-.SUFFIXES :
-
-## List of standard targets
-all: all-local
-install: install-local
-clean: clean-local
-distclean : distclean-local
-dist: dist-local
-check: all check-local
-
-all-local: $(TARGET)
-
-install-local:
-
-dist-local:
-
-clean-local:
-       test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
-       $(RMV) $(OBJECTS) $(TARGET)
-
-distclean-local: clean-local
-       $(RMV) Makefile
-
-check-local: all-local
-
-Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
-       cd $(top_builddir) \
-        && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-$(TARGET) : $(OBJECTS)
-       $(LINK.cc) -o $@ $^ $(LIBS)
-       $(POST_BUILD_STEP)
-
-invoke:
-       ICU_DATA=$${ICU_DATA:-$(top_builddir)/data/} TZ=PST8PDT $(INVOKE) $(INVOCATION)
-
-ifeq (,$(MAKECMDGOALS))
--include $(DEPS)
-else
-ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),)
--include $(DEPS)
-endif
-endif
diff --git a/icu4c/source/tools/dumpce/dumpce.cpp b/icu4c/source/tools/dumpce/dumpce.cpp
deleted file mode 100644 (file)
index 0917ce7..0000000
+++ /dev/null
@@ -1,1597 +0,0 @@
-/********************************************************************
- * COPYRIGHT:
- * Copyright (C) 2001-2011 IBM, Inc.   All Rights Reserved.
- *
- ********************************************************************/
-/********************************************************************************
-*
-* File dumpce.cpp
-*
-* Modification History:
-* Name          Date           Description
-* synwee        May 31 2001    Creation
-*
-*********************************************************************************
-*/
-
-/**
-* This program outputs the collation elements used for a requested tailoring.
-*
-* Usage:
-*     dumpce options... please check main function.
-*/
-#include <unicode/utypes.h>
-#include <unicode/ucol.h>
-#include <unicode/uloc.h>
-#include <unicode/ucoleitr.h>
-#include <unicode/uchar.h>
-#include <unicode/uscript.h>
-#include <unicode/utf16.h>
-#include <unicode/putil.h>
-#include <unicode/ustring.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include "ucol_tok.h"
-#include "cstring.h"
-#include "uoptions.h"
-#include "ucol_imp.h"
-#include <unicode/ures.h>
-#include <unicode/uniset.h>
-#include <unicode/usetiter.h>
-
-/**
-* Command line option variables. 
-* These global variables are set according to the options specified on the 
-* command line by the user.
-*/
-static UOption options[]={
-    /* 00 */ UOPTION_HELP_H, 
-    /* 01 */ UOPTION_HELP_QUESTION_MARK,
-    /* 02 */ {"locale",        NULL, NULL, NULL, 'l', UOPT_REQUIRES_ARG, 0},
-    /* 03 */ {"serialize",     NULL, NULL, NULL, 'z', UOPT_NO_ARG, 0},
-       /* 04 */ UOPTION_DESTDIR,
-    /* 05 */ UOPTION_SOURCEDIR,
-    /* 06 */ {"attribute",     NULL, NULL, NULL, 'a', UOPT_REQUIRES_ARG, 0},
-    /* 07 */ {"rule",          NULL, NULL, NULL, 'r', UOPT_REQUIRES_ARG, 0},
-    /* 08 */ {"normalization", NULL, NULL, NULL, 'n', UOPT_REQUIRES_ARG, 0},
-    /* 09 */ {"scripts",       NULL, NULL, NULL, 't', UOPT_NO_ARG, 0},
-    /* 10 */ {"reducehan",     NULL, NULL, NULL, 'e', UOPT_NO_ARG, 0},
-       /* 11 */ UOPTION_VERBOSE,
-    /* 12 */ {"wholescripts",      NULL, NULL, NULL, 'W', UOPT_NO_ARG, 0}
-};
-
-/**
-* Collator used in this program
-*/
-static UCollator *COLLATOR_;
-/**
-* Output strea, used in this program
-*/
-static FILE *OUTPUT_;
-
-static UColAttributeValue ATTRIBUTE_[UCOL_ATTRIBUTE_COUNT] = {
-    UCOL_DEFAULT, UCOL_DEFAULT, UCOL_DEFAULT, UCOL_DEFAULT, UCOL_DEFAULT, 
-    UCOL_DEFAULT, UCOL_DEFAULT, UCOL_DEFAULT,
-};
-
-typedef struct {
-    int   value;
-    char *name;
-} EnumNameValuePair;
-
-static const EnumNameValuePair ATTRIBUTE_NAME_[] = {
-    {UCOL_FRENCH_COLLATION, "UCOL_FRENCH_COLLATION"},
-    {UCOL_ALTERNATE_HANDLING, "UCOL_ALTERNATE_HANDLING"}, 
-    {UCOL_CASE_FIRST, "UCOL_CASE_FIRST"}, 
-    {UCOL_CASE_LEVEL, "UCOL_CASE_LEVEL"}, 
-    {UCOL_NORMALIZATION_MODE, 
-        "UCOL_NORMALIZATION_MODE|UCOL_DECOMPOSITION_MODE"},
-    {UCOL_STRENGTH, "UCOL_STRENGTH"},
-       {UCOL_HIRAGANA_QUATERNARY_MODE, "UCOL_HIRAGANA_QUATERNARY_MODE"},
-    {UCOL_NUMERIC_COLLATION, "UCOL_NUMERIC_COLLATION"},
-    NULL
-};
-     
-static const EnumNameValuePair ATTRIBUTE_VALUE_[] = {
-    {UCOL_PRIMARY, "UCOL_PRIMARY"},
-    {UCOL_SECONDARY, "UCOL_SECONDARY"},
-    {UCOL_TERTIARY, "UCOL_TERTIARY|UCOL_DEFAULT_STRENGTH"},
-    {UCOL_QUATERNARY, "UCOL_QUATERNARY"},
-    {UCOL_IDENTICAL, "UCOL_IDENTICAL"},
-    {UCOL_OFF, "UCOL_OFF"},
-    {UCOL_ON, "UCOL_ON"},
-    {UCOL_SHIFTED, "UCOL_SHIFTED"},
-    {UCOL_NON_IGNORABLE, "UCOL_NON_IGNORABLE"},
-    {UCOL_LOWER_FIRST, "UCOL_LOWER_FIRST"},
-    {UCOL_UPPER_FIRST, "UCOL_UPPER_FIRST"},
-    NULL
-};
-
-typedef struct {
-    UChar ch[32];
-    int   count; // number of codepoint
-    UBool tailored;
-} ScriptElement;
-
-/**
-* Writes the hexadecimal of a null-terminated array of codepoints into a 
-* file
-* @param f UFILE instance to store
-* @param c codepoints array
-*/
-void serialize(FILE *f, const UChar *c) 
-{
-    UChar cp = *(c ++);
-    
-    fprintf(f, " %04x", cp);
-   
-    while (*c != 0) {
-        cp = *(c ++);
-        fprintf(f, " %04x", cp);
-    }
-}
-
-/**
-* Writes the hexadecimal of a non-null-terminated array of codepoints into a 
-* file
-* @param f UFILE instance to store
-* @param c codepoints array
-* @param l codepoints array length
-*/
-void serialize(FILE *f, const UChar *c, int l) 
-{
-    int   count = 1;
-    UChar cp    = *(c ++);
-    
-    fprintf(f, " %04x", cp);
-   
-    while (count < l) {
-        cp = *(c ++);
-        fprintf(f, " %04x", cp);
-        count ++;
-    }
-}
-
-/**
-* Sets the iterator to the argument string and outputs the collation elements.
-* @param f file output stream
-* @param iter collation element iterator
-*/
-void serialize(FILE *f, UCollationElements *iter) {
-    const UChar   *codepoint = iter->iteratordata_.string;
-    // unlikely that sortkeys will be over this size 
-    uint8_t  sortkey[64];
-    uint8_t *psortkey = sortkey;
-    int      sortkeylength = 0;
-
-    if (iter->iteratordata_.flags & UCOL_ITER_HASLEN) {
-        serialize(f, codepoint, iter->iteratordata_.endp - codepoint);
-        sortkeylength = ucol_getSortKey(iter->iteratordata_.coll, codepoint, 
-                        iter->iteratordata_.endp - codepoint, sortkey, 64);
-    }
-    else {
-        serialize(f, codepoint);
-        sortkeylength = ucol_getSortKey(iter->iteratordata_.coll, codepoint, 
-                                        -1, sortkey, 64);
-    }
-    if (options[11].doesOccur) {
-        serialize(stdout, codepoint);
-        fprintf(stdout, "\n");
-    }
-
-    fprintf(f, "; ");
-
-    UErrorCode error = U_ZERO_ERROR;
-    uint32_t ce = ucol_next(iter, &error);
-    if (U_FAILURE(error)) {
-        fprintf(f, "Error retrieving collation elements\n");
-        return;
-    }
-    
-    while (TRUE) {
-        fprintf(f, "[");
-        if (UCOL_PRIMARYORDER(ce) != 0) {
-            fprintf(f, "%04x", UCOL_PRIMARYORDER(ce));
-        }
-        fprintf(f, ",");
-        if (UCOL_SECONDARYORDER(ce) != 0) {
-            fprintf(f, " %02x", UCOL_SECONDARYORDER(ce));
-        }
-        fprintf(f, ",");
-        if (UCOL_TERTIARYORDER(ce) != 0) {
-            fprintf(f, " %02x", UCOL_TERTIARYORDER(ce));
-        }
-        fprintf(f, "] ");
-
-        ce = ucol_next(iter, &error);
-        if (ce == UCOL_NULLORDER) {
-            break;
-        }
-        if (U_FAILURE(error)) {
-            fprintf(stdout, "Error retrieving collation elements");
-            return;
-        }
-    }
-    
-    if (sortkeylength > 64) {
-        fprintf(f, "Sortkey exceeds pre-allocated size");
-    }
-
-    fprintf(f, "[");
-    while (TRUE) {
-        fprintf(f, "%02x", *psortkey);
-        psortkey ++;
-        if ((*psortkey) == 0) {
-            break;
-        }
-        fprintf(f, " ");
-    }
-    fprintf(f, "]\n");
-}
-
-/**
-* Serializes the contraction within the given argument rule
-* @param f file output stream
-* @param r rule
-* @param rlen rule length
-* @param contractionsonly flag to indicate if only contractions are to be 
-*                         output or all collation elements
-* @param iter iterator to iterate over collation elements
-*/
-void serialize(FILE *f, UChar *rule, int rlen, UBool contractiononly, 
-               UCollationElements *iter) {
-    const UChar           *current  = NULL;
-          uint32_t         strength = 0;
-          uint32_t         chOffset = 0; 
-          uint32_t         chLen    = 0;
-          uint32_t         exOffset = 0; 
-          uint32_t         exLen    = 0;
-          uint32_t         prefixOffset = 0; 
-          uint32_t         prefixLen    = 0;
-          uint8_t          specs    = 0;
-          UBool            rstart   = TRUE;
-          UColTokenParser  src;
-          UColOptionSet    opts;
-          UParseError      parseError;
-          UErrorCode       error    = U_ZERO_ERROR;
-    
-    src.opts = &opts;
-      
-    src.source       = rule; 
-       src.current = rule;
-    src.end          = rule + rlen;
-    src.extraCurrent = src.end;
-    src.extraEnd     = src.end + UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
-
-        
-    while ((current = ucol_tok_parseNextToken(&src, rstart, &parseError,
-                                              &error)) != NULL) {
-      chOffset = src.parsedToken.charsOffset;
-      chLen = src.parsedToken.charsLen;
-        // contractions handled here
-        if (!contractiononly || chLen > 1) {
-            ucol_setText(iter, rule + chOffset, chLen, &error);
-            if (U_FAILURE(error)) {
-                fprintf(stdout, "Error setting text in iterator\n");
-                return;
-            }
-            serialize(f, iter);
-        }
-        rstart = FALSE;
-    }
-}
-
-/**
-* Prints the attribute values in the argument collator into the output stream
-* @param collator
-*/
-void outputAttribute(UCollator *collator, UErrorCode *error) 
-{
-    UColAttribute attribute = UCOL_FRENCH_COLLATION;
-    while (attribute < UCOL_ATTRIBUTE_COUNT) {
-        int count = 0;
-        while (TRUE) {
-            // getting attribute name
-            if (ATTRIBUTE_NAME_[count].value == attribute) {
-                fprintf(OUTPUT_, "%s = ", ATTRIBUTE_NAME_[count].name);
-                break;
-            }
-            count ++;
-        }
-        count = 0;
-        int attributeval = ucol_getAttribute(collator, attribute, error);
-        if (U_FAILURE(*error)) {
-            fprintf(stdout, "Failure in reading collator attribute\n");
-            return;
-        }
-        while (TRUE) {
-            // getting attribute value
-            if (ATTRIBUTE_VALUE_[count].value == attributeval) {
-                fprintf(OUTPUT_, "%s\n", ATTRIBUTE_VALUE_[count].name);
-                break;
-            }
-            count ++;
-        }
-        attribute = (UColAttribute)(attribute + 1);
-    }
-}
-
-/**
-* Prints the normalization mode in the argument collator into the output stream
-* @param collator
-*/
-void outputNormalization(UCollator *collator) 
-{
-       UErrorCode status = U_ZERO_ERROR;
-    int normmode = ucol_getAttribute(collator, UCOL_NORMALIZATION_MODE, &status);
-    int count = 0;
-    while (TRUE) {
-        // getting attribute name
-        if (ATTRIBUTE_VALUE_[count].value == normmode) {
-            break;
-        }
-        count ++;
-    }
-    fprintf(OUTPUT_, "NORMALIZATION MODE = %s\n", 
-            ATTRIBUTE_VALUE_[count].name);
-}
-
-/**
-* Output the collation element belonging to the locale into a file
-* @param locale string
-* @param fullrules flag to indicate if only tailored collation elements are to
-*        be output or all collation elements
-*/
-void serialize(const char *locale, UBool tailoredonly) {
-    UErrorCode  error              = U_ZERO_ERROR;
-    UChar       str[128];
-    int         strlen = 0;
-
-    fprintf(OUTPUT_, "# This file contains the serialized collation elements\n");
-    fprintf(OUTPUT_, "# as of the collation version indicated below.\n");
-    fprintf(OUTPUT_, "# Data format: xxxx xxxx..; [yyyy, yy, yy] [yyyy, yy, yy] ... [yyyy, yy, yy] [zz zz..\n");
-    fprintf(OUTPUT_, "#              where xxxx are codepoints in hexadecimals,\n");
-    fprintf(OUTPUT_, "#              yyyyyyyy are the corresponding\n");
-    fprintf(OUTPUT_, "#              collation elements in hexadecimals\n");
-    fprintf(OUTPUT_, "#              and zz are the sortkey values in hexadecimals\n");
-
-    fprintf(OUTPUT_, "\n# Collator information\n");
-
-    fprintf(OUTPUT_, "\nLocale: %s\n", locale);
-    fprintf(stdout, "Locale: %s\n", locale);
-    UVersionInfo version;
-    ucol_getVersion(COLLATOR_, version);
-    fprintf(OUTPUT_, "Version number: %d.%d.%d.%d\n", 
-                      version[0], version[1], version[2], version[3]);
-    outputAttribute(COLLATOR_, &error);
-    outputNormalization(COLLATOR_);
-    
-    UCollationElements *iter = ucol_openElements(COLLATOR_, str, strlen, 
-                                                 &error);
-    if (U_FAILURE(error)) {
-        fprintf(stdout, "Error creating iterator\n");
-        return;
-    }
-
-    if (!tailoredonly) {
-        fprintf(OUTPUT_, "\n# Range of unicode characters\n\n");
-        UChar32     codepoint          = 0;
-        while (codepoint <= UCHAR_MAX_VALUE) { 
-            if (u_isdefined(codepoint)) {
-                strlen = 0;
-                UTF16_APPEND_CHAR_UNSAFE(str, strlen, codepoint);
-                str[strlen] = 0;
-                ucol_setText(iter, str, strlen, &error);
-                if (U_FAILURE(error)) {
-                    fprintf(stdout, "Error setting text in iterator\n");
-                    return;
-                }
-                serialize(OUTPUT_, iter);
-            }
-            codepoint ++;
-        }
-    }
-
-    UChar    ucarules[0x10000];
-    UChar   *rules;
-    int32_t  rulelength = 0;
-    rules      = ucarules;
-    
-    if (tailoredonly) {
-              int32_t  rulelength = 0;
-        const UChar   *temp = ucol_getRules(COLLATOR_, &rulelength);
-        if (rulelength + UCOL_TOK_EXTRA_RULE_SPACE_SIZE > 0x10000) {
-            rules = (UChar *)malloc(sizeof(UChar) * 
-                                (rulelength + UCOL_TOK_EXTRA_RULE_SPACE_SIZE));
-        }
-        memcpy(rules, temp, rulelength * sizeof(UChar));
-        rules[rulelength] = 0;
-        fprintf(OUTPUT_, "\n# Tailorings\n\n");
-        serialize(OUTPUT_, rules, rulelength, FALSE, iter);
-        if (rules != ucarules) {
-            free(rules);
-        }
-    }
-    else {        
-        rulelength = ucol_getRulesEx(COLLATOR_, UCOL_FULL_RULES, ucarules, 
-                                     0x10000);
-        if (rulelength + UCOL_TOK_EXTRA_RULE_SPACE_SIZE > 0x10000) {
-            rules = (UChar *)malloc(sizeof(UChar) * 
-                                (rulelength + UCOL_TOK_EXTRA_RULE_SPACE_SIZE));
-            rulelength = ucol_getRulesEx(COLLATOR_, UCOL_FULL_RULES, rules, 
-                                         rulelength);
-        }
-        fprintf(OUTPUT_, "\n# Contractions\n\n");
-        serialize(OUTPUT_, rules, rulelength, TRUE, iter);
-        if (rules != ucarules) {
-            free(rules);
-        }
-    }
-        
-    ucol_closeElements(iter);
-}
-
-/**
-* Sets the collator with the attribute values
-* @param collator
-* @param error status
-*/
-void setAttributes(UCollator *collator, UErrorCode *error) 
-{
-    int count = 0;
-    while (count < UCOL_ATTRIBUTE_COUNT) {
-        if (ATTRIBUTE_[count] != UCOL_DEFAULT) {
-            ucol_setAttribute(collator, (UColAttribute)count, 
-                              ATTRIBUTE_[count], error);
-            if (U_FAILURE(*error)) {
-                return;
-            }
-        }
-        count ++;
-    }
-}
-
-/**
-* Appends directory path with an ending seperator if necessary.
-* @param path with enough space to append one seperator
-* @return new directory path length
-*/
-int appendDirSeparator(char *dir) 
-{
-    int dirlength = strlen(dir);
-    char dirending = dir[dirlength - 1];
-    if (dirending != U_FILE_SEP_CHAR) {
-        dir[dirlength] = U_FILE_SEP_CHAR;
-        dir[dirlength + 1] = 0;
-        return dirlength + 1;
-    }
-    return dirlength;
-}
-
-/**
-* Output the collation element into a file
-*/
-void serialize() {
-    char filename[128];
-    int  dirlength = 0;
-
-    if (options[4].doesOccur) {
-        strcpy(filename, options[4].value);
-        dirlength = appendDirSeparator(filename);
-    }
-
-    if (options[2].doesOccur) {
-        const char    *locale      = (char *)options[2].value;
-              int32_t  localeindex = 0;
-        
-        if (strcmp(locale, "all") == 0) {
-            if (options[4].doesOccur) {
-                strcat(filename, "UCA.txt");
-                OUTPUT_ = fopen(filename, "w");
-                if (OUTPUT_ == NULL) {
-                    fprintf(stdout, "Cannot open file:%s\n", filename);
-                    return;
-                }
-            }
-            fprintf(stdout, "UCA\n");
-            UErrorCode error = U_ZERO_ERROR;
-            COLLATOR_ = ucol_open("en_US", &error);
-            if (U_FAILURE(error)) {
-                fprintf(stdout, "Collator creation failed:");
-                fprintf(stdout, u_errorName(error));
-                goto CLOSEUCA;
-                return;
-            }
-            setAttributes(COLLATOR_, &error);
-            if (U_FAILURE(error)) {
-                fprintf(stdout, "Collator attribute setting failed:");
-                fprintf(stdout, u_errorName(error));
-                goto CLOSEUCA;
-                return;
-            }
-        
-            serialize("UCA", FALSE);
-CLOSEUCA :  
-            if (options[4].doesOccur) {
-                filename[dirlength] = 0;
-                fclose(OUTPUT_);
-            }
-            ucol_close(COLLATOR_);
-            localeindex = ucol_countAvailable() - 1;
-            fprintf(stdout, "Number of locales: %d\n", localeindex + 1);
-            locale      = ucol_getAvailable(localeindex);
-        }
-
-        while (TRUE) {
-            UErrorCode error = U_ZERO_ERROR;
-            COLLATOR_ = ucol_open(locale, &error);
-            if (U_FAILURE(error)) {
-                fprintf(stdout, "Collator creation failed:");
-                fprintf(stdout, u_errorName(error));
-                goto CLOSETAILOR;
-                return;
-            }
-            setAttributes(COLLATOR_, &error);
-            if (U_FAILURE(error)) {
-                fprintf(stdout, "Collator attribute setting failed:");
-                fprintf(stdout, u_errorName(error));
-                goto CLOSETAILOR;
-                return;
-            }
-
-            if (options[4].doesOccur) {
-                strcat(filename, locale);
-                strcat(filename, ".txt");
-                OUTPUT_ = fopen(filename, "w");
-                if (OUTPUT_ == NULL) {
-                    fprintf(stdout, "Cannot open file:%s\n", filename);
-                    return;
-                }
-            }
-
-            if (options[3].doesOccur) {
-                serialize(locale, TRUE);
-            }
-
-            ucol_close(COLLATOR_);
-
-CLOSETAILOR : 
-            if (options[4].doesOccur) {
-                filename[dirlength] = 0;
-                fclose(OUTPUT_);
-            }
-    
-            localeindex --;
-            if (localeindex < 0) {
-                break;
-            }
-            locale = ucol_getAvailable(localeindex);
-        }
-    }
-
-    if (options[7].doesOccur) {
-        char inputfilename[128] = "";
-        // rules are to be used
-        if (options[5].doesOccur) {
-            strcpy(inputfilename, options[5].value);
-            appendDirSeparator(inputfilename);
-        }
-        strcat(inputfilename, options[7].value);
-        FILE *input = fopen(inputfilename, "r");
-        if (input == NULL) {
-            fprintf(stdout, "Cannot open file:%s\n", filename);
-            return;
-        }
-        
-        char   s[1024];
-        UChar  rule[1024];
-        UChar *prule = rule;
-        int    size = 1024;
-        // synwee TODO: make this part dynamic
-        while (fscanf(input, "%[^\n]s", s) != EOF) {
-            size -= u_unescape(s, prule, size);
-            prule = prule + u_strlen(prule);
-        }
-        fclose(input);
-
-        if (options[4].doesOccur) {
-            strcat(filename, "Rules.txt");
-            OUTPUT_ = fopen(filename, "w");
-            if (OUTPUT_ == NULL) {
-                fprintf(stdout, "Cannot open file:%s\n", filename);
-                return;
-            }
-        }
-
-        fprintf(stdout, "Rules\n");
-        UErrorCode  error = U_ZERO_ERROR;
-        UParseError parseError;
-        COLLATOR_ = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT, 
-                                   UCOL_DEFAULT_STRENGTH, &parseError, &error);
-        if (U_FAILURE(error)) {
-            fprintf(stdout, "Collator creation failed:");
-            fprintf(stdout, u_errorName(error));
-            goto CLOSERULES;
-            return;
-        }
-        setAttributes(COLLATOR_, &error);
-        if (U_FAILURE(error)) {
-            fprintf(stdout, "Collator attribute setting failed:");
-            fprintf(stdout, u_errorName(error));
-            goto CLOSERULES;
-            return;
-        }
-        
-        serialize("Rule-based", TRUE);
-        ucol_close(COLLATOR_);
-
-CLOSERULES :
-        if (options[4].doesOccur) {
-            filename[dirlength] = 0;
-            fclose(OUTPUT_);
-        }
-    }
-}
-
-/**
-* Parse for enum values.
-* Note this only works for positive enum values.
-* @param enumarray array containing names of the enum values in string and 
-*        their corresponding value.
-*        declared enum value.
-* @param str string to be parsed
-* @return corresponding integer enum value or -1 if value is not found.
-*/
-int parseEnums(const EnumNameValuePair enumarray[], const char *str) 
-{
-    const char *enumname = enumarray[0].name;
-    int result = atoi(str);
-    if (result == 0 && str[0] != '0') {
-        while (strcmp(enumname, str) != 0) {
-            // checking for multiple enum names sharing the same values
-            enumname = strstr(enumname, str);
-            if (enumname != NULL) {
-                int size = strchr(enumname, '|') - enumname;
-                if (size < 0) {
-                    size = strlen(enumname);
-                }
-                if (size == (int)strlen(str)) {
-                    return enumarray[result].value;
-                }
-            }
-            result ++;
-            if (&(enumarray[result]) == NULL) {
-                return -1;
-            }
-            enumname = enumarray[result].name;
-        }
-    }
-    return -1;
-}
-
-/**
-* Parser for attribute name value pair
-*/
-void parseAttributes() {
-    char str[32];
-    const char *pname = options[6].value;
-    const char *pend  = options[6].value + strlen(options[6].value);
-    const char *pvalue;
-    
-    while (pname < pend) {
-        pvalue = strchr(pname, '=');
-        if (pvalue == NULL) {
-            fprintf(stdout, 
-                    "No matching value found for attribute argument %s\n", 
-                    pname);        
-            return;
-        }
-        int count = pvalue - pname;
-        strncpy(str, pname, count);
-        str[count] = 0;
-
-        int name = parseEnums(ATTRIBUTE_NAME_, str);
-        if (name == -1) {
-            fprintf(stdout, "Attribute name not found: %s\n", str);
-            return;
-        }
-        
-        pvalue ++;
-        // getting corresponding enum value
-        pname = strchr(pvalue, ',');
-        if (pname == NULL) {
-            pname = pend;
-        }
-        count = pname - pvalue;
-        strncpy(str, pvalue, count);
-        str[count] = 0;
-        int value = parseEnums(ATTRIBUTE_VALUE_, str);
-        if (value == -1) {
-            fprintf(stdout, "Attribute value not found: %s\n", str);
-            return;
-        }
-        ATTRIBUTE_[name] = (UColAttributeValue)value;
-        pname ++;
-    }
-}
-
-/**
-* Checks if the locale argument is a base language 
-* @param locale to be checked
-* @return TRUE if it is a base language
-*/
-inline UBool checkLocaleForLanguage(const char *locale)
-{
-    return strlen(locale) <= 2;
-}
-
-/**
-* Converts a UChar array into its string form "xxxx xxxx"
-* @param ch array of UChar characters
-* @param count number of UChar characters
-*/
-void outputUChar(UChar ch[], int count)
-{
-    for (int i = 0; i < count; i ++) {
-        fprintf(OUTPUT_, "%04X ", ch[i]);
-    }
-}
-
-/**
-* If it is a primary difference returns -1 or 1.
-* If it is a secondary difference returns -2 or 2.
-* If it is a tertiary difference returns -3 or 3.
-* If equals returns 0.
-*/
-int compareSortKey(const void *elem1, const void *elem2)
-{
-    // compare the 2 script element sort key
-    UChar     *ch1   = ((ScriptElement *)elem1)->ch;
-    UChar     *ch2   = ((ScriptElement *)elem2)->ch;
-    int        size1 = ((ScriptElement *)elem1)->count;
-    int        size2 = ((ScriptElement *)elem2)->count;
-    UErrorCode error = U_ZERO_ERROR;
-    
-    ucol_setStrength(COLLATOR_, UCOL_PRIMARY);
-    int result = ucol_strcoll(COLLATOR_, ch1, size1, ch2, size2);
-    if (result == 0) {
-        ucol_setStrength(COLLATOR_, UCOL_SECONDARY);
-        result = ucol_strcoll(COLLATOR_, ch1, size1, ch2, size2);
-        if (result == 0) {
-            ucol_setStrength(COLLATOR_, UCOL_TERTIARY);
-            result = ucol_strcoll(COLLATOR_, ch1, size1, ch2, size2);
-            if (result < 0) {
-                return -3;
-            }
-            if (result > 0) {
-                return 3;
-            }    
-        }
-        if (result < 0) {
-            return -2;
-        }
-        if (result > 0) {
-            return 2;
-        }
-    }
-    return result;
-}
-
-/**
-* Output serialized script elements
-* @param element the element to output
-* @param compare the comparison with the previous element
-* @param expansion flags TRUE if element has an expansion
-*/
-void outputScriptElem(ScriptElement &element, int compare, UBool expansion)
-{
-    switch (compare) {
-    case 0: 
-        if (expansion) {
-            fprintf(OUTPUT_, "<tr><td class='eq' title='["); 
-        }
-        else {
-            fprintf(OUTPUT_, "<tr><td class='q' title='["); 
-        }
-        break;  
-    case -1: 
-        if (expansion) {
-            fprintf(OUTPUT_, "<tr><td class='ep' title='["); 
-        }
-        else {
-            fprintf(OUTPUT_, "<tr><td class='p' title='["); 
-        }
-        break;        
-    case -2: 
-        if (expansion) {
-            fprintf(OUTPUT_, "<tr><td class='es' title='["); 
-        }
-        else {
-            fprintf(OUTPUT_, "<tr><td class='s' title='["); 
-        }
-        break;
-    default: 
-        if (expansion) {
-            fprintf(OUTPUT_, "<tr><td class='et' title='["); 
-        }
-        else {
-            fprintf(OUTPUT_, "<tr><td class='t' title='["); 
-        }
-    }
-
-    uint8_t sortkey[32];
-    ucol_setStrength(COLLATOR_, UCOL_TERTIARY);
-    ucol_getSortKey(COLLATOR_, element.ch, element.count, sortkey, 32);
-    int i = 0;
-    while (sortkey[i] != 0) {
-        if (sortkey[i] == 1) {
-            fprintf(OUTPUT_, " | ");
-        }
-        else {
-            fprintf(OUTPUT_, "%02x", sortkey[i]);
-        }
-
-        i ++;
-    }
-
-    fprintf(OUTPUT_, "]'>");
-    
-    UErrorCode error = U_ZERO_ERROR;
-    char       utf8[64];
-    UChar      nfc[32];
-    int32_t    length = unorm_normalize(element.ch, element.count, UNORM_NFC, 0, nfc, 
-                                        32, &error);
-    if (U_FAILURE(error)) {
-        fprintf(stdout, "Error normalizing contractions to NFC\n");
-    }
-    u_strToUTF8(utf8, 64, &length, nfc, length, &error);
-    if (U_FAILURE(error)) {
-        fprintf(stdout, "Error converting UChar to utf8\n");
-        return;
-    }
-    
-    fprintf(OUTPUT_, "%s<br>", utf8);
-    fprintf(OUTPUT_, "<tt>");
-    outputUChar(element.ch, element.count);
-
-    if (compare == 0) {
-        fprintf(OUTPUT_, "</tt></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>Q</td><td>");
-    }
-    else if (compare == -1) {
-        fprintf(OUTPUT_, "</tt></td><td>P</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>");
-    }
-    else if (compare == -2) {
-        fprintf(OUTPUT_, "</tt></td><td>&nbsp;</td><td>S</td><td>&nbsp;</td><td>&nbsp;</td><td>");
-    }
-    else if (compare == -3) {
-        fprintf(OUTPUT_, "</tt></td><td>&nbsp;</td><td>&nbsp;</td><td>T</td><td>&nbsp;</td><td>");
-    }
-
-    i = 0;
-    while (i < element.count) {
-        char    str[128];
-        UChar32 codepoint;
-        U16_NEXT(element.ch, i, element.count, codepoint);
-        int32_t temp = u_charName(codepoint, U_UNICODE_CHAR_NAME, str, 128, 
-                                      &error);
-        if (U_FAILURE(error)) {
-            fprintf(stdout, "Error getting character name\n");
-            return;
-        }
-        if (element.tailored) {
-            fprintf(OUTPUT_, "<b>");
-        }
-        fprintf(OUTPUT_, "%s", str);
-        if (element.tailored) {
-            fprintf(OUTPUT_, " *</b>");
-        }
-        if (i < element.count) {
-            fprintf(OUTPUT_, "<br>\n");
-        }
-    }
-
-    fprintf(OUTPUT_, "</td></tr>\n");
-}
-
-/**
-* Checks if codepoint belongs to scripts
-* @param script list
-* @param scriptcount number of scripts
-* @param codepoint to test
-* @return TRUE if codepoint belongs to scripts
-*/
-UBool checkInScripts(UScriptCode script[], int scriptcount, 
-                     UChar32 codepoint)
-{
-    UErrorCode error = U_ZERO_ERROR;
-    for (int i = 0; i < scriptcount; i ++) {
-        if (script[i] == USCRIPT_HAN && options[10].doesOccur) { 
-            if ((codepoint >= 0x2E80 && codepoint <= 0x2EE4) ||
-                (codepoint >= 0x2A672 && codepoint <= 0x2A6D6)) {
-                // reduce han
-                return TRUE;
-            }
-        }
-        else if (uscript_getScript(codepoint, &error) == script[i]) {
-            return TRUE;
-        }
-        if (U_FAILURE(error)) {
-            fprintf(stdout, "Error checking character in scripts\n");
-            return FALSE;
-        }
-    }
-    return FALSE;
-}
-
-/**
-* Checks if the set of codepoints belongs to the script
-* @param script list
-* @param scriptcount number of scripts
-* @param scriptelem
-* @return TRUE if all codepoints belongs to the script
-*/
-inline UBool checkInScripts(UScriptCode script[], int scriptcount,
-                           ScriptElement scriptelem)
-{
-    int i = 0;
-    while (i < scriptelem.count) {
-        UChar32     codepoint;
-        U16_NEXT(scriptelem.ch, i, scriptelem.count, codepoint);
-        UErrorCode  error = U_ZERO_ERROR;
-        if (checkInScripts(script, scriptcount, codepoint)) {
-            return TRUE;
-        }
-    }
-    return FALSE;
-}
-
-/**
-* Gets the script elements and contractions belonging to the script
-* @param elems output list
-* @param locale locale
-* @return number of script elements
-* Add by Richard
-*/
-int getScriptElementsFromExemplars(ScriptElement scriptelem[], const char* locale) {
-    UErrorCode error = U_ZERO_ERROR;
-    UChar32 codepoint = 0;
-
-    UResourceBundle* ures = ures_open(NULL, locale, &error);
-    if (U_FAILURE(error)) {
-        fprintf(stdout, "Can not find resource bundle for locale: %s\n", locale);
-        return -1;
-    }
-    int32_t length;
-    const UChar* exemplarChars = ures_getStringByKey(ures, "ExemplarCharacters", &length, &error);
-
-    if (U_FAILURE(error)) {
-        fprintf(stdout, "Can not find ExemplarCharacters in resource bundle\n");
-        return -1;
-    }
-
-    UChar* upperChars = new UChar[length * 2];
-    if (upperChars == 0) {
-        fprintf(stdout, "Memory error\n");
-        return -1;
-    }
-
-    int32_t destLength = u_strToUpper(upperChars, length * 2, exemplarChars, -1, locale, &error);
-    if (U_FAILURE(error)) {
-        fprintf(stdout, "Error when u_strToUpper() \n");
-        return -1;
-    }
-
-    UChar* pattern = new UChar[length + destLength + 10];
-    UChar left[2] = {0x005b, 0x0};
-    UChar right[2] = {0x005d, 0x0};
-    pattern = u_strcpy(pattern, left);
-    pattern = u_strcat(pattern, exemplarChars);
-    pattern = u_strcat(pattern, upperChars);
-    pattern = u_strcat(pattern, right);
-
-    UnicodeSet * uniset = new UnicodeSet(UnicodeString(pattern), error);
-    if (U_FAILURE(error)) {
-        fprintf(stdout, "Can not open USet \n");
-        return -1;
-    }
-
-    UnicodeSetIterator* usetiter = new UnicodeSetIterator(*uniset);
-
-    int32_t count = 0;
-
-    while (usetiter -> next()) {
-        if (usetiter -> isString()) {
-            UnicodeString strItem = usetiter -> getString();
-
-            scriptelem[count].count = 0;
-            for (int i = 0; i < strItem.length(); i++) {
-                codepoint = strItem.char32At(i);
-                UTF16_APPEND_CHAR_UNSAFE(scriptelem[count].ch, scriptelem[count].count, codepoint);
-                scriptelem[count].tailored = FALSE;
-            }
-        } else {
-            codepoint = usetiter -> getCodepoint();
-            scriptelem[count].count = 0;
-            UTF16_APPEND_CHAR_UNSAFE(scriptelem[count].ch, scriptelem[count].count, codepoint);
-            scriptelem[count].tailored = FALSE;
-        }
-
-        count++;
-    }
-    delete []pattern;
-
-    return count;
-}
-
-/**
-* Gets the script elements and contractions belonging to the script
-* @param script list
-* @param scriptcount number of scripts
-* @param elems output list
-* @return number of script elements
-*/
-int getScriptElements(UScriptCode script[], int scriptcount, 
-                      ScriptElement scriptelem[])
-{
-    UErrorCode error = U_ZERO_ERROR;
-    UChar32    codepoint = 0;
-    int        count     = 0;
-    while (codepoint <= UCHAR_MAX_VALUE) { 
-        if (checkInScripts(script, scriptcount, codepoint)) {
-            scriptelem[count].count = 0;
-            UTF16_APPEND_CHAR_UNSAFE(scriptelem[count].ch, 
-                                     scriptelem[count].count, codepoint);
-            scriptelem[count].tailored = FALSE;
-            count ++;
-        }
-        if (U_FAILURE(error)) {
-            fprintf(stdout, "Error determining codepoint in script\n");
-            return -1;
-        }
-        codepoint ++;
-    }
-
-    const UChar           *current  = NULL;
-          uint32_t         strength = 0;
-          uint32_t         chOffset = 0; 
-          uint32_t         chLen    = 0;
-          uint32_t         exOffset = 0; 
-          uint32_t         exLen    = 0;
-          uint32_t         prefixOffset = 0; 
-          uint32_t         prefixLen    = 0;
-          uint8_t          specs    = 0;
-          UBool            rstart   = TRUE;
-          UColTokenParser  src;
-          UColOptionSet    opts;
-          UParseError      parseError;
-
-    int32_t  rulelength = ucol_getRulesEx(COLLATOR_, UCOL_FULL_RULES, NULL, 0);
-    src.source       = (UChar *)malloc(sizeof(UChar) * 
-                                (rulelength + UCOL_TOK_EXTRA_RULE_SPACE_SIZE));
-    rulelength = ucol_getRulesEx(COLLATOR_, UCOL_FULL_RULES, src.source, 
-                                 rulelength);
-    src.current      = src.source;
-    src.end          = src.source + rulelength;
-    src.extraCurrent = src.end;
-    src.extraEnd     = src.end + UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
-    src.opts         = &opts;
-        
-       /*
-       ucol_tok_parseNextToken(&src, &strength, &chOffset, 
-                                              &chLen, &exOffset, &exLen,
-                                              &prefixOffset, &prefixLen,
-                                              &specs, rstart, &parseError,
-                                              &error)
-    */
-    while ((current = ucol_tok_parseNextToken(&src, rstart, &parseError,
-                                              &error)) != NULL) {
-        // contractions handled here
-        if (chLen > 1) {
-            u_strncpy(scriptelem[count].ch, src.source + chOffset, chLen);
-            scriptelem[count].count = chLen;
-            if (checkInScripts(script, scriptcount, scriptelem[count])) {
-                scriptelem[count].tailored     = FALSE;
-                count ++;
-            }
-        }
-        rstart = FALSE;
-    }
-    if (U_FAILURE(error)) {
-        fprintf(stdout, "Error parsing rules: %s\n", u_errorName(error));
-    }
-       // rule might have been reallocated, so delete this instead
-    free(src.source); 
-    return count;
-}
-
-int compareCodepoints(const void *elem1, const void *elem2)
-{
-    UChar *ch1 = ((ScriptElement *)elem1)->ch; // key
-    UChar *ch2 = ((ScriptElement *)elem2)->ch;
-    ch1[((ScriptElement *)elem1)->count] = 0;
-    ch2[((ScriptElement *)elem2)->count] = 0;
-
-    // compare the 2 codepoints
-    return u_strcmp(ch1, ch2);
-}
-
-UBool hasSubNFD(ScriptElement &se, ScriptElement &key)
-{
-    UChar *ch1 = se.ch; 
-    UChar *ch2 = key.ch; // key
-    ch1[se.count] = 0;
-    ch2[key.count] = 0;
-    
-    // compare the 2 codepoints
-    if (u_strstr(ch1, ch2) != NULL) {
-        return TRUE;
-    }
-
-    // check the decomposition 
-    UChar      norm[32];
-    UErrorCode error = U_ZERO_ERROR;
-    int        size  = unorm_normalize(ch1, se.count, UNORM_NFD, 0, norm, 32, 
-                                       &error);    
-    if (U_FAILURE(error)) {
-        fprintf(stdout, "Error normalizing\n");
-    }
-    if (u_strstr(norm, ch2) != NULL) {
-        return TRUE;
-    }
-    return FALSE;
-}
-
-/**
-* Marks tailored elements
-* @param script list
-* @param scriptcount number of scripts
-* @param scriptelem script element list
-* @param scriptelemlength size of the script element list
-*/
-void markTailored(UScriptCode script[], int scriptcount, 
-                  ScriptElement scriptelem[], int scriptelemlength)
-{
-          int32_t  rulelength;
-    const UChar   *rule = ucol_getRules(COLLATOR_, &rulelength);
-    
-    const UChar           *current  = NULL;
-          uint32_t         strength = 0;
-          uint32_t         chOffset = 0; 
-          uint32_t         chLen    = 0;
-          uint32_t         exOffset = 0; 
-          uint32_t         exLen    = 0;
-          uint32_t         prefixOffset = 0; 
-          uint32_t         prefixLen    = 0;
-          uint8_t          specs    = 0;
-          UBool            rstart   = TRUE;
-          UColTokenParser  src;
-          UColOptionSet    opts;
-          UParseError      parseError;
-    
-    src.opts         = &opts;
-    src.source       = (UChar *)malloc(
-               (rulelength + UCOL_TOK_EXTRA_RULE_SPACE_SIZE) * sizeof(UChar));
-    memcpy(src.source, rule, rulelength * sizeof(UChar));
-       src.current      = src.source;
-    src.end          = (UChar *)src.source + rulelength;
-    src.extraCurrent = src.end;
-    src.extraEnd     = src.end + UCOL_TOK_EXTRA_RULE_SPACE_SIZE;
-
-    UErrorCode    error = U_ZERO_ERROR;
-        
-    while ((current = ucol_tok_parseNextToken(&src, rstart, &parseError,
-                                              &error)) != NULL) {
-        if (chLen >= 1 && strength != UCOL_TOK_RESET) {
-            // skipping the reset characters and non useful stuff.
-            ScriptElement se;
-            u_strncpy(se.ch, src.source + chOffset, chLen);
-            se.count = chLen;
-
-            if (checkInScripts(script, scriptcount, se)) {
-                /*
-                ScriptElement *tse = (ScriptElement *)bsearch(&se, scriptelem, 
-                                                              scriptelemlength, 
-                                                         sizeof(ScriptElement), 
-                                                         compareCodepoints);
-                */
-                for (int i = 0; i < scriptelemlength; i ++) {
-                    if (!scriptelem[i].tailored && 
-                        hasSubNFD(scriptelem[i], se)) {
-                        scriptelem[i].tailored = TRUE;
-                    }
-                }
-            }
-        }
-        rstart = FALSE;
-    }
-    free(src.source);
-    if (U_FAILURE(error)) {
-        fprintf(stdout, "Error parsing rules\n");
-    }
-}
-
-/**
-* Checks if the collation iterator has more than 1 collation element
-* @parem coleiter collation element iterator
-* @return TRUE if collation iterator has more than 1 collation element
-*/
-UBool hasExpansions(UCollationElements *coleiter)
-{
-    UErrorCode error = U_ZERO_ERROR;
-    int32_t    ce    = ucol_next(coleiter, &error);
-    int        count = 0;
-
-    if (U_FAILURE(error)) {
-        fprintf(stdout, "Error getting next collation element\n");
-    }
-    while (ce != UCOL_NULLORDER) {
-        if ((UCOL_PRIMARYORDER(ce) != 0) && !isContinuation(ce)) {
-            count ++;
-            if (count == 2) {
-                return TRUE;
-            }
-        }
-        ce = ucol_next(coleiter, &error);
-        if (U_FAILURE(error)) {
-            fprintf(stdout, "Error getting next collation element\n");
-        }
-    }
-    return FALSE;
-}
-
-/**
-* Prints the footer for index.html
-* @param file output file
-*/
-void outputHTMLFooter()
-{
-    fprintf(OUTPUT_, "</table>\n");
-    fprintf(OUTPUT_, "</body>\n");
-    fprintf(OUTPUT_, "</html>\n");
-}
-
-/**
-* Serialize the codepoints from start to end into an html file.
-* Arranging them into ascending collation order.
-* @param script code list
-* @param scriptcount number of scripts
-*/
-//void serializeScripts(UScriptCode script[], int scriptcount) 
-//Richard
-void serializeScripts(UScriptCode script[], int scriptcount, const char* locale = NULL) 
-{
-    UErrorCode  error  = U_ZERO_ERROR;
-    
-    ScriptElement *scriptelem = 
-                     (ScriptElement *)malloc(sizeof(ScriptElement) * 0x20000);
-    if (scriptelem == NULL) {
-        fprintf(stdout, "Memory error\n");
-        return;
-    }
-    int count = 0;
-    if(locale) {
-      count = getScriptElementsFromExemplars(scriptelem, locale);
-    } else {
-      count = getScriptElements(script, scriptcount, scriptelem); 
-    }
-
-    // Sort script elements using Quicksort algorithm:
-    qsort(scriptelem, count, sizeof(ScriptElement), compareCodepoints);
-    markTailored(script, scriptcount, scriptelem, count);
-    // Sort script elements using Quicksort algorithm:
-    qsort(scriptelem, count, sizeof(ScriptElement), compareSortKey);
-
-    UCollationElements* coleiter = ucol_openElements(COLLATOR_, 
-                                                     scriptelem[0].ch,
-                                                     scriptelem[0].count,
-                                                     &error);
-    if (U_FAILURE(error)) {
-        fprintf(stdout, "Error creating collation element iterator\n");
-        return;
-    }
-
-    outputScriptElem(scriptelem[0], -1, hasExpansions(coleiter));
-    for (int i = 0; i < count - 1; i ++) {
-        ucol_setText(coleiter, scriptelem[i + 1].ch, scriptelem[i + 1].count,
-                     &error);
-        if (U_FAILURE(error)) {
-            fprintf(stdout, "Error setting text in collation element iterator\n");
-            return;
-        }
-        outputScriptElem(scriptelem[i + 1], 
-                         compareSortKey(scriptelem + i, scriptelem + i + 1),
-                         hasExpansions(coleiter));
-    }
-    free(scriptelem);
-    outputHTMLFooter();
-}
-
-/**
-* Prints the header for the html
-* @param locale name
-* @param script
-* @param scriptcount number of scripts
-*/
-void outputHTMLHeader(const char *locale, UScriptCode script[], 
-                      int scriptcount)
-{
-    fprintf(OUTPUT_, "<html>\n");
-    fprintf(OUTPUT_, "<head>\n");
-    fprintf(OUTPUT_, "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n");
-    fprintf(OUTPUT_, "<meta http-equiv=\"Content-Language\" content=\"en-us\">\n");
-    fprintf(OUTPUT_, "<link rel=\"stylesheet\" href=\"charts.css\" type=\"text/css\">\n");
-    fprintf(OUTPUT_, "<title>ICU Collation charts</title>\n");
-    fprintf(OUTPUT_, "<base target=\"main\">\n");
-    fprintf(OUTPUT_, "</head>\n");
-
-    fprintf(OUTPUT_, "<body bgcolor=#FFFFFF>\n");
-    fprintf(OUTPUT_, "<!--\n");
-    fprintf(OUTPUT_, "This file contains sorted characters in ascending order according to the locale stated\n");
-    fprintf(OUTPUT_, "If the character is in red, it is tailored in the collation rules.\n");
-    fprintf(OUTPUT_, "Background colours have certain meanings:\n");
-    fprintf(OUTPUT_, "White - equals the previous character\n");
-    fprintf(OUTPUT_, "dark blue - primary greater than the previous character\n");
-    fprintf(OUTPUT_, "blue - secondary greater than the previous character\n");
-    fprintf(OUTPUT_, "light blue - tertiary greater than the previous character\n");
-    fprintf(OUTPUT_, "--!>\n");
-
-    fprintf(OUTPUT_, "<table border=0>\n");
-    UChar      displayname[64];
-    UErrorCode error = U_ZERO_ERROR;
-    int32_t size = uloc_getDisplayName(locale, "en_US", displayname, 64, &error);
-    char       utf8displayname[128];
-    if (U_FAILURE(error)) {
-        utf8displayname[0] = 0;
-    }
-    else {
-        int32_t utf8size = 0;
-        u_strToUTF8(utf8displayname, 128, &utf8size, displayname, size, &error);
-    }
-
-    fprintf(OUTPUT_, "<tr><th>Locale</th><td class='noborder'>%s</td></tr>\n", utf8displayname);
-    fprintf(OUTPUT_, "<tr><th>Script(s)</th>");
-    fprintf(OUTPUT_, "<td class='noborder'>");
-    for (int i = 0; i < scriptcount; i ++) {
-        fprintf(OUTPUT_, "%s", uscript_getName(script[i]));
-        if (i + 1 != scriptcount) {
-            fprintf(OUTPUT_, ", ");
-        }
-    }
-    fprintf(OUTPUT_, "</td></tr>\n");
-    
-    fprintf(OUTPUT_, "<tr><th>Rules</th><td class='noborder'><a href=\"http://dev.icu-project.org/cgi-bin/viewcvs.cgi/*checkout*/icu/source/data/coll/%s.txt\">%s.txt</a></td></tr>\n", locale, locale);
-    
-    UVersionInfo version;
-    ucol_getVersion(COLLATOR_, version);
-    fprintf(OUTPUT_, "<tr><th>Collator version</th><td class='noborder'>%d.%d.%d.%d</td></tr>\n", 
-                      version[0], version[1], version[2], version[3]);
-    
-    UColAttribute attr = UCOL_FRENCH_COLLATION;
-    while (attr < UCOL_ATTRIBUTE_COUNT) {
-        UColAttributeValue value = ucol_getAttribute(COLLATOR_, attr, &error);
-        if (U_FAILURE(error)) {
-            fprintf(stdout, "Error getting attribute\n");
-            return;
-        }
-        if (value != UCOL_DEFAULT) {
-            if (attr == UCOL_FRENCH_COLLATION && value != UCOL_OFF) {
-                fprintf(OUTPUT_, "<tr><th>French Collation</th><td class='noborder'>on, code %d</td></tr>\n", value);
-            }
-            if (attr == UCOL_ALTERNATE_HANDLING && value != UCOL_NON_IGNORABLE) {
-                fprintf(OUTPUT_, "<tr><th>Alternate Handling</th><td class='noborder'>shifted, code%d</td></tr>\n", value);
-            }
-            if (attr == UCOL_CASE_FIRST && value != UCOL_OFF) {
-                fprintf(OUTPUT_, "<tr><th>Case First</th><td class='noborder'>on, code %d</td></tr>\n", value);
-            }
-            if (attr == UCOL_CASE_LEVEL && value != UCOL_OFF) {
-                fprintf(OUTPUT_, "<tr><th>Case Level</th><td class='noborder'>on, code %d</td></tr>\n", value);
-            }
-            if (attr == UCOL_NORMALIZATION_MODE && value != UCOL_OFF) {
-                fprintf(OUTPUT_, "<tr><th>Normalization</th><td class='noborder'>on, code %d</td></tr>\n", value);
-            }
-            if (attr == UCOL_STRENGTH && value != UCOL_TERTIARY) {
-                fprintf(OUTPUT_, "<tr><th>Strength</th><td class='noborder'>code %d</td></tr>\n", value);
-            }
-            if (attr == UCOL_HIRAGANA_QUATERNARY_MODE && value != UCOL_OFF) {
-                fprintf(OUTPUT_, "<tr><th>Hiragana Quaternary</th><td class='noborder'>on, code %d</td></tr>\n", value);
-            }
-        }
-        attr = (UColAttribute)(attr + 1);
-    }
-
-    // Get UNIX-style time and display as number and string.
-    time_t ltime;
-    time( &ltime );
-    fprintf(OUTPUT_, "<tr><th>Date Generated</th><td class='noborder'>%s</td></tr>", ctime(&ltime));
-     
-    fprintf(OUTPUT_, "</table>\n");
-
-    fprintf(OUTPUT_, "<p><a href=help.html>How to read the table</a><br>\n");
-    fprintf(OUTPUT_, "<a href=http://www.jtcsv.com/cgi-bin/icu-bugs/ target=new>Submit a bug</a></p>\n");
-    fprintf(OUTPUT_, "\n<table>\n");
-    fprintf(OUTPUT_, "\n<tr><th>Codepoint</th><th>P</th><th>S</th><th>T</th><th>Q</th><th>Name</th></tr>\n");
-}
-
-/**
-* Prints the header for index.html
-* @param file output file
-*/
-void outputListHTMLHeader(FILE *file)
-{
-    fprintf(file, "<html>\n");
-    fprintf(file, "<head>\n");
-    fprintf(file, "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n");
-    fprintf(file, "<meta http-equiv=\"Content-Language\" content=\"en-us\">\n");
-    fprintf(file, "<title>ICU Collation Charts</title>\n");
-    fprintf(file, "<base target=\"main\">\n");
-    fprintf(file, "</head>\n");
-    fprintf(file, "<body bgcolor=#FFFFFF>\n");
-    fprintf(file, "<h2 align=center>ICU Collation Charts</h2>\n");
-    fprintf(file, "<p align=center>\n");
-    fprintf(file, "<a href=http://www.unicode.org/charts/collation/ target=new>UCA Charts</a><br>");
-}
-
-/**
-* Prints the footer for index.html
-* @param file output file
-*/
-void outputListHTMLFooter(FILE *file)
-{
-    fprintf(file, "</p>\n");
-       //fprintf(file, "<center><image src=http://oss.software.ibm.com/icu/images/w24.gif></center>\n");
-    fprintf(file, "</body>\n");
-    fprintf(file, "</html>\n");
-}
-
-/**
-* Gets all scripts and serialize their codepoints into an html file.
-*/
-void serializeScripts() {
-    char filename[128];
-    int  dirlength = 0;
-
-    if (options[4].doesOccur) {
-        strcpy(filename, options[4].value);
-        dirlength = appendDirSeparator(filename);
-    } else {
-      filename[0] = 0;
-    }
-
-    const char    *locale;
-          int32_t  localelist = 0;
-          int32_t  localesize;
-        
-    localesize = ucol_countAvailable();
-    locale     = ucol_getAvailable(localelist);
-
-    strcat(filename, "list.html");
-    FILE *list = fopen(filename, "w");
-    filename[dirlength] = 0;
-    if (list == NULL) {
-        fprintf(stdout, "Cannot open file: %s\n", filename);
-        return;
-    }
-
-    outputListHTMLHeader(list);
-    fprintf(list, "<blockquote>\n");
-    while (TRUE) {
-        UErrorCode error = U_ZERO_ERROR;
-        COLLATOR_ = ucol_open(locale, &error);
-        if (U_FAILURE(error)) {
-            fprintf(stdout, "Collator creation failed:");
-            fprintf(stdout, u_errorName(error));
-            break;
-        }
-        if ((error != U_USING_FALLBACK_WARNING && // not tailored
-            error != U_USING_DEFAULT_WARNING) ||
-            checkLocaleForLanguage(locale)) {
-            fprintf(list, "<a href=%s.html>%s</a> ", locale, locale);
-               setAttributes(COLLATOR_, &error);
-            if (U_FAILURE(error)) {
-               fprintf(stdout, "Collator attribute setting failed:");
-               fprintf(stdout, u_errorName(error));
-               break;
-            }
-
-            UScriptCode scriptcode[32];
-            uint32_t scriptcount = uscript_getCode(locale, scriptcode, 32, 
-                                                   &error);
-            if (U_FAILURE(error)) {
-                fprintf(stdout, "Error getting lcale scripts\n");
-                break;
-            }
-
-            strcat(filename, locale);
-            strcat(filename, ".html");
-            OUTPUT_ = fopen(filename, "w");
-            if (OUTPUT_ == NULL) {
-                fprintf(stdout, "Cannot open file:%s\n", filename);
-                break;
-            }
-            outputHTMLHeader(locale, scriptcode, scriptcount);
-            fprintf(stdout, "%s\n", locale);
-
-            if(options[12].doesOccur) {
-              // use whole scripts
-                serializeScripts(scriptcode, scriptcount);
-            } else {
-              // use exemplar chars
-              serializeScripts(scriptcode, scriptcount, locale);
-            }
-            fclose(OUTPUT_);
-        }
-        ucol_close(COLLATOR_);
-
-        filename[dirlength] = 0;
-        localelist ++;
-        if (localelist == localesize) {
-            break;
-        }
-        locale = ucol_getAvailable(localelist);
-    }
-    fprintf(list, "<br><a href=help.html>help</a><br>");
-    fprintf(list, "</blockquote>\n");
-    outputListHTMLFooter(list);
-    fclose(list);
-}
-
-/** 
-* Main   --  process command line, read in and pre-process the test file,
-*            call other functions to do the actual tests.
-*/
-int main(int argc, char *argv[]) {
-    
-    argc = u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), 
-                       options);
-    
-    // error handling, printing usage message
-    if (argc < 0) {
-        fprintf(stdout, "error in command line argument: ");
-        fprintf(stdout, argv[-argc]);
-        fprintf(stdout, "\n");
-    }
-    if (argc < 0 || options[0].doesOccur || options[1].doesOccur) {
-        fprintf(stdout, "Usage: dumpce options...\n"
-                        "--help\n"
-                        "    Display this message.\n"
-                        "--locale name|all\n"
-                        "    ICU locale to use. Default is en_US\n"
-                        "--serialize\n"
-                        "    Serializes the collation elements in -locale or all locales available and outputs them into --outputdir/locale_ce.txt\n"
-                        "--destdir dir_name\n"
-                        "    Path for outputing the serialized collation elements. Defaults to stdout if no defined\n"
-                        "--sourcedir dir_name\n"
-                        "    Path for the input rule file for collation\n"
-                        "--attribute name=value,name=value...\n" 
-                        "    Pairs of attribute names and values for setting\n"
-                        "--rule filename\n" 
-                        "    Name of file containing the collation rules.\n"
-                        "--normalizaton mode\n" 
-                        "    UNormalizationMode mode to be used.\n"
-                        "--scripts\n" 
-                        "    Codepoints from all scripts are sorted and serialized.\n"
-                        "--reducehan\n" 
-                        "    Only 200 Han script characters will be displayed with the use of --scripts.\n"
-                        "--wholescripts\n"
-                        "    Show collation order for whole scripts instead of just for exemplar characters of a locale\n\n");
-
-        fprintf(stdout, "Example to generate *.txt files : dumpce --serialize --locale af --destdir /temp --attribute UCOL_STRENGTH=UCOL_DEFAULT_STRENGTH,4=17\n\n");
-        fprintf(stdout, "Example to generate *.html files for oss web display: dumpce --scripts --destdir /temp --reducehan\n");
-        return argc < 0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
-    }
-
-    OUTPUT_ = stdout;
-    if (options[6].doesOccur) {
-        fprintf(stdout, "attributes %s\n", options[6].value);
-        parseAttributes();
-    }
-    if (options[3].doesOccur) {
-        serialize();
-    }
-    if (options[9].doesOccur) {
-        serializeScripts();
-    }
-    return 0;
-}
diff --git a/icu4c/source/tools/dumpce/dumpce.dsp b/icu4c/source/tools/dumpce/dumpce.dsp
deleted file mode 100644 (file)
index d19f653..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-# Microsoft Developer Studio Project File - Name="dumpce" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=dumpce - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE 
-!MESSAGE NMAKE /f "dumpce.mak".
-!MESSAGE 
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
-!MESSAGE NMAKE /f "dumpce.mak" CFG="dumpce - Win32 Debug"
-!MESSAGE 
-!MESSAGE Possible choices for configuration are:
-!MESSAGE 
-!MESSAGE "dumpce - Win32 Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "dumpce - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE 
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF  "$(CFG)" == "dumpce - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /G6 /MD /W3 /GX /O2 /Ob2 /I "..\..\..\include" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
-# SUBTRACT CPP /YX
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 icuuc.lib icuin.lib icutu.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\lib\\"
-
-!ELSEIF  "$(CFG)" == "dumpce - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /G6 /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /I "..\..\common" /I "..\..\i18n" /I "..\..\tools\toolutil" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 icuucd.lib icuind.lib icutud.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\lib\\"
-
-!ENDIF 
-
-# Begin Target
-
-# Name "dumpce - Win32 Release"
-# Name "dumpce - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\dumpce.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# End Group
-# Begin Group "Resource Files"
-
-# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
-# End Group
-# End Target
-# End Project
diff --git a/icu4c/source/tools/dumpce/dumpce.dsw b/icu4c/source/tools/dumpce/dumpce.dsw
deleted file mode 100644 (file)
index f074149..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "dumpce"=.\dumpce.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
index 92b25f5f01470857d3e1c747de37d27b75de9d8f..0f271d95013730458e11164928b663a7605f5fe1 100644 (file)
@@ -557,7 +557,7 @@ processFile(
         printf("autodetected encoding %s\n", cp);
     }
     /* Parse the data into an SRBRoot */
-    data = parse(ucbuf, inputDir, outputDir,
+    data = parse(ucbuf, inputDir, outputDir, filename,
                  !omitBinaryCollation, options[NO_COLLATION_RULES].doesOccur, status);
 
     if (data == NULL || U_FAILURE(*status)) {
index b7f48efbfc6648818281055c08e6234c176e94b7..919694d93b80fa84a952e4ef12dcb69f41b7bd0b 100644 (file)
   <ItemGroup>\r
     <ClCompile Include="errmsg.c" />\r
     <ClCompile Include="genrb.c" />\r
-    <ClCompile Include="parse.cpp" />\r
+    <ClCompile Include="parse.cpp">\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\r
+    </ClCompile>\r
     <ClCompile Include="prscmnts.cpp" />\r
     <ClCompile Include="rbutil.c" />\r
     <ClCompile Include="read.c" />\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
   <ImportGroup Label="ExtensionTargets">\r
   </ImportGroup>\r
-</Project>\r
+</Project>
\ No newline at end of file
index 9f91e0e3fb217e7f306033d0cc3b4cceb126ca8e..60bb3fec0fc95f7ce8e95da9116aa8158dca60f0 100644 (file)
@@ -28,7 +28,6 @@
 #   define UNISTR_FROM_STRING_EXPLICIT explicit
 #endif
 
-#include "ucol_imp.h"
 #include "parse.h"
 #include "errmsg.h"
 #include "uhash.h"
 #include "genrb.h"
 #include "unicode/ustring.h"
 #include "unicode/uscript.h"
+#include "unicode/utf16.h"
 #include "unicode/putil.h"
+#include "collationbuilder.h"
+#include "collationdata.h"
+#include "collationdatareader.h"
+#include "collationdatawriter.h"
+#include "collationfastlatinbuilder.h"
+#include "collationinfo.h"
+#include "collationroot.h"
+#include "collationruleparser.h"
+#include "collationtailoring.h"
 #include <stdio.h>
 
 /* Number of tokens to read ahead of the current stream position */
@@ -61,6 +70,9 @@
 #define OPENSQBRACKET    0x005B
 #define CLOSESQBRACKET   0x005D
 
+using icu::LocalPointer;
+using icu::UnicodeString;
+
 struct Lookahead
 {
      enum   ETokenType type;
@@ -94,6 +106,7 @@ typedef struct {
     uint32_t        inputdirLength;
     const char     *outputdir;
     uint32_t        outputdirLength;
+    const char     *filename;
     UBool           makeBinaryCollation;
     UBool           omitCollationRules;
 } ParseState;
@@ -633,10 +646,9 @@ parseAlias(ParseState* state, char *tag, uint32_t startline, const struct UStrin
     return result;
 }
 
-typedef struct{
-    const char* inputDir;
-    const char* outputDir;
-} GenrbData;
+#if !UCONFIG_NO_COLLATION
+
+namespace {
 
 static struct SResource* resLookup(struct SResource* res, const char* key){
     struct SResource *current = NULL;
@@ -657,17 +669,33 @@ static struct SResource* resLookup(struct SResource* res, const char* key){
     return NULL;
 }
 
-static const UChar* importFromDataFile(void* context, const char* locale, const char* type, int32_t* pLength, UErrorCode* status){
+class GenrbImporter : public icu::CollationRuleParser::Importer {
+public:
+    GenrbImporter(const char *in, const char *out) : inputDir(in), outputDir(out) {}
+    virtual ~GenrbImporter();
+    virtual const UnicodeString *getRules(
+            const char *localeID, const char *collationType,
+            const char *&errorReason, UErrorCode &errorCode);
+
+private:
+    const char *inputDir;
+    const char *outputDir;
+    UnicodeString rules;
+};
+
+GenrbImporter::~GenrbImporter() {}
+
+const UnicodeString *
+GenrbImporter::getRules(
+        const char *localeID, const char *collationType,
+        const char *& /*errorReason*/, UErrorCode &errorCode) {
     struct SRBRoot *data         = NULL;
     UCHARBUF       *ucbuf        = NULL;
-    GenrbData* genrbdata = (GenrbData*) context;
-    int localeLength = strlen(locale);
+    int localeLength = strlen(localeID);
     char* filename = (char*)uprv_malloc(localeLength+5);
     char           *inputDirBuf  = NULL;
     char           *openFileName = NULL;
     const char* cp = "";
-    UChar* urules = NULL;
-    int32_t urulesLength = 0;
     int32_t i = 0;
     int32_t dirlen  = 0;
     int32_t filelen = 0;
@@ -676,7 +704,7 @@ static const UChar* importFromDataFile(void* context, const char* locale, const
     struct SResource* collation;
     struct SResource* sequence;
 
-    memcpy(filename, locale, localeLength);
+    memcpy(filename, localeID, localeLength);
     for(i = 0; i < localeLength; i++){
         if(filename[i] == '-'){
             filename[i] = '_';
@@ -689,16 +717,16 @@ static const UChar* importFromDataFile(void* context, const char* locale, const
     filename[localeLength+4] = 0;
 
 
-    if (status==NULL || U_FAILURE(*status)) {
+    if (U_FAILURE(errorCode)) {
         return NULL;
     }
     if(filename==NULL){
-        *status=U_ILLEGAL_ARGUMENT_ERROR;
+        errorCode=U_ILLEGAL_ARGUMENT_ERROR;
         return NULL;
     }else{
         filelen = (int32_t)uprv_strlen(filename);
     }
-    if(genrbdata->inputDir == NULL) {
+    if(inputDir == NULL) {
         const char *filenameBegin = uprv_strrchr(filename, U_FILE_SEP_CHAR);
         openFileName = (char *) uprv_malloc(dirlen + filelen + 2);
         openFileName[0] = '\0';
@@ -710,27 +738,28 @@ static const UChar* importFromDataFile(void* context, const char* locale, const
              * another file, like UCARules.txt or thaidict.brk.
              */
             int32_t filenameSize = (int32_t)(filenameBegin - filename + 1);
-            inputDirBuf = uprv_strncpy((char *)uprv_malloc(filenameSize), filename, filenameSize);
+            inputDirBuf = (char *)uprv_malloc(filenameSize);
 
             /* test for NULL */
             if(inputDirBuf == NULL) {
-                *status = U_MEMORY_ALLOCATION_ERROR;
+                errorCode = U_MEMORY_ALLOCATION_ERROR;
                 goto finish;
             }
 
+            uprv_strncpy(inputDirBuf, filename, filenameSize);
             inputDirBuf[filenameSize - 1] = 0;
-            genrbdata->inputDir = inputDirBuf;
-            dirlen  = (int32_t)uprv_strlen(genrbdata->inputDir);
+            inputDir = inputDirBuf;
+            dirlen  = (int32_t)uprv_strlen(inputDir);
         }
     }else{
-        dirlen  = (int32_t)uprv_strlen(genrbdata->inputDir);
+        dirlen  = (int32_t)uprv_strlen(inputDir);
 
-        if(genrbdata->inputDir[dirlen-1] != U_FILE_SEP_CHAR) {
+        if(inputDir[dirlen-1] != U_FILE_SEP_CHAR) {
             openFileName = (char *) uprv_malloc(dirlen + filelen + 2);
 
             /* test for NULL */
             if(openFileName == NULL) {
-                *status = U_MEMORY_ALLOCATION_ERROR;
+                errorCode = U_MEMORY_ALLOCATION_ERROR;
                 goto finish;
             }
 
@@ -746,8 +775,8 @@ static const UChar* importFromDataFile(void* context, const char* locale, const
              * user should use
              * genrb -s. icu/data  --- start from CWD and look in icu/data dir
              */
-            if( (filename[0] != U_FILE_SEP_CHAR) && (genrbdata->inputDir[dirlen-1] !='.')){
-                uprv_strcpy(openFileName, genrbdata->inputDir);
+            if( (filename[0] != U_FILE_SEP_CHAR) && (inputDir[dirlen-1] !='.')){
+                uprv_strcpy(openFileName, inputDir);
                 openFileName[dirlen]     = U_FILE_SEP_CHAR;
             }
             openFileName[dirlen + 1] = '\0';
@@ -756,42 +785,40 @@ static const UChar* importFromDataFile(void* context, const char* locale, const
 
             /* test for NULL */
             if(openFileName == NULL) {
-                *status = U_MEMORY_ALLOCATION_ERROR;
+                errorCode = U_MEMORY_ALLOCATION_ERROR;
                 goto finish;
             }
 
-            uprv_strcpy(openFileName, genrbdata->inputDir);
+            uprv_strcpy(openFileName, inputDir);
 
         }
     }
     uprv_strcat(openFileName, filename);
     /* printf("%s\n", openFileName);  */
-    *status = U_ZERO_ERROR;
-    ucbuf = ucbuf_open(openFileName, &cp,getShowWarning(),TRUE, status);
+    errorCode = U_ZERO_ERROR;
+    ucbuf = ucbuf_open(openFileName, &cp,getShowWarning(),TRUE, &errorCode);
 
-    if(*status == U_FILE_ACCESS_ERROR) {
+    if(errorCode == U_FILE_ACCESS_ERROR) {
 
         fprintf(stderr, "couldn't open file %s\n", openFileName == NULL ? filename : openFileName);
         goto finish;
     }
-    if (ucbuf == NULL || U_FAILURE(*status)) {
-        fprintf(stderr, "An error occured processing file %s. Error: %s\n", openFileName == NULL ? filename : openFileName,u_errorName(*status));
+    if (ucbuf == NULL || U_FAILURE(errorCode)) {
+        fprintf(stderr, "An error occured processing file %s. Error: %s\n", openFileName == NULL ? filename : openFileName,u_errorName(errorCode));
         goto finish;
     }
 
     /* Parse the data into an SRBRoot */
-    data = parse(ucbuf, genrbdata->inputDir, genrbdata->outputDir, FALSE, FALSE, status);
+    data = parse(ucbuf, inputDir, outputDir, filename, FALSE, FALSE, &errorCode);
 
     root = data->fRoot;
     collations = resLookup(root, "collations");
     if (collations != NULL) {
-      collation = resLookup(collations, type);
+      collation = resLookup(collations, collationType);
       if (collation != NULL) {
         sequence = resLookup(collation, "Sequence");
         if (sequence != NULL) {
-          urules = sequence->u.fString.fChars;
-          urulesLength = sequence->u.fString.fLength;
-          *pLength = urulesLength;
+          rules.setTo(FALSE, sequence->u.fString.fChars, sequence->u.fString.fLength);
         }
       }
     }
@@ -809,7 +836,7 @@ finish:
         ucbuf_close(ucbuf);
     }
 
-    return urules;
+    return &rules;
 }
 
 // Quick-and-dirty escaping function.
@@ -833,17 +860,25 @@ escape(const UChar *s, char *buffer) {
     }
 }
 
+}  // namespace
+
+#endif  // !UCONFIG_NO_COLLATION
+
 static struct SResource *
-addCollation(ParseState* state, struct SResource  *result, uint32_t startline, UErrorCode *status)
+addCollation(ParseState* state, struct SResource  *result, const char *collationType,
+             uint32_t startline, UErrorCode *status)
 {
+    // TODO: Use LocalPointer for result, or make caller close it when there is a failure.
     struct SResource  *member = NULL;
     struct UString    *tokenValue;
     struct UString     comment;
     enum   ETokenType  token;
     char               subtag[1024];
+    UnicodeString      rules;
+    UBool              haveRules = FALSE;
     UVersionInfo       version;
     uint32_t           line;
-    GenrbData genrbdata;
+
     /* '{' . (name resource)* '}' */
     version[0]=0; version[1]=0; version[2]=0; version[3]=0;
 
@@ -854,7 +889,7 @@ addCollation(ParseState* state, struct SResource  *result, uint32_t startline, U
 
         if (token == TOK_CLOSE_BRACE)
         {
-            return result;
+            break;
         }
 
         if (token != TOK_STRING)
@@ -918,102 +953,10 @@ addCollation(ParseState* state, struct SResource  *result, uint32_t startline, U
         }
         else if (uprv_strcmp(subtag, "Sequence") == 0)
         {
-#if UCONFIG_NO_COLLATION || UCONFIG_NO_FILE_IO
-            warning(line, "Not building collation elements because of UCONFIG_NO_COLLATION and/or UCONFIG_NO_FILE_IO, see uconfig.h");
-#else
-            if(state->makeBinaryCollation) {
-
-                /* do the collation elements */
-                int32_t     len   = 0;
-                uint8_t   *data  = NULL;
-                UCollator *coll  = NULL;
-                int32_t reorderCodes[USCRIPT_CODE_LIMIT + (UCOL_REORDER_CODE_LIMIT - UCOL_REORDER_CODE_FIRST)];
-                int32_t reorderCodeCount;
-                int32_t reorderCodeIndex;
-                UParseError parseError;
-
-                genrbdata.inputDir = state->inputdir;
-                genrbdata.outputDir = state->outputdir;
-
-                UErrorCode intStatus = U_ZERO_ERROR;
-                uprv_memset(&parseError, 0, sizeof(parseError));
-                coll = ucol_openRulesForImport(member->u.fString.fChars, member->u.fString.fLength,
-                                               UCOL_OFF, UCOL_DEFAULT_STRENGTH,&parseError, importFromDataFile, &genrbdata, &intStatus);
-
-                if (U_SUCCESS(intStatus) && coll != NULL)
-                {
-                    len = ucol_cloneBinary(coll, NULL, 0, &intStatus);
-                    data = (uint8_t *)uprv_malloc(len);
-                    intStatus = U_ZERO_ERROR;
-                    len = ucol_cloneBinary(coll, data, len, &intStatus);
-
-                    /* tailoring rules version */
-                    /* This is wrong! */
-                    /*coll->dataInfo.dataVersion[1] = version[0];*/
-                    /* Copy tailoring version. Builder version already */
-                    /* set in ucol_openRules */
-                    ((UCATableHeader *)data)->version[1] = version[0];
-                    ((UCATableHeader *)data)->version[2] = version[1];
-                    ((UCATableHeader *)data)->version[3] = version[2];
-
-                    if (U_SUCCESS(intStatus) && data != NULL)
-                    {
-                        struct SResource *collationBin = bin_open(state->bundle, "%%CollationBin", len, data, NULL, NULL, status);
-                        table_add(result, collationBin, line, status);
-                        uprv_free(data);
-
-                        reorderCodeCount = ucol_getReorderCodes(
-                            coll, reorderCodes, USCRIPT_CODE_LIMIT + (UCOL_REORDER_CODE_LIMIT - UCOL_REORDER_CODE_FIRST), &intStatus);
-                        if (U_SUCCESS(intStatus) && reorderCodeCount > 0) {
-                            struct SResource *reorderCodeRes = intvector_open(state->bundle, "%%ReorderCodes", NULL, status);
-                            for (reorderCodeIndex = 0; reorderCodeIndex < reorderCodeCount; reorderCodeIndex++) {
-                                intvector_add(reorderCodeRes, reorderCodes[reorderCodeIndex], status);
-                            }
-                            table_add(result, reorderCodeRes, line, status);
-                        }
-                    }
-                    else
-                    {
-                        warning(line, "could not obtain rules from collator");
-                        if(isStrict()){
-                            *status = U_INVALID_FORMAT_ERROR;
-                            return NULL;
-                        }
-                    }
-
-                    ucol_close(coll);
-                }
-                else
-                {
-                    if(intStatus == U_FILE_ACCESS_ERROR) {
-                        error(startline, "Collation could not be built- U_FILE_ACCESS_ERROR. Make sure ICU's data has been built and is loading properly.");
-                        *status = intStatus;
-                        return NULL;
-                    }
-                    char preBuffer[100], postBuffer[100];
-                    escape(parseError.preContext, preBuffer);
-                    escape(parseError.postContext, postBuffer);
-                    warning(line,
-                            "%%%%CollationBin could not be constructed from CollationElements\n"
-                            "  check context, check that the FractionalUCA.txt UCA version "
-                            "matches the current UCD version\n"
-                            "  UErrorCode=%s  UParseError={ line=%d offset=%d pre=<> post=<> }",
-                            u_errorName(intStatus),
-                            parseError.line,
-                            parseError.offset,
-                            preBuffer,
-                            postBuffer);
-                    if(isStrict()){
-                        *status = intStatus;
-                        return NULL;
-                    }
-                }
-            } else {
-                if(isVerbose()) {
-                    printf("Not building Collation binary\n");
-                }
-            }
-#endif
+            rules.setTo(member->u.fString.fChars, member->u.fString.fLength);
+            haveRules = TRUE;
+            // Defer building the collator until we have seen
+            // all sub-elements of the collation table, including the Version.
             /* in order to achieve smaller data files, we can direct genrb */
             /* to omit collation rules */
             if(state->omitCollationRules) {
@@ -1029,9 +972,98 @@ addCollation(ParseState* state, struct SResource  *result, uint32_t startline, U
         }
     }
 
-    // Reached the end without a TOK_CLOSE_BRACE.  Should be an error.
-    *status = U_INTERNAL_PROGRAM_ERROR;
-    return NULL;
+    if (!haveRules) { return result; }
+
+#if UCONFIG_NO_COLLATION || UCONFIG_NO_FILE_IO
+    warning(line, "Not building collation elements because of UCONFIG_NO_COLLATION and/or UCONFIG_NO_FILE_IO, see uconfig.h");
+    (void)collationType;
+#else
+    if(!state->makeBinaryCollation) {
+        if(isVerbose()) {
+            printf("Not building %s~%s collation binary\n", state->filename, collationType);
+        }
+        return result;
+    }
+    UErrorCode intStatus = U_ZERO_ERROR;
+    UParseError parseError;
+    uprv_memset(&parseError, 0, sizeof(parseError));
+    GenrbImporter importer(state->inputdir, state->outputdir);
+    const icu::CollationTailoring *base = icu::CollationRoot::getRoot(intStatus);
+    if(U_FAILURE(intStatus)) {
+        error(line, "failed to load root collator (ucadata.icu) - %s", u_errorName(intStatus));
+        res_close(result);
+        return NULL;  // TODO: use LocalUResourceBundlePointer for result
+    }
+    icu::CollationBuilder builder(base, intStatus);
+    if(uprv_strncmp(collationType, "search", 6) == 0) {
+        builder.disableFastLatin();  // build fast-Latin table unless search collator
+    }
+    LocalPointer<icu::CollationTailoring> t(
+            builder.parseAndBuild(rules, version, &importer, &parseError, intStatus));
+    if(U_FAILURE(intStatus)) {
+        const char *reason = builder.getErrorReason();
+        if(reason == NULL) { reason = ""; }
+        error(line, "CollationBuilder failed at %s~%s/Sequence rule offset %ld: %s  %s",
+                state->filename, collationType,
+                (long)parseError.offset, u_errorName(intStatus), reason);
+        if(parseError.preContext[0] != 0 || parseError.postContext[0] != 0) {
+            // Print pre- and post-context.
+            char preBuffer[100], postBuffer[100];
+            escape(parseError.preContext, preBuffer);
+            escape(parseError.postContext, postBuffer);
+            error(line, "  error context: \"...%s\" ! \"%s...\"", preBuffer, postBuffer);
+        }
+        if(isStrict()) {
+            *status = intStatus;
+            res_close(result);
+            return NULL;
+        }
+    }
+    icu::LocalMemory<uint8_t> buffer;
+    int32_t capacity = 100000;
+    uint8_t *dest = buffer.allocateInsteadAndCopy(capacity);
+    if(dest == NULL) {
+        fprintf(stderr, "memory allocation (%ld bytes) for file contents failed\n",
+                (long)capacity);
+        *status = U_MEMORY_ALLOCATION_ERROR;
+        res_close(result);
+        return NULL;
+    }
+    int32_t indexes[icu::CollationDataReader::IX_TOTAL_SIZE + 1];
+    int32_t totalSize = icu::CollationDataWriter::writeTailoring(
+            *t, *t->settings, indexes, dest, capacity, intStatus);
+    if(intStatus == U_BUFFER_OVERFLOW_ERROR) {
+        intStatus = U_ZERO_ERROR;
+        capacity = totalSize;
+        dest = buffer.allocateInsteadAndCopy(capacity);
+        if(dest == NULL) {
+            fprintf(stderr, "memory allocation (%ld bytes) for file contents failed\n",
+                    (long)capacity);
+            *status = U_MEMORY_ALLOCATION_ERROR;
+            res_close(result);
+            return NULL;
+        }
+        totalSize = icu::CollationDataWriter::writeTailoring(
+                *t, *t->settings, indexes, dest, capacity, intStatus);
+    }
+    if(U_FAILURE(intStatus)) {
+        fprintf(stderr, "CollationDataWriter::writeTailoring() failed: %s\n",
+                u_errorName(intStatus));
+        res_close(result);
+        return NULL;
+    }
+    if(isVerbose()) {
+        printf("%s~%s collation tailoring part sizes:\n", state->filename, collationType);
+        icu::CollationInfo::printSizes(totalSize, indexes);
+    }
+    struct SResource *collationBin = bin_open(state->bundle, "%%CollationBin", totalSize, dest, NULL, NULL, status);
+    table_add(result, collationBin, line, status);
+    if (U_FAILURE(*status)) {
+        res_close(result);
+        return NULL;
+    }
+#endif
+    return result;
 }
 
 static struct SResource *
@@ -1056,7 +1088,7 @@ parseCollationElements(ParseState* state, char *tag, uint32_t startline, UBool n
         printf(" collation elements %s at line %i \n",  (tag == NULL) ? "(null)" : tag, (int)startline);
     }
     if(!newCollation) {
-        return addCollation(state, result, startline, status);
+        return addCollation(state, result, "(no type)", startline, status);
     }
     else {
         for(;;) {
@@ -1114,7 +1146,7 @@ parseCollationElements(ParseState* state, char *tag, uint32_t startline, UBool n
                 if(token == TOK_OPEN_BRACE) {
                     token = getToken(state, &tokenValue, &comment, &line, status);
                     collationRes = table_open(state->bundle, subtag, NULL, status);
-                    collationRes = addCollation(state, collationRes, startline, status); /* need to parse the collation data regardless */
+                    collationRes = addCollation(state, collationRes, subtag, startline, status); /* need to parse the collation data regardless */
                     if (gIncludeUnihanColl || uprv_strcmp(subtag, "unihan") != 0) {
                         table_add(result, collationRes, startline, status);
                     }
@@ -2046,7 +2078,7 @@ parseResource(ParseState* state, char *tag, const struct UString *comment, UErro
 
 /* parse the top-level resource */
 struct SRBRoot *
-parse(UCHARBUF *buf, const char *inputDir, const char *outputDir,
+parse(UCHARBUF *buf, const char *inputDir, const char *outputDir, const char *filename,
       UBool makeBinaryCollation, UBool omitCollationRules, UErrorCode *status)
 {
     struct UString    *tokenValue;
@@ -2070,6 +2102,7 @@ parse(UCHARBUF *buf, const char *inputDir, const char *outputDir,
     state.inputdirLength = (state.inputdir != NULL) ? (uint32_t)uprv_strlen(state.inputdir) : 0;
     state.outputdir       = outputDir;
     state.outputdirLength = (state.outputdir != NULL) ? (uint32_t)uprv_strlen(state.outputdir) : 0;
+    state.filename = filename;
     state.makeBinaryCollation = makeBinaryCollation;
     state.omitCollationRules = omitCollationRules;
 
index a29367fbaab0c731b6aca0934d59950d4b8615c0..c9ac5521e1bf9005d5bb55708451fdfdc3ad2b26 100644 (file)
@@ -28,6 +28,7 @@ void initParser();
 
 /* Parse a ResourceBundle text file */
 struct SRBRoot* parse(UCHARBUF *buf, const char* inputDir, const char* outputDir,
+                      const char *filename,
                       UBool makeBinaryCollation, UBool omitCollationRules, UErrorCode *status);
 
 U_CDECL_END
index c1031208bd1c33ad672e13dc3691c58d6aff5979..1e9c5519d2e7e10b9cdc356bbe0baa30c30c4514 100644 (file)
@@ -36,7 +36,6 @@
 #include "unicode/ucnv.h"
 #include "genrb.h"
 #include "rle.h"
-#include "ucol_tok.h"
 #include "uhash.h"
 #include "uresimp.h"
 #include "unicode/ustring.h"
index ffec2b4d8e9be0055cdcf3f503e60a20eccaae24..2774e041e43d842628fbf2cf8e26c88bf65431c4 100644 (file)
@@ -1,6 +1,6 @@
 #******************************************************************************
 #
-#   Copyright (C) 1999-2011, International Business Machines
+#   Copyright (C) 1999-2014, International Business Machines
 #   Corporation and others.  All Rights Reserved.
 #
 #******************************************************************************
@@ -54,7 +54,7 @@ LDFLAGS += $(LDFLAGSICUTOOLUTIL)
 LIBS = $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS)
 
 OBJECTS = filestrm.o package.o pkgitems.o swapimpl.o toolutil.o unewdata.o \
-denseranges.o \
+collationinfo.o denseranges.o \
 ucm.o ucmstate.o uoptions.o uparse.o \
 ucbuf.o xmlparser.o writesrc.o \
 pkg_icu.o pkg_genc.o pkg_gencmn.o ppucd.o flagparser.o filetools.o \
diff --git a/icu4c/source/tools/toolutil/collationinfo.cpp b/icu4c/source/tools/toolutil/collationinfo.cpp
new file mode 100644 (file)
index 0000000..7bf3861
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationinfo.cpp
+*
+* created on: 2013aug05
+* created by: Markus W. Scherer
+*/
+
+#include <stdio.h>
+#include <string.h>
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+#include "collationdatareader.h"
+#include "collationinfo.h"
+#include "uassert.h"
+
+U_NAMESPACE_BEGIN
+
+void
+CollationInfo::printSizes(int32_t sizeWithHeader, const int32_t indexes[]) {
+    int32_t totalSize = indexes[CollationDataReader::IX_TOTAL_SIZE];
+    if(sizeWithHeader > totalSize) {
+        printf("  header size:                  %6ld\n", (long)(sizeWithHeader - totalSize));
+    }
+
+    int32_t length = indexes[CollationDataReader::IX_INDEXES_LENGTH];
+    printf("  indexes:          %6ld *4 = %6ld\n", (long)length, (long)length * 4);
+
+    length = getDataLength(indexes, CollationDataReader::IX_REORDER_CODES_OFFSET);
+    if(length != 0) {
+        printf("  reorder codes:    %6ld *4 = %6ld\n", (long)length / 4, (long)length);
+    }
+
+    length = getDataLength(indexes, CollationDataReader::IX_REORDER_TABLE_OFFSET);
+    if(length != 0) {
+        U_ASSERT(length >= 256);
+        printf("  reorder table:                %6ld\n", (long)length);
+    }
+
+    length = getDataLength(indexes, CollationDataReader::IX_TRIE_OFFSET);
+    if(length != 0) {
+        printf("  trie size:                    %6ld\n", (long)length);
+    }
+
+    length = getDataLength(indexes, CollationDataReader::IX_RESERVED8_OFFSET);
+    if(length != 0) {
+        printf("  reserved (offset 8):          %6ld\n", (long)length);
+    }
+
+    length = getDataLength(indexes, CollationDataReader::IX_CES_OFFSET);
+    if(length != 0) {
+        printf("  CEs:              %6ld *8 = %6ld\n", (long)length / 8, (long)length);
+    }
+
+    length = getDataLength(indexes, CollationDataReader::IX_RESERVED10_OFFSET);
+    if(length != 0) {
+        printf("  reserved (offset 10):         %6ld\n", (long)length);
+    }
+
+    length = getDataLength(indexes, CollationDataReader::IX_CE32S_OFFSET);
+    if(length != 0) {
+        printf("  CE32s:            %6ld *4 = %6ld\n", (long)length / 4, (long)length);
+    }
+
+    length = getDataLength(indexes, CollationDataReader::IX_ROOT_ELEMENTS_OFFSET);
+    if(length != 0) {
+        printf("  rootElements:     %6ld *4 = %6ld\n", (long)length / 4, (long)length);
+    }
+
+    length = getDataLength(indexes, CollationDataReader::IX_CONTEXTS_OFFSET);
+    if(length != 0) {
+        printf("  contexts:         %6ld *2 = %6ld\n", (long)length / 2, (long)length);
+    }
+
+    length = getDataLength(indexes, CollationDataReader::IX_UNSAFE_BWD_OFFSET);
+    if(length != 0) {
+        printf("  unsafeBwdSet:     %6ld *2 = %6ld\n", (long)length / 2, (long)length);
+    }
+
+    length = getDataLength(indexes, CollationDataReader::IX_FAST_LATIN_TABLE_OFFSET);
+    if(length != 0) {
+        printf("  fastLatin table:  %6ld *2 = %6ld\n", (long)length / 2, (long)length);
+    }
+
+    length = getDataLength(indexes, CollationDataReader::IX_SCRIPTS_OFFSET);
+    if(length != 0) {
+        printf("  scripts data:     %6ld *2 = %6ld\n", (long)length / 2, (long)length);
+    }
+
+    length = getDataLength(indexes, CollationDataReader::IX_COMPRESSIBLE_BYTES_OFFSET);
+    if(length != 0) {
+        U_ASSERT(length >= 256);
+        printf("  compressibleBytes:            %6ld\n", (long)length);
+    }
+
+    length = getDataLength(indexes, CollationDataReader::IX_RESERVED18_OFFSET);
+    if(length != 0) {
+        printf("  reserved (offset 18):         %6ld\n", (long)length);
+    }
+
+    printf(" collator binary total size:    %6ld\n", (long)sizeWithHeader);
+}
+
+int32_t
+CollationInfo::getDataLength(const int32_t indexes[], int32_t startIndex) {
+    return indexes[startIndex + 1] - indexes[startIndex];
+}
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
diff --git a/icu4c/source/tools/toolutil/collationinfo.h b/icu4c/source/tools/toolutil/collationinfo.h
new file mode 100644 (file)
index 0000000..dd61f8e
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+*******************************************************************************
+* collationinfo.h
+*
+* created on: 2013aug05
+* created by: Markus W. Scherer
+*/
+
+#ifndef __COLLATIONINFO_H__
+#define __COLLATIONINFO_H__
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_COLLATION
+
+U_NAMESPACE_BEGIN
+
+/**
+ * Collation-related code for tools & demos.
+ */
+class U_TOOLUTIL_API CollationInfo /* all static */ {
+public:
+    static void printSizes(int32_t sizeWithHeader, const int32_t indexes[]);
+
+private:
+    CollationInfo();  // no constructor
+
+    static int32_t getDataLength(const int32_t indexes[], int32_t startIndex);
+};
+
+U_NAMESPACE_END
+
+#endif  // !UCONFIG_NO_COLLATION
+#endif  // __COLLATIONINFO_H__
index 34ab0cae655dff559bfee7188c507ad4c33d039e..0974c55ecf82463ac77dad5d457951453e797e19 100644 (file)
     </Link>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
+    <ClCompile Include="collationinfo.cpp" />\r
     <ClCompile Include="denseranges.cpp" />\r
     <ClCompile Include="filestrm.c" />\r
     <ClCompile Include="filetools.cpp" />\r
     </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
+    <ClInclude Include="collationinfo.h" />\r
     <ClInclude Include="denseranges.h" />\r
     <ClInclude Include="filestrm.h" />\r
     <ClInclude Include="filetools.h" />\r