From fbc02c177d0f01817d47700aaa6725d2b8aa6b2f Mon Sep 17 00:00:00 2001 From: "richard (rikki) andrew cattermole" Date: Mon, 15 Apr 2024 03:44:04 +1200 Subject: [PATCH] Implement UAX31's quick check algorithm --- changelog/dmd.identifier-quick-check.dd | 14 + compiler/src/dmd/cli.d | 18 + compiler/src/dmd/common/charactertables.d | 353 +- compiler/src/dmd/common/identifiertables.d | 5669 +++++------------ compiler/src/dmd/cparse.d | 4 + compiler/src/dmd/frontend.h | 51 +- compiler/src/dmd/globals.d | 14 +- compiler/src/dmd/globals.h | 16 +- compiler/src/dmd/identifier.d | 44 + compiler/src/dmd/lexer.d | 138 +- compiler/src/dmd/main.d | 33 + compiler/src/dmd/mars.d | 46 + compiler/test/compilable/ident_UAX31.c | 1 + compiler/test/compilable/ident_c11.c | 1 + compiler/test/compilable/ident_c99.c | 1 + compiler/test/compilable/normalize_silent.c | 15 + compiler/test/compilable/normalize_silent.d | 10 + .../test/fail_compilation/normalize_warn.c | 25 + .../test/fail_compilation/normalize_warn.d | 20 + .../derivedNormalizationProps.d | 105 + compiler/tools/unicode_tables/unicodeData.d | 169 +- compiler/tools/unicode_tables/util.d | 24 +- compiler/tools/unicodetables.d | 273 +- 23 files changed, 2667 insertions(+), 4377 deletions(-) create mode 100644 changelog/dmd.identifier-quick-check.dd create mode 100644 compiler/test/compilable/normalize_silent.c create mode 100644 compiler/test/compilable/normalize_silent.d create mode 100644 compiler/test/fail_compilation/normalize_warn.c create mode 100644 compiler/test/fail_compilation/normalize_warn.d create mode 100644 compiler/tools/unicode_tables/derivedNormalizationProps.d diff --git a/changelog/dmd.identifier-quick-check.dd b/changelog/dmd.identifier-quick-check.dd new file mode 100644 index 000000000000..b22a8ac9eadb --- /dev/null +++ b/changelog/dmd.identifier-quick-check.dd @@ -0,0 +1,14 @@ +Identifiers are verifiable against normalization form C + +It is now possible to verify identifiers against normalization form C, as per UAX31 and C23. + +The quick check algorithm that is in use is an incomplete form that does not handle maybes and can result in false positives in errors. +The purpose of this algorithm in its incomplete state is to minimize normalization in a future update. + +It is configurable for both D and ImportC using ``-normalization=`` and ``-normalization-importc=``. +Using the options ``ignore``, ``deprecate``, ``warn``, and ``error``. + +Unless you use non-ASCII characters, this change will not affect you. + +Due to bug [24507](https://issues.dlang.org/show_bug.cgi?id=24507) if you use GCC as your preprocessor with any identifier that is not normalized to form C, by default it will produce a warning. +Use the GCC option ``-Wnormalized=none`` to disable this [warning](https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wnormalized_003d), and the D compiler will take over. diff --git a/compiler/src/dmd/cli.d b/compiler/src/dmd/cli.d index b69fed52ae57..76e85f0632bf 100644 --- a/compiler/src/dmd/cli.d +++ b/compiler/src/dmd/cli.d @@ -639,6 +639,24 @@ dmd -cov -unittest myprog.d `Turns off all array bounds checking, even for safe functions. $(RED Deprecated (use $(TT $(SWLINK -boundscheck)=off) instead).)`, ), + Option("normalization=", + "Specify what to do when an identifier is not normalized", + `The strategy that will be used when an identifier may not be normalized (quick check algorithm). + The quick check algorithm will give off false positives as it does not handle the maybe case. + $(UL + $(LI $(I ignore): Silently accept any failing identifiers (default)) + $(LI $(I warn): Emit a warning but accept) + )` + ), + Option("normalization-importc=", + "Specify what to do when an identifier is not normalized", + `The strategy that will be used with ImportC when an identifier may not be normalized (quick check algorithm). + The quick check algorithm will give off false positives as it does not handle the maybe case. + $(UL + $(LI $(I ignore): Silently accept any failing identifiers (default)) + $(LI $(I warn): Emit a warning but accept) + )` + ), Option("nothrow", "assume no Exceptions will be thrown", `Turns off generation of exception stack unwinding code, enables diff --git a/compiler/src/dmd/common/charactertables.d b/compiler/src/dmd/common/charactertables.d index 951c335817df..b4e27958d9a5 100644 --- a/compiler/src/dmd/common/charactertables.d +++ b/compiler/src/dmd/common/charactertables.d @@ -3,6 +3,8 @@ * * Supports UAX31, C99, C11 and least restrictive (All). * + * Supports normalization quick check algorithm, ignores maybe value. + * * Copyright: Copyright (C) 1999-2024 by The D Language Foundation, All Rights Reserved * Authors: $(LINK2 https://cattermole.co.nz, Richard (Rikki) Andrew Cattermole) * License: $(LINK2 https://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) @@ -11,13 +13,68 @@ * Coverage: https://codecov.io/gh/dlang/dmd/src/master/src/dmd/common/charactertables.d */ module dmd.common.charactertables; +import dmd.common.identifiertables; + +// Has to be above the @nogc +private template PlaneOffsetForRanges(alias Ranges) +{ + enum PlaneOffsetForRanges = () { + size_t[] result = new size_t[18]; + ptrdiff_t lastPlane = -1; + size_t offset; + + // Add a plane for a given index. + // If we don't do it like this we're gonna have problems where planes get missed out. + // So the tables won't be as sequentially or predictable as required. + void add(int plane, size_t indexOfPlaneStart) + { + foreach (p; lastPlane + 1 .. plane) + { + result[offset++] = indexOfPlaneStart; + lastPlane = p; + } + + if (plane > lastPlane) + { + assert(plane == offset); + assert(plane == lastPlane + 1); + + result[offset++] = indexOfPlaneStart; + lastPlane = plane; + } + } + + foreach (indexOfPlaneStart, v; Ranges) + { + int startPlane = (cast(int) v[0]) >> 16; + const endPlane = (cast(int) v[1]) >> 16; + + add(startPlane, indexOfPlaneStart); + startPlane++; + + while (startPlane <= endPlane) + { + add(startPlane++, indexOfPlaneStart); + } + } + + // 16 planes in Unicode, you need one more to make it a naive plane + 1 to remove extra conditionals. + foreach (_; offset .. 18) + { + result[offset++] = Ranges.length; + } + + return result; + }(); +} @safe nothrow @nogc pure: -extern(C++): +extern (C++): /// -enum IdentifierTable { +enum IdentifierTable +{ UAX31, /// C99, /// C11, /// @@ -27,42 +84,64 @@ enum IdentifierTable { /// struct IdentifierCharLookup { - @safe nothrow @nogc pure: +@safe nothrow @nogc pure: /// - extern(C++) bool function(dchar) isStart; + extern (C++) bool function(dchar) isStart; /// - extern(C++) bool function(dchar) isContinue; + extern (C++) bool function(dchar, ref UnicodeQuickCheckState) isContinue; /// Lookup the table given the table name static IdentifierCharLookup forTable(IdentifierTable table) { - import dmd.common.identifiertables; - // Awful solution to require these lambdas. // However without them the extern(C++) ABI issues crop up for isInRange, // and then it can't access the tables. - final switch(table) { - case IdentifierTable.UAX31: - return IdentifierCharLookup( - (c) => isInRange!UAX31_Start(c), - (c) => isInRange!UAX31_Continue(c)); - case IdentifierTable.C99: - return IdentifierCharLookup( - (c) => isInRange!FixedTable_C99_Start(c), - (c) => isInRange!FixedTable_C99_Continue(c)); - case IdentifierTable.C11: - return IdentifierCharLookup( - (c) => isInRange!FixedTable_C11_Start(c), - (c) => isInRange!FixedTable_C11_Continue(c)); - case IdentifierTable.LR: - return IdentifierCharLookup( - (c) => isInRange!LeastRestrictive_Start(c), - (c) => isInRange!LeastRestrictive_Continue(c)); + + // dfmt off + final switch (table) + { + case IdentifierTable.UAX31: + return IdentifierCharLookup( + (c) => isInRange!UAX31_Start(c), + (c, ref unicodeQuickCheckState) => isInRange!UAX31_Continue(c, unicodeQuickCheckState)); + case IdentifierTable.C99: + return IdentifierCharLookup( + (c) => isInRange!FixedTable_C99_Start(c), + (c, ref unicodeQuickCheckState) => isInRange!FixedTable_C99_Continue(c, unicodeQuickCheckState)); + case IdentifierTable.C11: + return IdentifierCharLookup( + (c) => isInRange!FixedTable_C11_Start(c), + (c, ref unicodeQuickCheckState) => isInRange!FixedTable_C11_Continue(c, unicodeQuickCheckState)); + case IdentifierTable.LR: + return IdentifierCharLookup( + (c) => isInRange!LeastRestrictive_Start(c), + (c, ref unicodeQuickCheckState) => isInRange!LeastRestrictive_Continue(c, unicodeQuickCheckState)); } + //dfmt on } } +/// Normalization strategies +enum NormalizationStrategy +{ + SilentlyAccept, /// Silently accept unnormalized strategies + Normalize, /// Unimplemented + Deprecate, /// Emit deprecations but accept + Warning, /// Emit warning but accept +} + +/** +State for normalization quick check algorithm. + +https://unicode.org/reports/tr15/#Detecting_Normalization_Forms +*/ +struct UnicodeQuickCheckState +{ + ubyte lastCCC; + bool isNormalized = true; +} + /** Convenience function for use in places where we just don't care, what the identifier ranges are, or if it is start/continue. @@ -71,7 +150,6 @@ Returns: is character a member of least restrictive of all. */ bool isAnyIdentifierCharacter(dchar c) { - import dmd.common.identifiertables; return isInRange!LeastRestrictive_OfAll(c); } @@ -89,7 +167,6 @@ Returns: is character a member of restrictive Start */ bool isAnyStart(dchar c) { - import dmd.common.identifiertables; return isInRange!LeastRestrictive_Start(c); } @@ -107,7 +184,6 @@ Returns: is character a member of least restrictive Continue */ bool isAnyContinue(dchar c) { - import dmd.common.identifiertables; return isInRange!LeastRestrictive_Continue(c); } @@ -124,8 +200,8 @@ enum PS = 0x2029; private { - enum CMoctal = 0x1; - enum CMhex = 0x2; + enum CMoctal = 0x1; + enum CMhex = 0x2; enum CMidchar = 0x4; enum CMzerosecond = 0x8; enum CMdigitsecond = 0x10; @@ -171,50 +247,153 @@ bool issinglechar(const char c) /// bool c_isxdigit(const int c) { - return (( c >= '0' && c <= '9') || - ( c >= 'a' && c <= 'f') || - ( c >= 'A' && c <= 'F')); + return ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')); } /// bool c_isalnum(const int c) { - return (( c >= '0' && c <= '9') || - ( c >= 'a' && c <= 'z') || - ( c >= 'A' && c <= 'Z')); + return ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); } -extern(D) private: +extern (D) private: -// originally from dmd.root.utf bool isInRange(alias Ranges)(dchar c) { - size_t high = Ranges.length - 1; - // Shortcut search if c is out of range - size_t low = (c < Ranges[0][0] || Ranges[high][1] < c) ? high + 1 : 0; - // Binary search - while (low <= high) + pragma(inline, true); + return findInBinaryTablePair!Ranges(c) >= 0; +} + +bool isInRange(alias Ranges)(dchar c, ref UnicodeQuickCheckState unicodeQuickCheckState) +{ + // Boot strap compiler cannot inline this function. + // As of 2024Q1 + + if (findInBinaryTablePair!Ranges(c) < 0) + return false; + + // For more information on the following see the normalization quick check algorithm. + // https://unicode.org/reports/tr15/#Detecting_Normalization_Forms + + // Note how maybe gets rolled into no, + // from a practical stand point that means we have to do normalization more often. + // But it also means we can simplify our implementation greatly. + + const isNormalized = findInBinaryTablePair!IsCharacterNotNormalized(c) >= 0; + + const cccIndex = findInBinaryTablePair!IndexTableForCCC(c); + assert(cccIndex >= 0, "CCC lookup table _must_ have every CCC value for each character in any input character table, unmapped value provided."); + const ccc = ValueTableForCCC[cccIndex]; + + // If we are not normalized + // or if our last ccc is more than ours + // and ours isn't a starter. + // Then we have a bit of a problem, + // this can't be normalized. + if (!isNormalized || (unicodeQuickCheckState.lastCCC > ccc && ccc > 0)) + unicodeQuickCheckState.isNormalized = false; + + unicodeQuickCheckState.lastCCC = ccc; + return true; +} + +// The reason we return a ptrdiff_t, is to be able to use it for maps. +// An index table + a value table, of same length. +// This is an appropriete approach for the CCC table, +// but will work equally well for normal check if character is in set. +ptrdiff_t findInBinaryTablePair(alias Ranges)(dchar c) +{ + // Boot strap compiler cannot inline this function. + // As of 2024Q1 + + // Buckets the ranges based upon plane (per 0xFFFF). + // Original code used wchar's instead of dchar's, + // as a result this reverts the performance back to pre-UAX31 levels, + // which is a good thing if we want it to be "fast". + static immutable PlaneOffsets = PlaneOffsetForRanges!Ranges; + + // Do not attempt to optimize this further by switching off of bucketed binary search without benchmarking. + // Alternatives that were attempted: + // - Binary search (original) + // - Bucketed binary search (by plane) + // - Fibonaccian search (naive) + // - Fibonaccian search (Knuth) + // - Bucketed Fibonaccian search (Knuth) + // Bucketed binary search was just under half the running time over binary search. + // Fibonaccian search (Knuth) may seem like an ultra good idea to take advantage of probabilities, + // and it may be better, however... + // it uses a lot of ROM and any wins is only over the binary search and not the bucketed binary search. + + // It may appear to be a good idea to inject extra information into the tables LSB, + // such as the Yes/No/Maybe NFC normalized table, + // however it will balloon the source file over 98mb. + // Use separate tables, even if it costs a little more CPU and ROM. + + const plane = c >> 16; + // Due to universal character names for ImportC, the plane may be > 16. + // This is not a bug in this code, but does indicate bad input. + if (plane > 16) + return -1; + + const planeStart = PlaneOffsets[plane], planeNextStart = PlaneOffsets[plane + 1]; + if (planeStart < planeNextStart) { - const size_t mid = low + ((high - low) >> 1); - if (c < Ranges[mid][0]) - high = mid - 1; - else if (Ranges[mid][1] < c) - low = mid + 1; - else + immutable(dchar[2][]) pairs = Ranges[planeStart .. planeNextStart]; + + size_t high = pairs.length - 1; + // Shortcut search if c is out of range + size_t low = (c < pairs[0][0] || pairs[high][1] < c) ? high + 1 : 0; + + // Binary search + while (low <= high) + { + const mid = low + ((high - low) >> 1); + + if (c < pairs[mid][0]) + high = mid - 1; + else if (pairs[mid][1] < c) + low = mid + 1; + else + { + assert(pairs[mid][0] <= c && c <= pairs[mid][1]); + return planeStart + mid; + } + } + } + + return -1; +} + +// Verify that all the tables can actually find start/mid/end in them +unittest +{ + void verify(alias Ranges, alias ToTest)() + { + foreach (toTest; ToTest) { - assert(Ranges[mid][0] <= c && c <= Ranges[mid][1]); - return true; + const c = cast(dchar) toTest[0]; + const index = toTest[1]; + + assert(findInBinaryTablePair!Ranges(c) == index); } } - return false; + + verify!(UAX31_Start, UAX31_Start_Test); + verify!(UAX31_Continue, UAX31_Continue_Test); + verify!(FixedTable_C99_Continue, FixedTable_C99_Continue_Test); + verify!(FixedTable_C11_Continue, FixedTable_C11_Continue_Test); + verify!(LeastRestrictive_OfAll, LeastRestrictive_OfAll_Test); + verify!(LeastRestrictive_Start, LeastRestrictive_Start_Test); + verify!(LeastRestrictive_Continue, LeastRestrictive_Continue_Test); + verify!(IsCharacterNotNormalized, IsCharacterNotNormalized_Test); + verify!(IndexTableForCCC, IndexTableForCCC_Test); } /******************************************** * Do our own char maps */ // originally from dmd.lexer (was private) -static immutable cmtable = () -{ +static immutable cmtable = () { ubyte[256] table; foreach (const c; 0 .. table.length) { @@ -227,40 +406,48 @@ static immutable cmtable = () switch (c) { - case 'x': case 'X': - case 'b': case 'B': - table[c] |= CMzerosecond; - break; - - case '0': .. case '9': - case 'e': case 'E': - case 'f': case 'F': - case 'l': case 'L': - case 'p': case 'P': - case 'u': case 'U': - case 'i': - case '.': - case '_': - table[c] |= CMzerosecond | CMdigitsecond; - break; - - default: - break; + case 'x': + case 'X': + case 'b': + case 'B': + table[c] |= CMzerosecond; + break; + + case '0': + .. case '9': + case 'e': + case 'E': + case 'f': + case 'F': + case 'l': + case 'L': + case 'p': + case 'P': + case 'u': + case 'U': + case 'i': + case '.': + case '_': + table[c] |= CMzerosecond | CMdigitsecond; + break; + + default: + break; } switch (c) { - case '\\': - case '\n': - case '\r': - case 0: - case 0x1A: - case '\'': - break; - default: - if (!(c & 0x80)) - table[c] |= CMsinglechar; - break; + case '\\': + case '\n': + case '\r': + case 0: + case 0x1A: + case '\'': + break; + default: + if (!(c & 0x80)) + table[c] |= CMsinglechar; + break; } } return table; diff --git a/compiler/src/dmd/common/identifiertables.d b/compiler/src/dmd/common/identifiertables.d index b87e9fac094e..b29afacaa153 100644 --- a/compiler/src/dmd/common/identifiertables.d +++ b/compiler/src/dmd/common/identifiertables.d @@ -6,671 +6,190 @@ UAX31 profile Start Entries: 136892 */ static immutable dchar[2][] UAX31_Start = [ - [0xAA, 0xAA], - [0xB5, 0xB5], - [0xBA, 0xBA], - [0xC0, 0xD6], - [0xD8, 0xF6], - [0xF8, 0x2C1], - [0x2C6, 0x2D1], - [0x2E0, 0x2E4], - [0x2EC, 0x2EC], - [0x2EE, 0x2EE], - [0x370, 0x374], - [0x376, 0x377], - [0x37B, 0x37D], - [0x37F, 0x37F], - [0x386, 0x386], - [0x388, 0x38A], - [0x38C, 0x38C], - [0x38E, 0x3A1], - [0x3A3, 0x3F5], - [0x3F7, 0x481], - [0x48A, 0x52F], - [0x531, 0x556], - [0x559, 0x559], - [0x560, 0x588], - [0x5D0, 0x5EA], - [0x5EF, 0x5F2], - [0x620, 0x64A], - [0x66E, 0x66F], - [0x671, 0x6D3], - [0x6D5, 0x6D5], - [0x6E5, 0x6E6], - [0x6EE, 0x6EF], - [0x6FA, 0x6FC], - [0x6FF, 0x6FF], - [0x710, 0x710], - [0x712, 0x72F], - [0x74D, 0x7A5], - [0x7B1, 0x7B1], - [0x7CA, 0x7EA], - [0x7F4, 0x7F5], - [0x7FA, 0x7FA], - [0x800, 0x815], - [0x81A, 0x81A], - [0x824, 0x824], - [0x828, 0x828], - [0x840, 0x858], - [0x860, 0x86A], - [0x870, 0x887], - [0x889, 0x88E], - [0x8A0, 0x8C9], - [0x904, 0x939], - [0x93D, 0x93D], - [0x950, 0x950], - [0x958, 0x961], - [0x971, 0x980], - [0x985, 0x98C], - [0x98F, 0x990], - [0x993, 0x9A8], - [0x9AA, 0x9B0], - [0x9B2, 0x9B2], - [0x9B6, 0x9B9], - [0x9BD, 0x9BD], - [0x9CE, 0x9CE], - [0x9DC, 0x9DD], - [0x9DF, 0x9E1], - [0x9F0, 0x9F1], - [0x9FC, 0x9FC], - [0xA05, 0xA0A], - [0xA0F, 0xA10], - [0xA13, 0xA28], - [0xA2A, 0xA30], - [0xA32, 0xA33], - [0xA35, 0xA36], - [0xA38, 0xA39], - [0xA59, 0xA5C], - [0xA5E, 0xA5E], - [0xA72, 0xA74], - [0xA85, 0xA8D], - [0xA8F, 0xA91], - [0xA93, 0xAA8], - [0xAAA, 0xAB0], - [0xAB2, 0xAB3], - [0xAB5, 0xAB9], - [0xABD, 0xABD], - [0xAD0, 0xAD0], - [0xAE0, 0xAE1], - [0xAF9, 0xAF9], - [0xB05, 0xB0C], - [0xB0F, 0xB10], - [0xB13, 0xB28], - [0xB2A, 0xB30], - [0xB32, 0xB33], - [0xB35, 0xB39], - [0xB3D, 0xB3D], - [0xB5C, 0xB5D], - [0xB5F, 0xB61], - [0xB71, 0xB71], - [0xB83, 0xB83], - [0xB85, 0xB8A], - [0xB8E, 0xB90], - [0xB92, 0xB95], - [0xB99, 0xB9A], - [0xB9C, 0xB9C], - [0xB9E, 0xB9F], - [0xBA3, 0xBA4], - [0xBA8, 0xBAA], - [0xBAE, 0xBB9], - [0xBD0, 0xBD0], - [0xC05, 0xC0C], - [0xC0E, 0xC10], - [0xC12, 0xC28], - [0xC2A, 0xC39], - [0xC3D, 0xC3D], - [0xC58, 0xC5A], - [0xC5D, 0xC5D], - [0xC60, 0xC61], - [0xC80, 0xC80], - [0xC85, 0xC8C], - [0xC8E, 0xC90], - [0xC92, 0xCA8], - [0xCAA, 0xCB3], - [0xCB5, 0xCB9], - [0xCBD, 0xCBD], - [0xCDD, 0xCDE], - [0xCE0, 0xCE1], - [0xCF1, 0xCF2], - [0xD04, 0xD0C], - [0xD0E, 0xD10], - [0xD12, 0xD3A], - [0xD3D, 0xD3D], - [0xD4E, 0xD4E], - [0xD54, 0xD56], - [0xD5F, 0xD61], - [0xD7A, 0xD7F], - [0xD85, 0xD96], - [0xD9A, 0xDB1], - [0xDB3, 0xDBB], - [0xDBD, 0xDBD], - [0xDC0, 0xDC6], - [0xE01, 0xE30], - [0xE32, 0xE32], - [0xE40, 0xE46], - [0xE81, 0xE82], - [0xE84, 0xE84], - [0xE86, 0xE8A], - [0xE8C, 0xEA3], - [0xEA5, 0xEA5], - [0xEA7, 0xEB0], - [0xEB2, 0xEB2], - [0xEBD, 0xEBD], - [0xEC0, 0xEC4], - [0xEC6, 0xEC6], - [0xEDC, 0xEDF], - [0xF00, 0xF00], - [0xF40, 0xF47], - [0xF49, 0xF6C], - [0xF88, 0xF8C], - [0x1000, 0x102A], - [0x103F, 0x103F], - [0x1050, 0x1055], - [0x105A, 0x105D], - [0x1061, 0x1061], - [0x1065, 0x1066], - [0x106E, 0x1070], - [0x1075, 0x1081], - [0x108E, 0x108E], - [0x10A0, 0x10C5], - [0x10C7, 0x10C7], - [0x10CD, 0x10CD], - [0x10D0, 0x10FA], - [0x10FC, 0x1248], - [0x124A, 0x124D], - [0x1250, 0x1256], - [0x1258, 0x1258], - [0x125A, 0x125D], - [0x1260, 0x1288], - [0x128A, 0x128D], - [0x1290, 0x12B0], - [0x12B2, 0x12B5], - [0x12B8, 0x12BE], - [0x12C0, 0x12C0], - [0x12C2, 0x12C5], - [0x12C8, 0x12D6], - [0x12D8, 0x1310], - [0x1312, 0x1315], - [0x1318, 0x135A], - [0x1380, 0x138F], - [0x13A0, 0x13F5], - [0x13F8, 0x13FD], - [0x1401, 0x166C], - [0x166F, 0x167F], - [0x1681, 0x169A], - [0x16A0, 0x16EA], - [0x16EE, 0x16F8], - [0x1700, 0x1711], - [0x171F, 0x1731], - [0x1740, 0x1751], - [0x1760, 0x176C], - [0x176E, 0x1770], - [0x1780, 0x17B3], - [0x17D7, 0x17D7], - [0x17DC, 0x17DC], - [0x1820, 0x1878], - [0x1880, 0x18A8], - [0x18AA, 0x18AA], - [0x18B0, 0x18F5], - [0x1900, 0x191E], - [0x1950, 0x196D], - [0x1970, 0x1974], - [0x1980, 0x19AB], - [0x19B0, 0x19C9], - [0x1A00, 0x1A16], - [0x1A20, 0x1A54], - [0x1AA7, 0x1AA7], - [0x1B05, 0x1B33], - [0x1B45, 0x1B4C], - [0x1B83, 0x1BA0], - [0x1BAE, 0x1BAF], - [0x1BBA, 0x1BE5], - [0x1C00, 0x1C23], - [0x1C4D, 0x1C4F], - [0x1C5A, 0x1C7D], - [0x1C80, 0x1C88], - [0x1C90, 0x1CBA], - [0x1CBD, 0x1CBF], - [0x1CE9, 0x1CEC], - [0x1CEE, 0x1CF3], - [0x1CF5, 0x1CF6], - [0x1CFA, 0x1CFA], - [0x1D00, 0x1DBF], - [0x1E00, 0x1F15], - [0x1F18, 0x1F1D], - [0x1F20, 0x1F45], - [0x1F48, 0x1F4D], - [0x1F50, 0x1F57], - [0x1F59, 0x1F59], - [0x1F5B, 0x1F5B], - [0x1F5D, 0x1F5D], - [0x1F5F, 0x1F7D], - [0x1F80, 0x1FB4], - [0x1FB6, 0x1FBC], - [0x1FBE, 0x1FBE], - [0x1FC2, 0x1FC4], - [0x1FC6, 0x1FCC], - [0x1FD0, 0x1FD3], - [0x1FD6, 0x1FDB], - [0x1FE0, 0x1FEC], - [0x1FF2, 0x1FF4], - [0x1FF6, 0x1FFC], - [0x2071, 0x2071], - [0x207F, 0x207F], - [0x2090, 0x209C], - [0x2102, 0x2102], - [0x2107, 0x2107], - [0x210A, 0x2113], - [0x2115, 0x2115], - [0x2118, 0x211D], - [0x2124, 0x2124], - [0x2126, 0x2126], - [0x2128, 0x2128], - [0x212A, 0x2139], - [0x213C, 0x213F], - [0x2145, 0x2149], - [0x214E, 0x214E], - [0x2160, 0x2188], - [0x2C00, 0x2CE4], - [0x2CEB, 0x2CEE], - [0x2CF2, 0x2CF3], - [0x2D00, 0x2D25], - [0x2D27, 0x2D27], - [0x2D2D, 0x2D2D], - [0x2D30, 0x2D67], - [0x2D6F, 0x2D6F], - [0x2D80, 0x2D96], - [0x2DA0, 0x2DA6], - [0x2DA8, 0x2DAE], - [0x2DB0, 0x2DB6], - [0x2DB8, 0x2DBE], - [0x2DC0, 0x2DC6], - [0x2DC8, 0x2DCE], - [0x2DD0, 0x2DD6], - [0x2DD8, 0x2DDE], - [0x3005, 0x3007], - [0x3021, 0x3029], - [0x3031, 0x3035], - [0x3038, 0x303C], - [0x3041, 0x3096], - [0x309D, 0x309F], - [0x30A1, 0x30FA], - [0x30FC, 0x30FF], - [0x3105, 0x312F], - [0x3131, 0x318E], - [0x31A0, 0x31BF], - [0x31F0, 0x31FF], - [0x3400, 0x4DBF], - [0x4E00, 0xA48C], - [0xA4D0, 0xA4FD], - [0xA500, 0xA60C], - [0xA610, 0xA61F], - [0xA62A, 0xA62B], - [0xA640, 0xA66E], - [0xA67F, 0xA69D], - [0xA6A0, 0xA6EF], - [0xA717, 0xA71F], - [0xA722, 0xA788], - [0xA78B, 0xA7CA], - [0xA7D0, 0xA7D1], - [0xA7D3, 0xA7D3], - [0xA7D5, 0xA7D9], - [0xA7F2, 0xA801], - [0xA803, 0xA805], - [0xA807, 0xA80A], - [0xA80C, 0xA822], - [0xA840, 0xA873], - [0xA882, 0xA8B3], - [0xA8F2, 0xA8F7], - [0xA8FB, 0xA8FB], - [0xA8FD, 0xA8FE], - [0xA90A, 0xA925], - [0xA930, 0xA946], - [0xA960, 0xA97C], - [0xA984, 0xA9B2], - [0xA9CF, 0xA9CF], - [0xA9E0, 0xA9E4], - [0xA9E6, 0xA9EF], - [0xA9FA, 0xA9FE], - [0xAA00, 0xAA28], - [0xAA40, 0xAA42], - [0xAA44, 0xAA4B], - [0xAA60, 0xAA76], - [0xAA7A, 0xAA7A], - [0xAA7E, 0xAAAF], - [0xAAB1, 0xAAB1], - [0xAAB5, 0xAAB6], - [0xAAB9, 0xAABD], - [0xAAC0, 0xAAC0], - [0xAAC2, 0xAAC2], - [0xAADB, 0xAADD], - [0xAAE0, 0xAAEA], - [0xAAF2, 0xAAF4], - [0xAB01, 0xAB06], - [0xAB09, 0xAB0E], - [0xAB11, 0xAB16], - [0xAB20, 0xAB26], - [0xAB28, 0xAB2E], - [0xAB30, 0xAB5A], - [0xAB5C, 0xAB69], - [0xAB70, 0xABE2], - [0xAC00, 0xD7A3], - [0xD7B0, 0xD7C6], - [0xD7CB, 0xD7FB], - [0xF900, 0xFA6D], - [0xFA70, 0xFAD9], - [0xFB00, 0xFB06], - [0xFB13, 0xFB17], - [0xFB1D, 0xFB1D], - [0xFB1F, 0xFB28], - [0xFB2A, 0xFB36], - [0xFB38, 0xFB3C], - [0xFB3E, 0xFB3E], - [0xFB40, 0xFB41], - [0xFB43, 0xFB44], - [0xFB46, 0xFBB1], - [0xFBD3, 0xFC5D], - [0xFC64, 0xFD3D], - [0xFD50, 0xFD8F], - [0xFD92, 0xFDC7], - [0xFDF0, 0xFDF9], - [0xFE71, 0xFE71], - [0xFE73, 0xFE73], - [0xFE77, 0xFE77], - [0xFE79, 0xFE79], - [0xFE7B, 0xFE7B], - [0xFE7D, 0xFE7D], - [0xFE7F, 0xFEFC], - [0xFF21, 0xFF3A], - [0xFF41, 0xFF5A], - [0xFF66, 0xFF9D], - [0xFFA0, 0xFFBE], - [0xFFC2, 0xFFC7], - [0xFFCA, 0xFFCF], - [0xFFD2, 0xFFD7], - [0xFFDA, 0xFFDC], - [0x10000, 0x1000B], - [0x1000D, 0x10026], - [0x10028, 0x1003A], - [0x1003C, 0x1003D], - [0x1003F, 0x1004D], - [0x10050, 0x1005D], - [0x10080, 0x100FA], - [0x10140, 0x10174], - [0x10280, 0x1029C], - [0x102A0, 0x102D0], - [0x10300, 0x1031F], - [0x1032D, 0x1034A], - [0x10350, 0x10375], - [0x10380, 0x1039D], - [0x103A0, 0x103C3], - [0x103C8, 0x103CF], - [0x103D1, 0x103D5], - [0x10400, 0x1049D], - [0x104B0, 0x104D3], - [0x104D8, 0x104FB], - [0x10500, 0x10527], - [0x10530, 0x10563], - [0x10570, 0x1057A], - [0x1057C, 0x1058A], - [0x1058C, 0x10592], - [0x10594, 0x10595], - [0x10597, 0x105A1], - [0x105A3, 0x105B1], - [0x105B3, 0x105B9], - [0x105BB, 0x105BC], - [0x10600, 0x10736], - [0x10740, 0x10755], - [0x10760, 0x10767], - [0x10780, 0x10785], - [0x10787, 0x107B0], - [0x107B2, 0x107BA], - [0x10800, 0x10805], - [0x10808, 0x10808], - [0x1080A, 0x10835], - [0x10837, 0x10838], - [0x1083C, 0x1083C], - [0x1083F, 0x10855], - [0x10860, 0x10876], - [0x10880, 0x1089E], - [0x108E0, 0x108F2], - [0x108F4, 0x108F5], - [0x10900, 0x10915], - [0x10920, 0x10939], - [0x10980, 0x109B7], - [0x109BE, 0x109BF], - [0x10A00, 0x10A00], - [0x10A10, 0x10A13], - [0x10A15, 0x10A17], - [0x10A19, 0x10A35], - [0x10A60, 0x10A7C], - [0x10A80, 0x10A9C], - [0x10AC0, 0x10AC7], - [0x10AC9, 0x10AE4], - [0x10B00, 0x10B35], - [0x10B40, 0x10B55], - [0x10B60, 0x10B72], - [0x10B80, 0x10B91], - [0x10C00, 0x10C48], - [0x10C80, 0x10CB2], - [0x10CC0, 0x10CF2], - [0x10D00, 0x10D23], - [0x10E80, 0x10EA9], - [0x10EB0, 0x10EB1], - [0x10F00, 0x10F1C], - [0x10F27, 0x10F27], - [0x10F30, 0x10F45], - [0x10F70, 0x10F81], - [0x10FB0, 0x10FC4], - [0x10FE0, 0x10FF6], - [0x11003, 0x11037], - [0x11071, 0x11072], - [0x11075, 0x11075], - [0x11083, 0x110AF], - [0x110D0, 0x110E8], - [0x11103, 0x11126], - [0x11144, 0x11144], - [0x11147, 0x11147], - [0x11150, 0x11172], - [0x11176, 0x11176], - [0x11183, 0x111B2], - [0x111C1, 0x111C4], - [0x111DA, 0x111DA], - [0x111DC, 0x111DC], - [0x11200, 0x11211], - [0x11213, 0x1122B], - [0x1123F, 0x11240], - [0x11280, 0x11286], - [0x11288, 0x11288], - [0x1128A, 0x1128D], - [0x1128F, 0x1129D], - [0x1129F, 0x112A8], - [0x112B0, 0x112DE], - [0x11305, 0x1130C], - [0x1130F, 0x11310], - [0x11313, 0x11328], - [0x1132A, 0x11330], - [0x11332, 0x11333], - [0x11335, 0x11339], - [0x1133D, 0x1133D], - [0x11350, 0x11350], - [0x1135D, 0x11361], - [0x11400, 0x11434], - [0x11447, 0x1144A], - [0x1145F, 0x11461], - [0x11480, 0x114AF], - [0x114C4, 0x114C5], - [0x114C7, 0x114C7], - [0x11580, 0x115AE], - [0x115D8, 0x115DB], - [0x11600, 0x1162F], - [0x11644, 0x11644], - [0x11680, 0x116AA], - [0x116B8, 0x116B8], - [0x11700, 0x1171A], - [0x11740, 0x11746], - [0x11800, 0x1182B], - [0x118A0, 0x118DF], - [0x118FF, 0x11906], - [0x11909, 0x11909], - [0x1190C, 0x11913], - [0x11915, 0x11916], - [0x11918, 0x1192F], - [0x1193F, 0x1193F], - [0x11941, 0x11941], - [0x119A0, 0x119A7], - [0x119AA, 0x119D0], - [0x119E1, 0x119E1], - [0x119E3, 0x119E3], - [0x11A00, 0x11A00], - [0x11A0B, 0x11A32], - [0x11A3A, 0x11A3A], - [0x11A50, 0x11A50], - [0x11A5C, 0x11A89], - [0x11A9D, 0x11A9D], - [0x11AB0, 0x11AF8], - [0x11C00, 0x11C08], - [0x11C0A, 0x11C2E], - [0x11C40, 0x11C40], - [0x11C72, 0x11C8F], - [0x11D00, 0x11D06], - [0x11D08, 0x11D09], - [0x11D0B, 0x11D30], - [0x11D46, 0x11D46], - [0x11D60, 0x11D65], - [0x11D67, 0x11D68], - [0x11D6A, 0x11D89], - [0x11D98, 0x11D98], - [0x11EE0, 0x11EF2], - [0x11F02, 0x11F02], - [0x11F04, 0x11F10], - [0x11F12, 0x11F33], - [0x11FB0, 0x11FB0], - [0x12000, 0x12399], - [0x12400, 0x1246E], - [0x12480, 0x12543], - [0x12F90, 0x12FF0], - [0x13000, 0x1342F], - [0x13441, 0x13446], - [0x14400, 0x14646], - [0x16800, 0x16A38], - [0x16A40, 0x16A5E], - [0x16A70, 0x16ABE], - [0x16AD0, 0x16AED], - [0x16B00, 0x16B2F], - [0x16B40, 0x16B43], - [0x16B63, 0x16B77], - [0x16B7D, 0x16B8F], - [0x16E40, 0x16E7F], - [0x16F00, 0x16F4A], - [0x16F50, 0x16F50], - [0x16F93, 0x16F9F], - [0x16FE0, 0x16FE1], - [0x16FE3, 0x16FE3], - [0x17000, 0x187F7], - [0x18800, 0x18CD5], - [0x18D00, 0x18D08], - [0x1AFF0, 0x1AFF3], - [0x1AFF5, 0x1AFFB], - [0x1AFFD, 0x1AFFE], - [0x1B000, 0x1B122], - [0x1B132, 0x1B132], - [0x1B150, 0x1B152], - [0x1B155, 0x1B155], - [0x1B164, 0x1B167], - [0x1B170, 0x1B2FB], - [0x1BC00, 0x1BC6A], - [0x1BC70, 0x1BC7C], - [0x1BC80, 0x1BC88], - [0x1BC90, 0x1BC99], - [0x1D400, 0x1D454], - [0x1D456, 0x1D49C], - [0x1D49E, 0x1D49F], - [0x1D4A2, 0x1D4A2], - [0x1D4A5, 0x1D4A6], - [0x1D4A9, 0x1D4AC], - [0x1D4AE, 0x1D4B9], - [0x1D4BB, 0x1D4BB], - [0x1D4BD, 0x1D4C3], - [0x1D4C5, 0x1D505], - [0x1D507, 0x1D50A], - [0x1D50D, 0x1D514], - [0x1D516, 0x1D51C], - [0x1D51E, 0x1D539], - [0x1D53B, 0x1D53E], - [0x1D540, 0x1D544], - [0x1D546, 0x1D546], - [0x1D54A, 0x1D550], - [0x1D552, 0x1D6A5], - [0x1D6A8, 0x1D6C0], - [0x1D6C2, 0x1D6DA], - [0x1D6DC, 0x1D6FA], - [0x1D6FC, 0x1D714], - [0x1D716, 0x1D734], - [0x1D736, 0x1D74E], - [0x1D750, 0x1D76E], - [0x1D770, 0x1D788], - [0x1D78A, 0x1D7A8], - [0x1D7AA, 0x1D7C2], - [0x1D7C4, 0x1D7CB], - [0x1DF00, 0x1DF1E], - [0x1DF25, 0x1DF2A], - [0x1E030, 0x1E06D], - [0x1E100, 0x1E12C], - [0x1E137, 0x1E13D], - [0x1E14E, 0x1E14E], - [0x1E290, 0x1E2AD], - [0x1E2C0, 0x1E2EB], - [0x1E4D0, 0x1E4EB], - [0x1E7E0, 0x1E7E6], - [0x1E7E8, 0x1E7EB], - [0x1E7ED, 0x1E7EE], - [0x1E7F0, 0x1E7FE], - [0x1E800, 0x1E8C4], - [0x1E900, 0x1E943], - [0x1E94B, 0x1E94B], - [0x1EE00, 0x1EE03], - [0x1EE05, 0x1EE1F], - [0x1EE21, 0x1EE22], - [0x1EE24, 0x1EE24], - [0x1EE27, 0x1EE27], - [0x1EE29, 0x1EE32], - [0x1EE34, 0x1EE37], - [0x1EE39, 0x1EE39], - [0x1EE3B, 0x1EE3B], - [0x1EE42, 0x1EE42], - [0x1EE47, 0x1EE47], - [0x1EE49, 0x1EE49], - [0x1EE4B, 0x1EE4B], - [0x1EE4D, 0x1EE4F], - [0x1EE51, 0x1EE52], - [0x1EE54, 0x1EE54], - [0x1EE57, 0x1EE57], - [0x1EE59, 0x1EE59], - [0x1EE5B, 0x1EE5B], - [0x1EE5D, 0x1EE5D], - [0x1EE5F, 0x1EE5F], - [0x1EE61, 0x1EE62], - [0x1EE64, 0x1EE64], - [0x1EE67, 0x1EE6A], - [0x1EE6C, 0x1EE72], - [0x1EE74, 0x1EE77], - [0x1EE79, 0x1EE7C], - [0x1EE7E, 0x1EE7E], - [0x1EE80, 0x1EE89], - [0x1EE8B, 0x1EE9B], - [0x1EEA1, 0x1EEA3], - [0x1EEA5, 0x1EEA9], - [0x1EEAB, 0x1EEBB], - [0x20000, 0x2A6DF], - [0x2A700, 0x2B739], - [0x2B740, 0x2B81D], - [0x2B820, 0x2CEA1], - [0x2CEB0, 0x2EBE0], - [0x2EBF0, 0x2EE5D], - [0x2F800, 0x2FA1D], - [0x30000, 0x3134A], - [0x31350, 0x323AF], + [0xAA, 0xAA], [0xB5, 0xB5], [0xBA, 0xBA], [0xC0, 0xD6], + [0xD8, 0xF6], [0xF8, 0x2C1], [0x2C6, 0x2D1], [0x2E0, 0x2E4], + [0x2EC, 0x2EC], [0x2EE, 0x2EE], [0x370, 0x374], [0x376, 0x377], + [0x37B, 0x37D], [0x37F, 0x37F], [0x386, 0x386], [0x388, 0x38A], + [0x38C, 0x38C], [0x38E, 0x3A1], [0x3A3, 0x3F5], [0x3F7, 0x481], + [0x48A, 0x52F], [0x531, 0x556], [0x559, 0x559], [0x560, 0x588], + [0x5D0, 0x5EA], [0x5EF, 0x5F2], [0x620, 0x64A], [0x66E, 0x66F], + [0x671, 0x6D3], [0x6D5, 0x6D5], [0x6E5, 0x6E6], [0x6EE, 0x6EF], + [0x6FA, 0x6FC], [0x6FF, 0x6FF], [0x710, 0x710], [0x712, 0x72F], + [0x74D, 0x7A5], [0x7B1, 0x7B1], [0x7CA, 0x7EA], [0x7F4, 0x7F5], + [0x7FA, 0x7FA], [0x800, 0x815], [0x81A, 0x81A], [0x824, 0x824], + [0x828, 0x828], [0x840, 0x858], [0x860, 0x86A], [0x870, 0x887], + [0x889, 0x88E], [0x8A0, 0x8C9], [0x904, 0x939], [0x93D, 0x93D], + [0x950, 0x950], [0x958, 0x961], [0x971, 0x980], [0x985, 0x98C], + [0x98F, 0x990], [0x993, 0x9A8], [0x9AA, 0x9B0], [0x9B2, 0x9B2], + [0x9B6, 0x9B9], [0x9BD, 0x9BD], [0x9CE, 0x9CE], [0x9DC, 0x9DD], + [0x9DF, 0x9E1], [0x9F0, 0x9F1], [0x9FC, 0x9FC], [0xA05, 0xA0A], + [0xA0F, 0xA10], [0xA13, 0xA28], [0xA2A, 0xA30], [0xA32, 0xA33], + [0xA35, 0xA36], [0xA38, 0xA39], [0xA59, 0xA5C], [0xA5E, 0xA5E], + [0xA72, 0xA74], [0xA85, 0xA8D], [0xA8F, 0xA91], [0xA93, 0xAA8], + [0xAAA, 0xAB0], [0xAB2, 0xAB3], [0xAB5, 0xAB9], [0xABD, 0xABD], + [0xAD0, 0xAD0], [0xAE0, 0xAE1], [0xAF9, 0xAF9], [0xB05, 0xB0C], + [0xB0F, 0xB10], [0xB13, 0xB28], [0xB2A, 0xB30], [0xB32, 0xB33], + [0xB35, 0xB39], [0xB3D, 0xB3D], [0xB5C, 0xB5D], [0xB5F, 0xB61], + [0xB71, 0xB71], [0xB83, 0xB83], [0xB85, 0xB8A], [0xB8E, 0xB90], + [0xB92, 0xB95], [0xB99, 0xB9A], [0xB9C, 0xB9C], [0xB9E, 0xB9F], + [0xBA3, 0xBA4], [0xBA8, 0xBAA], [0xBAE, 0xBB9], [0xBD0, 0xBD0], + [0xC05, 0xC0C], [0xC0E, 0xC10], [0xC12, 0xC28], [0xC2A, 0xC39], + [0xC3D, 0xC3D], [0xC58, 0xC5A], [0xC5D, 0xC5D], [0xC60, 0xC61], + [0xC80, 0xC80], [0xC85, 0xC8C], [0xC8E, 0xC90], [0xC92, 0xCA8], + [0xCAA, 0xCB3], [0xCB5, 0xCB9], [0xCBD, 0xCBD], [0xCDD, 0xCDE], + [0xCE0, 0xCE1], [0xCF1, 0xCF2], [0xD04, 0xD0C], [0xD0E, 0xD10], + [0xD12, 0xD3A], [0xD3D, 0xD3D], [0xD4E, 0xD4E], [0xD54, 0xD56], + [0xD5F, 0xD61], [0xD7A, 0xD7F], [0xD85, 0xD96], [0xD9A, 0xDB1], + [0xDB3, 0xDBB], [0xDBD, 0xDBD], [0xDC0, 0xDC6], [0xE01, 0xE30], + [0xE32, 0xE32], [0xE40, 0xE46], [0xE81, 0xE82], [0xE84, 0xE84], + [0xE86, 0xE8A], [0xE8C, 0xEA3], [0xEA5, 0xEA5], [0xEA7, 0xEB0], + [0xEB2, 0xEB2], [0xEBD, 0xEBD], [0xEC0, 0xEC4], [0xEC6, 0xEC6], + [0xEDC, 0xEDF], [0xF00, 0xF00], [0xF40, 0xF47], [0xF49, 0xF6C], + [0xF88, 0xF8C], [0x1000, 0x102A], [0x103F, 0x103F], [0x1050, 0x1055], + [0x105A, 0x105D], [0x1061, 0x1061], [0x1065, 0x1066], [0x106E, 0x1070], + [0x1075, 0x1081], [0x108E, 0x108E], [0x10A0, 0x10C5], [0x10C7, 0x10C7], + [0x10CD, 0x10CD], [0x10D0, 0x10FA], [0x10FC, 0x1248], [0x124A, 0x124D], + [0x1250, 0x1256], [0x1258, 0x1258], [0x125A, 0x125D], [0x1260, 0x1288], + [0x128A, 0x128D], [0x1290, 0x12B0], [0x12B2, 0x12B5], [0x12B8, 0x12BE], + [0x12C0, 0x12C0], [0x12C2, 0x12C5], [0x12C8, 0x12D6], [0x12D8, 0x1310], + [0x1312, 0x1315], [0x1318, 0x135A], [0x1380, 0x138F], [0x13A0, 0x13F5], + [0x13F8, 0x13FD], [0x1401, 0x166C], [0x166F, 0x167F], [0x1681, 0x169A], + [0x16A0, 0x16EA], [0x16EE, 0x16F8], [0x1700, 0x1711], [0x171F, 0x1731], + [0x1740, 0x1751], [0x1760, 0x176C], [0x176E, 0x1770], [0x1780, 0x17B3], + [0x17D7, 0x17D7], [0x17DC, 0x17DC], [0x1820, 0x1878], [0x1880, 0x18A8], + [0x18AA, 0x18AA], [0x18B0, 0x18F5], [0x1900, 0x191E], [0x1950, 0x196D], + [0x1970, 0x1974], [0x1980, 0x19AB], [0x19B0, 0x19C9], [0x1A00, 0x1A16], + [0x1A20, 0x1A54], [0x1AA7, 0x1AA7], [0x1B05, 0x1B33], [0x1B45, 0x1B4C], + [0x1B83, 0x1BA0], [0x1BAE, 0x1BAF], [0x1BBA, 0x1BE5], [0x1C00, 0x1C23], + [0x1C4D, 0x1C4F], [0x1C5A, 0x1C7D], [0x1C80, 0x1C88], [0x1C90, 0x1CBA], + [0x1CBD, 0x1CBF], [0x1CE9, 0x1CEC], [0x1CEE, 0x1CF3], [0x1CF5, 0x1CF6], + [0x1CFA, 0x1CFA], [0x1D00, 0x1DBF], [0x1E00, 0x1F15], [0x1F18, 0x1F1D], + [0x1F20, 0x1F45], [0x1F48, 0x1F4D], [0x1F50, 0x1F57], [0x1F59, 0x1F59], + [0x1F5B, 0x1F5B], [0x1F5D, 0x1F5D], [0x1F5F, 0x1F7D], [0x1F80, 0x1FB4], + [0x1FB6, 0x1FBC], [0x1FBE, 0x1FBE], [0x1FC2, 0x1FC4], [0x1FC6, 0x1FCC], + [0x1FD0, 0x1FD3], [0x1FD6, 0x1FDB], [0x1FE0, 0x1FEC], [0x1FF2, 0x1FF4], + [0x1FF6, 0x1FFC], [0x2071, 0x2071], [0x207F, 0x207F], [0x2090, 0x209C], + [0x2102, 0x2102], [0x2107, 0x2107], [0x210A, 0x2113], [0x2115, 0x2115], + [0x2118, 0x211D], [0x2124, 0x2124], [0x2126, 0x2126], [0x2128, 0x2128], + [0x212A, 0x2139], [0x213C, 0x213F], [0x2145, 0x2149], [0x214E, 0x214E], + [0x2160, 0x2188], [0x2C00, 0x2CE4], [0x2CEB, 0x2CEE], [0x2CF2, 0x2CF3], + [0x2D00, 0x2D25], [0x2D27, 0x2D27], [0x2D2D, 0x2D2D], [0x2D30, 0x2D67], + [0x2D6F, 0x2D6F], [0x2D80, 0x2D96], [0x2DA0, 0x2DA6], [0x2DA8, 0x2DAE], + [0x2DB0, 0x2DB6], [0x2DB8, 0x2DBE], [0x2DC0, 0x2DC6], [0x2DC8, 0x2DCE], + [0x2DD0, 0x2DD6], [0x2DD8, 0x2DDE], [0x3005, 0x3007], [0x3021, 0x3029], + [0x3031, 0x3035], [0x3038, 0x303C], [0x3041, 0x3096], [0x309D, 0x309F], + [0x30A1, 0x30FA], [0x30FC, 0x30FF], [0x3105, 0x312F], [0x3131, 0x318E], + [0x31A0, 0x31BF], [0x31F0, 0x31FF], [0x3400, 0x4DBF], [0x4E00, 0xA48C], + [0xA4D0, 0xA4FD], [0xA500, 0xA60C], [0xA610, 0xA61F], [0xA62A, 0xA62B], + [0xA640, 0xA66E], [0xA67F, 0xA69D], [0xA6A0, 0xA6EF], [0xA717, 0xA71F], + [0xA722, 0xA788], [0xA78B, 0xA7CA], [0xA7D0, 0xA7D1], [0xA7D3, 0xA7D3], + [0xA7D5, 0xA7D9], [0xA7F2, 0xA801], [0xA803, 0xA805], [0xA807, 0xA80A], + [0xA80C, 0xA822], [0xA840, 0xA873], [0xA882, 0xA8B3], [0xA8F2, 0xA8F7], + [0xA8FB, 0xA8FB], [0xA8FD, 0xA8FE], [0xA90A, 0xA925], [0xA930, 0xA946], + [0xA960, 0xA97C], [0xA984, 0xA9B2], [0xA9CF, 0xA9CF], [0xA9E0, 0xA9E4], + [0xA9E6, 0xA9EF], [0xA9FA, 0xA9FE], [0xAA00, 0xAA28], [0xAA40, 0xAA42], + [0xAA44, 0xAA4B], [0xAA60, 0xAA76], [0xAA7A, 0xAA7A], [0xAA7E, 0xAAAF], + [0xAAB1, 0xAAB1], [0xAAB5, 0xAAB6], [0xAAB9, 0xAABD], [0xAAC0, 0xAAC0], + [0xAAC2, 0xAAC2], [0xAADB, 0xAADD], [0xAAE0, 0xAAEA], [0xAAF2, 0xAAF4], + [0xAB01, 0xAB06], [0xAB09, 0xAB0E], [0xAB11, 0xAB16], [0xAB20, 0xAB26], + [0xAB28, 0xAB2E], [0xAB30, 0xAB5A], [0xAB5C, 0xAB69], [0xAB70, 0xABE2], + [0xAC00, 0xD7A3], [0xD7B0, 0xD7C6], [0xD7CB, 0xD7FB], [0xF900, 0xFA6D], + [0xFA70, 0xFAD9], [0xFB00, 0xFB06], [0xFB13, 0xFB17], [0xFB1D, 0xFB1D], + [0xFB1F, 0xFB28], [0xFB2A, 0xFB36], [0xFB38, 0xFB3C], [0xFB3E, 0xFB3E], + [0xFB40, 0xFB41], [0xFB43, 0xFB44], [0xFB46, 0xFBB1], [0xFBD3, 0xFC5D], + [0xFC64, 0xFD3D], [0xFD50, 0xFD8F], [0xFD92, 0xFDC7], [0xFDF0, 0xFDF9], + [0xFE71, 0xFE71], [0xFE73, 0xFE73], [0xFE77, 0xFE77], [0xFE79, 0xFE79], + [0xFE7B, 0xFE7B], [0xFE7D, 0xFE7D], [0xFE7F, 0xFEFC], [0xFF21, 0xFF3A], + [0xFF41, 0xFF5A], [0xFF66, 0xFF9D], [0xFFA0, 0xFFBE], [0xFFC2, 0xFFC7], + [0xFFCA, 0xFFCF], [0xFFD2, 0xFFD7], [0xFFDA, 0xFFDC], [0x10000, 0x1000B], + [0x1000D, 0x10026], [0x10028, 0x1003A], [0x1003C, 0x1003D], [0x1003F, 0x1004D], + [0x10050, 0x1005D], [0x10080, 0x100FA], [0x10140, 0x10174], [0x10280, 0x1029C], + [0x102A0, 0x102D0], [0x10300, 0x1031F], [0x1032D, 0x1034A], [0x10350, 0x10375], + [0x10380, 0x1039D], [0x103A0, 0x103C3], [0x103C8, 0x103CF], [0x103D1, 0x103D5], + [0x10400, 0x1049D], [0x104B0, 0x104D3], [0x104D8, 0x104FB], [0x10500, 0x10527], + [0x10530, 0x10563], [0x10570, 0x1057A], [0x1057C, 0x1058A], [0x1058C, 0x10592], + [0x10594, 0x10595], [0x10597, 0x105A1], [0x105A3, 0x105B1], [0x105B3, 0x105B9], + [0x105BB, 0x105BC], [0x10600, 0x10736], [0x10740, 0x10755], [0x10760, 0x10767], + [0x10780, 0x10785], [0x10787, 0x107B0], [0x107B2, 0x107BA], [0x10800, 0x10805], + [0x10808, 0x10808], [0x1080A, 0x10835], [0x10837, 0x10838], [0x1083C, 0x1083C], + [0x1083F, 0x10855], [0x10860, 0x10876], [0x10880, 0x1089E], [0x108E0, 0x108F2], + [0x108F4, 0x108F5], [0x10900, 0x10915], [0x10920, 0x10939], [0x10980, 0x109B7], + [0x109BE, 0x109BF], [0x10A00, 0x10A00], [0x10A10, 0x10A13], [0x10A15, 0x10A17], + [0x10A19, 0x10A35], [0x10A60, 0x10A7C], [0x10A80, 0x10A9C], [0x10AC0, 0x10AC7], + [0x10AC9, 0x10AE4], [0x10B00, 0x10B35], [0x10B40, 0x10B55], [0x10B60, 0x10B72], + [0x10B80, 0x10B91], [0x10C00, 0x10C48], [0x10C80, 0x10CB2], [0x10CC0, 0x10CF2], + [0x10D00, 0x10D23], [0x10E80, 0x10EA9], [0x10EB0, 0x10EB1], [0x10F00, 0x10F1C], + [0x10F27, 0x10F27], [0x10F30, 0x10F45], [0x10F70, 0x10F81], [0x10FB0, 0x10FC4], + [0x10FE0, 0x10FF6], [0x11003, 0x11037], [0x11071, 0x11072], [0x11075, 0x11075], + [0x11083, 0x110AF], [0x110D0, 0x110E8], [0x11103, 0x11126], [0x11144, 0x11144], + [0x11147, 0x11147], [0x11150, 0x11172], [0x11176, 0x11176], [0x11183, 0x111B2], + [0x111C1, 0x111C4], [0x111DA, 0x111DA], [0x111DC, 0x111DC], [0x11200, 0x11211], + [0x11213, 0x1122B], [0x1123F, 0x11240], [0x11280, 0x11286], [0x11288, 0x11288], + [0x1128A, 0x1128D], [0x1128F, 0x1129D], [0x1129F, 0x112A8], [0x112B0, 0x112DE], + [0x11305, 0x1130C], [0x1130F, 0x11310], [0x11313, 0x11328], [0x1132A, 0x11330], + [0x11332, 0x11333], [0x11335, 0x11339], [0x1133D, 0x1133D], [0x11350, 0x11350], + [0x1135D, 0x11361], [0x11400, 0x11434], [0x11447, 0x1144A], [0x1145F, 0x11461], + [0x11480, 0x114AF], [0x114C4, 0x114C5], [0x114C7, 0x114C7], [0x11580, 0x115AE], + [0x115D8, 0x115DB], [0x11600, 0x1162F], [0x11644, 0x11644], [0x11680, 0x116AA], + [0x116B8, 0x116B8], [0x11700, 0x1171A], [0x11740, 0x11746], [0x11800, 0x1182B], + [0x118A0, 0x118DF], [0x118FF, 0x11906], [0x11909, 0x11909], [0x1190C, 0x11913], + [0x11915, 0x11916], [0x11918, 0x1192F], [0x1193F, 0x1193F], [0x11941, 0x11941], + [0x119A0, 0x119A7], [0x119AA, 0x119D0], [0x119E1, 0x119E1], [0x119E3, 0x119E3], + [0x11A00, 0x11A00], [0x11A0B, 0x11A32], [0x11A3A, 0x11A3A], [0x11A50, 0x11A50], + [0x11A5C, 0x11A89], [0x11A9D, 0x11A9D], [0x11AB0, 0x11AF8], [0x11C00, 0x11C08], + [0x11C0A, 0x11C2E], [0x11C40, 0x11C40], [0x11C72, 0x11C8F], [0x11D00, 0x11D06], + [0x11D08, 0x11D09], [0x11D0B, 0x11D30], [0x11D46, 0x11D46], [0x11D60, 0x11D65], + [0x11D67, 0x11D68], [0x11D6A, 0x11D89], [0x11D98, 0x11D98], [0x11EE0, 0x11EF2], + [0x11F02, 0x11F02], [0x11F04, 0x11F10], [0x11F12, 0x11F33], [0x11FB0, 0x11FB0], + [0x12000, 0x12399], [0x12400, 0x1246E], [0x12480, 0x12543], [0x12F90, 0x12FF0], + [0x13000, 0x1342F], [0x13441, 0x13446], [0x14400, 0x14646], [0x16800, 0x16A38], + [0x16A40, 0x16A5E], [0x16A70, 0x16ABE], [0x16AD0, 0x16AED], [0x16B00, 0x16B2F], + [0x16B40, 0x16B43], [0x16B63, 0x16B77], [0x16B7D, 0x16B8F], [0x16E40, 0x16E7F], + [0x16F00, 0x16F4A], [0x16F50, 0x16F50], [0x16F93, 0x16F9F], [0x16FE0, 0x16FE1], + [0x16FE3, 0x16FE3], [0x17000, 0x187F7], [0x18800, 0x18CD5], [0x18D00, 0x18D08], + [0x1AFF0, 0x1AFF3], [0x1AFF5, 0x1AFFB], [0x1AFFD, 0x1AFFE], [0x1B000, 0x1B122], + [0x1B132, 0x1B132], [0x1B150, 0x1B152], [0x1B155, 0x1B155], [0x1B164, 0x1B167], + [0x1B170, 0x1B2FB], [0x1BC00, 0x1BC6A], [0x1BC70, 0x1BC7C], [0x1BC80, 0x1BC88], + [0x1BC90, 0x1BC99], [0x1D400, 0x1D454], [0x1D456, 0x1D49C], [0x1D49E, 0x1D49F], + [0x1D4A2, 0x1D4A2], [0x1D4A5, 0x1D4A6], [0x1D4A9, 0x1D4AC], [0x1D4AE, 0x1D4B9], + [0x1D4BB, 0x1D4BB], [0x1D4BD, 0x1D4C3], [0x1D4C5, 0x1D505], [0x1D507, 0x1D50A], + [0x1D50D, 0x1D514], [0x1D516, 0x1D51C], [0x1D51E, 0x1D539], [0x1D53B, 0x1D53E], + [0x1D540, 0x1D544], [0x1D546, 0x1D546], [0x1D54A, 0x1D550], [0x1D552, 0x1D6A5], + [0x1D6A8, 0x1D6C0], [0x1D6C2, 0x1D6DA], [0x1D6DC, 0x1D6FA], [0x1D6FC, 0x1D714], + [0x1D716, 0x1D734], [0x1D736, 0x1D74E], [0x1D750, 0x1D76E], [0x1D770, 0x1D788], + [0x1D78A, 0x1D7A8], [0x1D7AA, 0x1D7C2], [0x1D7C4, 0x1D7CB], [0x1DF00, 0x1DF1E], + [0x1DF25, 0x1DF2A], [0x1E030, 0x1E06D], [0x1E100, 0x1E12C], [0x1E137, 0x1E13D], + [0x1E14E, 0x1E14E], [0x1E290, 0x1E2AD], [0x1E2C0, 0x1E2EB], [0x1E4D0, 0x1E4EB], + [0x1E7E0, 0x1E7E6], [0x1E7E8, 0x1E7EB], [0x1E7ED, 0x1E7EE], [0x1E7F0, 0x1E7FE], + [0x1E800, 0x1E8C4], [0x1E900, 0x1E943], [0x1E94B, 0x1E94B], [0x1EE00, 0x1EE03], + [0x1EE05, 0x1EE1F], [0x1EE21, 0x1EE22], [0x1EE24, 0x1EE24], [0x1EE27, 0x1EE27], + [0x1EE29, 0x1EE32], [0x1EE34, 0x1EE37], [0x1EE39, 0x1EE39], [0x1EE3B, 0x1EE3B], + [0x1EE42, 0x1EE42], [0x1EE47, 0x1EE47], [0x1EE49, 0x1EE49], [0x1EE4B, 0x1EE4B], + [0x1EE4D, 0x1EE4F], [0x1EE51, 0x1EE52], [0x1EE54, 0x1EE54], [0x1EE57, 0x1EE57], + [0x1EE59, 0x1EE59], [0x1EE5B, 0x1EE5B], [0x1EE5D, 0x1EE5D], [0x1EE5F, 0x1EE5F], + [0x1EE61, 0x1EE62], [0x1EE64, 0x1EE64], [0x1EE67, 0x1EE6A], [0x1EE6C, 0x1EE72], + [0x1EE74, 0x1EE77], [0x1EE79, 0x1EE7C], [0x1EE7E, 0x1EE7E], [0x1EE80, 0x1EE89], + [0x1EE8B, 0x1EE9B], [0x1EEA1, 0x1EEA3], [0x1EEA5, 0x1EEA9], [0x1EEAB, 0x1EEBB], + [0x20000, 0x2A6DF], [0x2A700, 0x2B739], [0x2B740, 0x2B81D], [0x2B820, 0x2CEA1], + [0x2CEB0, 0x2EBE0], [0x2EBF0, 0x2EE5D], [0x2F800, 0x2FA1D], [0x30000, 0x3134A], + [0x31350, 0x323AF] +]; + +/** +Tests [[dchar, index] ... planes * 3] for UAX31_Start +*/ +enum uint[2][] UAX31_Start_Test = [ + [0x0000AA, 0], + [0x00168D, 191], + [0x00FFDB, 382], + [0x010005, 383], + [0x011A50, 519], + [0x01EEB3, 655], + [0x02536F, 656], + [0x02C360, 659], + [0x02F90E, 662], + [0x0309A5, 663], + [0x031B7F, 664], ]; /** @@ -678,778 +197,217 @@ UAX31 profile Continue Entries: 140026 */ static immutable dchar[2][] UAX31_Continue = [ - [0xAA, 0xAA], - [0xB5, 0xB5], - [0xB7, 0xB7], - [0xBA, 0xBA], - [0xC0, 0xD6], - [0xD8, 0xF6], - [0xF8, 0x2C1], - [0x2C6, 0x2D1], - [0x2E0, 0x2E4], - [0x2EC, 0x2EC], - [0x2EE, 0x2EE], - [0x300, 0x374], - [0x376, 0x377], - [0x37B, 0x37D], - [0x37F, 0x37F], - [0x386, 0x38A], - [0x38C, 0x38C], - [0x38E, 0x3A1], - [0x3A3, 0x3F5], - [0x3F7, 0x481], - [0x483, 0x487], - [0x48A, 0x52F], - [0x531, 0x556], - [0x559, 0x559], - [0x560, 0x588], - [0x591, 0x5BD], - [0x5BF, 0x5BF], - [0x5C1, 0x5C2], - [0x5C4, 0x5C5], - [0x5C7, 0x5C7], - [0x5D0, 0x5EA], - [0x5EF, 0x5F2], - [0x610, 0x61A], - [0x620, 0x669], - [0x66E, 0x6D3], - [0x6D5, 0x6DC], - [0x6DF, 0x6E8], - [0x6EA, 0x6FC], - [0x6FF, 0x6FF], - [0x710, 0x74A], - [0x74D, 0x7B1], - [0x7C0, 0x7F5], - [0x7FA, 0x7FA], - [0x7FD, 0x7FD], - [0x800, 0x82D], - [0x840, 0x85B], - [0x860, 0x86A], - [0x870, 0x887], - [0x889, 0x88E], - [0x898, 0x8E1], - [0x8E3, 0x963], - [0x966, 0x96F], - [0x971, 0x983], - [0x985, 0x98C], - [0x98F, 0x990], - [0x993, 0x9A8], - [0x9AA, 0x9B0], - [0x9B2, 0x9B2], - [0x9B6, 0x9B9], - [0x9BC, 0x9C4], - [0x9C7, 0x9C8], - [0x9CB, 0x9CE], - [0x9D7, 0x9D7], - [0x9DC, 0x9DD], - [0x9DF, 0x9E3], - [0x9E6, 0x9F1], - [0x9FC, 0x9FC], - [0x9FE, 0x9FE], - [0xA01, 0xA03], - [0xA05, 0xA0A], - [0xA0F, 0xA10], - [0xA13, 0xA28], - [0xA2A, 0xA30], - [0xA32, 0xA33], - [0xA35, 0xA36], - [0xA38, 0xA39], - [0xA3C, 0xA3C], - [0xA3E, 0xA42], - [0xA47, 0xA48], - [0xA4B, 0xA4D], - [0xA51, 0xA51], - [0xA59, 0xA5C], - [0xA5E, 0xA5E], - [0xA66, 0xA75], - [0xA81, 0xA83], - [0xA85, 0xA8D], - [0xA8F, 0xA91], - [0xA93, 0xAA8], - [0xAAA, 0xAB0], - [0xAB2, 0xAB3], - [0xAB5, 0xAB9], - [0xABC, 0xAC5], - [0xAC7, 0xAC9], - [0xACB, 0xACD], - [0xAD0, 0xAD0], - [0xAE0, 0xAE3], - [0xAE6, 0xAEF], - [0xAF9, 0xAFF], - [0xB01, 0xB03], - [0xB05, 0xB0C], - [0xB0F, 0xB10], - [0xB13, 0xB28], - [0xB2A, 0xB30], - [0xB32, 0xB33], - [0xB35, 0xB39], - [0xB3C, 0xB44], - [0xB47, 0xB48], - [0xB4B, 0xB4D], - [0xB55, 0xB57], - [0xB5C, 0xB5D], - [0xB5F, 0xB63], - [0xB66, 0xB6F], - [0xB71, 0xB71], - [0xB82, 0xB83], - [0xB85, 0xB8A], - [0xB8E, 0xB90], - [0xB92, 0xB95], - [0xB99, 0xB9A], - [0xB9C, 0xB9C], - [0xB9E, 0xB9F], - [0xBA3, 0xBA4], - [0xBA8, 0xBAA], - [0xBAE, 0xBB9], - [0xBBE, 0xBC2], - [0xBC6, 0xBC8], - [0xBCA, 0xBCD], - [0xBD0, 0xBD0], - [0xBD7, 0xBD7], - [0xBE6, 0xBEF], - [0xC00, 0xC0C], - [0xC0E, 0xC10], - [0xC12, 0xC28], - [0xC2A, 0xC39], - [0xC3C, 0xC44], - [0xC46, 0xC48], - [0xC4A, 0xC4D], - [0xC55, 0xC56], - [0xC58, 0xC5A], - [0xC5D, 0xC5D], - [0xC60, 0xC63], - [0xC66, 0xC6F], - [0xC80, 0xC83], - [0xC85, 0xC8C], - [0xC8E, 0xC90], - [0xC92, 0xCA8], - [0xCAA, 0xCB3], - [0xCB5, 0xCB9], - [0xCBC, 0xCC4], - [0xCC6, 0xCC8], - [0xCCA, 0xCCD], - [0xCD5, 0xCD6], - [0xCDD, 0xCDE], - [0xCE0, 0xCE3], - [0xCE6, 0xCEF], - [0xCF1, 0xCF3], - [0xD00, 0xD0C], - [0xD0E, 0xD10], - [0xD12, 0xD44], - [0xD46, 0xD48], - [0xD4A, 0xD4E], - [0xD54, 0xD57], - [0xD5F, 0xD63], - [0xD66, 0xD6F], - [0xD7A, 0xD7F], - [0xD81, 0xD83], - [0xD85, 0xD96], - [0xD9A, 0xDB1], - [0xDB3, 0xDBB], - [0xDBD, 0xDBD], - [0xDC0, 0xDC6], - [0xDCA, 0xDCA], - [0xDCF, 0xDD4], - [0xDD6, 0xDD6], - [0xDD8, 0xDDF], - [0xDE6, 0xDEF], - [0xDF2, 0xDF3], - [0xE01, 0xE3A], - [0xE40, 0xE4E], - [0xE50, 0xE59], - [0xE81, 0xE82], - [0xE84, 0xE84], - [0xE86, 0xE8A], - [0xE8C, 0xEA3], - [0xEA5, 0xEA5], - [0xEA7, 0xEBD], - [0xEC0, 0xEC4], - [0xEC6, 0xEC6], - [0xEC8, 0xECE], - [0xED0, 0xED9], - [0xEDC, 0xEDF], - [0xF00, 0xF00], - [0xF18, 0xF19], - [0xF20, 0xF29], - [0xF35, 0xF35], - [0xF37, 0xF37], - [0xF39, 0xF39], - [0xF3E, 0xF47], - [0xF49, 0xF6C], - [0xF71, 0xF84], - [0xF86, 0xF97], - [0xF99, 0xFBC], - [0xFC6, 0xFC6], - [0x1000, 0x1049], - [0x1050, 0x109D], - [0x10A0, 0x10C5], - [0x10C7, 0x10C7], - [0x10CD, 0x10CD], - [0x10D0, 0x10FA], - [0x10FC, 0x1248], - [0x124A, 0x124D], - [0x1250, 0x1256], - [0x1258, 0x1258], - [0x125A, 0x125D], - [0x1260, 0x1288], - [0x128A, 0x128D], - [0x1290, 0x12B0], - [0x12B2, 0x12B5], - [0x12B8, 0x12BE], - [0x12C0, 0x12C0], - [0x12C2, 0x12C5], - [0x12C8, 0x12D6], - [0x12D8, 0x1310], - [0x1312, 0x1315], - [0x1318, 0x135A], - [0x135D, 0x135F], - [0x1369, 0x1371], - [0x1380, 0x138F], - [0x13A0, 0x13F5], - [0x13F8, 0x13FD], - [0x1401, 0x166C], - [0x166F, 0x167F], - [0x1681, 0x169A], - [0x16A0, 0x16EA], - [0x16EE, 0x16F8], - [0x1700, 0x1715], - [0x171F, 0x1734], - [0x1740, 0x1753], - [0x1760, 0x176C], - [0x176E, 0x1770], - [0x1772, 0x1773], - [0x1780, 0x17D3], - [0x17D7, 0x17D7], - [0x17DC, 0x17DD], - [0x17E0, 0x17E9], - [0x180B, 0x180D], - [0x180F, 0x1819], - [0x1820, 0x1878], - [0x1880, 0x18AA], - [0x18B0, 0x18F5], - [0x1900, 0x191E], - [0x1920, 0x192B], - [0x1930, 0x193B], - [0x1946, 0x196D], - [0x1970, 0x1974], - [0x1980, 0x19AB], - [0x19B0, 0x19C9], - [0x19D0, 0x19DA], - [0x1A00, 0x1A1B], - [0x1A20, 0x1A5E], - [0x1A60, 0x1A7C], - [0x1A7F, 0x1A89], - [0x1A90, 0x1A99], - [0x1AA7, 0x1AA7], - [0x1AB0, 0x1ABD], - [0x1ABF, 0x1ACE], - [0x1B00, 0x1B4C], - [0x1B50, 0x1B59], - [0x1B6B, 0x1B73], - [0x1B80, 0x1BF3], - [0x1C00, 0x1C37], - [0x1C40, 0x1C49], - [0x1C4D, 0x1C7D], - [0x1C80, 0x1C88], - [0x1C90, 0x1CBA], - [0x1CBD, 0x1CBF], - [0x1CD0, 0x1CD2], - [0x1CD4, 0x1CFA], - [0x1D00, 0x1F15], - [0x1F18, 0x1F1D], - [0x1F20, 0x1F45], - [0x1F48, 0x1F4D], - [0x1F50, 0x1F57], - [0x1F59, 0x1F59], - [0x1F5B, 0x1F5B], - [0x1F5D, 0x1F5D], - [0x1F5F, 0x1F7D], - [0x1F80, 0x1FB4], - [0x1FB6, 0x1FBC], - [0x1FBE, 0x1FBE], - [0x1FC2, 0x1FC4], - [0x1FC6, 0x1FCC], - [0x1FD0, 0x1FD3], - [0x1FD6, 0x1FDB], - [0x1FE0, 0x1FEC], - [0x1FF2, 0x1FF4], - [0x1FF6, 0x1FFC], - [0x200C, 0x200D], - [0x203F, 0x2040], - [0x2054, 0x2054], - [0x2071, 0x2071], - [0x207F, 0x207F], - [0x2090, 0x209C], - [0x20D0, 0x20DC], - [0x20E1, 0x20E1], - [0x20E5, 0x20F0], - [0x2102, 0x2102], - [0x2107, 0x2107], - [0x210A, 0x2113], - [0x2115, 0x2115], - [0x2118, 0x211D], - [0x2124, 0x2124], - [0x2126, 0x2126], - [0x2128, 0x2128], - [0x212A, 0x2139], - [0x213C, 0x213F], - [0x2145, 0x2149], - [0x214E, 0x214E], - [0x2160, 0x2188], - [0x2C00, 0x2CE4], - [0x2CEB, 0x2CF3], - [0x2D00, 0x2D25], - [0x2D27, 0x2D27], - [0x2D2D, 0x2D2D], - [0x2D30, 0x2D67], - [0x2D6F, 0x2D6F], - [0x2D7F, 0x2D96], - [0x2DA0, 0x2DA6], - [0x2DA8, 0x2DAE], - [0x2DB0, 0x2DB6], - [0x2DB8, 0x2DBE], - [0x2DC0, 0x2DC6], - [0x2DC8, 0x2DCE], - [0x2DD0, 0x2DD6], - [0x2DD8, 0x2DDE], - [0x2DE0, 0x2DFF], - [0x3005, 0x3007], - [0x3021, 0x302F], - [0x3031, 0x3035], - [0x3038, 0x303C], - [0x3041, 0x3096], - [0x3099, 0x309A], - [0x309D, 0x309F], - [0x30A1, 0x30FF], - [0x3105, 0x312F], - [0x3131, 0x318E], - [0x31A0, 0x31BF], - [0x31F0, 0x31FF], - [0x3400, 0x4DBF], - [0x4E00, 0xA48C], - [0xA4D0, 0xA4FD], - [0xA500, 0xA60C], - [0xA610, 0xA62B], - [0xA640, 0xA66F], - [0xA674, 0xA67D], - [0xA67F, 0xA6F1], - [0xA717, 0xA71F], - [0xA722, 0xA788], - [0xA78B, 0xA7CA], - [0xA7D0, 0xA7D1], - [0xA7D3, 0xA7D3], - [0xA7D5, 0xA7D9], - [0xA7F2, 0xA827], - [0xA82C, 0xA82C], - [0xA840, 0xA873], - [0xA880, 0xA8C5], - [0xA8D0, 0xA8D9], - [0xA8E0, 0xA8F7], - [0xA8FB, 0xA8FB], - [0xA8FD, 0xA92D], - [0xA930, 0xA953], - [0xA960, 0xA97C], - [0xA980, 0xA9C0], - [0xA9CF, 0xA9D9], - [0xA9E0, 0xA9FE], - [0xAA00, 0xAA36], - [0xAA40, 0xAA4D], - [0xAA50, 0xAA59], - [0xAA60, 0xAA76], - [0xAA7A, 0xAAC2], - [0xAADB, 0xAADD], - [0xAAE0, 0xAAEF], - [0xAAF2, 0xAAF6], - [0xAB01, 0xAB06], - [0xAB09, 0xAB0E], - [0xAB11, 0xAB16], - [0xAB20, 0xAB26], - [0xAB28, 0xAB2E], - [0xAB30, 0xAB5A], - [0xAB5C, 0xAB69], - [0xAB70, 0xABEA], - [0xABEC, 0xABED], - [0xABF0, 0xABF9], - [0xAC00, 0xD7A3], - [0xD7B0, 0xD7C6], - [0xD7CB, 0xD7FB], - [0xF900, 0xFA6D], - [0xFA70, 0xFAD9], - [0xFB00, 0xFB06], - [0xFB13, 0xFB17], - [0xFB1D, 0xFB28], - [0xFB2A, 0xFB36], - [0xFB38, 0xFB3C], - [0xFB3E, 0xFB3E], - [0xFB40, 0xFB41], - [0xFB43, 0xFB44], - [0xFB46, 0xFBB1], - [0xFBD3, 0xFC5D], - [0xFC64, 0xFD3D], - [0xFD50, 0xFD8F], - [0xFD92, 0xFDC7], - [0xFDF0, 0xFDF9], - [0xFE00, 0xFE0F], - [0xFE20, 0xFE2F], - [0xFE33, 0xFE34], - [0xFE4D, 0xFE4F], - [0xFE71, 0xFE71], - [0xFE73, 0xFE73], - [0xFE77, 0xFE77], - [0xFE79, 0xFE79], - [0xFE7B, 0xFE7B], - [0xFE7D, 0xFE7D], - [0xFE7F, 0xFEFC], - [0xFF10, 0xFF19], - [0xFF21, 0xFF3A], - [0xFF3F, 0xFF3F], - [0xFF41, 0xFF5A], - [0xFF65, 0xFFBE], - [0xFFC2, 0xFFC7], - [0xFFCA, 0xFFCF], - [0xFFD2, 0xFFD7], - [0xFFDA, 0xFFDC], - [0x10000, 0x1000B], - [0x1000D, 0x10026], - [0x10028, 0x1003A], - [0x1003C, 0x1003D], - [0x1003F, 0x1004D], - [0x10050, 0x1005D], - [0x10080, 0x100FA], - [0x10140, 0x10174], - [0x101FD, 0x101FD], - [0x10280, 0x1029C], - [0x102A0, 0x102D0], - [0x102E0, 0x102E0], - [0x10300, 0x1031F], - [0x1032D, 0x1034A], - [0x10350, 0x1037A], - [0x10380, 0x1039D], - [0x103A0, 0x103C3], - [0x103C8, 0x103CF], - [0x103D1, 0x103D5], - [0x10400, 0x1049D], - [0x104A0, 0x104A9], - [0x104B0, 0x104D3], - [0x104D8, 0x104FB], - [0x10500, 0x10527], - [0x10530, 0x10563], - [0x10570, 0x1057A], - [0x1057C, 0x1058A], - [0x1058C, 0x10592], - [0x10594, 0x10595], - [0x10597, 0x105A1], - [0x105A3, 0x105B1], - [0x105B3, 0x105B9], - [0x105BB, 0x105BC], - [0x10600, 0x10736], - [0x10740, 0x10755], - [0x10760, 0x10767], - [0x10780, 0x10785], - [0x10787, 0x107B0], - [0x107B2, 0x107BA], - [0x10800, 0x10805], - [0x10808, 0x10808], - [0x1080A, 0x10835], - [0x10837, 0x10838], - [0x1083C, 0x1083C], - [0x1083F, 0x10855], - [0x10860, 0x10876], - [0x10880, 0x1089E], - [0x108E0, 0x108F2], - [0x108F4, 0x108F5], - [0x10900, 0x10915], - [0x10920, 0x10939], - [0x10980, 0x109B7], - [0x109BE, 0x109BF], - [0x10A00, 0x10A03], - [0x10A05, 0x10A06], - [0x10A0C, 0x10A13], - [0x10A15, 0x10A17], - [0x10A19, 0x10A35], - [0x10A38, 0x10A3A], - [0x10A3F, 0x10A3F], - [0x10A60, 0x10A7C], - [0x10A80, 0x10A9C], - [0x10AC0, 0x10AC7], - [0x10AC9, 0x10AE6], - [0x10B00, 0x10B35], - [0x10B40, 0x10B55], - [0x10B60, 0x10B72], - [0x10B80, 0x10B91], - [0x10C00, 0x10C48], - [0x10C80, 0x10CB2], - [0x10CC0, 0x10CF2], - [0x10D00, 0x10D27], - [0x10D30, 0x10D39], - [0x10E80, 0x10EA9], - [0x10EAB, 0x10EAC], - [0x10EB0, 0x10EB1], - [0x10EFD, 0x10F1C], - [0x10F27, 0x10F27], - [0x10F30, 0x10F50], - [0x10F70, 0x10F85], - [0x10FB0, 0x10FC4], - [0x10FE0, 0x10FF6], - [0x11000, 0x11046], - [0x11066, 0x11075], - [0x1107F, 0x110BA], - [0x110C2, 0x110C2], - [0x110D0, 0x110E8], - [0x110F0, 0x110F9], - [0x11100, 0x11134], - [0x11136, 0x1113F], - [0x11144, 0x11147], - [0x11150, 0x11173], - [0x11176, 0x11176], - [0x11180, 0x111C4], - [0x111C9, 0x111CC], - [0x111CE, 0x111DA], - [0x111DC, 0x111DC], - [0x11200, 0x11211], - [0x11213, 0x11237], - [0x1123E, 0x11241], - [0x11280, 0x11286], - [0x11288, 0x11288], - [0x1128A, 0x1128D], - [0x1128F, 0x1129D], - [0x1129F, 0x112A8], - [0x112B0, 0x112EA], - [0x112F0, 0x112F9], - [0x11300, 0x11303], - [0x11305, 0x1130C], - [0x1130F, 0x11310], - [0x11313, 0x11328], - [0x1132A, 0x11330], - [0x11332, 0x11333], - [0x11335, 0x11339], - [0x1133B, 0x11344], - [0x11347, 0x11348], - [0x1134B, 0x1134D], - [0x11350, 0x11350], - [0x11357, 0x11357], - [0x1135D, 0x11363], - [0x11366, 0x1136C], - [0x11370, 0x11374], - [0x11400, 0x1144A], - [0x11450, 0x11459], - [0x1145E, 0x11461], - [0x11480, 0x114C5], - [0x114C7, 0x114C7], - [0x114D0, 0x114D9], - [0x11580, 0x115B5], - [0x115B8, 0x115C0], - [0x115D8, 0x115DD], - [0x11600, 0x11640], - [0x11644, 0x11644], - [0x11650, 0x11659], - [0x11680, 0x116B8], - [0x116C0, 0x116C9], - [0x11700, 0x1171A], - [0x1171D, 0x1172B], - [0x11730, 0x11739], - [0x11740, 0x11746], - [0x11800, 0x1183A], - [0x118A0, 0x118E9], - [0x118FF, 0x11906], - [0x11909, 0x11909], - [0x1190C, 0x11913], - [0x11915, 0x11916], - [0x11918, 0x11935], - [0x11937, 0x11938], - [0x1193B, 0x11943], - [0x11950, 0x11959], - [0x119A0, 0x119A7], - [0x119AA, 0x119D7], - [0x119DA, 0x119E1], - [0x119E3, 0x119E4], - [0x11A00, 0x11A3E], - [0x11A47, 0x11A47], - [0x11A50, 0x11A99], - [0x11A9D, 0x11A9D], - [0x11AB0, 0x11AF8], - [0x11C00, 0x11C08], - [0x11C0A, 0x11C36], - [0x11C38, 0x11C40], - [0x11C50, 0x11C59], - [0x11C72, 0x11C8F], - [0x11C92, 0x11CA7], - [0x11CA9, 0x11CB6], - [0x11D00, 0x11D06], - [0x11D08, 0x11D09], - [0x11D0B, 0x11D36], - [0x11D3A, 0x11D3A], - [0x11D3C, 0x11D3D], - [0x11D3F, 0x11D47], - [0x11D50, 0x11D59], - [0x11D60, 0x11D65], - [0x11D67, 0x11D68], - [0x11D6A, 0x11D8E], - [0x11D90, 0x11D91], - [0x11D93, 0x11D98], - [0x11DA0, 0x11DA9], - [0x11EE0, 0x11EF6], - [0x11F00, 0x11F10], - [0x11F12, 0x11F3A], - [0x11F3E, 0x11F42], - [0x11F50, 0x11F59], - [0x11FB0, 0x11FB0], - [0x12000, 0x12399], - [0x12400, 0x1246E], - [0x12480, 0x12543], - [0x12F90, 0x12FF0], - [0x13000, 0x1342F], - [0x13440, 0x13455], - [0x14400, 0x14646], - [0x16800, 0x16A38], - [0x16A40, 0x16A5E], - [0x16A60, 0x16A69], - [0x16A70, 0x16ABE], - [0x16AC0, 0x16AC9], - [0x16AD0, 0x16AED], - [0x16AF0, 0x16AF4], - [0x16B00, 0x16B36], - [0x16B40, 0x16B43], - [0x16B50, 0x16B59], - [0x16B63, 0x16B77], - [0x16B7D, 0x16B8F], - [0x16E40, 0x16E7F], - [0x16F00, 0x16F4A], - [0x16F4F, 0x16F87], - [0x16F8F, 0x16F9F], - [0x16FE0, 0x16FE1], - [0x16FE3, 0x16FE4], - [0x16FF0, 0x16FF1], - [0x17000, 0x187F7], - [0x18800, 0x18CD5], - [0x18D00, 0x18D08], - [0x1AFF0, 0x1AFF3], - [0x1AFF5, 0x1AFFB], - [0x1AFFD, 0x1AFFE], - [0x1B000, 0x1B122], - [0x1B132, 0x1B132], - [0x1B150, 0x1B152], - [0x1B155, 0x1B155], - [0x1B164, 0x1B167], - [0x1B170, 0x1B2FB], - [0x1BC00, 0x1BC6A], - [0x1BC70, 0x1BC7C], - [0x1BC80, 0x1BC88], - [0x1BC90, 0x1BC99], - [0x1BC9D, 0x1BC9E], - [0x1CF00, 0x1CF2D], - [0x1CF30, 0x1CF46], - [0x1D165, 0x1D169], - [0x1D16D, 0x1D172], - [0x1D17B, 0x1D182], - [0x1D185, 0x1D18B], - [0x1D1AA, 0x1D1AD], - [0x1D242, 0x1D244], - [0x1D400, 0x1D454], - [0x1D456, 0x1D49C], - [0x1D49E, 0x1D49F], - [0x1D4A2, 0x1D4A2], - [0x1D4A5, 0x1D4A6], - [0x1D4A9, 0x1D4AC], - [0x1D4AE, 0x1D4B9], - [0x1D4BB, 0x1D4BB], - [0x1D4BD, 0x1D4C3], - [0x1D4C5, 0x1D505], - [0x1D507, 0x1D50A], - [0x1D50D, 0x1D514], - [0x1D516, 0x1D51C], - [0x1D51E, 0x1D539], - [0x1D53B, 0x1D53E], - [0x1D540, 0x1D544], - [0x1D546, 0x1D546], - [0x1D54A, 0x1D550], - [0x1D552, 0x1D6A5], - [0x1D6A8, 0x1D6C0], - [0x1D6C2, 0x1D6DA], - [0x1D6DC, 0x1D6FA], - [0x1D6FC, 0x1D714], - [0x1D716, 0x1D734], - [0x1D736, 0x1D74E], - [0x1D750, 0x1D76E], - [0x1D770, 0x1D788], - [0x1D78A, 0x1D7A8], - [0x1D7AA, 0x1D7C2], - [0x1D7C4, 0x1D7CB], - [0x1D7CE, 0x1D7FF], - [0x1DA00, 0x1DA36], - [0x1DA3B, 0x1DA6C], - [0x1DA75, 0x1DA75], - [0x1DA84, 0x1DA84], - [0x1DA9B, 0x1DA9F], - [0x1DAA1, 0x1DAAF], - [0x1DF00, 0x1DF1E], - [0x1DF25, 0x1DF2A], - [0x1E000, 0x1E006], - [0x1E008, 0x1E018], - [0x1E01B, 0x1E021], - [0x1E023, 0x1E024], - [0x1E026, 0x1E02A], - [0x1E030, 0x1E06D], - [0x1E08F, 0x1E08F], - [0x1E100, 0x1E12C], - [0x1E130, 0x1E13D], - [0x1E140, 0x1E149], - [0x1E14E, 0x1E14E], - [0x1E290, 0x1E2AE], - [0x1E2C0, 0x1E2F9], - [0x1E4D0, 0x1E4F9], - [0x1E7E0, 0x1E7E6], - [0x1E7E8, 0x1E7EB], - [0x1E7ED, 0x1E7EE], - [0x1E7F0, 0x1E7FE], - [0x1E800, 0x1E8C4], - [0x1E8D0, 0x1E8D6], - [0x1E900, 0x1E94B], - [0x1E950, 0x1E959], - [0x1EE00, 0x1EE03], - [0x1EE05, 0x1EE1F], - [0x1EE21, 0x1EE22], - [0x1EE24, 0x1EE24], - [0x1EE27, 0x1EE27], - [0x1EE29, 0x1EE32], - [0x1EE34, 0x1EE37], - [0x1EE39, 0x1EE39], - [0x1EE3B, 0x1EE3B], - [0x1EE42, 0x1EE42], - [0x1EE47, 0x1EE47], - [0x1EE49, 0x1EE49], - [0x1EE4B, 0x1EE4B], - [0x1EE4D, 0x1EE4F], - [0x1EE51, 0x1EE52], - [0x1EE54, 0x1EE54], - [0x1EE57, 0x1EE57], - [0x1EE59, 0x1EE59], - [0x1EE5B, 0x1EE5B], - [0x1EE5D, 0x1EE5D], - [0x1EE5F, 0x1EE5F], - [0x1EE61, 0x1EE62], - [0x1EE64, 0x1EE64], - [0x1EE67, 0x1EE6A], - [0x1EE6C, 0x1EE72], - [0x1EE74, 0x1EE77], - [0x1EE79, 0x1EE7C], - [0x1EE7E, 0x1EE7E], - [0x1EE80, 0x1EE89], - [0x1EE8B, 0x1EE9B], - [0x1EEA1, 0x1EEA3], - [0x1EEA5, 0x1EEA9], - [0x1EEAB, 0x1EEBB], - [0x1FBF0, 0x1FBF9], - [0x20000, 0x2A6DF], - [0x2A700, 0x2B739], - [0x2B740, 0x2B81D], - [0x2B820, 0x2CEA1], - [0x2CEB0, 0x2EBE0], - [0x2EBF0, 0x2EE5D], - [0x2F800, 0x2FA1D], - [0x30000, 0x3134A], - [0x31350, 0x323AF], - [0xE0100, 0xE01EF], + [0xAA, 0xAA], [0xB5, 0xB5], [0xB7, 0xB7], [0xBA, 0xBA], + [0xC0, 0xD6], [0xD8, 0xF6], [0xF8, 0x2C1], [0x2C6, 0x2D1], + [0x2E0, 0x2E4], [0x2EC, 0x2EC], [0x2EE, 0x2EE], [0x300, 0x374], + [0x376, 0x377], [0x37B, 0x37D], [0x37F, 0x37F], [0x386, 0x38A], + [0x38C, 0x38C], [0x38E, 0x3A1], [0x3A3, 0x3F5], [0x3F7, 0x481], + [0x483, 0x487], [0x48A, 0x52F], [0x531, 0x556], [0x559, 0x559], + [0x560, 0x588], [0x591, 0x5BD], [0x5BF, 0x5BF], [0x5C1, 0x5C2], + [0x5C4, 0x5C5], [0x5C7, 0x5C7], [0x5D0, 0x5EA], [0x5EF, 0x5F2], + [0x610, 0x61A], [0x620, 0x669], [0x66E, 0x6D3], [0x6D5, 0x6DC], + [0x6DF, 0x6E8], [0x6EA, 0x6FC], [0x6FF, 0x6FF], [0x710, 0x74A], + [0x74D, 0x7B1], [0x7C0, 0x7F5], [0x7FA, 0x7FA], [0x7FD, 0x7FD], + [0x800, 0x82D], [0x840, 0x85B], [0x860, 0x86A], [0x870, 0x887], + [0x889, 0x88E], [0x898, 0x8E1], [0x8E3, 0x963], [0x966, 0x96F], + [0x971, 0x983], [0x985, 0x98C], [0x98F, 0x990], [0x993, 0x9A8], + [0x9AA, 0x9B0], [0x9B2, 0x9B2], [0x9B6, 0x9B9], [0x9BC, 0x9C4], + [0x9C7, 0x9C8], [0x9CB, 0x9CE], [0x9D7, 0x9D7], [0x9DC, 0x9DD], + [0x9DF, 0x9E3], [0x9E6, 0x9F1], [0x9FC, 0x9FC], [0x9FE, 0x9FE], + [0xA01, 0xA03], [0xA05, 0xA0A], [0xA0F, 0xA10], [0xA13, 0xA28], + [0xA2A, 0xA30], [0xA32, 0xA33], [0xA35, 0xA36], [0xA38, 0xA39], + [0xA3C, 0xA3C], [0xA3E, 0xA42], [0xA47, 0xA48], [0xA4B, 0xA4D], + [0xA51, 0xA51], [0xA59, 0xA5C], [0xA5E, 0xA5E], [0xA66, 0xA75], + [0xA81, 0xA83], [0xA85, 0xA8D], [0xA8F, 0xA91], [0xA93, 0xAA8], + [0xAAA, 0xAB0], [0xAB2, 0xAB3], [0xAB5, 0xAB9], [0xABC, 0xAC5], + [0xAC7, 0xAC9], [0xACB, 0xACD], [0xAD0, 0xAD0], [0xAE0, 0xAE3], + [0xAE6, 0xAEF], [0xAF9, 0xAFF], [0xB01, 0xB03], [0xB05, 0xB0C], + [0xB0F, 0xB10], [0xB13, 0xB28], [0xB2A, 0xB30], [0xB32, 0xB33], + [0xB35, 0xB39], [0xB3C, 0xB44], [0xB47, 0xB48], [0xB4B, 0xB4D], + [0xB55, 0xB57], [0xB5C, 0xB5D], [0xB5F, 0xB63], [0xB66, 0xB6F], + [0xB71, 0xB71], [0xB82, 0xB83], [0xB85, 0xB8A], [0xB8E, 0xB90], + [0xB92, 0xB95], [0xB99, 0xB9A], [0xB9C, 0xB9C], [0xB9E, 0xB9F], + [0xBA3, 0xBA4], [0xBA8, 0xBAA], [0xBAE, 0xBB9], [0xBBE, 0xBC2], + [0xBC6, 0xBC8], [0xBCA, 0xBCD], [0xBD0, 0xBD0], [0xBD7, 0xBD7], + [0xBE6, 0xBEF], [0xC00, 0xC0C], [0xC0E, 0xC10], [0xC12, 0xC28], + [0xC2A, 0xC39], [0xC3C, 0xC44], [0xC46, 0xC48], [0xC4A, 0xC4D], + [0xC55, 0xC56], [0xC58, 0xC5A], [0xC5D, 0xC5D], [0xC60, 0xC63], + [0xC66, 0xC6F], [0xC80, 0xC83], [0xC85, 0xC8C], [0xC8E, 0xC90], + [0xC92, 0xCA8], [0xCAA, 0xCB3], [0xCB5, 0xCB9], [0xCBC, 0xCC4], + [0xCC6, 0xCC8], [0xCCA, 0xCCD], [0xCD5, 0xCD6], [0xCDD, 0xCDE], + [0xCE0, 0xCE3], [0xCE6, 0xCEF], [0xCF1, 0xCF3], [0xD00, 0xD0C], + [0xD0E, 0xD10], [0xD12, 0xD44], [0xD46, 0xD48], [0xD4A, 0xD4E], + [0xD54, 0xD57], [0xD5F, 0xD63], [0xD66, 0xD6F], [0xD7A, 0xD7F], + [0xD81, 0xD83], [0xD85, 0xD96], [0xD9A, 0xDB1], [0xDB3, 0xDBB], + [0xDBD, 0xDBD], [0xDC0, 0xDC6], [0xDCA, 0xDCA], [0xDCF, 0xDD4], + [0xDD6, 0xDD6], [0xDD8, 0xDDF], [0xDE6, 0xDEF], [0xDF2, 0xDF3], + [0xE01, 0xE3A], [0xE40, 0xE4E], [0xE50, 0xE59], [0xE81, 0xE82], + [0xE84, 0xE84], [0xE86, 0xE8A], [0xE8C, 0xEA3], [0xEA5, 0xEA5], + [0xEA7, 0xEBD], [0xEC0, 0xEC4], [0xEC6, 0xEC6], [0xEC8, 0xECE], + [0xED0, 0xED9], [0xEDC, 0xEDF], [0xF00, 0xF00], [0xF18, 0xF19], + [0xF20, 0xF29], [0xF35, 0xF35], [0xF37, 0xF37], [0xF39, 0xF39], + [0xF3E, 0xF47], [0xF49, 0xF6C], [0xF71, 0xF84], [0xF86, 0xF97], + [0xF99, 0xFBC], [0xFC6, 0xFC6], [0x1000, 0x1049], [0x1050, 0x109D], + [0x10A0, 0x10C5], [0x10C7, 0x10C7], [0x10CD, 0x10CD], [0x10D0, 0x10FA], + [0x10FC, 0x1248], [0x124A, 0x124D], [0x1250, 0x1256], [0x1258, 0x1258], + [0x125A, 0x125D], [0x1260, 0x1288], [0x128A, 0x128D], [0x1290, 0x12B0], + [0x12B2, 0x12B5], [0x12B8, 0x12BE], [0x12C0, 0x12C0], [0x12C2, 0x12C5], + [0x12C8, 0x12D6], [0x12D8, 0x1310], [0x1312, 0x1315], [0x1318, 0x135A], + [0x135D, 0x135F], [0x1369, 0x1371], [0x1380, 0x138F], [0x13A0, 0x13F5], + [0x13F8, 0x13FD], [0x1401, 0x166C], [0x166F, 0x167F], [0x1681, 0x169A], + [0x16A0, 0x16EA], [0x16EE, 0x16F8], [0x1700, 0x1715], [0x171F, 0x1734], + [0x1740, 0x1753], [0x1760, 0x176C], [0x176E, 0x1770], [0x1772, 0x1773], + [0x1780, 0x17D3], [0x17D7, 0x17D7], [0x17DC, 0x17DD], [0x17E0, 0x17E9], + [0x180B, 0x180D], [0x180F, 0x1819], [0x1820, 0x1878], [0x1880, 0x18AA], + [0x18B0, 0x18F5], [0x1900, 0x191E], [0x1920, 0x192B], [0x1930, 0x193B], + [0x1946, 0x196D], [0x1970, 0x1974], [0x1980, 0x19AB], [0x19B0, 0x19C9], + [0x19D0, 0x19DA], [0x1A00, 0x1A1B], [0x1A20, 0x1A5E], [0x1A60, 0x1A7C], + [0x1A7F, 0x1A89], [0x1A90, 0x1A99], [0x1AA7, 0x1AA7], [0x1AB0, 0x1ABD], + [0x1ABF, 0x1ACE], [0x1B00, 0x1B4C], [0x1B50, 0x1B59], [0x1B6B, 0x1B73], + [0x1B80, 0x1BF3], [0x1C00, 0x1C37], [0x1C40, 0x1C49], [0x1C4D, 0x1C7D], + [0x1C80, 0x1C88], [0x1C90, 0x1CBA], [0x1CBD, 0x1CBF], [0x1CD0, 0x1CD2], + [0x1CD4, 0x1CFA], [0x1D00, 0x1F15], [0x1F18, 0x1F1D], [0x1F20, 0x1F45], + [0x1F48, 0x1F4D], [0x1F50, 0x1F57], [0x1F59, 0x1F59], [0x1F5B, 0x1F5B], + [0x1F5D, 0x1F5D], [0x1F5F, 0x1F7D], [0x1F80, 0x1FB4], [0x1FB6, 0x1FBC], + [0x1FBE, 0x1FBE], [0x1FC2, 0x1FC4], [0x1FC6, 0x1FCC], [0x1FD0, 0x1FD3], + [0x1FD6, 0x1FDB], [0x1FE0, 0x1FEC], [0x1FF2, 0x1FF4], [0x1FF6, 0x1FFC], + [0x200C, 0x200D], [0x203F, 0x2040], [0x2054, 0x2054], [0x2071, 0x2071], + [0x207F, 0x207F], [0x2090, 0x209C], [0x20D0, 0x20DC], [0x20E1, 0x20E1], + [0x20E5, 0x20F0], [0x2102, 0x2102], [0x2107, 0x2107], [0x210A, 0x2113], + [0x2115, 0x2115], [0x2118, 0x211D], [0x2124, 0x2124], [0x2126, 0x2126], + [0x2128, 0x2128], [0x212A, 0x2139], [0x213C, 0x213F], [0x2145, 0x2149], + [0x214E, 0x214E], [0x2160, 0x2188], [0x2C00, 0x2CE4], [0x2CEB, 0x2CF3], + [0x2D00, 0x2D25], [0x2D27, 0x2D27], [0x2D2D, 0x2D2D], [0x2D30, 0x2D67], + [0x2D6F, 0x2D6F], [0x2D7F, 0x2D96], [0x2DA0, 0x2DA6], [0x2DA8, 0x2DAE], + [0x2DB0, 0x2DB6], [0x2DB8, 0x2DBE], [0x2DC0, 0x2DC6], [0x2DC8, 0x2DCE], + [0x2DD0, 0x2DD6], [0x2DD8, 0x2DDE], [0x2DE0, 0x2DFF], [0x3005, 0x3007], + [0x3021, 0x302F], [0x3031, 0x3035], [0x3038, 0x303C], [0x3041, 0x3096], + [0x3099, 0x309A], [0x309D, 0x309F], [0x30A1, 0x30FF], [0x3105, 0x312F], + [0x3131, 0x318E], [0x31A0, 0x31BF], [0x31F0, 0x31FF], [0x3400, 0x4DBF], + [0x4E00, 0xA48C], [0xA4D0, 0xA4FD], [0xA500, 0xA60C], [0xA610, 0xA62B], + [0xA640, 0xA66F], [0xA674, 0xA67D], [0xA67F, 0xA6F1], [0xA717, 0xA71F], + [0xA722, 0xA788], [0xA78B, 0xA7CA], [0xA7D0, 0xA7D1], [0xA7D3, 0xA7D3], + [0xA7D5, 0xA7D9], [0xA7F2, 0xA827], [0xA82C, 0xA82C], [0xA840, 0xA873], + [0xA880, 0xA8C5], [0xA8D0, 0xA8D9], [0xA8E0, 0xA8F7], [0xA8FB, 0xA8FB], + [0xA8FD, 0xA92D], [0xA930, 0xA953], [0xA960, 0xA97C], [0xA980, 0xA9C0], + [0xA9CF, 0xA9D9], [0xA9E0, 0xA9FE], [0xAA00, 0xAA36], [0xAA40, 0xAA4D], + [0xAA50, 0xAA59], [0xAA60, 0xAA76], [0xAA7A, 0xAAC2], [0xAADB, 0xAADD], + [0xAAE0, 0xAAEF], [0xAAF2, 0xAAF6], [0xAB01, 0xAB06], [0xAB09, 0xAB0E], + [0xAB11, 0xAB16], [0xAB20, 0xAB26], [0xAB28, 0xAB2E], [0xAB30, 0xAB5A], + [0xAB5C, 0xAB69], [0xAB70, 0xABEA], [0xABEC, 0xABED], [0xABF0, 0xABF9], + [0xAC00, 0xD7A3], [0xD7B0, 0xD7C6], [0xD7CB, 0xD7FB], [0xF900, 0xFA6D], + [0xFA70, 0xFAD9], [0xFB00, 0xFB06], [0xFB13, 0xFB17], [0xFB1D, 0xFB28], + [0xFB2A, 0xFB36], [0xFB38, 0xFB3C], [0xFB3E, 0xFB3E], [0xFB40, 0xFB41], + [0xFB43, 0xFB44], [0xFB46, 0xFBB1], [0xFBD3, 0xFC5D], [0xFC64, 0xFD3D], + [0xFD50, 0xFD8F], [0xFD92, 0xFDC7], [0xFDF0, 0xFDF9], [0xFE00, 0xFE0F], + [0xFE20, 0xFE2F], [0xFE33, 0xFE34], [0xFE4D, 0xFE4F], [0xFE71, 0xFE71], + [0xFE73, 0xFE73], [0xFE77, 0xFE77], [0xFE79, 0xFE79], [0xFE7B, 0xFE7B], + [0xFE7D, 0xFE7D], [0xFE7F, 0xFEFC], [0xFF10, 0xFF19], [0xFF21, 0xFF3A], + [0xFF3F, 0xFF3F], [0xFF41, 0xFF5A], [0xFF65, 0xFFBE], [0xFFC2, 0xFFC7], + [0xFFCA, 0xFFCF], [0xFFD2, 0xFFD7], [0xFFDA, 0xFFDC], [0x10000, 0x1000B], + [0x1000D, 0x10026], [0x10028, 0x1003A], [0x1003C, 0x1003D], [0x1003F, 0x1004D], + [0x10050, 0x1005D], [0x10080, 0x100FA], [0x10140, 0x10174], [0x101FD, 0x101FD], + [0x10280, 0x1029C], [0x102A0, 0x102D0], [0x102E0, 0x102E0], [0x10300, 0x1031F], + [0x1032D, 0x1034A], [0x10350, 0x1037A], [0x10380, 0x1039D], [0x103A0, 0x103C3], + [0x103C8, 0x103CF], [0x103D1, 0x103D5], [0x10400, 0x1049D], [0x104A0, 0x104A9], + [0x104B0, 0x104D3], [0x104D8, 0x104FB], [0x10500, 0x10527], [0x10530, 0x10563], + [0x10570, 0x1057A], [0x1057C, 0x1058A], [0x1058C, 0x10592], [0x10594, 0x10595], + [0x10597, 0x105A1], [0x105A3, 0x105B1], [0x105B3, 0x105B9], [0x105BB, 0x105BC], + [0x10600, 0x10736], [0x10740, 0x10755], [0x10760, 0x10767], [0x10780, 0x10785], + [0x10787, 0x107B0], [0x107B2, 0x107BA], [0x10800, 0x10805], [0x10808, 0x10808], + [0x1080A, 0x10835], [0x10837, 0x10838], [0x1083C, 0x1083C], [0x1083F, 0x10855], + [0x10860, 0x10876], [0x10880, 0x1089E], [0x108E0, 0x108F2], [0x108F4, 0x108F5], + [0x10900, 0x10915], [0x10920, 0x10939], [0x10980, 0x109B7], [0x109BE, 0x109BF], + [0x10A00, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A13], [0x10A15, 0x10A17], + [0x10A19, 0x10A35], [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x10A60, 0x10A7C], + [0x10A80, 0x10A9C], [0x10AC0, 0x10AC7], [0x10AC9, 0x10AE6], [0x10B00, 0x10B35], + [0x10B40, 0x10B55], [0x10B60, 0x10B72], [0x10B80, 0x10B91], [0x10C00, 0x10C48], + [0x10C80, 0x10CB2], [0x10CC0, 0x10CF2], [0x10D00, 0x10D27], [0x10D30, 0x10D39], + [0x10E80, 0x10EA9], [0x10EAB, 0x10EAC], [0x10EB0, 0x10EB1], [0x10EFD, 0x10F1C], + [0x10F27, 0x10F27], [0x10F30, 0x10F50], [0x10F70, 0x10F85], [0x10FB0, 0x10FC4], + [0x10FE0, 0x10FF6], [0x11000, 0x11046], [0x11066, 0x11075], [0x1107F, 0x110BA], + [0x110C2, 0x110C2], [0x110D0, 0x110E8], [0x110F0, 0x110F9], [0x11100, 0x11134], + [0x11136, 0x1113F], [0x11144, 0x11147], [0x11150, 0x11173], [0x11176, 0x11176], + [0x11180, 0x111C4], [0x111C9, 0x111CC], [0x111CE, 0x111DA], [0x111DC, 0x111DC], + [0x11200, 0x11211], [0x11213, 0x11237], [0x1123E, 0x11241], [0x11280, 0x11286], + [0x11288, 0x11288], [0x1128A, 0x1128D], [0x1128F, 0x1129D], [0x1129F, 0x112A8], + [0x112B0, 0x112EA], [0x112F0, 0x112F9], [0x11300, 0x11303], [0x11305, 0x1130C], + [0x1130F, 0x11310], [0x11313, 0x11328], [0x1132A, 0x11330], [0x11332, 0x11333], + [0x11335, 0x11339], [0x1133B, 0x11344], [0x11347, 0x11348], [0x1134B, 0x1134D], + [0x11350, 0x11350], [0x11357, 0x11357], [0x1135D, 0x11363], [0x11366, 0x1136C], + [0x11370, 0x11374], [0x11400, 0x1144A], [0x11450, 0x11459], [0x1145E, 0x11461], + [0x11480, 0x114C5], [0x114C7, 0x114C7], [0x114D0, 0x114D9], [0x11580, 0x115B5], + [0x115B8, 0x115C0], [0x115D8, 0x115DD], [0x11600, 0x11640], [0x11644, 0x11644], + [0x11650, 0x11659], [0x11680, 0x116B8], [0x116C0, 0x116C9], [0x11700, 0x1171A], + [0x1171D, 0x1172B], [0x11730, 0x11739], [0x11740, 0x11746], [0x11800, 0x1183A], + [0x118A0, 0x118E9], [0x118FF, 0x11906], [0x11909, 0x11909], [0x1190C, 0x11913], + [0x11915, 0x11916], [0x11918, 0x11935], [0x11937, 0x11938], [0x1193B, 0x11943], + [0x11950, 0x11959], [0x119A0, 0x119A7], [0x119AA, 0x119D7], [0x119DA, 0x119E1], + [0x119E3, 0x119E4], [0x11A00, 0x11A3E], [0x11A47, 0x11A47], [0x11A50, 0x11A99], + [0x11A9D, 0x11A9D], [0x11AB0, 0x11AF8], [0x11C00, 0x11C08], [0x11C0A, 0x11C36], + [0x11C38, 0x11C40], [0x11C50, 0x11C59], [0x11C72, 0x11C8F], [0x11C92, 0x11CA7], + [0x11CA9, 0x11CB6], [0x11D00, 0x11D06], [0x11D08, 0x11D09], [0x11D0B, 0x11D36], + [0x11D3A, 0x11D3A], [0x11D3C, 0x11D3D], [0x11D3F, 0x11D47], [0x11D50, 0x11D59], + [0x11D60, 0x11D65], [0x11D67, 0x11D68], [0x11D6A, 0x11D8E], [0x11D90, 0x11D91], + [0x11D93, 0x11D98], [0x11DA0, 0x11DA9], [0x11EE0, 0x11EF6], [0x11F00, 0x11F10], + [0x11F12, 0x11F3A], [0x11F3E, 0x11F42], [0x11F50, 0x11F59], [0x11FB0, 0x11FB0], + [0x12000, 0x12399], [0x12400, 0x1246E], [0x12480, 0x12543], [0x12F90, 0x12FF0], + [0x13000, 0x1342F], [0x13440, 0x13455], [0x14400, 0x14646], [0x16800, 0x16A38], + [0x16A40, 0x16A5E], [0x16A60, 0x16A69], [0x16A70, 0x16ABE], [0x16AC0, 0x16AC9], + [0x16AD0, 0x16AED], [0x16AF0, 0x16AF4], [0x16B00, 0x16B36], [0x16B40, 0x16B43], + [0x16B50, 0x16B59], [0x16B63, 0x16B77], [0x16B7D, 0x16B8F], [0x16E40, 0x16E7F], + [0x16F00, 0x16F4A], [0x16F4F, 0x16F87], [0x16F8F, 0x16F9F], [0x16FE0, 0x16FE1], + [0x16FE3, 0x16FE4], [0x16FF0, 0x16FF1], [0x17000, 0x187F7], [0x18800, 0x18CD5], + [0x18D00, 0x18D08], [0x1AFF0, 0x1AFF3], [0x1AFF5, 0x1AFFB], [0x1AFFD, 0x1AFFE], + [0x1B000, 0x1B122], [0x1B132, 0x1B132], [0x1B150, 0x1B152], [0x1B155, 0x1B155], + [0x1B164, 0x1B167], [0x1B170, 0x1B2FB], [0x1BC00, 0x1BC6A], [0x1BC70, 0x1BC7C], + [0x1BC80, 0x1BC88], [0x1BC90, 0x1BC99], [0x1BC9D, 0x1BC9E], [0x1CF00, 0x1CF2D], + [0x1CF30, 0x1CF46], [0x1D165, 0x1D169], [0x1D16D, 0x1D172], [0x1D17B, 0x1D182], + [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD], [0x1D242, 0x1D244], [0x1D400, 0x1D454], + [0x1D456, 0x1D49C], [0x1D49E, 0x1D49F], [0x1D4A2, 0x1D4A2], [0x1D4A5, 0x1D4A6], + [0x1D4A9, 0x1D4AC], [0x1D4AE, 0x1D4B9], [0x1D4BB, 0x1D4BB], [0x1D4BD, 0x1D4C3], + [0x1D4C5, 0x1D505], [0x1D507, 0x1D50A], [0x1D50D, 0x1D514], [0x1D516, 0x1D51C], + [0x1D51E, 0x1D539], [0x1D53B, 0x1D53E], [0x1D540, 0x1D544], [0x1D546, 0x1D546], + [0x1D54A, 0x1D550], [0x1D552, 0x1D6A5], [0x1D6A8, 0x1D6C0], [0x1D6C2, 0x1D6DA], + [0x1D6DC, 0x1D6FA], [0x1D6FC, 0x1D714], [0x1D716, 0x1D734], [0x1D736, 0x1D74E], + [0x1D750, 0x1D76E], [0x1D770, 0x1D788], [0x1D78A, 0x1D7A8], [0x1D7AA, 0x1D7C2], + [0x1D7C4, 0x1D7CB], [0x1D7CE, 0x1D7FF], [0x1DA00, 0x1DA36], [0x1DA3B, 0x1DA6C], + [0x1DA75, 0x1DA75], [0x1DA84, 0x1DA84], [0x1DA9B, 0x1DA9F], [0x1DAA1, 0x1DAAF], + [0x1DF00, 0x1DF1E], [0x1DF25, 0x1DF2A], [0x1E000, 0x1E006], [0x1E008, 0x1E018], + [0x1E01B, 0x1E021], [0x1E023, 0x1E024], [0x1E026, 0x1E02A], [0x1E030, 0x1E06D], + [0x1E08F, 0x1E08F], [0x1E100, 0x1E12C], [0x1E130, 0x1E13D], [0x1E140, 0x1E149], + [0x1E14E, 0x1E14E], [0x1E290, 0x1E2AE], [0x1E2C0, 0x1E2F9], [0x1E4D0, 0x1E4F9], + [0x1E7E0, 0x1E7E6], [0x1E7E8, 0x1E7EB], [0x1E7ED, 0x1E7EE], [0x1E7F0, 0x1E7FE], + [0x1E800, 0x1E8C4], [0x1E8D0, 0x1E8D6], [0x1E900, 0x1E94B], [0x1E950, 0x1E959], + [0x1EE00, 0x1EE03], [0x1EE05, 0x1EE1F], [0x1EE21, 0x1EE22], [0x1EE24, 0x1EE24], + [0x1EE27, 0x1EE27], [0x1EE29, 0x1EE32], [0x1EE34, 0x1EE37], [0x1EE39, 0x1EE39], + [0x1EE3B, 0x1EE3B], [0x1EE42, 0x1EE42], [0x1EE47, 0x1EE47], [0x1EE49, 0x1EE49], + [0x1EE4B, 0x1EE4B], [0x1EE4D, 0x1EE4F], [0x1EE51, 0x1EE52], [0x1EE54, 0x1EE54], + [0x1EE57, 0x1EE57], [0x1EE59, 0x1EE59], [0x1EE5B, 0x1EE5B], [0x1EE5D, 0x1EE5D], + [0x1EE5F, 0x1EE5F], [0x1EE61, 0x1EE62], [0x1EE64, 0x1EE64], [0x1EE67, 0x1EE6A], + [0x1EE6C, 0x1EE72], [0x1EE74, 0x1EE77], [0x1EE79, 0x1EE7C], [0x1EE7E, 0x1EE7E], + [0x1EE80, 0x1EE89], [0x1EE8B, 0x1EE9B], [0x1EEA1, 0x1EEA3], [0x1EEA5, 0x1EEA9], + [0x1EEAB, 0x1EEBB], [0x1FBF0, 0x1FBF9], [0x20000, 0x2A6DF], [0x2A700, 0x2B739], + [0x2B740, 0x2B81D], [0x2B820, 0x2CEA1], [0x2CEB0, 0x2EBE0], [0x2EBF0, 0x2EE5D], + [0x2F800, 0x2FA1D], [0x30000, 0x3134A], [0x31350, 0x323AF], [0xE0100, 0xE01EF], +]; + +/** +Tests [[dchar, index] ... planes * 3] for UAX31_Continue +*/ +enum uint[2][] UAX31_Continue_Test = [ + [0x0000AA, 0], + [0x0012A0, 215], + [0x00FFDB, 430], + [0x010005, 431], + [0x011CAF, 596], + [0x01FBF4, 761], + [0x02536F, 762], + [0x02C360, 765], + [0x02F90E, 768], + [0x0309A5, 769], + [0x031B7F, 770], + [0x0E0177, 771], ]; /** @@ -1463,253 +421,79 @@ C99 Continue Entries: 34958 */ static immutable dchar[2][] FixedTable_C99_Continue = [ - [0xAA, 0xAA], - [0xB5, 0xB5], - [0xB7, 0xB7], - [0xBA, 0xBA], - [0xC0, 0xD6], - [0xD8, 0xF6], - [0xF8, 0x1F5], - [0x1FA, 0x217], - [0x250, 0x2A8], - [0x2B0, 0x2B8], - [0x2BB, 0x2BB], - [0x2BD, 0x2C1], - [0x2D0, 0x2D1], - [0x2E0, 0x2E4], - [0x37A, 0x37A], - [0x386, 0x386], - [0x388, 0x38A], - [0x38C, 0x38C], - [0x38E, 0x3A1], - [0x3A3, 0x3CE], - [0x3D0, 0x3D6], - [0x3DA, 0x3DA], - [0x3DC, 0x3DC], - [0x3DE, 0x3DE], - [0x3E0, 0x3E0], - [0x3E2, 0x3F3], - [0x401, 0x40C], - [0x40E, 0x44F], - [0x451, 0x45C], - [0x45E, 0x481], - [0x490, 0x4C4], - [0x4C7, 0x4C8], - [0x4CB, 0x4CC], - [0x4D0, 0x4EB], - [0x4EE, 0x4F5], - [0x4F8, 0x4F9], - [0x531, 0x556], - [0x559, 0x559], - [0x561, 0x587], - [0x5B0, 0x5B9], - [0x5BB, 0x5BD], - [0x5BF, 0x5BF], - [0x5C1, 0x5C2], - [0x5D0, 0x5EA], - [0x5F0, 0x5F2], - [0x621, 0x63A], - [0x640, 0x652], - [0x660, 0x669], - [0x670, 0x6B7], - [0x6BA, 0x6BE], - [0x6C0, 0x6CE], - [0x6D0, 0x6DC], - [0x6E5, 0x6E8], - [0x6EA, 0x6ED], - [0x6F0, 0x6F9], - [0x901, 0x903], - [0x905, 0x939], - [0x93D, 0x94D], - [0x950, 0x952], - [0x958, 0x963], - [0x966, 0x96F], - [0x981, 0x983], - [0x985, 0x98C], - [0x98F, 0x990], - [0x993, 0x9A8], - [0x9AA, 0x9B0], - [0x9B2, 0x9B2], - [0x9B6, 0x9B9], - [0x9BE, 0x9C4], - [0x9C7, 0x9C8], - [0x9CB, 0x9CD], - [0x9DC, 0x9DD], - [0x9DF, 0x9E3], - [0x9E6, 0x9F1], - [0xA02, 0xA02], - [0xA05, 0xA0A], - [0xA0F, 0xA10], - [0xA13, 0xA28], - [0xA2A, 0xA30], - [0xA32, 0xA33], - [0xA35, 0xA36], - [0xA38, 0xA39], - [0xA3E, 0xA42], - [0xA47, 0xA48], - [0xA4B, 0xA4D], - [0xA59, 0xA5C], - [0xA5E, 0xA5E], - [0xA66, 0xA6F], - [0xA74, 0xA74], - [0xA81, 0xA83], - [0xA85, 0xA8B], - [0xA8D, 0xA8D], - [0xA8F, 0xA91], - [0xA93, 0xAA8], - [0xAAA, 0xAB0], - [0xAB2, 0xAB3], - [0xAB5, 0xAB9], - [0xABD, 0xAC5], - [0xAC7, 0xAC9], - [0xACB, 0xACD], - [0xAD0, 0xAD0], - [0xAE0, 0xAE0], - [0xAE6, 0xAEF], - [0xB01, 0xB03], - [0xB05, 0xB0C], - [0xB0F, 0xB10], - [0xB13, 0xB28], - [0xB2A, 0xB30], - [0xB32, 0xB33], - [0xB36, 0xB39], - [0xB3D, 0xB43], - [0xB47, 0xB48], - [0xB4B, 0xB4D], - [0xB5C, 0xB5D], - [0xB5F, 0xB61], - [0xB66, 0xB6F], - [0xB82, 0xB83], - [0xB85, 0xB8A], - [0xB8E, 0xB90], - [0xB92, 0xB95], - [0xB99, 0xB9A], - [0xB9C, 0xB9C], - [0xB9E, 0xB9F], - [0xBA3, 0xBA4], - [0xBA8, 0xBAA], - [0xBAE, 0xBB5], - [0xBB7, 0xBB9], - [0xBBE, 0xBC2], - [0xBC6, 0xBC8], - [0xBCA, 0xBCD], - [0xBE7, 0xBEF], - [0xC01, 0xC03], - [0xC05, 0xC0C], - [0xC0E, 0xC10], - [0xC12, 0xC28], - [0xC2A, 0xC33], - [0xC35, 0xC39], - [0xC3E, 0xC44], - [0xC46, 0xC48], - [0xC4A, 0xC4D], - [0xC60, 0xC61], - [0xC66, 0xC6F], - [0xC82, 0xC83], - [0xC85, 0xC8C], - [0xC8E, 0xC90], - [0xC92, 0xCA8], - [0xCAA, 0xCB3], - [0xCB5, 0xCB9], - [0xCBE, 0xCC4], - [0xCC6, 0xCC8], - [0xCCA, 0xCCD], - [0xCDE, 0xCDE], - [0xCE0, 0xCE1], - [0xCE6, 0xCEF], - [0xD02, 0xD03], - [0xD05, 0xD0C], - [0xD0E, 0xD10], - [0xD12, 0xD28], - [0xD2A, 0xD39], - [0xD3E, 0xD43], - [0xD46, 0xD48], - [0xD4A, 0xD4D], - [0xD60, 0xD61], - [0xD66, 0xD6F], - [0xE01, 0xE3A], - [0xE40, 0xE5B], - [0xE81, 0xE82], - [0xE84, 0xE84], - [0xE87, 0xE88], - [0xE8A, 0xE8A], - [0xE8D, 0xE8D], - [0xE94, 0xE97], - [0xE99, 0xE9F], - [0xEA1, 0xEA3], - [0xEA5, 0xEA5], - [0xEA7, 0xEA7], - [0xEAA, 0xEAB], - [0xEAD, 0xEAE], - [0xEB0, 0xEB9], - [0xEBB, 0xEBD], - [0xEC0, 0xEC4], - [0xEC6, 0xEC6], - [0xEC8, 0xECD], - [0xED0, 0xED9], - [0xEDC, 0xEDD], - [0xF00, 0xF00], - [0xF18, 0xF19], - [0xF20, 0xF33], - [0xF35, 0xF35], - [0xF37, 0xF37], - [0xF39, 0xF39], - [0xF3E, 0xF47], - [0xF49, 0xF69], - [0xF71, 0xF84], - [0xF86, 0xF8B], - [0xF90, 0xF95], - [0xF97, 0xF97], - [0xF99, 0xFAD], - [0xFB1, 0xFB7], - [0xFB9, 0xFB9], - [0x10A0, 0x10C5], - [0x10D0, 0x10F6], - [0x1E00, 0x1E9B], - [0x1EA0, 0x1EF9], - [0x1F00, 0x1F15], - [0x1F18, 0x1F1D], - [0x1F20, 0x1F45], - [0x1F48, 0x1F4D], - [0x1F50, 0x1F57], - [0x1F59, 0x1F59], - [0x1F5B, 0x1F5B], - [0x1F5D, 0x1F5D], - [0x1F5F, 0x1F7D], - [0x1F80, 0x1FB4], - [0x1FB6, 0x1FBC], - [0x1FBE, 0x1FBE], - [0x1FC2, 0x1FC4], - [0x1FC6, 0x1FCC], - [0x1FD0, 0x1FD3], - [0x1FD6, 0x1FDB], - [0x1FE0, 0x1FEC], - [0x1FF2, 0x1FF4], - [0x1FF6, 0x1FFC], - [0x203F, 0x2040], - [0x207F, 0x207F], - [0x2102, 0x2102], - [0x2107, 0x2107], - [0x210A, 0x2113], - [0x2115, 0x2115], - [0x2118, 0x211D], - [0x2124, 0x2124], - [0x2126, 0x2126], - [0x2128, 0x2128], - [0x212A, 0x2131], - [0x2133, 0x2138], - [0x2160, 0x2182], - [0x3005, 0x3007], - [0x3021, 0x3029], - [0x3041, 0x3093], - [0x309B, 0x309C], - [0x30A1, 0x30F6], - [0x30FB, 0x30FC], - [0x3105, 0x312C], - [0x4E00, 0x9FA5], - [0xAC00, 0xD7A3], + [0xAA, 0xAA], [0xB5, 0xB5], [0xB7, 0xB7], [0xBA, 0xBA], + [0xC0, 0xD6], [0xD8, 0xF6], [0xF8, 0x1F5], [0x1FA, 0x217], + [0x250, 0x2A8], [0x2B0, 0x2B8], [0x2BB, 0x2BB], [0x2BD, 0x2C1], + [0x2D0, 0x2D1], [0x2E0, 0x2E4], [0x37A, 0x37A], [0x386, 0x386], + [0x388, 0x38A], [0x38C, 0x38C], [0x38E, 0x3A1], [0x3A3, 0x3CE], + [0x3D0, 0x3D6], [0x3DA, 0x3DA], [0x3DC, 0x3DC], [0x3DE, 0x3DE], + [0x3E0, 0x3E0], [0x3E2, 0x3F3], [0x401, 0x40C], [0x40E, 0x44F], + [0x451, 0x45C], [0x45E, 0x481], [0x490, 0x4C4], [0x4C7, 0x4C8], + [0x4CB, 0x4CC], [0x4D0, 0x4EB], [0x4EE, 0x4F5], [0x4F8, 0x4F9], + [0x531, 0x556], [0x559, 0x559], [0x561, 0x587], [0x5B0, 0x5B9], + [0x5BB, 0x5BD], [0x5BF, 0x5BF], [0x5C1, 0x5C2], [0x5D0, 0x5EA], + [0x5F0, 0x5F2], [0x621, 0x63A], [0x640, 0x652], [0x660, 0x669], + [0x670, 0x6B7], [0x6BA, 0x6BE], [0x6C0, 0x6CE], [0x6D0, 0x6DC], + [0x6E5, 0x6E8], [0x6EA, 0x6ED], [0x6F0, 0x6F9], [0x901, 0x903], + [0x905, 0x939], [0x93D, 0x94D], [0x950, 0x952], [0x958, 0x963], + [0x966, 0x96F], [0x981, 0x983], [0x985, 0x98C], [0x98F, 0x990], + [0x993, 0x9A8], [0x9AA, 0x9B0], [0x9B2, 0x9B2], [0x9B6, 0x9B9], + [0x9BE, 0x9C4], [0x9C7, 0x9C8], [0x9CB, 0x9CD], [0x9DC, 0x9DD], + [0x9DF, 0x9E3], [0x9E6, 0x9F1], [0xA02, 0xA02], [0xA05, 0xA0A], + [0xA0F, 0xA10], [0xA13, 0xA28], [0xA2A, 0xA30], [0xA32, 0xA33], + [0xA35, 0xA36], [0xA38, 0xA39], [0xA3E, 0xA42], [0xA47, 0xA48], + [0xA4B, 0xA4D], [0xA59, 0xA5C], [0xA5E, 0xA5E], [0xA66, 0xA6F], + [0xA74, 0xA74], [0xA81, 0xA83], [0xA85, 0xA8B], [0xA8D, 0xA8D], + [0xA8F, 0xA91], [0xA93, 0xAA8], [0xAAA, 0xAB0], [0xAB2, 0xAB3], + [0xAB5, 0xAB9], [0xABD, 0xAC5], [0xAC7, 0xAC9], [0xACB, 0xACD], + [0xAD0, 0xAD0], [0xAE0, 0xAE0], [0xAE6, 0xAEF], [0xB01, 0xB03], + [0xB05, 0xB0C], [0xB0F, 0xB10], [0xB13, 0xB28], [0xB2A, 0xB30], + [0xB32, 0xB33], [0xB36, 0xB39], [0xB3D, 0xB43], [0xB47, 0xB48], + [0xB4B, 0xB4D], [0xB5C, 0xB5D], [0xB5F, 0xB61], [0xB66, 0xB6F], + [0xB82, 0xB83], [0xB85, 0xB8A], [0xB8E, 0xB90], [0xB92, 0xB95], + [0xB99, 0xB9A], [0xB9C, 0xB9C], [0xB9E, 0xB9F], [0xBA3, 0xBA4], + [0xBA8, 0xBAA], [0xBAE, 0xBB5], [0xBB7, 0xBB9], [0xBBE, 0xBC2], + [0xBC6, 0xBC8], [0xBCA, 0xBCD], [0xBE7, 0xBEF], [0xC01, 0xC03], + [0xC05, 0xC0C], [0xC0E, 0xC10], [0xC12, 0xC28], [0xC2A, 0xC33], + [0xC35, 0xC39], [0xC3E, 0xC44], [0xC46, 0xC48], [0xC4A, 0xC4D], + [0xC60, 0xC61], [0xC66, 0xC6F], [0xC82, 0xC83], [0xC85, 0xC8C], + [0xC8E, 0xC90], [0xC92, 0xCA8], [0xCAA, 0xCB3], [0xCB5, 0xCB9], + [0xCBE, 0xCC4], [0xCC6, 0xCC8], [0xCCA, 0xCCD], [0xCDE, 0xCDE], + [0xCE0, 0xCE1], [0xCE6, 0xCEF], [0xD02, 0xD03], [0xD05, 0xD0C], + [0xD0E, 0xD10], [0xD12, 0xD28], [0xD2A, 0xD39], [0xD3E, 0xD43], + [0xD46, 0xD48], [0xD4A, 0xD4D], [0xD60, 0xD61], [0xD66, 0xD6F], + [0xE01, 0xE3A], [0xE40, 0xE5B], [0xE81, 0xE82], [0xE84, 0xE84], + [0xE87, 0xE88], [0xE8A, 0xE8A], [0xE8D, 0xE8D], [0xE94, 0xE97], + [0xE99, 0xE9F], [0xEA1, 0xEA3], [0xEA5, 0xEA5], [0xEA7, 0xEA7], + [0xEAA, 0xEAB], [0xEAD, 0xEAE], [0xEB0, 0xEB9], [0xEBB, 0xEBD], + [0xEC0, 0xEC4], [0xEC6, 0xEC6], [0xEC8, 0xECD], [0xED0, 0xED9], + [0xEDC, 0xEDD], [0xF00, 0xF00], [0xF18, 0xF19], [0xF20, 0xF33], + [0xF35, 0xF35], [0xF37, 0xF37], [0xF39, 0xF39], [0xF3E, 0xF47], + [0xF49, 0xF69], [0xF71, 0xF84], [0xF86, 0xF8B], [0xF90, 0xF95], + [0xF97, 0xF97], [0xF99, 0xFAD], [0xFB1, 0xFB7], [0xFB9, 0xFB9], + [0x10A0, 0x10C5], [0x10D0, 0x10F6], [0x1E00, 0x1E9B], [0x1EA0, 0x1EF9], + [0x1F00, 0x1F15], [0x1F18, 0x1F1D], [0x1F20, 0x1F45], [0x1F48, 0x1F4D], + [0x1F50, 0x1F57], [0x1F59, 0x1F59], [0x1F5B, 0x1F5B], [0x1F5D, 0x1F5D], + [0x1F5F, 0x1F7D], [0x1F80, 0x1FB4], [0x1FB6, 0x1FBC], [0x1FBE, 0x1FBE], + [0x1FC2, 0x1FC4], [0x1FC6, 0x1FCC], [0x1FD0, 0x1FD3], [0x1FD6, 0x1FDB], + [0x1FE0, 0x1FEC], [0x1FF2, 0x1FF4], [0x1FF6, 0x1FFC], [0x203F, 0x2040], + [0x207F, 0x207F], [0x2102, 0x2102], [0x2107, 0x2107], [0x210A, 0x2113], + [0x2115, 0x2115], [0x2118, 0x211D], [0x2124, 0x2124], [0x2126, 0x2126], + [0x2128, 0x2128], [0x212A, 0x2131], [0x2133, 0x2138], [0x2160, 0x2182], + [0x3005, 0x3007], [0x3021, 0x3029], [0x3041, 0x3093], [0x309B, 0x309C], + [0x30A1, 0x30F6], [0x30FB, 0x30FC], [0x3105, 0x312C], [0x4E00, 0x9FA5], + [0xAC00, 0xD7A3] ]; + +/** +Tests [[dchar, index] ... planes * 3] for FixedTable_C99_Continue +*/ +enum uint[2][] FixedTable_C99_Continue_Test = [ + [0x0000AA, 0], + [0x000B9E, 122], + [0x00C1D1, 244], +]; /** C11 Start Entries: 971620 @@ -1721,51 +505,41 @@ C11 Continue Entries: 971620 */ static immutable dchar[2][] FixedTable_C11_Continue = [ - [0xA8, 0xA8], - [0xAA, 0xAA], - [0xAD, 0xAD], - [0xAF, 0xAF], - [0xB2, 0xB5], - [0xB7, 0xBA], - [0xBC, 0xBE], - [0xC0, 0xD6], - [0xD8, 0xF6], - [0xF8, 0xFF], - [0x100, 0x167F], - [0x1681, 0x180D], - [0x180F, 0x1FFF], - [0x200B, 0x200D], - [0x202A, 0x202E], - [0x203F, 0x2040], - [0x2054, 0x2054], - [0x2060, 0x206F], - [0x2070, 0x218F], - [0x2460, 0x24FF], - [0x2776, 0x2793], - [0x2C00, 0x2DFF], - [0x2E80, 0x2FFF], - [0x3004, 0x3007], - [0x3021, 0x302F], - [0x3031, 0x303F], - [0x3040, 0xD7FF], - [0xF900, 0xFD3D], - [0xFD40, 0xFDCF], - [0xFDF0, 0xFE44], - [0xFE47, 0xFFFD], - [0x10000, 0x1FFFD], - [0x20000, 0x2FFFD], - [0x30000, 0x3FFFD], - [0x40000, 0x4FFFD], - [0x50000, 0x5FFFD], - [0x60000, 0x6FFFD], - [0x70000, 0x7FFFD], - [0x80000, 0x8FFFD], - [0x90000, 0x9FFFD], - [0xA0000, 0xAFFFD], - [0xB0000, 0xBFFFD], - [0xC0000, 0xCFFFD], - [0xD0000, 0xDFFFD], - [0xE0000, 0xEFFFD], + [0xA8, 0xA8], [0xAA, 0xAA], [0xAD, 0xAD], [0xAF, 0xAF], + [0xB2, 0xB5], [0xB7, 0xBA], [0xBC, 0xBE], [0xC0, 0xD6], + [0xD8, 0xF6], [0xF8, 0xFF], [0x100, 0x167F], [0x1681, 0x180D], + [0x180F, 0x1FFF], [0x200B, 0x200D], [0x202A, 0x202E], [0x203F, 0x2040], + [0x2054, 0x2054], [0x2060, 0x206F], [0x2070, 0x218F], [0x2460, 0x24FF], + [0x2776, 0x2793], [0x2C00, 0x2DFF], [0x2E80, 0x2FFF], [0x3004, 0x3007], + [0x3021, 0x302F], [0x3031, 0x303F], [0x3040, 0xD7FF], [0xF900, 0xFD3D], + [0xFD40, 0xFDCF], [0xFDF0, 0xFE44], [0xFE47, 0xFFFD], [0x10000, 0x1FFFD], + [0x20000, 0x2FFFD], [0x30000, 0x3FFFD], [0x40000, 0x4FFFD], [0x50000, 0x5FFFD], + [0x60000, 0x6FFFD], [0x70000, 0x7FFFD], [0x80000, 0x8FFFD], [0x90000, 0x9FFFD], + [0xA0000, 0xAFFFD], [0xB0000, 0xBFFFD], [0xC0000, 0xCFFFD], [0xD0000, 0xDFFFD], + [0xE0000, 0xEFFFD] +]; + +/** +Tests [[dchar, index] ... planes * 3] for FixedTable_C11_Continue +*/ +enum uint[2][] FixedTable_C11_Continue_Test = [ + [0x0000A8, 0], + [0x00203F, 15], + [0x00FF22, 30], + [0x017FFE, 31], + [0x027FFE, 32], + [0x037FFE, 33], + [0x047FFE, 34], + [0x057FFE, 35], + [0x067FFE, 36], + [0x077FFE, 37], + [0x087FFE, 38], + [0x097FFE, 39], + [0x0A7FFE, 40], + [0x0B7FFE, 41], + [0x0C7FFE, 42], + [0x0D7FFE, 43], + [0x0E7FFE, 44], ]; /** @@ -1773,2469 +547,1008 @@ Least restrictive with both Start and Continue Entries: 860486 */ static immutable dchar[2][] LeastRestrictive_OfAll = [ - [0xA8, 0xA8], - [0xAA, 0xAA], - [0xAD, 0xAD], - [0xAF, 0xAF], - [0xB2, 0xB5], - [0xB7, 0xBA], - [0xBC, 0xBE], - [0xC0, 0xD6], - [0xD8, 0xF6], - [0xF8, 0x217], - [0x250, 0x2A8], - [0x2B0, 0x2B8], - [0x2BB, 0x2BB], - [0x2BD, 0x2C1], - [0x2C6, 0x2D1], - [0x2E0, 0x2E4], - [0x2EC, 0x2EC], - [0x2EE, 0x2EE], - [0x300, 0x374], - [0x376, 0x377], - [0x37A, 0x37D], - [0x37F, 0x37F], - [0x386, 0x386], - [0x388, 0x38A], - [0x38C, 0x38C], - [0x38E, 0x3A1], - [0x3A3, 0x3D6], - [0x3DA, 0x3DA], - [0x3DC, 0x3DC], - [0x3DE, 0x3DE], - [0x3E0, 0x3E0], - [0x3E2, 0x3F3], - [0x3F7, 0x40C], - [0x40E, 0x44F], - [0x451, 0x45C], - [0x45E, 0x481], - [0x483, 0x487], - [0x48A, 0x4C4], - [0x4C7, 0x4C8], - [0x4CB, 0x4CC], - [0x4D0, 0x4EB], - [0x4EE, 0x4F5], - [0x4F8, 0x4F9], - [0x531, 0x556], - [0x559, 0x559], - [0x560, 0x587], - [0x591, 0x5B9], - [0x5BB, 0x5BD], - [0x5BF, 0x5BF], - [0x5C1, 0x5C2], - [0x5C4, 0x5C5], - [0x5C7, 0x5C7], - [0x5D0, 0x5EA], - [0x5EF, 0x5F2], - [0x610, 0x61A], - [0x620, 0x63A], - [0x640, 0x652], - [0x660, 0x669], - [0x66E, 0x6BE], - [0x6C0, 0x6CE], - [0x6D0, 0x6D5], - [0x6DF, 0x6E8], - [0x6EA, 0x6F9], - [0x6FF, 0x6FF], - [0x710, 0x710], - [0x712, 0x72F], - [0x74D, 0x7A5], - [0x7B1, 0x7B1], - [0x7C0, 0x7EA], - [0x7F4, 0x7F5], - [0x7FA, 0x7FA], - [0x7FD, 0x7FD], - [0x800, 0x815], - [0x81A, 0x81A], - [0x824, 0x824], - [0x828, 0x828], - [0x840, 0x858], - [0x860, 0x86A], - [0x870, 0x887], - [0x889, 0x88E], - [0x898, 0x8C9], - [0x8E3, 0x939], - [0x93D, 0x94D], - [0x950, 0x952], - [0x958, 0x963], - [0x966, 0x96F], - [0x971, 0x983], - [0x985, 0x98C], - [0x98F, 0x990], - [0x993, 0x9A8], - [0x9AA, 0x9B0], - [0x9B2, 0x9B2], - [0x9B6, 0x9B9], - [0x9BC, 0x9C4], - [0x9C7, 0x9C8], - [0x9CB, 0x9CE], - [0x9D7, 0x9D7], - [0x9DC, 0x9DD], - [0x9DF, 0x9E3], - [0x9E6, 0x9F1], - [0x9FC, 0x9FC], - [0x9FE, 0x9FE], - [0xA01, 0xA02], - [0xA05, 0xA0A], - [0xA0F, 0xA10], - [0xA13, 0xA28], - [0xA2A, 0xA30], - [0xA32, 0xA33], - [0xA35, 0xA36], - [0xA38, 0xA39], - [0xA3C, 0xA3C], - [0xA3E, 0xA42], - [0xA47, 0xA48], - [0xA4B, 0xA4D], - [0xA51, 0xA51], - [0xA59, 0xA5C], - [0xA5E, 0xA5E], - [0xA66, 0xA6F], - [0xA72, 0xA74], - [0xA81, 0xA83], - [0xA85, 0xA8B], - [0xA8D, 0xA8D], - [0xA8F, 0xA91], - [0xA93, 0xAA8], - [0xAAA, 0xAB0], - [0xAB2, 0xAB3], - [0xAB5, 0xAB9], - [0xABC, 0xABD], - [0xAC7, 0xAC9], - [0xACB, 0xACD], - [0xAD0, 0xAD0], - [0xAE0, 0xAE0], - [0xAE6, 0xAEF], - [0xAF9, 0xAFF], - [0xB01, 0xB03], - [0xB05, 0xB0C], - [0xB0F, 0xB10], - [0xB13, 0xB28], - [0xB2A, 0xB30], - [0xB32, 0xB33], - [0xB35, 0xB39], - [0xB3C, 0xB43], - [0xB47, 0xB48], - [0xB4B, 0xB4D], - [0xB55, 0xB57], - [0xB5C, 0xB5D], - [0xB5F, 0xB61], - [0xB66, 0xB6F], - [0xB71, 0xB71], - [0xB82, 0xB83], - [0xB85, 0xB8A], - [0xB8E, 0xB90], - [0xB92, 0xB95], - [0xB99, 0xB9A], - [0xB9C, 0xB9C], - [0xB9E, 0xB9F], - [0xBA3, 0xBA4], - [0xBA8, 0xBAA], - [0xBAE, 0xBB5], - [0xBB7, 0xBB9], - [0xBBE, 0xBC2], - [0xBC6, 0xBC8], - [0xBCA, 0xBCD], - [0xBD0, 0xBD0], - [0xBD7, 0xBD7], - [0xBE6, 0xBEF], - [0xC00, 0xC03], - [0xC05, 0xC0C], - [0xC0E, 0xC10], - [0xC12, 0xC28], - [0xC2A, 0xC33], - [0xC35, 0xC39], - [0xC3C, 0xC44], - [0xC46, 0xC48], - [0xC4A, 0xC4D], - [0xC55, 0xC56], - [0xC58, 0xC5A], - [0xC5D, 0xC5D], - [0xC60, 0xC61], - [0xC66, 0xC6F], - [0xC80, 0xC83], - [0xC85, 0xC8C], - [0xC8E, 0xC90], - [0xC92, 0xCA8], - [0xCAA, 0xCB3], - [0xCB5, 0xCB9], - [0xCBC, 0xCC4], - [0xCC6, 0xCC8], - [0xCCA, 0xCCD], - [0xCD5, 0xCD6], - [0xCDD, 0xCDE], - [0xCE0, 0xCE1], - [0xCE6, 0xCEF], - [0xCF1, 0xCF2], - [0xD00, 0xD0C], - [0xD0E, 0xD10], - [0xD12, 0xD39], - [0xD3D, 0xD43], - [0xD46, 0xD48], - [0xD4A, 0xD4E], - [0xD54, 0xD57], - [0xD5F, 0xD61], - [0xD66, 0xD6F], - [0xD7A, 0xD7F], - [0xD81, 0xD83], - [0xD85, 0xD96], - [0xD9A, 0xDB1], - [0xDB3, 0xDBB], - [0xDBD, 0xDBD], - [0xDC0, 0xDC6], - [0xDCA, 0xDCA], - [0xDCF, 0xDD4], - [0xDD6, 0xDD6], - [0xDD8, 0xDDF], - [0xDE6, 0xDEF], - [0xDF2, 0xDF3], - [0xE01, 0xE32], - [0xE40, 0xE4E], - [0xE50, 0xE59], - [0xE81, 0xE82], - [0xE84, 0xE84], - [0xE86, 0xE88], - [0xE8A, 0xE8A], - [0xE8C, 0xE8D], - [0xE94, 0xE97], - [0xE99, 0xE9F], - [0xEA1, 0xEA3], - [0xEA5, 0xEA5], - [0xEA7, 0xEAB], - [0xEAD, 0xEAE], - [0xEB0, 0xEB9], - [0xEBB, 0xEBD], - [0xEC0, 0xEC4], - [0xEC6, 0xEC6], - [0xEC8, 0xECE], - [0xED0, 0xED9], - [0xEDC, 0xEDF], - [0xF00, 0xF00], - [0xF18, 0xF19], - [0xF20, 0xF29], - [0xF35, 0xF35], - [0xF37, 0xF37], - [0xF39, 0xF39], - [0xF3E, 0xF47], - [0xF49, 0xF6C], - [0xF71, 0xF84], - [0xF86, 0xF95], - [0xF97, 0xF97], - [0xF99, 0xFB7], - [0xFB9, 0xFB9], - [0xFC6, 0xFC6], - [0x1000, 0x103F], - [0x1050, 0x105D], - [0x1061, 0x1061], - [0x1065, 0x1066], - [0x106E, 0x1070], - [0x1075, 0x1081], - [0x108E, 0x108E], - [0x10A0, 0x10C5], - [0x10C7, 0x10C7], - [0x10CD, 0x10CD], - [0x10D0, 0x10FA], - [0x10FC, 0x1248], - [0x124A, 0x124D], - [0x1250, 0x1256], - [0x1258, 0x1258], - [0x125A, 0x125D], - [0x1260, 0x1288], - [0x128A, 0x128D], - [0x1290, 0x12B0], - [0x12B2, 0x12B5], - [0x12B8, 0x12BE], - [0x12C0, 0x12C0], - [0x12C2, 0x12C5], - [0x12C8, 0x12D6], - [0x12D8, 0x1310], - [0x1312, 0x1315], - [0x1318, 0x135A], - [0x135D, 0x135F], - [0x1369, 0x1371], - [0x1380, 0x138F], - [0x13A0, 0x13F5], - [0x13F8, 0x13FD], - [0x1401, 0x166C], - [0x166F, 0x167F], - [0x1681, 0x169A], - [0x16A0, 0x16EA], - [0x16EE, 0x16F8], - [0x1700, 0x1711], - [0x171F, 0x1731], - [0x1740, 0x1751], - [0x1760, 0x176C], - [0x176E, 0x1770], - [0x1772, 0x1773], - [0x1780, 0x17B3], - [0x17D7, 0x17D7], - [0x17DC, 0x17DC], - [0x17E0, 0x17E9], - [0x180B, 0x180D], - [0x180F, 0x1878], - [0x1880, 0x18A8], - [0x18AA, 0x18AA], - [0x18B0, 0x18F5], - [0x1900, 0x191E], - [0x1920, 0x192B], - [0x1930, 0x193B], - [0x1946, 0x196D], - [0x1970, 0x1974], - [0x1980, 0x19AB], - [0x19B0, 0x19C9], - [0x19D0, 0x19DA], - [0x1A00, 0x1A16], - [0x1A20, 0x1A54], - [0x1A60, 0x1A7C], - [0x1A7F, 0x1A89], - [0x1A90, 0x1A99], - [0x1AA7, 0x1AA7], - [0x1AB0, 0x1ABD], - [0x1ABF, 0x1ACE], - [0x1B00, 0x1B33], - [0x1B45, 0x1B4C], - [0x1B50, 0x1B59], - [0x1B6B, 0x1B73], - [0x1B80, 0x1BA0], - [0x1BAE, 0x1BAF], - [0x1BBA, 0x1BE5], - [0x1C00, 0x1C37], - [0x1C40, 0x1C49], - [0x1C4D, 0x1C7D], - [0x1C80, 0x1C88], - [0x1C90, 0x1CBA], - [0x1CBD, 0x1CBF], - [0x1CD0, 0x1CD2], - [0x1CD4, 0x1CEC], - [0x1CEE, 0x1CF3], - [0x1CF5, 0x1CF6], - [0x1CFA, 0x1CFA], - [0x1D00, 0x1EF9], - [0x1F00, 0x1F15], - [0x1F18, 0x1F1D], - [0x1F20, 0x1F45], - [0x1F48, 0x1F4D], - [0x1F50, 0x1F57], - [0x1F59, 0x1F59], - [0x1F5B, 0x1F5B], - [0x1F5D, 0x1F5D], - [0x1F5F, 0x1F7D], - [0x1F80, 0x1FB4], - [0x1FB6, 0x1FBC], - [0x1FBE, 0x1FBE], - [0x1FC2, 0x1FC4], - [0x1FC6, 0x1FCC], - [0x1FD0, 0x1FD3], - [0x1FD6, 0x1FDB], - [0x1FE0, 0x1FEC], - [0x1FF2, 0x1FF4], - [0x1FF6, 0x1FFC], - [0x200B, 0x200D], - [0x202A, 0x202E], - [0x203F, 0x2040], - [0x2054, 0x2054], - [0x2060, 0x2071], - [0x207F, 0x207F], - [0x2090, 0x209C], - [0x20D0, 0x20DC], - [0x20E1, 0x20E1], - [0x20E5, 0x20F0], - [0x2102, 0x2102], - [0x2107, 0x2107], - [0x210A, 0x2113], - [0x2115, 0x2115], - [0x2118, 0x211D], - [0x2124, 0x2124], - [0x2126, 0x2126], - [0x2128, 0x2128], - [0x212A, 0x2138], - [0x213C, 0x213F], - [0x2145, 0x2149], - [0x214E, 0x214E], - [0x2160, 0x2188], - [0x2460, 0x24FF], - [0x2776, 0x2793], - [0x2C00, 0x2CE4], - [0x2CEB, 0x2CF3], - [0x2D00, 0x2D25], - [0x2D27, 0x2D27], - [0x2D2D, 0x2D2D], - [0x2D30, 0x2D67], - [0x2D6F, 0x2D6F], - [0x2D7F, 0x2D96], - [0x2DA0, 0x2DA6], - [0x2DA8, 0x2DAE], - [0x2DB0, 0x2DB6], - [0x2DB8, 0x2DBE], - [0x2DC0, 0x2DC6], - [0x2DC8, 0x2DCE], - [0x2DD0, 0x2DD6], - [0x2DD8, 0x2DDE], - [0x2DE0, 0x2DFF], - [0x2E80, 0x2FFF], - [0x3004, 0x3007], - [0x3021, 0x302F], - [0x3031, 0x303C], - [0x3041, 0x3096], - [0x3099, 0x309F], - [0x30A1, 0x30FC], - [0x3105, 0x312F], - [0x3131, 0x318E], - [0x31A0, 0x31BF], - [0x31F0, 0x31FF], - [0x3400, 0x4DBF], - [0x4E00, 0xA48C], - [0xA4D0, 0xA4FD], - [0xA500, 0xA60C], - [0xA610, 0xA61F], - [0xA62A, 0xA62B], - [0xA640, 0xA66F], - [0xA674, 0xA67D], - [0xA67F, 0xA6EF], - [0xA717, 0xA71F], - [0xA722, 0xA788], - [0xA78B, 0xA7CA], - [0xA7D0, 0xA7D1], - [0xA7D3, 0xA7D3], - [0xA7D5, 0xA7D9], - [0xA7F2, 0xA805], - [0xA807, 0xA80A], - [0xA80C, 0xA822], - [0xA82C, 0xA82C], - [0xA840, 0xA873], - [0xA880, 0xA8B3], - [0xA8D0, 0xA8D9], - [0xA8E0, 0xA8F7], - [0xA8FB, 0xA8FB], - [0xA8FD, 0xA8FE], - [0xA90A, 0xA925], - [0xA930, 0xA946], - [0xA960, 0xA97C], - [0xA980, 0xA9B2], - [0xA9CF, 0xA9CF], - [0xA9E0, 0xA9E4], - [0xA9E6, 0xA9EF], - [0xA9FA, 0xA9FE], - [0xAA00, 0xAA28], - [0xAA40, 0xAA42], - [0xAA44, 0xAA4B], - [0xAA50, 0xAA59], - [0xAA60, 0xAA76], - [0xAA7A, 0xAA7A], - [0xAA7E, 0xAAAF], - [0xAAB1, 0xAAB1], - [0xAAB5, 0xAAB6], - [0xAAB9, 0xAABD], - [0xAAC0, 0xAAC0], - [0xAAC2, 0xAAC2], - [0xAADB, 0xAADD], - [0xAAE0, 0xAAEA], - [0xAAF2, 0xAAF4], - [0xAB01, 0xAB06], - [0xAB09, 0xAB0E], - [0xAB11, 0xAB16], - [0xAB20, 0xAB26], - [0xAB28, 0xAB2E], - [0xAB30, 0xAB5A], - [0xAB5C, 0xAB69], - [0xAB70, 0xABE2], - [0xABEC, 0xABED], - [0xABF0, 0xABF9], - [0xAC00, 0xD7A3], - [0xD7B0, 0xD7C6], - [0xD7CB, 0xD7FB], - [0xF900, 0xFA6D], - [0xFA70, 0xFAD9], - [0xFB00, 0xFB06], - [0xFB13, 0xFB17], - [0xFB1D, 0xFB1D], - [0xFB1F, 0xFB28], - [0xFB2A, 0xFB36], - [0xFB38, 0xFB3C], - [0xFB3E, 0xFB3E], - [0xFB40, 0xFB41], - [0xFB43, 0xFB44], - [0xFB46, 0xFBB1], - [0xFBD3, 0xFC5D], - [0xFC64, 0xFD3D], - [0xFD40, 0xFD8F], - [0xFD92, 0xFDC7], - [0xFDF0, 0xFDF9], - [0xFE00, 0xFE0F], - [0xFE20, 0xFE2F], - [0xFE33, 0xFE34], - [0xFE47, 0xFE71], - [0xFE73, 0xFE73], - [0xFE77, 0xFE77], - [0xFE79, 0xFE79], - [0xFE7B, 0xFE7B], - [0xFE7D, 0xFE7D], - [0xFE7F, 0xFEFC], - [0xFF10, 0xFF19], - [0xFF21, 0xFF3A], - [0xFF3F, 0xFF3F], - [0xFF41, 0xFF5A], - [0xFF65, 0xFF9D], - [0xFFA0, 0xFFBE], - [0xFFC2, 0xFFC7], - [0xFFCA, 0xFFCF], - [0xFFD2, 0xFFD7], - [0xFFDA, 0xFFDC], - [0x10000, 0x1000B], - [0x1000D, 0x10026], - [0x10028, 0x1003A], - [0x1003C, 0x1003D], - [0x1003F, 0x1004D], - [0x10050, 0x1005D], - [0x10080, 0x100FA], - [0x10140, 0x10174], - [0x101FD, 0x101FD], - [0x10280, 0x1029C], - [0x102A0, 0x102D0], - [0x102E0, 0x102E0], - [0x10300, 0x1031F], - [0x1032D, 0x1034A], - [0x10350, 0x10375], - [0x10380, 0x1039D], - [0x103A0, 0x103C3], - [0x103C8, 0x103CF], - [0x103D1, 0x103D5], - [0x10400, 0x1049D], - [0x104A0, 0x104A9], - [0x104B0, 0x104D3], - [0x104D8, 0x104FB], - [0x10500, 0x10527], - [0x10530, 0x10563], - [0x10570, 0x1057A], - [0x1057C, 0x1058A], - [0x1058C, 0x10592], - [0x10594, 0x10595], - [0x10597, 0x105A1], - [0x105A3, 0x105B1], - [0x105B3, 0x105B9], - [0x105BB, 0x105BC], - [0x10600, 0x10736], - [0x10740, 0x10755], - [0x10760, 0x10767], - [0x10780, 0x10785], - [0x10787, 0x107B0], - [0x107B2, 0x107BA], - [0x10800, 0x10805], - [0x10808, 0x10808], - [0x1080A, 0x10835], - [0x10837, 0x10838], - [0x1083C, 0x1083C], - [0x1083F, 0x10855], - [0x10860, 0x10876], - [0x10880, 0x1089E], - [0x108E0, 0x108F2], - [0x108F4, 0x108F5], - [0x10900, 0x10915], - [0x10920, 0x10939], - [0x10980, 0x109B7], - [0x109BE, 0x109BF], - [0x10A00, 0x10A03], - [0x10A05, 0x10A06], - [0x10A0C, 0x10A13], - [0x10A15, 0x10A17], - [0x10A19, 0x10A35], - [0x10A38, 0x10A3A], - [0x10A3F, 0x10A3F], - [0x10A60, 0x10A7C], - [0x10A80, 0x10A9C], - [0x10AC0, 0x10AC7], - [0x10AC9, 0x10AE6], - [0x10B00, 0x10B35], - [0x10B40, 0x10B55], - [0x10B60, 0x10B72], - [0x10B80, 0x10B91], - [0x10C00, 0x10C48], - [0x10C80, 0x10CB2], - [0x10CC0, 0x10CF2], - [0x10D00, 0x10D23], - [0x10D30, 0x10D39], - [0x10E80, 0x10EA9], - [0x10EAB, 0x10EAC], - [0x10EB0, 0x10EB1], - [0x10EFD, 0x10F1C], - [0x10F27, 0x10F27], - [0x10F30, 0x10F45], - [0x10F70, 0x10F81], - [0x10FB0, 0x10FC4], - [0x10FE0, 0x10FF6], - [0x11000, 0x11037], - [0x11066, 0x11072], - [0x11075, 0x11075], - [0x1107F, 0x110AF], - [0x110C2, 0x110C2], - [0x110D0, 0x110E8], - [0x110F0, 0x110F9], - [0x11100, 0x11126], - [0x11136, 0x1113F], - [0x11144, 0x11147], - [0x11150, 0x11173], - [0x11176, 0x11176], - [0x11180, 0x111B2], - [0x111C1, 0x111C4], - [0x111C9, 0x111CC], - [0x111CE, 0x111DA], - [0x111DC, 0x111DC], - [0x11200, 0x11211], - [0x11213, 0x11237], - [0x1123E, 0x11240], - [0x11280, 0x11286], - [0x11288, 0x11288], - [0x1128A, 0x1128D], - [0x1128F, 0x1129D], - [0x1129F, 0x112A8], - [0x112B0, 0x112EA], - [0x112F0, 0x112F9], - [0x11300, 0x11303], - [0x11305, 0x1130C], - [0x1130F, 0x11310], - [0x11313, 0x11328], - [0x1132A, 0x11330], - [0x11332, 0x11333], - [0x11335, 0x11339], - [0x1133B, 0x1133D], - [0x11347, 0x11348], - [0x1134B, 0x1134D], - [0x11350, 0x11350], - [0x11357, 0x11357], - [0x1135D, 0x11363], - [0x11366, 0x1136C], - [0x11370, 0x11374], - [0x11400, 0x1144A], - [0x11450, 0x11459], - [0x1145E, 0x11461], - [0x11480, 0x114C5], - [0x114C7, 0x114C7], - [0x114D0, 0x114D9], - [0x11580, 0x115B5], - [0x115B8, 0x115C0], - [0x115D8, 0x115DD], - [0x11600, 0x11640], - [0x11644, 0x11644], - [0x11650, 0x11659], - [0x11680, 0x116B8], - [0x116C0, 0x116C9], - [0x11700, 0x1171A], - [0x1171D, 0x1172B], - [0x11730, 0x11739], - [0x11740, 0x11746], - [0x11800, 0x1183A], - [0x118A0, 0x118E9], - [0x118FF, 0x11906], - [0x11909, 0x11909], - [0x1190C, 0x11913], - [0x11915, 0x11916], - [0x11918, 0x11935], - [0x11937, 0x11938], - [0x1193B, 0x1193F], - [0x11941, 0x11941], - [0x11950, 0x11959], - [0x119A0, 0x119A7], - [0x119AA, 0x119D7], - [0x119DA, 0x119E1], - [0x119E3, 0x119E3], - [0x11A00, 0x11A32], - [0x11A3A, 0x11A3A], - [0x11A47, 0x11A47], - [0x11A50, 0x11A89], - [0x11A9D, 0x11A9D], - [0x11AB0, 0x11AF8], - [0x11C00, 0x11C08], - [0x11C0A, 0x11C36], - [0x11C38, 0x11C40], - [0x11C50, 0x11C59], - [0x11C72, 0x11C8F], - [0x11C92, 0x11CA7], - [0x11CA9, 0x11CB6], - [0x11D00, 0x11D06], - [0x11D08, 0x11D09], - [0x11D0B, 0x11D36], - [0x11D3A, 0x11D3A], - [0x11D3C, 0x11D3D], - [0x11D3F, 0x11D46], - [0x11D50, 0x11D59], - [0x11D60, 0x11D65], - [0x11D67, 0x11D68], - [0x11D6A, 0x11D89], - [0x11D90, 0x11D91], - [0x11D93, 0x11D98], - [0x11DA0, 0x11DA9], - [0x11EE0, 0x11EF2], - [0x11F00, 0x11F02], - [0x11F04, 0x11F10], - [0x11F12, 0x11F33], - [0x11F3E, 0x11F42], - [0x11F50, 0x11F59], - [0x11FB0, 0x11FB0], - [0x12000, 0x12399], - [0x12400, 0x1246E], - [0x12480, 0x12543], - [0x12F90, 0x12FF0], - [0x13000, 0x1342F], - [0x13440, 0x13446], - [0x14400, 0x14646], - [0x16800, 0x16A38], - [0x16A40, 0x16A5E], - [0x16A60, 0x16A69], - [0x16A70, 0x16ABE], - [0x16AC0, 0x16AC9], - [0x16AD0, 0x16AED], - [0x16AF0, 0x16AF4], - [0x16B00, 0x16B2F], - [0x16B40, 0x16B43], - [0x16B50, 0x16B59], - [0x16B63, 0x16B77], - [0x16B7D, 0x16B8F], - [0x16E40, 0x16E7F], - [0x16F00, 0x16F4A], - [0x16F4F, 0x16F50], - [0x16F8F, 0x16F9F], - [0x16FE0, 0x16FE1], - [0x16FE3, 0x16FE3], - [0x16FF0, 0x16FF1], - [0x17000, 0x187F7], - [0x18800, 0x18CD5], - [0x18D00, 0x18D08], - [0x1AFF0, 0x1AFF3], - [0x1AFF5, 0x1AFFB], - [0x1AFFD, 0x1AFFE], - [0x1B000, 0x1B122], - [0x1B132, 0x1B132], - [0x1B150, 0x1B152], - [0x1B155, 0x1B155], - [0x1B164, 0x1B167], - [0x1B170, 0x1B2FB], - [0x1BC00, 0x1BC6A], - [0x1BC70, 0x1BC7C], - [0x1BC80, 0x1BC88], - [0x1BC90, 0x1BC99], - [0x1BC9D, 0x1BC9E], - [0x1CF00, 0x1CF2D], - [0x1CF30, 0x1CF46], - [0x1D165, 0x1D169], - [0x1D16D, 0x1D172], - [0x1D17B, 0x1D182], - [0x1D185, 0x1D18B], - [0x1D1AA, 0x1D1AD], - [0x1D242, 0x1D244], - [0x1D400, 0x1D454], - [0x1D456, 0x1D49C], - [0x1D49E, 0x1D49F], - [0x1D4A2, 0x1D4A2], - [0x1D4A5, 0x1D4A6], - [0x1D4A9, 0x1D4AC], - [0x1D4AE, 0x1D4B9], - [0x1D4BB, 0x1D4BB], - [0x1D4BD, 0x1D4C3], - [0x1D4C5, 0x1D505], - [0x1D507, 0x1D50A], - [0x1D50D, 0x1D514], - [0x1D516, 0x1D51C], - [0x1D51E, 0x1D539], - [0x1D53B, 0x1D53E], - [0x1D540, 0x1D544], - [0x1D546, 0x1D546], - [0x1D54A, 0x1D550], - [0x1D552, 0x1D6A5], - [0x1D6A8, 0x1D6C0], - [0x1D6C2, 0x1D6DA], - [0x1D6DC, 0x1D6FA], - [0x1D6FC, 0x1D714], - [0x1D716, 0x1D734], - [0x1D736, 0x1D74E], - [0x1D750, 0x1D76E], - [0x1D770, 0x1D788], - [0x1D78A, 0x1D7A8], - [0x1D7AA, 0x1D7C2], - [0x1D7C4, 0x1D7CB], - [0x1D7CE, 0x1D7FF], - [0x1DA00, 0x1DA36], - [0x1DA3B, 0x1DA6C], - [0x1DA75, 0x1DA75], - [0x1DA84, 0x1DA84], - [0x1DA9B, 0x1DA9F], - [0x1DAA1, 0x1DAAF], - [0x1DF00, 0x1DF1E], - [0x1DF25, 0x1DF2A], - [0x1E000, 0x1E006], - [0x1E008, 0x1E018], - [0x1E01B, 0x1E021], - [0x1E023, 0x1E024], - [0x1E026, 0x1E02A], - [0x1E030, 0x1E06D], - [0x1E08F, 0x1E08F], - [0x1E100, 0x1E12C], - [0x1E130, 0x1E13D], - [0x1E140, 0x1E149], - [0x1E14E, 0x1E14E], - [0x1E290, 0x1E2AE], - [0x1E2C0, 0x1E2F9], - [0x1E4D0, 0x1E4F9], - [0x1E7E0, 0x1E7E6], - [0x1E7E8, 0x1E7EB], - [0x1E7ED, 0x1E7EE], - [0x1E7F0, 0x1E7FE], - [0x1E800, 0x1E8C4], - [0x1E8D0, 0x1E8D6], - [0x1E900, 0x1E94B], - [0x1E950, 0x1E959], - [0x1EE00, 0x1EE03], - [0x1EE05, 0x1EE1F], - [0x1EE21, 0x1EE22], - [0x1EE24, 0x1EE24], - [0x1EE27, 0x1EE27], - [0x1EE29, 0x1EE32], - [0x1EE34, 0x1EE37], - [0x1EE39, 0x1EE39], - [0x1EE3B, 0x1EE3B], - [0x1EE42, 0x1EE42], - [0x1EE47, 0x1EE47], - [0x1EE49, 0x1EE49], - [0x1EE4B, 0x1EE4B], - [0x1EE4D, 0x1EE4F], - [0x1EE51, 0x1EE52], - [0x1EE54, 0x1EE54], - [0x1EE57, 0x1EE57], - [0x1EE59, 0x1EE59], - [0x1EE5B, 0x1EE5B], - [0x1EE5D, 0x1EE5D], - [0x1EE5F, 0x1EE5F], - [0x1EE61, 0x1EE62], - [0x1EE64, 0x1EE64], - [0x1EE67, 0x1EE6A], - [0x1EE6C, 0x1EE72], - [0x1EE74, 0x1EE77], - [0x1EE79, 0x1EE7C], - [0x1EE7E, 0x1EE7E], - [0x1EE80, 0x1EE89], - [0x1EE8B, 0x1EE9B], - [0x1EEA1, 0x1EEA3], - [0x1EEA5, 0x1EEA9], - [0x1EEAB, 0x1EEBB], - [0x1FBF0, 0x1FBF9], - [0x20000, 0x2B739], - [0x2B740, 0x2B81D], - [0x2B820, 0x2CEA1], - [0x2CEB0, 0x2EBE0], - [0x2EBF0, 0x2EE5D], - [0x2F800, 0x2FA1D], - [0x30000, 0x323AF], - [0x40000, 0x4FFFD], - [0x50000, 0x5FFFD], - [0x60000, 0x6FFFD], - [0x70000, 0x7FFFD], - [0x80000, 0x8FFFD], - [0x90000, 0x9FFFD], - [0xA0000, 0xAFFFD], - [0xB0000, 0xBFFFD], - [0xC0000, 0xCFFFD], - [0xD0000, 0xDFFFD], - [0xE0000, 0xEFFFD], + [0xA8, 0xA8], [0xAA, 0xAA], [0xAD, 0xAD], [0xAF, 0xAF], + [0xB2, 0xB5], [0xB7, 0xBA], [0xBC, 0xBE], [0xC0, 0xD6], + [0xD8, 0xF6], [0xF8, 0x217], [0x250, 0x2A8], [0x2B0, 0x2B8], + [0x2BB, 0x2BB], [0x2BD, 0x2C1], [0x2C6, 0x2D1], [0x2E0, 0x2E4], + [0x2EC, 0x2EC], [0x2EE, 0x2EE], [0x300, 0x374], [0x376, 0x377], + [0x37A, 0x37D], [0x37F, 0x37F], [0x386, 0x386], [0x388, 0x38A], + [0x38C, 0x38C], [0x38E, 0x3A1], [0x3A3, 0x3D6], [0x3DA, 0x3DA], + [0x3DC, 0x3DC], [0x3DE, 0x3DE], [0x3E0, 0x3E0], [0x3E2, 0x3F3], + [0x3F7, 0x40C], [0x40E, 0x44F], [0x451, 0x45C], [0x45E, 0x481], + [0x483, 0x487], [0x48A, 0x4C4], [0x4C7, 0x4C8], [0x4CB, 0x4CC], + [0x4D0, 0x4EB], [0x4EE, 0x4F5], [0x4F8, 0x4F9], [0x531, 0x556], + [0x559, 0x559], [0x560, 0x587], [0x591, 0x5B9], [0x5BB, 0x5BD], + [0x5BF, 0x5BF], [0x5C1, 0x5C2], [0x5C4, 0x5C5], [0x5C7, 0x5C7], + [0x5D0, 0x5EA], [0x5EF, 0x5F2], [0x610, 0x61A], [0x620, 0x63A], + [0x640, 0x652], [0x660, 0x669], [0x66E, 0x6BE], [0x6C0, 0x6CE], + [0x6D0, 0x6D5], [0x6DF, 0x6E8], [0x6EA, 0x6F9], [0x6FF, 0x6FF], + [0x710, 0x710], [0x712, 0x72F], [0x74D, 0x7A5], [0x7B1, 0x7B1], + [0x7C0, 0x7EA], [0x7F4, 0x7F5], [0x7FA, 0x7FA], [0x7FD, 0x7FD], + [0x800, 0x815], [0x81A, 0x81A], [0x824, 0x824], [0x828, 0x828], + [0x840, 0x858], [0x860, 0x86A], [0x870, 0x887], [0x889, 0x88E], + [0x898, 0x8C9], [0x8E3, 0x939], [0x93D, 0x94D], [0x950, 0x952], + [0x958, 0x963], [0x966, 0x96F], [0x971, 0x983], [0x985, 0x98C], + [0x98F, 0x990], [0x993, 0x9A8], [0x9AA, 0x9B0], [0x9B2, 0x9B2], + [0x9B6, 0x9B9], [0x9BC, 0x9C4], [0x9C7, 0x9C8], [0x9CB, 0x9CE], + [0x9D7, 0x9D7], [0x9DC, 0x9DD], [0x9DF, 0x9E3], [0x9E6, 0x9F1], + [0x9FC, 0x9FC], [0x9FE, 0x9FE], [0xA01, 0xA02], [0xA05, 0xA0A], + [0xA0F, 0xA10], [0xA13, 0xA28], [0xA2A, 0xA30], [0xA32, 0xA33], + [0xA35, 0xA36], [0xA38, 0xA39], [0xA3C, 0xA3C], [0xA3E, 0xA42], + [0xA47, 0xA48], [0xA4B, 0xA4D], [0xA51, 0xA51], [0xA59, 0xA5C], + [0xA5E, 0xA5E], [0xA66, 0xA6F], [0xA72, 0xA74], [0xA81, 0xA83], + [0xA85, 0xA8B], [0xA8D, 0xA8D], [0xA8F, 0xA91], [0xA93, 0xAA8], + [0xAAA, 0xAB0], [0xAB2, 0xAB3], [0xAB5, 0xAB9], [0xABC, 0xABD], + [0xAC7, 0xAC9], [0xACB, 0xACD], [0xAD0, 0xAD0], [0xAE0, 0xAE0], + [0xAE6, 0xAEF], [0xAF9, 0xAFF], [0xB01, 0xB03], [0xB05, 0xB0C], + [0xB0F, 0xB10], [0xB13, 0xB28], [0xB2A, 0xB30], [0xB32, 0xB33], + [0xB35, 0xB39], [0xB3C, 0xB43], [0xB47, 0xB48], [0xB4B, 0xB4D], + [0xB55, 0xB57], [0xB5C, 0xB5D], [0xB5F, 0xB61], [0xB66, 0xB6F], + [0xB71, 0xB71], [0xB82, 0xB83], [0xB85, 0xB8A], [0xB8E, 0xB90], + [0xB92, 0xB95], [0xB99, 0xB9A], [0xB9C, 0xB9C], [0xB9E, 0xB9F], + [0xBA3, 0xBA4], [0xBA8, 0xBAA], [0xBAE, 0xBB5], [0xBB7, 0xBB9], + [0xBBE, 0xBC2], [0xBC6, 0xBC8], [0xBCA, 0xBCD], [0xBD0, 0xBD0], + [0xBD7, 0xBD7], [0xBE6, 0xBEF], [0xC00, 0xC03], [0xC05, 0xC0C], + [0xC0E, 0xC10], [0xC12, 0xC28], [0xC2A, 0xC33], [0xC35, 0xC39], + [0xC3C, 0xC44], [0xC46, 0xC48], [0xC4A, 0xC4D], [0xC55, 0xC56], + [0xC58, 0xC5A], [0xC5D, 0xC5D], [0xC60, 0xC61], [0xC66, 0xC6F], + [0xC80, 0xC83], [0xC85, 0xC8C], [0xC8E, 0xC90], [0xC92, 0xCA8], + [0xCAA, 0xCB3], [0xCB5, 0xCB9], [0xCBC, 0xCC4], [0xCC6, 0xCC8], + [0xCCA, 0xCCD], [0xCD5, 0xCD6], [0xCDD, 0xCDE], [0xCE0, 0xCE1], + [0xCE6, 0xCEF], [0xCF1, 0xCF2], [0xD00, 0xD0C], [0xD0E, 0xD10], + [0xD12, 0xD39], [0xD3D, 0xD43], [0xD46, 0xD48], [0xD4A, 0xD4E], + [0xD54, 0xD57], [0xD5F, 0xD61], [0xD66, 0xD6F], [0xD7A, 0xD7F], + [0xD81, 0xD83], [0xD85, 0xD96], [0xD9A, 0xDB1], [0xDB3, 0xDBB], + [0xDBD, 0xDBD], [0xDC0, 0xDC6], [0xDCA, 0xDCA], [0xDCF, 0xDD4], + [0xDD6, 0xDD6], [0xDD8, 0xDDF], [0xDE6, 0xDEF], [0xDF2, 0xDF3], + [0xE01, 0xE32], [0xE40, 0xE4E], [0xE50, 0xE59], [0xE81, 0xE82], + [0xE84, 0xE84], [0xE86, 0xE88], [0xE8A, 0xE8A], [0xE8C, 0xE8D], + [0xE94, 0xE97], [0xE99, 0xE9F], [0xEA1, 0xEA3], [0xEA5, 0xEA5], + [0xEA7, 0xEAB], [0xEAD, 0xEAE], [0xEB0, 0xEB9], [0xEBB, 0xEBD], + [0xEC0, 0xEC4], [0xEC6, 0xEC6], [0xEC8, 0xECE], [0xED0, 0xED9], + [0xEDC, 0xEDF], [0xF00, 0xF00], [0xF18, 0xF19], [0xF20, 0xF29], + [0xF35, 0xF35], [0xF37, 0xF37], [0xF39, 0xF39], [0xF3E, 0xF47], + [0xF49, 0xF6C], [0xF71, 0xF84], [0xF86, 0xF95], [0xF97, 0xF97], + [0xF99, 0xFB7], [0xFB9, 0xFB9], [0xFC6, 0xFC6], [0x1000, 0x103F], + [0x1050, 0x105D], [0x1061, 0x1061], [0x1065, 0x1066], [0x106E, 0x1070], + [0x1075, 0x1081], [0x108E, 0x108E], [0x10A0, 0x10C5], [0x10C7, 0x10C7], + [0x10CD, 0x10CD], [0x10D0, 0x10FA], [0x10FC, 0x1248], [0x124A, 0x124D], + [0x1250, 0x1256], [0x1258, 0x1258], [0x125A, 0x125D], [0x1260, 0x1288], + [0x128A, 0x128D], [0x1290, 0x12B0], [0x12B2, 0x12B5], [0x12B8, 0x12BE], + [0x12C0, 0x12C0], [0x12C2, 0x12C5], [0x12C8, 0x12D6], [0x12D8, 0x1310], + [0x1312, 0x1315], [0x1318, 0x135A], [0x135D, 0x135F], [0x1369, 0x1371], + [0x1380, 0x138F], [0x13A0, 0x13F5], [0x13F8, 0x13FD], [0x1401, 0x166C], + [0x166F, 0x167F], [0x1681, 0x169A], [0x16A0, 0x16EA], [0x16EE, 0x16F8], + [0x1700, 0x1711], [0x171F, 0x1731], [0x1740, 0x1751], [0x1760, 0x176C], + [0x176E, 0x1770], [0x1772, 0x1773], [0x1780, 0x17B3], [0x17D7, 0x17D7], + [0x17DC, 0x17DC], [0x17E0, 0x17E9], [0x180B, 0x180D], [0x180F, 0x1878], + [0x1880, 0x18A8], [0x18AA, 0x18AA], [0x18B0, 0x18F5], [0x1900, 0x191E], + [0x1920, 0x192B], [0x1930, 0x193B], [0x1946, 0x196D], [0x1970, 0x1974], + [0x1980, 0x19AB], [0x19B0, 0x19C9], [0x19D0, 0x19DA], [0x1A00, 0x1A16], + [0x1A20, 0x1A54], [0x1A60, 0x1A7C], [0x1A7F, 0x1A89], [0x1A90, 0x1A99], + [0x1AA7, 0x1AA7], [0x1AB0, 0x1ABD], [0x1ABF, 0x1ACE], [0x1B00, 0x1B33], + [0x1B45, 0x1B4C], [0x1B50, 0x1B59], [0x1B6B, 0x1B73], [0x1B80, 0x1BA0], + [0x1BAE, 0x1BAF], [0x1BBA, 0x1BE5], [0x1C00, 0x1C37], [0x1C40, 0x1C49], + [0x1C4D, 0x1C7D], [0x1C80, 0x1C88], [0x1C90, 0x1CBA], [0x1CBD, 0x1CBF], + [0x1CD0, 0x1CD2], [0x1CD4, 0x1CEC], [0x1CEE, 0x1CF3], [0x1CF5, 0x1CF6], + [0x1CFA, 0x1CFA], [0x1D00, 0x1EF9], [0x1F00, 0x1F15], [0x1F18, 0x1F1D], + [0x1F20, 0x1F45], [0x1F48, 0x1F4D], [0x1F50, 0x1F57], [0x1F59, 0x1F59], + [0x1F5B, 0x1F5B], [0x1F5D, 0x1F5D], [0x1F5F, 0x1F7D], [0x1F80, 0x1FB4], + [0x1FB6, 0x1FBC], [0x1FBE, 0x1FBE], [0x1FC2, 0x1FC4], [0x1FC6, 0x1FCC], + [0x1FD0, 0x1FD3], [0x1FD6, 0x1FDB], [0x1FE0, 0x1FEC], [0x1FF2, 0x1FF4], + [0x1FF6, 0x1FFC], [0x200B, 0x200D], [0x202A, 0x202E], [0x203F, 0x2040], + [0x2054, 0x2054], [0x2060, 0x2071], [0x207F, 0x207F], [0x2090, 0x209C], + [0x20D0, 0x20DC], [0x20E1, 0x20E1], [0x20E5, 0x20F0], [0x2102, 0x2102], + [0x2107, 0x2107], [0x210A, 0x2113], [0x2115, 0x2115], [0x2118, 0x211D], + [0x2124, 0x2124], [0x2126, 0x2126], [0x2128, 0x2128], [0x212A, 0x2138], + [0x213C, 0x213F], [0x2145, 0x2149], [0x214E, 0x214E], [0x2160, 0x2188], + [0x2460, 0x24FF], [0x2776, 0x2793], [0x2C00, 0x2CE4], [0x2CEB, 0x2CF3], + [0x2D00, 0x2D25], [0x2D27, 0x2D27], [0x2D2D, 0x2D2D], [0x2D30, 0x2D67], + [0x2D6F, 0x2D6F], [0x2D7F, 0x2D96], [0x2DA0, 0x2DA6], [0x2DA8, 0x2DAE], + [0x2DB0, 0x2DB6], [0x2DB8, 0x2DBE], [0x2DC0, 0x2DC6], [0x2DC8, 0x2DCE], + [0x2DD0, 0x2DD6], [0x2DD8, 0x2DDE], [0x2DE0, 0x2DFF], [0x2E80, 0x2FFF], + [0x3004, 0x3007], [0x3021, 0x302F], [0x3031, 0x303C], [0x3041, 0x3096], + [0x3099, 0x309F], [0x30A1, 0x30FC], [0x3105, 0x312F], [0x3131, 0x318E], + [0x31A0, 0x31BF], [0x31F0, 0x31FF], [0x3400, 0x4DBF], [0x4E00, 0xA48C], + [0xA4D0, 0xA4FD], [0xA500, 0xA60C], [0xA610, 0xA61F], [0xA62A, 0xA62B], + [0xA640, 0xA66F], [0xA674, 0xA67D], [0xA67F, 0xA6EF], [0xA717, 0xA71F], + [0xA722, 0xA788], [0xA78B, 0xA7CA], [0xA7D0, 0xA7D1], [0xA7D3, 0xA7D3], + [0xA7D5, 0xA7D9], [0xA7F2, 0xA805], [0xA807, 0xA80A], [0xA80C, 0xA822], + [0xA82C, 0xA82C], [0xA840, 0xA873], [0xA880, 0xA8B3], [0xA8D0, 0xA8D9], + [0xA8E0, 0xA8F7], [0xA8FB, 0xA8FB], [0xA8FD, 0xA8FE], [0xA90A, 0xA925], + [0xA930, 0xA946], [0xA960, 0xA97C], [0xA980, 0xA9B2], [0xA9CF, 0xA9CF], + [0xA9E0, 0xA9E4], [0xA9E6, 0xA9EF], [0xA9FA, 0xA9FE], [0xAA00, 0xAA28], + [0xAA40, 0xAA42], [0xAA44, 0xAA4B], [0xAA50, 0xAA59], [0xAA60, 0xAA76], + [0xAA7A, 0xAA7A], [0xAA7E, 0xAAAF], [0xAAB1, 0xAAB1], [0xAAB5, 0xAAB6], + [0xAAB9, 0xAABD], [0xAAC0, 0xAAC0], [0xAAC2, 0xAAC2], [0xAADB, 0xAADD], + [0xAAE0, 0xAAEA], [0xAAF2, 0xAAF4], [0xAB01, 0xAB06], [0xAB09, 0xAB0E], + [0xAB11, 0xAB16], [0xAB20, 0xAB26], [0xAB28, 0xAB2E], [0xAB30, 0xAB5A], + [0xAB5C, 0xAB69], [0xAB70, 0xABE2], [0xABEC, 0xABED], [0xABF0, 0xABF9], + [0xAC00, 0xD7A3], [0xD7B0, 0xD7C6], [0xD7CB, 0xD7FB], [0xF900, 0xFA6D], + [0xFA70, 0xFAD9], [0xFB00, 0xFB06], [0xFB13, 0xFB17], [0xFB1D, 0xFB1D], + [0xFB1F, 0xFB28], [0xFB2A, 0xFB36], [0xFB38, 0xFB3C], [0xFB3E, 0xFB3E], + [0xFB40, 0xFB41], [0xFB43, 0xFB44], [0xFB46, 0xFBB1], [0xFBD3, 0xFC5D], + [0xFC64, 0xFD3D], [0xFD40, 0xFD8F], [0xFD92, 0xFDC7], [0xFDF0, 0xFDF9], + [0xFE00, 0xFE0F], [0xFE20, 0xFE2F], [0xFE33, 0xFE34], [0xFE47, 0xFE71], + [0xFE73, 0xFE73], [0xFE77, 0xFE77], [0xFE79, 0xFE79], [0xFE7B, 0xFE7B], + [0xFE7D, 0xFE7D], [0xFE7F, 0xFEFC], [0xFF10, 0xFF19], [0xFF21, 0xFF3A], + [0xFF3F, 0xFF3F], [0xFF41, 0xFF5A], [0xFF65, 0xFF9D], [0xFFA0, 0xFFBE], + [0xFFC2, 0xFFC7], [0xFFCA, 0xFFCF], [0xFFD2, 0xFFD7], [0xFFDA, 0xFFDC], + [0x10000, 0x1000B], [0x1000D, 0x10026], [0x10028, 0x1003A], [0x1003C, 0x1003D], + [0x1003F, 0x1004D], [0x10050, 0x1005D], [0x10080, 0x100FA], [0x10140, 0x10174], + [0x101FD, 0x101FD], [0x10280, 0x1029C], [0x102A0, 0x102D0], [0x102E0, 0x102E0], + [0x10300, 0x1031F], [0x1032D, 0x1034A], [0x10350, 0x10375], [0x10380, 0x1039D], + [0x103A0, 0x103C3], [0x103C8, 0x103CF], [0x103D1, 0x103D5], [0x10400, 0x1049D], + [0x104A0, 0x104A9], [0x104B0, 0x104D3], [0x104D8, 0x104FB], [0x10500, 0x10527], + [0x10530, 0x10563], [0x10570, 0x1057A], [0x1057C, 0x1058A], [0x1058C, 0x10592], + [0x10594, 0x10595], [0x10597, 0x105A1], [0x105A3, 0x105B1], [0x105B3, 0x105B9], + [0x105BB, 0x105BC], [0x10600, 0x10736], [0x10740, 0x10755], [0x10760, 0x10767], + [0x10780, 0x10785], [0x10787, 0x107B0], [0x107B2, 0x107BA], [0x10800, 0x10805], + [0x10808, 0x10808], [0x1080A, 0x10835], [0x10837, 0x10838], [0x1083C, 0x1083C], + [0x1083F, 0x10855], [0x10860, 0x10876], [0x10880, 0x1089E], [0x108E0, 0x108F2], + [0x108F4, 0x108F5], [0x10900, 0x10915], [0x10920, 0x10939], [0x10980, 0x109B7], + [0x109BE, 0x109BF], [0x10A00, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A13], + [0x10A15, 0x10A17], [0x10A19, 0x10A35], [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], + [0x10A60, 0x10A7C], [0x10A80, 0x10A9C], [0x10AC0, 0x10AC7], [0x10AC9, 0x10AE6], + [0x10B00, 0x10B35], [0x10B40, 0x10B55], [0x10B60, 0x10B72], [0x10B80, 0x10B91], + [0x10C00, 0x10C48], [0x10C80, 0x10CB2], [0x10CC0, 0x10CF2], [0x10D00, 0x10D23], + [0x10D30, 0x10D39], [0x10E80, 0x10EA9], [0x10EAB, 0x10EAC], [0x10EB0, 0x10EB1], + [0x10EFD, 0x10F1C], [0x10F27, 0x10F27], [0x10F30, 0x10F45], [0x10F70, 0x10F81], + [0x10FB0, 0x10FC4], [0x10FE0, 0x10FF6], [0x11000, 0x11037], [0x11066, 0x11072], + [0x11075, 0x11075], [0x1107F, 0x110AF], [0x110C2, 0x110C2], [0x110D0, 0x110E8], + [0x110F0, 0x110F9], [0x11100, 0x11126], [0x11136, 0x1113F], [0x11144, 0x11147], + [0x11150, 0x11173], [0x11176, 0x11176], [0x11180, 0x111B2], [0x111C1, 0x111C4], + [0x111C9, 0x111CC], [0x111CE, 0x111DA], [0x111DC, 0x111DC], [0x11200, 0x11211], + [0x11213, 0x11237], [0x1123E, 0x11240], [0x11280, 0x11286], [0x11288, 0x11288], + [0x1128A, 0x1128D], [0x1128F, 0x1129D], [0x1129F, 0x112A8], [0x112B0, 0x112EA], + [0x112F0, 0x112F9], [0x11300, 0x11303], [0x11305, 0x1130C], [0x1130F, 0x11310], + [0x11313, 0x11328], [0x1132A, 0x11330], [0x11332, 0x11333], [0x11335, 0x11339], + [0x1133B, 0x1133D], [0x11347, 0x11348], [0x1134B, 0x1134D], [0x11350, 0x11350], + [0x11357, 0x11357], [0x1135D, 0x11363], [0x11366, 0x1136C], [0x11370, 0x11374], + [0x11400, 0x1144A], [0x11450, 0x11459], [0x1145E, 0x11461], [0x11480, 0x114C5], + [0x114C7, 0x114C7], [0x114D0, 0x114D9], [0x11580, 0x115B5], [0x115B8, 0x115C0], + [0x115D8, 0x115DD], [0x11600, 0x11640], [0x11644, 0x11644], [0x11650, 0x11659], + [0x11680, 0x116B8], [0x116C0, 0x116C9], [0x11700, 0x1171A], [0x1171D, 0x1172B], + [0x11730, 0x11739], [0x11740, 0x11746], [0x11800, 0x1183A], [0x118A0, 0x118E9], + [0x118FF, 0x11906], [0x11909, 0x11909], [0x1190C, 0x11913], [0x11915, 0x11916], + [0x11918, 0x11935], [0x11937, 0x11938], [0x1193B, 0x1193F], [0x11941, 0x11941], + [0x11950, 0x11959], [0x119A0, 0x119A7], [0x119AA, 0x119D7], [0x119DA, 0x119E1], + [0x119E3, 0x119E3], [0x11A00, 0x11A32], [0x11A3A, 0x11A3A], [0x11A47, 0x11A47], + [0x11A50, 0x11A89], [0x11A9D, 0x11A9D], [0x11AB0, 0x11AF8], [0x11C00, 0x11C08], + [0x11C0A, 0x11C36], [0x11C38, 0x11C40], [0x11C50, 0x11C59], [0x11C72, 0x11C8F], + [0x11C92, 0x11CA7], [0x11CA9, 0x11CB6], [0x11D00, 0x11D06], [0x11D08, 0x11D09], + [0x11D0B, 0x11D36], [0x11D3A, 0x11D3A], [0x11D3C, 0x11D3D], [0x11D3F, 0x11D46], + [0x11D50, 0x11D59], [0x11D60, 0x11D65], [0x11D67, 0x11D68], [0x11D6A, 0x11D89], + [0x11D90, 0x11D91], [0x11D93, 0x11D98], [0x11DA0, 0x11DA9], [0x11EE0, 0x11EF2], + [0x11F00, 0x11F02], [0x11F04, 0x11F10], [0x11F12, 0x11F33], [0x11F3E, 0x11F42], + [0x11F50, 0x11F59], [0x11FB0, 0x11FB0], [0x12000, 0x12399], [0x12400, 0x1246E], + [0x12480, 0x12543], [0x12F90, 0x12FF0], [0x13000, 0x1342F], [0x13440, 0x13446], + [0x14400, 0x14646], [0x16800, 0x16A38], [0x16A40, 0x16A5E], [0x16A60, 0x16A69], + [0x16A70, 0x16ABE], [0x16AC0, 0x16AC9], [0x16AD0, 0x16AED], [0x16AF0, 0x16AF4], + [0x16B00, 0x16B2F], [0x16B40, 0x16B43], [0x16B50, 0x16B59], [0x16B63, 0x16B77], + [0x16B7D, 0x16B8F], [0x16E40, 0x16E7F], [0x16F00, 0x16F4A], [0x16F4F, 0x16F50], + [0x16F8F, 0x16F9F], [0x16FE0, 0x16FE1], [0x16FE3, 0x16FE3], [0x16FF0, 0x16FF1], + [0x17000, 0x187F7], [0x18800, 0x18CD5], [0x18D00, 0x18D08], [0x1AFF0, 0x1AFF3], + [0x1AFF5, 0x1AFFB], [0x1AFFD, 0x1AFFE], [0x1B000, 0x1B122], [0x1B132, 0x1B132], + [0x1B150, 0x1B152], [0x1B155, 0x1B155], [0x1B164, 0x1B167], [0x1B170, 0x1B2FB], + [0x1BC00, 0x1BC6A], [0x1BC70, 0x1BC7C], [0x1BC80, 0x1BC88], [0x1BC90, 0x1BC99], + [0x1BC9D, 0x1BC9E], [0x1CF00, 0x1CF2D], [0x1CF30, 0x1CF46], [0x1D165, 0x1D169], + [0x1D16D, 0x1D172], [0x1D17B, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD], + [0x1D242, 0x1D244], [0x1D400, 0x1D454], [0x1D456, 0x1D49C], [0x1D49E, 0x1D49F], + [0x1D4A2, 0x1D4A2], [0x1D4A5, 0x1D4A6], [0x1D4A9, 0x1D4AC], [0x1D4AE, 0x1D4B9], + [0x1D4BB, 0x1D4BB], [0x1D4BD, 0x1D4C3], [0x1D4C5, 0x1D505], [0x1D507, 0x1D50A], + [0x1D50D, 0x1D514], [0x1D516, 0x1D51C], [0x1D51E, 0x1D539], [0x1D53B, 0x1D53E], + [0x1D540, 0x1D544], [0x1D546, 0x1D546], [0x1D54A, 0x1D550], [0x1D552, 0x1D6A5], + [0x1D6A8, 0x1D6C0], [0x1D6C2, 0x1D6DA], [0x1D6DC, 0x1D6FA], [0x1D6FC, 0x1D714], + [0x1D716, 0x1D734], [0x1D736, 0x1D74E], [0x1D750, 0x1D76E], [0x1D770, 0x1D788], + [0x1D78A, 0x1D7A8], [0x1D7AA, 0x1D7C2], [0x1D7C4, 0x1D7CB], [0x1D7CE, 0x1D7FF], + [0x1DA00, 0x1DA36], [0x1DA3B, 0x1DA6C], [0x1DA75, 0x1DA75], [0x1DA84, 0x1DA84], + [0x1DA9B, 0x1DA9F], [0x1DAA1, 0x1DAAF], [0x1DF00, 0x1DF1E], [0x1DF25, 0x1DF2A], + [0x1E000, 0x1E006], [0x1E008, 0x1E018], [0x1E01B, 0x1E021], [0x1E023, 0x1E024], + [0x1E026, 0x1E02A], [0x1E030, 0x1E06D], [0x1E08F, 0x1E08F], [0x1E100, 0x1E12C], + [0x1E130, 0x1E13D], [0x1E140, 0x1E149], [0x1E14E, 0x1E14E], [0x1E290, 0x1E2AE], + [0x1E2C0, 0x1E2F9], [0x1E4D0, 0x1E4F9], [0x1E7E0, 0x1E7E6], [0x1E7E8, 0x1E7EB], + [0x1E7ED, 0x1E7EE], [0x1E7F0, 0x1E7FE], [0x1E800, 0x1E8C4], [0x1E8D0, 0x1E8D6], + [0x1E900, 0x1E94B], [0x1E950, 0x1E959], [0x1EE00, 0x1EE03], [0x1EE05, 0x1EE1F], + [0x1EE21, 0x1EE22], [0x1EE24, 0x1EE24], [0x1EE27, 0x1EE27], [0x1EE29, 0x1EE32], + [0x1EE34, 0x1EE37], [0x1EE39, 0x1EE39], [0x1EE3B, 0x1EE3B], [0x1EE42, 0x1EE42], + [0x1EE47, 0x1EE47], [0x1EE49, 0x1EE49], [0x1EE4B, 0x1EE4B], [0x1EE4D, 0x1EE4F], + [0x1EE51, 0x1EE52], [0x1EE54, 0x1EE54], [0x1EE57, 0x1EE57], [0x1EE59, 0x1EE59], + [0x1EE5B, 0x1EE5B], [0x1EE5D, 0x1EE5D], [0x1EE5F, 0x1EE5F], [0x1EE61, 0x1EE62], + [0x1EE64, 0x1EE64], [0x1EE67, 0x1EE6A], [0x1EE6C, 0x1EE72], [0x1EE74, 0x1EE77], + [0x1EE79, 0x1EE7C], [0x1EE7E, 0x1EE7E], [0x1EE80, 0x1EE89], [0x1EE8B, 0x1EE9B], + [0x1EEA1, 0x1EEA3], [0x1EEA5, 0x1EEA9], [0x1EEAB, 0x1EEBB], [0x1FBF0, 0x1FBF9], + [0x20000, 0x2B739], [0x2B740, 0x2B81D], [0x2B820, 0x2CEA1], [0x2CEB0, 0x2EBE0], + [0x2EBF0, 0x2EE5D], [0x2F800, 0x2FA1D], [0x30000, 0x323AF], [0x40000, 0x4FFFD], + [0x50000, 0x5FFFD], [0x60000, 0x6FFFD], [0x70000, 0x7FFFD], [0x80000, 0x8FFFD], + [0x90000, 0x9FFFD], [0xA0000, 0xAFFFD], [0xB0000, 0xBFFFD], [0xC0000, 0xCFFFD], + [0xD0000, 0xDFFFD], [0xE0000, 0xEFFFD] ]; + +/** +Tests [[dchar, index] ... planes * 3] for LeastRestrictive_OfAll +*/ +enum uint[2][] LeastRestrictive_OfAll_Test = [ + [0x0000A8, 0], + [0x001065, 254], + [0x00FFDB, 507], + [0x010005, 508], + [0x011C9C, 676], + [0x01FBF4, 843], + [0x025B9C, 844], + [0x02DD48, 847], + [0x02F90E, 849], + [0x0311D7, 850], + [0x047FFE, 851], + [0x057FFE, 852], + [0x067FFE, 853], + [0x077FFE, 854], + [0x087FFE, 855], + [0x097FFE, 856], + [0x0A7FFE, 857], + [0x0B7FFE, 858], + [0x0C7FFE, 859], + [0x0D7FFE, 860], + [0x0E7FFE, 861], +]; /** Least restrictive Start Entries: 858717 */ static immutable dchar[2][] LeastRestrictive_Start = [ - [0xA8, 0xA8], - [0xAA, 0xAA], - [0xAD, 0xAD], - [0xAF, 0xAF], - [0xB2, 0xB5], - [0xB7, 0xBA], - [0xBC, 0xBE], - [0xC0, 0xD6], - [0xD8, 0xF6], - [0xF8, 0x217], - [0x250, 0x2A8], - [0x2B0, 0x2B8], - [0x2BB, 0x2BB], - [0x2BD, 0x2C1], - [0x2C6, 0x2D1], - [0x2E0, 0x2E4], - [0x2EC, 0x2EC], - [0x2EE, 0x2EE], - [0x370, 0x374], - [0x376, 0x377], - [0x37A, 0x37D], - [0x37F, 0x37F], - [0x386, 0x386], - [0x388, 0x38A], - [0x38C, 0x38C], - [0x38E, 0x3A1], - [0x3A3, 0x3CE], - [0x3D0, 0x3D6], - [0x3DA, 0x3DA], - [0x3DC, 0x3DC], - [0x3DE, 0x3DE], - [0x3E0, 0x3E0], - [0x3E2, 0x3F3], - [0x3F7, 0x40C], - [0x40E, 0x44F], - [0x451, 0x45C], - [0x45E, 0x481], - [0x48A, 0x4C4], - [0x4C7, 0x4C8], - [0x4CB, 0x4CC], - [0x4D0, 0x4EB], - [0x4EE, 0x4F5], - [0x4F8, 0x4F9], - [0x531, 0x556], - [0x559, 0x559], - [0x560, 0x587], - [0x5B0, 0x5B9], - [0x5BB, 0x5BD], - [0x5BF, 0x5BF], - [0x5C1, 0x5C2], - [0x5D0, 0x5EA], - [0x5EF, 0x5F2], - [0x620, 0x63A], - [0x640, 0x652], - [0x660, 0x669], - [0x66E, 0x6BE], - [0x6C0, 0x6CE], - [0x6D0, 0x6D5], - [0x6E5, 0x6E8], - [0x6EA, 0x6FC], - [0x6FF, 0x6FF], - [0x710, 0x710], - [0x712, 0x72F], - [0x74D, 0x7A5], - [0x7B1, 0x7B1], - [0x7CA, 0x7EA], - [0x7F4, 0x7F5], - [0x7FA, 0x7FA], - [0x800, 0x815], - [0x81A, 0x81A], - [0x824, 0x824], - [0x828, 0x828], - [0x840, 0x858], - [0x860, 0x86A], - [0x870, 0x887], - [0x889, 0x88E], - [0x8A0, 0x8C9], - [0x901, 0x939], - [0x93D, 0x94D], - [0x950, 0x952], - [0x958, 0x963], - [0x966, 0x96F], - [0x971, 0x983], - [0x985, 0x98C], - [0x98F, 0x990], - [0x993, 0x9A8], - [0x9AA, 0x9B0], - [0x9B2, 0x9B2], - [0x9B6, 0x9B9], - [0x9BD, 0x9C4], - [0x9C7, 0x9C8], - [0x9CB, 0x9CE], - [0x9DC, 0x9DD], - [0x9DF, 0x9E3], - [0x9E6, 0x9F1], - [0x9FC, 0x9FC], - [0xA02, 0xA02], - [0xA05, 0xA0A], - [0xA0F, 0xA10], - [0xA13, 0xA28], - [0xA2A, 0xA30], - [0xA32, 0xA33], - [0xA35, 0xA36], - [0xA38, 0xA39], - [0xA3E, 0xA42], - [0xA47, 0xA48], - [0xA4B, 0xA4D], - [0xA59, 0xA5C], - [0xA5E, 0xA5E], - [0xA66, 0xA6F], - [0xA72, 0xA74], - [0xA81, 0xA83], - [0xA85, 0xA8B], - [0xA8D, 0xA8D], - [0xA8F, 0xA91], - [0xA93, 0xAA8], - [0xAAA, 0xAB0], - [0xAB2, 0xAB3], - [0xAB5, 0xAB9], - [0xABD, 0xABD], - [0xAC7, 0xAC9], - [0xACB, 0xACD], - [0xAD0, 0xAD0], - [0xAE0, 0xAE0], - [0xAE6, 0xAEF], - [0xAF9, 0xAF9], - [0xB01, 0xB03], - [0xB05, 0xB0C], - [0xB0F, 0xB10], - [0xB13, 0xB28], - [0xB2A, 0xB30], - [0xB32, 0xB33], - [0xB35, 0xB39], - [0xB3D, 0xB43], - [0xB47, 0xB48], - [0xB4B, 0xB4D], - [0xB5C, 0xB5D], - [0xB5F, 0xB61], - [0xB66, 0xB6F], - [0xB71, 0xB71], - [0xB82, 0xB83], - [0xB85, 0xB8A], - [0xB8E, 0xB90], - [0xB92, 0xB95], - [0xB99, 0xB9A], - [0xB9C, 0xB9C], - [0xB9E, 0xB9F], - [0xBA3, 0xBA4], - [0xBA8, 0xBAA], - [0xBAE, 0xBB5], - [0xBB7, 0xBB9], - [0xBBE, 0xBC2], - [0xBC6, 0xBC8], - [0xBCA, 0xBCD], - [0xBD0, 0xBD0], - [0xBE7, 0xBEF], - [0xC01, 0xC03], - [0xC05, 0xC0C], - [0xC0E, 0xC10], - [0xC12, 0xC28], - [0xC2A, 0xC33], - [0xC35, 0xC39], - [0xC3D, 0xC44], - [0xC46, 0xC48], - [0xC4A, 0xC4D], - [0xC58, 0xC5A], - [0xC5D, 0xC5D], - [0xC60, 0xC61], - [0xC66, 0xC6F], - [0xC80, 0xC80], - [0xC82, 0xC83], - [0xC85, 0xC8C], - [0xC8E, 0xC90], - [0xC92, 0xCA8], - [0xCAA, 0xCB3], - [0xCB5, 0xCB9], - [0xCBD, 0xCC4], - [0xCC6, 0xCC8], - [0xCCA, 0xCCD], - [0xCDD, 0xCDE], - [0xCE0, 0xCE1], - [0xCE6, 0xCEF], - [0xCF1, 0xCF2], - [0xD02, 0xD0C], - [0xD0E, 0xD10], - [0xD12, 0xD28], - [0xD2A, 0xD39], - [0xD3D, 0xD43], - [0xD46, 0xD48], - [0xD4A, 0xD4E], - [0xD54, 0xD56], - [0xD5F, 0xD61], - [0xD66, 0xD6F], - [0xD7A, 0xD7F], - [0xD85, 0xD96], - [0xD9A, 0xDB1], - [0xDB3, 0xDBB], - [0xDBD, 0xDBD], - [0xDC0, 0xDC6], - [0xE01, 0xE30], - [0xE32, 0xE32], - [0xE40, 0xE5B], - [0xE81, 0xE82], - [0xE84, 0xE84], - [0xE86, 0xE88], - [0xE8A, 0xE8A], - [0xE8C, 0xE8D], - [0xE94, 0xE97], - [0xE99, 0xE9F], - [0xEA1, 0xEA3], - [0xEA5, 0xEA5], - [0xEA7, 0xEAB], - [0xEAD, 0xEAE], - [0xEB0, 0xEB2], - [0xEBB, 0xEBD], - [0xEC0, 0xEC4], - [0xEC6, 0xEC6], - [0xEC8, 0xECD], - [0xED0, 0xED9], - [0xEDC, 0xEDD], - [0xF00, 0xF00], - [0xF18, 0xF19], - [0xF20, 0xF33], - [0xF35, 0xF35], - [0xF37, 0xF37], - [0xF39, 0xF39], - [0xF3E, 0xF47], - [0xF49, 0xF69], - [0xF71, 0xF84], - [0xF86, 0xF8C], - [0xF90, 0xF95], - [0xF97, 0xF97], - [0xF99, 0xFAD], - [0xFB1, 0xFB7], - [0xFB9, 0xFB9], - [0x1000, 0x102A], - [0x103F, 0x103F], - [0x1050, 0x1055], - [0x105A, 0x105D], - [0x1061, 0x1061], - [0x1065, 0x1066], - [0x106E, 0x1070], - [0x1075, 0x1081], - [0x108E, 0x108E], - [0x10A0, 0x10C5], - [0x10C7, 0x10C7], - [0x10CD, 0x10CD], - [0x10D0, 0x10FA], - [0x10FC, 0x1248], - [0x124A, 0x124D], - [0x1250, 0x1256], - [0x1258, 0x1258], - [0x125A, 0x125D], - [0x1260, 0x1288], - [0x128A, 0x128D], - [0x1290, 0x12B0], - [0x12B2, 0x12B5], - [0x12B8, 0x12BE], - [0x12C0, 0x12C0], - [0x12C2, 0x12C5], - [0x12C8, 0x12D6], - [0x12D8, 0x1310], - [0x1312, 0x1315], - [0x1318, 0x135A], - [0x1380, 0x138F], - [0x13A0, 0x13F5], - [0x13F8, 0x13FD], - [0x1401, 0x166C], - [0x166F, 0x167F], - [0x1681, 0x169A], - [0x16A0, 0x16EA], - [0x16EE, 0x16F8], - [0x1700, 0x1711], - [0x171F, 0x1731], - [0x1740, 0x1751], - [0x1760, 0x176C], - [0x176E, 0x1770], - [0x1780, 0x17B3], - [0x17D7, 0x17D7], - [0x17DC, 0x17DC], - [0x180F, 0x1878], - [0x1880, 0x18A8], - [0x18AA, 0x18AA], - [0x18B0, 0x18F5], - [0x1900, 0x191E], - [0x1950, 0x196D], - [0x1970, 0x1974], - [0x1980, 0x19AB], - [0x19B0, 0x19C9], - [0x1A00, 0x1A16], - [0x1A20, 0x1A54], - [0x1AA7, 0x1AA7], - [0x1B05, 0x1B33], - [0x1B45, 0x1B4C], - [0x1B83, 0x1BA0], - [0x1BAE, 0x1BAF], - [0x1BBA, 0x1BE5], - [0x1C00, 0x1C23], - [0x1C4D, 0x1C4F], - [0x1C5A, 0x1C7D], - [0x1C80, 0x1C88], - [0x1C90, 0x1CBA], - [0x1CBD, 0x1CBF], - [0x1CE9, 0x1CEC], - [0x1CEE, 0x1CF3], - [0x1CF5, 0x1CF6], - [0x1CFA, 0x1CFA], - [0x1D00, 0x1DBF], - [0x1E00, 0x1EF9], - [0x1F00, 0x1F15], - [0x1F18, 0x1F1D], - [0x1F20, 0x1F45], - [0x1F48, 0x1F4D], - [0x1F50, 0x1F57], - [0x1F59, 0x1F59], - [0x1F5B, 0x1F5B], - [0x1F5D, 0x1F5D], - [0x1F5F, 0x1F7D], - [0x1F80, 0x1FB4], - [0x1FB6, 0x1FBC], - [0x1FBE, 0x1FBE], - [0x1FC2, 0x1FC4], - [0x1FC6, 0x1FCC], - [0x1FD0, 0x1FD3], - [0x1FD6, 0x1FDB], - [0x1FE0, 0x1FEC], - [0x1FF2, 0x1FF4], - [0x1FF6, 0x1FFC], - [0x200B, 0x200D], - [0x202A, 0x202E], - [0x203F, 0x2040], - [0x2054, 0x2054], - [0x2060, 0x2071], - [0x207F, 0x207F], - [0x2090, 0x209C], - [0x2102, 0x2102], - [0x2107, 0x2107], - [0x210A, 0x2113], - [0x2115, 0x2115], - [0x2118, 0x211D], - [0x2124, 0x2124], - [0x2126, 0x2126], - [0x2128, 0x2128], - [0x212A, 0x2138], - [0x213C, 0x213F], - [0x2145, 0x2149], - [0x214E, 0x214E], - [0x2160, 0x2188], - [0x2460, 0x24FF], - [0x2776, 0x2793], - [0x2C00, 0x2CE4], - [0x2CEB, 0x2CEE], - [0x2CF2, 0x2CF3], - [0x2D00, 0x2D25], - [0x2D27, 0x2D27], - [0x2D2D, 0x2D2D], - [0x2D30, 0x2D67], - [0x2D6F, 0x2D6F], - [0x2D80, 0x2D96], - [0x2DA0, 0x2DA6], - [0x2DA8, 0x2DAE], - [0x2DB0, 0x2DB6], - [0x2DB8, 0x2DBE], - [0x2DC0, 0x2DC6], - [0x2DC8, 0x2DCE], - [0x2DD0, 0x2DD6], - [0x2DD8, 0x2DDE], - [0x2E80, 0x2FFF], - [0x3004, 0x3007], - [0x3021, 0x3029], - [0x3031, 0x3035], - [0x3038, 0x303C], - [0x3041, 0x3096], - [0x309B, 0x309F], - [0x30A1, 0x30FF], - [0x3105, 0x312F], - [0x3131, 0x318E], - [0x31A0, 0x31BF], - [0x31F0, 0x31FF], - [0x3400, 0x4DBF], - [0x4E00, 0xA48C], - [0xA4D0, 0xA4FD], - [0xA500, 0xA60C], - [0xA610, 0xA61F], - [0xA62A, 0xA62B], - [0xA640, 0xA66E], - [0xA67F, 0xA69D], - [0xA6A0, 0xA6EF], - [0xA717, 0xA71F], - [0xA722, 0xA788], - [0xA78B, 0xA7CA], - [0xA7D0, 0xA7D1], - [0xA7D3, 0xA7D3], - [0xA7D5, 0xA7D9], - [0xA7F2, 0xA801], - [0xA803, 0xA805], - [0xA807, 0xA80A], - [0xA80C, 0xA822], - [0xA840, 0xA873], - [0xA882, 0xA8B3], - [0xA8F2, 0xA8F7], - [0xA8FB, 0xA8FB], - [0xA8FD, 0xA8FE], - [0xA90A, 0xA925], - [0xA930, 0xA946], - [0xA960, 0xA97C], - [0xA984, 0xA9B2], - [0xA9CF, 0xA9CF], - [0xA9E0, 0xA9E4], - [0xA9E6, 0xA9EF], - [0xA9FA, 0xA9FE], - [0xAA00, 0xAA28], - [0xAA40, 0xAA42], - [0xAA44, 0xAA4B], - [0xAA60, 0xAA76], - [0xAA7A, 0xAA7A], - [0xAA7E, 0xAAAF], - [0xAAB1, 0xAAB1], - [0xAAB5, 0xAAB6], - [0xAAB9, 0xAABD], - [0xAAC0, 0xAAC0], - [0xAAC2, 0xAAC2], - [0xAADB, 0xAADD], - [0xAAE0, 0xAAEA], - [0xAAF2, 0xAAF4], - [0xAB01, 0xAB06], - [0xAB09, 0xAB0E], - [0xAB11, 0xAB16], - [0xAB20, 0xAB26], - [0xAB28, 0xAB2E], - [0xAB30, 0xAB5A], - [0xAB5C, 0xAB69], - [0xAB70, 0xABE2], - [0xAC00, 0xD7A3], - [0xD7B0, 0xD7C6], - [0xD7CB, 0xD7FB], - [0xF900, 0xFA6D], - [0xFA70, 0xFAD9], - [0xFB00, 0xFB06], - [0xFB13, 0xFB17], - [0xFB1D, 0xFB1D], - [0xFB1F, 0xFB28], - [0xFB2A, 0xFB36], - [0xFB38, 0xFB3C], - [0xFB3E, 0xFB3E], - [0xFB40, 0xFB41], - [0xFB43, 0xFB44], - [0xFB46, 0xFBB1], - [0xFBD3, 0xFC5D], - [0xFC64, 0xFD3D], - [0xFD40, 0xFD8F], - [0xFD92, 0xFDC7], - [0xFDF0, 0xFDF9], - [0xFE47, 0xFE71], - [0xFE73, 0xFE73], - [0xFE77, 0xFE77], - [0xFE79, 0xFE79], - [0xFE7B, 0xFE7B], - [0xFE7D, 0xFE7D], - [0xFE7F, 0xFEFC], - [0xFF21, 0xFF3A], - [0xFF41, 0xFF5A], - [0xFF66, 0xFF9D], - [0xFFA0, 0xFFBE], - [0xFFC2, 0xFFC7], - [0xFFCA, 0xFFCF], - [0xFFD2, 0xFFD7], - [0xFFDA, 0xFFDC], - [0x10000, 0x1000B], - [0x1000D, 0x10026], - [0x10028, 0x1003A], - [0x1003C, 0x1003D], - [0x1003F, 0x1004D], - [0x10050, 0x1005D], - [0x10080, 0x100FA], - [0x10140, 0x10174], - [0x10280, 0x1029C], - [0x102A0, 0x102D0], - [0x10300, 0x1031F], - [0x1032D, 0x1034A], - [0x10350, 0x10375], - [0x10380, 0x1039D], - [0x103A0, 0x103C3], - [0x103C8, 0x103CF], - [0x103D1, 0x103D5], - [0x10400, 0x1049D], - [0x104B0, 0x104D3], - [0x104D8, 0x104FB], - [0x10500, 0x10527], - [0x10530, 0x10563], - [0x10570, 0x1057A], - [0x1057C, 0x1058A], - [0x1058C, 0x10592], - [0x10594, 0x10595], - [0x10597, 0x105A1], - [0x105A3, 0x105B1], - [0x105B3, 0x105B9], - [0x105BB, 0x105BC], - [0x10600, 0x10736], - [0x10740, 0x10755], - [0x10760, 0x10767], - [0x10780, 0x10785], - [0x10787, 0x107B0], - [0x107B2, 0x107BA], - [0x10800, 0x10805], - [0x10808, 0x10808], - [0x1080A, 0x10835], - [0x10837, 0x10838], - [0x1083C, 0x1083C], - [0x1083F, 0x10855], - [0x10860, 0x10876], - [0x10880, 0x1089E], - [0x108E0, 0x108F2], - [0x108F4, 0x108F5], - [0x10900, 0x10915], - [0x10920, 0x10939], - [0x10980, 0x109B7], - [0x109BE, 0x109BF], - [0x10A00, 0x10A00], - [0x10A10, 0x10A13], - [0x10A15, 0x10A17], - [0x10A19, 0x10A35], - [0x10A60, 0x10A7C], - [0x10A80, 0x10A9C], - [0x10AC0, 0x10AC7], - [0x10AC9, 0x10AE4], - [0x10B00, 0x10B35], - [0x10B40, 0x10B55], - [0x10B60, 0x10B72], - [0x10B80, 0x10B91], - [0x10C00, 0x10C48], - [0x10C80, 0x10CB2], - [0x10CC0, 0x10CF2], - [0x10D00, 0x10D23], - [0x10E80, 0x10EA9], - [0x10EB0, 0x10EB1], - [0x10F00, 0x10F1C], - [0x10F27, 0x10F27], - [0x10F30, 0x10F45], - [0x10F70, 0x10F81], - [0x10FB0, 0x10FC4], - [0x10FE0, 0x10FF6], - [0x11003, 0x11037], - [0x11071, 0x11072], - [0x11075, 0x11075], - [0x11083, 0x110AF], - [0x110D0, 0x110E8], - [0x11103, 0x11126], - [0x11144, 0x11144], - [0x11147, 0x11147], - [0x11150, 0x11172], - [0x11176, 0x11176], - [0x11183, 0x111B2], - [0x111C1, 0x111C4], - [0x111DA, 0x111DA], - [0x111DC, 0x111DC], - [0x11200, 0x11211], - [0x11213, 0x1122B], - [0x1123F, 0x11240], - [0x11280, 0x11286], - [0x11288, 0x11288], - [0x1128A, 0x1128D], - [0x1128F, 0x1129D], - [0x1129F, 0x112A8], - [0x112B0, 0x112DE], - [0x11305, 0x1130C], - [0x1130F, 0x11310], - [0x11313, 0x11328], - [0x1132A, 0x11330], - [0x11332, 0x11333], - [0x11335, 0x11339], - [0x1133D, 0x1133D], - [0x11350, 0x11350], - [0x1135D, 0x11361], - [0x11400, 0x11434], - [0x11447, 0x1144A], - [0x1145F, 0x11461], - [0x11480, 0x114AF], - [0x114C4, 0x114C5], - [0x114C7, 0x114C7], - [0x11580, 0x115AE], - [0x115D8, 0x115DB], - [0x11600, 0x1162F], - [0x11644, 0x11644], - [0x11680, 0x116AA], - [0x116B8, 0x116B8], - [0x11700, 0x1171A], - [0x11740, 0x11746], - [0x11800, 0x1182B], - [0x118A0, 0x118DF], - [0x118FF, 0x11906], - [0x11909, 0x11909], - [0x1190C, 0x11913], - [0x11915, 0x11916], - [0x11918, 0x1192F], - [0x1193F, 0x1193F], - [0x11941, 0x11941], - [0x119A0, 0x119A7], - [0x119AA, 0x119D0], - [0x119E1, 0x119E1], - [0x119E3, 0x119E3], - [0x11A00, 0x11A00], - [0x11A0B, 0x11A32], - [0x11A3A, 0x11A3A], - [0x11A50, 0x11A50], - [0x11A5C, 0x11A89], - [0x11A9D, 0x11A9D], - [0x11AB0, 0x11AF8], - [0x11C00, 0x11C08], - [0x11C0A, 0x11C2E], - [0x11C40, 0x11C40], - [0x11C72, 0x11C8F], - [0x11D00, 0x11D06], - [0x11D08, 0x11D09], - [0x11D0B, 0x11D30], - [0x11D46, 0x11D46], - [0x11D60, 0x11D65], - [0x11D67, 0x11D68], - [0x11D6A, 0x11D89], - [0x11D98, 0x11D98], - [0x11EE0, 0x11EF2], - [0x11F02, 0x11F02], - [0x11F04, 0x11F10], - [0x11F12, 0x11F33], - [0x11FB0, 0x11FB0], - [0x12000, 0x12399], - [0x12400, 0x1246E], - [0x12480, 0x12543], - [0x12F90, 0x12FF0], - [0x13000, 0x1342F], - [0x13441, 0x13446], - [0x14400, 0x14646], - [0x16800, 0x16A38], - [0x16A40, 0x16A5E], - [0x16A70, 0x16ABE], - [0x16AD0, 0x16AED], - [0x16B00, 0x16B2F], - [0x16B40, 0x16B43], - [0x16B63, 0x16B77], - [0x16B7D, 0x16B8F], - [0x16E40, 0x16E7F], - [0x16F00, 0x16F4A], - [0x16F50, 0x16F50], - [0x16F93, 0x16F9F], - [0x16FE0, 0x16FE1], - [0x16FE3, 0x16FE3], - [0x17000, 0x187F7], - [0x18800, 0x18CD5], - [0x18D00, 0x18D08], - [0x1AFF0, 0x1AFF3], - [0x1AFF5, 0x1AFFB], - [0x1AFFD, 0x1AFFE], - [0x1B000, 0x1B122], - [0x1B132, 0x1B132], - [0x1B150, 0x1B152], - [0x1B155, 0x1B155], - [0x1B164, 0x1B167], - [0x1B170, 0x1B2FB], - [0x1BC00, 0x1BC6A], - [0x1BC70, 0x1BC7C], - [0x1BC80, 0x1BC88], - [0x1BC90, 0x1BC99], - [0x1D400, 0x1D454], - [0x1D456, 0x1D49C], - [0x1D49E, 0x1D49F], - [0x1D4A2, 0x1D4A2], - [0x1D4A5, 0x1D4A6], - [0x1D4A9, 0x1D4AC], - [0x1D4AE, 0x1D4B9], - [0x1D4BB, 0x1D4BB], - [0x1D4BD, 0x1D4C3], - [0x1D4C5, 0x1D505], - [0x1D507, 0x1D50A], - [0x1D50D, 0x1D514], - [0x1D516, 0x1D51C], - [0x1D51E, 0x1D539], - [0x1D53B, 0x1D53E], - [0x1D540, 0x1D544], - [0x1D546, 0x1D546], - [0x1D54A, 0x1D550], - [0x1D552, 0x1D6A5], - [0x1D6A8, 0x1D6C0], - [0x1D6C2, 0x1D6DA], - [0x1D6DC, 0x1D6FA], - [0x1D6FC, 0x1D714], - [0x1D716, 0x1D734], - [0x1D736, 0x1D74E], - [0x1D750, 0x1D76E], - [0x1D770, 0x1D788], - [0x1D78A, 0x1D7A8], - [0x1D7AA, 0x1D7C2], - [0x1D7C4, 0x1D7CB], - [0x1DF00, 0x1DF1E], - [0x1DF25, 0x1DF2A], - [0x1E030, 0x1E06D], - [0x1E100, 0x1E12C], - [0x1E137, 0x1E13D], - [0x1E14E, 0x1E14E], - [0x1E290, 0x1E2AD], - [0x1E2C0, 0x1E2EB], - [0x1E4D0, 0x1E4EB], - [0x1E7E0, 0x1E7E6], - [0x1E7E8, 0x1E7EB], - [0x1E7ED, 0x1E7EE], - [0x1E7F0, 0x1E7FE], - [0x1E800, 0x1E8C4], - [0x1E900, 0x1E943], - [0x1E94B, 0x1E94B], - [0x1EE00, 0x1EE03], - [0x1EE05, 0x1EE1F], - [0x1EE21, 0x1EE22], - [0x1EE24, 0x1EE24], - [0x1EE27, 0x1EE27], - [0x1EE29, 0x1EE32], - [0x1EE34, 0x1EE37], - [0x1EE39, 0x1EE39], - [0x1EE3B, 0x1EE3B], - [0x1EE42, 0x1EE42], - [0x1EE47, 0x1EE47], - [0x1EE49, 0x1EE49], - [0x1EE4B, 0x1EE4B], - [0x1EE4D, 0x1EE4F], - [0x1EE51, 0x1EE52], - [0x1EE54, 0x1EE54], - [0x1EE57, 0x1EE57], - [0x1EE59, 0x1EE59], - [0x1EE5B, 0x1EE5B], - [0x1EE5D, 0x1EE5D], - [0x1EE5F, 0x1EE5F], - [0x1EE61, 0x1EE62], - [0x1EE64, 0x1EE64], - [0x1EE67, 0x1EE6A], - [0x1EE6C, 0x1EE72], - [0x1EE74, 0x1EE77], - [0x1EE79, 0x1EE7C], - [0x1EE7E, 0x1EE7E], - [0x1EE80, 0x1EE89], - [0x1EE8B, 0x1EE9B], - [0x1EEA1, 0x1EEA3], - [0x1EEA5, 0x1EEA9], - [0x1EEAB, 0x1EEBB], - [0x20000, 0x2B739], - [0x2B740, 0x2B81D], - [0x2B820, 0x2CEA1], - [0x2CEB0, 0x2EBE0], - [0x2EBF0, 0x2EE5D], - [0x2F800, 0x2FA1D], - [0x30000, 0x323AF], - [0x40000, 0x4FFFD], - [0x50000, 0x5FFFD], - [0x60000, 0x6FFFD], - [0x70000, 0x7FFFD], - [0x80000, 0x8FFFD], - [0x90000, 0x9FFFD], - [0xA0000, 0xAFFFD], - [0xB0000, 0xBFFFD], - [0xC0000, 0xCFFFD], - [0xD0000, 0xDFFFD], - [0xE0000, 0xEFFFD], + [0xA8, 0xA8], [0xAA, 0xAA], [0xAD, 0xAD], [0xAF, 0xAF], + [0xB2, 0xB5], [0xB7, 0xBA], [0xBC, 0xBE], [0xC0, 0xD6], + [0xD8, 0xF6], [0xF8, 0x217], [0x250, 0x2A8], [0x2B0, 0x2B8], + [0x2BB, 0x2BB], [0x2BD, 0x2C1], [0x2C6, 0x2D1], [0x2E0, 0x2E4], + [0x2EC, 0x2EC], [0x2EE, 0x2EE], [0x370, 0x374], [0x376, 0x377], + [0x37A, 0x37D], [0x37F, 0x37F], [0x386, 0x386], [0x388, 0x38A], + [0x38C, 0x38C], [0x38E, 0x3A1], [0x3A3, 0x3CE], [0x3D0, 0x3D6], + [0x3DA, 0x3DA], [0x3DC, 0x3DC], [0x3DE, 0x3DE], [0x3E0, 0x3E0], + [0x3E2, 0x3F3], [0x3F7, 0x40C], [0x40E, 0x44F], [0x451, 0x45C], + [0x45E, 0x481], [0x48A, 0x4C4], [0x4C7, 0x4C8], [0x4CB, 0x4CC], + [0x4D0, 0x4EB], [0x4EE, 0x4F5], [0x4F8, 0x4F9], [0x531, 0x556], + [0x559, 0x559], [0x560, 0x587], [0x5B0, 0x5B9], [0x5BB, 0x5BD], + [0x5BF, 0x5BF], [0x5C1, 0x5C2], [0x5D0, 0x5EA], [0x5EF, 0x5F2], + [0x620, 0x63A], [0x640, 0x652], [0x660, 0x669], [0x66E, 0x6BE], + [0x6C0, 0x6CE], [0x6D0, 0x6D5], [0x6E5, 0x6E8], [0x6EA, 0x6FC], + [0x6FF, 0x6FF], [0x710, 0x710], [0x712, 0x72F], [0x74D, 0x7A5], + [0x7B1, 0x7B1], [0x7CA, 0x7EA], [0x7F4, 0x7F5], [0x7FA, 0x7FA], + [0x800, 0x815], [0x81A, 0x81A], [0x824, 0x824], [0x828, 0x828], + [0x840, 0x858], [0x860, 0x86A], [0x870, 0x887], [0x889, 0x88E], + [0x8A0, 0x8C9], [0x901, 0x939], [0x93D, 0x94D], [0x950, 0x952], + [0x958, 0x963], [0x966, 0x96F], [0x971, 0x983], [0x985, 0x98C], + [0x98F, 0x990], [0x993, 0x9A8], [0x9AA, 0x9B0], [0x9B2, 0x9B2], + [0x9B6, 0x9B9], [0x9BD, 0x9C4], [0x9C7, 0x9C8], [0x9CB, 0x9CE], + [0x9DC, 0x9DD], [0x9DF, 0x9E3], [0x9E6, 0x9F1], [0x9FC, 0x9FC], + [0xA02, 0xA02], [0xA05, 0xA0A], [0xA0F, 0xA10], [0xA13, 0xA28], + [0xA2A, 0xA30], [0xA32, 0xA33], [0xA35, 0xA36], [0xA38, 0xA39], + [0xA3E, 0xA42], [0xA47, 0xA48], [0xA4B, 0xA4D], [0xA59, 0xA5C], + [0xA5E, 0xA5E], [0xA66, 0xA6F], [0xA72, 0xA74], [0xA81, 0xA83], + [0xA85, 0xA8B], [0xA8D, 0xA8D], [0xA8F, 0xA91], [0xA93, 0xAA8], + [0xAAA, 0xAB0], [0xAB2, 0xAB3], [0xAB5, 0xAB9], [0xABD, 0xABD], + [0xAC7, 0xAC9], [0xACB, 0xACD], [0xAD0, 0xAD0], [0xAE0, 0xAE0], + [0xAE6, 0xAEF], [0xAF9, 0xAF9], [0xB01, 0xB03], [0xB05, 0xB0C], + [0xB0F, 0xB10], [0xB13, 0xB28], [0xB2A, 0xB30], [0xB32, 0xB33], + [0xB35, 0xB39], [0xB3D, 0xB43], [0xB47, 0xB48], [0xB4B, 0xB4D], + [0xB5C, 0xB5D], [0xB5F, 0xB61], [0xB66, 0xB6F], [0xB71, 0xB71], + [0xB82, 0xB83], [0xB85, 0xB8A], [0xB8E, 0xB90], [0xB92, 0xB95], + [0xB99, 0xB9A], [0xB9C, 0xB9C], [0xB9E, 0xB9F], [0xBA3, 0xBA4], + [0xBA8, 0xBAA], [0xBAE, 0xBB5], [0xBB7, 0xBB9], [0xBBE, 0xBC2], + [0xBC6, 0xBC8], [0xBCA, 0xBCD], [0xBD0, 0xBD0], [0xBE7, 0xBEF], + [0xC01, 0xC03], [0xC05, 0xC0C], [0xC0E, 0xC10], [0xC12, 0xC28], + [0xC2A, 0xC33], [0xC35, 0xC39], [0xC3D, 0xC44], [0xC46, 0xC48], + [0xC4A, 0xC4D], [0xC58, 0xC5A], [0xC5D, 0xC5D], [0xC60, 0xC61], + [0xC66, 0xC6F], [0xC80, 0xC80], [0xC82, 0xC83], [0xC85, 0xC8C], + [0xC8E, 0xC90], [0xC92, 0xCA8], [0xCAA, 0xCB3], [0xCB5, 0xCB9], + [0xCBD, 0xCC4], [0xCC6, 0xCC8], [0xCCA, 0xCCD], [0xCDD, 0xCDE], + [0xCE0, 0xCE1], [0xCE6, 0xCEF], [0xCF1, 0xCF2], [0xD02, 0xD0C], + [0xD0E, 0xD10], [0xD12, 0xD28], [0xD2A, 0xD39], [0xD3D, 0xD43], + [0xD46, 0xD48], [0xD4A, 0xD4E], [0xD54, 0xD56], [0xD5F, 0xD61], + [0xD66, 0xD6F], [0xD7A, 0xD7F], [0xD85, 0xD96], [0xD9A, 0xDB1], + [0xDB3, 0xDBB], [0xDBD, 0xDBD], [0xDC0, 0xDC6], [0xE01, 0xE30], + [0xE32, 0xE32], [0xE40, 0xE5B], [0xE81, 0xE82], [0xE84, 0xE84], + [0xE86, 0xE88], [0xE8A, 0xE8A], [0xE8C, 0xE8D], [0xE94, 0xE97], + [0xE99, 0xE9F], [0xEA1, 0xEA3], [0xEA5, 0xEA5], [0xEA7, 0xEAB], + [0xEAD, 0xEAE], [0xEB0, 0xEB2], [0xEBB, 0xEBD], [0xEC0, 0xEC4], + [0xEC6, 0xEC6], [0xEC8, 0xECD], [0xED0, 0xED9], [0xEDC, 0xEDD], + [0xF00, 0xF00], [0xF18, 0xF19], [0xF20, 0xF33], [0xF35, 0xF35], + [0xF37, 0xF37], [0xF39, 0xF39], [0xF3E, 0xF47], [0xF49, 0xF69], + [0xF71, 0xF84], [0xF86, 0xF8C], [0xF90, 0xF95], [0xF97, 0xF97], + [0xF99, 0xFAD], [0xFB1, 0xFB7], [0xFB9, 0xFB9], [0x1000, 0x102A], + [0x103F, 0x103F], [0x1050, 0x1055], [0x105A, 0x105D], [0x1061, 0x1061], + [0x1065, 0x1066], [0x106E, 0x1070], [0x1075, 0x1081], [0x108E, 0x108E], + [0x10A0, 0x10C5], [0x10C7, 0x10C7], [0x10CD, 0x10CD], [0x10D0, 0x10FA], + [0x10FC, 0x1248], [0x124A, 0x124D], [0x1250, 0x1256], [0x1258, 0x1258], + [0x125A, 0x125D], [0x1260, 0x1288], [0x128A, 0x128D], [0x1290, 0x12B0], + [0x12B2, 0x12B5], [0x12B8, 0x12BE], [0x12C0, 0x12C0], [0x12C2, 0x12C5], + [0x12C8, 0x12D6], [0x12D8, 0x1310], [0x1312, 0x1315], [0x1318, 0x135A], + [0x1380, 0x138F], [0x13A0, 0x13F5], [0x13F8, 0x13FD], [0x1401, 0x166C], + [0x166F, 0x167F], [0x1681, 0x169A], [0x16A0, 0x16EA], [0x16EE, 0x16F8], + [0x1700, 0x1711], [0x171F, 0x1731], [0x1740, 0x1751], [0x1760, 0x176C], + [0x176E, 0x1770], [0x1780, 0x17B3], [0x17D7, 0x17D7], [0x17DC, 0x17DC], + [0x180F, 0x1878], [0x1880, 0x18A8], [0x18AA, 0x18AA], [0x18B0, 0x18F5], + [0x1900, 0x191E], [0x1950, 0x196D], [0x1970, 0x1974], [0x1980, 0x19AB], + [0x19B0, 0x19C9], [0x1A00, 0x1A16], [0x1A20, 0x1A54], [0x1AA7, 0x1AA7], + [0x1B05, 0x1B33], [0x1B45, 0x1B4C], [0x1B83, 0x1BA0], [0x1BAE, 0x1BAF], + [0x1BBA, 0x1BE5], [0x1C00, 0x1C23], [0x1C4D, 0x1C4F], [0x1C5A, 0x1C7D], + [0x1C80, 0x1C88], [0x1C90, 0x1CBA], [0x1CBD, 0x1CBF], [0x1CE9, 0x1CEC], + [0x1CEE, 0x1CF3], [0x1CF5, 0x1CF6], [0x1CFA, 0x1CFA], [0x1D00, 0x1DBF], + [0x1E00, 0x1EF9], [0x1F00, 0x1F15], [0x1F18, 0x1F1D], [0x1F20, 0x1F45], + [0x1F48, 0x1F4D], [0x1F50, 0x1F57], [0x1F59, 0x1F59], [0x1F5B, 0x1F5B], + [0x1F5D, 0x1F5D], [0x1F5F, 0x1F7D], [0x1F80, 0x1FB4], [0x1FB6, 0x1FBC], + [0x1FBE, 0x1FBE], [0x1FC2, 0x1FC4], [0x1FC6, 0x1FCC], [0x1FD0, 0x1FD3], + [0x1FD6, 0x1FDB], [0x1FE0, 0x1FEC], [0x1FF2, 0x1FF4], [0x1FF6, 0x1FFC], + [0x200B, 0x200D], [0x202A, 0x202E], [0x203F, 0x2040], [0x2054, 0x2054], + [0x2060, 0x2071], [0x207F, 0x207F], [0x2090, 0x209C], [0x2102, 0x2102], + [0x2107, 0x2107], [0x210A, 0x2113], [0x2115, 0x2115], [0x2118, 0x211D], + [0x2124, 0x2124], [0x2126, 0x2126], [0x2128, 0x2128], [0x212A, 0x2138], + [0x213C, 0x213F], [0x2145, 0x2149], [0x214E, 0x214E], [0x2160, 0x2188], + [0x2460, 0x24FF], [0x2776, 0x2793], [0x2C00, 0x2CE4], [0x2CEB, 0x2CEE], + [0x2CF2, 0x2CF3], [0x2D00, 0x2D25], [0x2D27, 0x2D27], [0x2D2D, 0x2D2D], + [0x2D30, 0x2D67], [0x2D6F, 0x2D6F], [0x2D80, 0x2D96], [0x2DA0, 0x2DA6], + [0x2DA8, 0x2DAE], [0x2DB0, 0x2DB6], [0x2DB8, 0x2DBE], [0x2DC0, 0x2DC6], + [0x2DC8, 0x2DCE], [0x2DD0, 0x2DD6], [0x2DD8, 0x2DDE], [0x2E80, 0x2FFF], + [0x3004, 0x3007], [0x3021, 0x3029], [0x3031, 0x3035], [0x3038, 0x303C], + [0x3041, 0x3096], [0x309B, 0x309F], [0x30A1, 0x30FF], [0x3105, 0x312F], + [0x3131, 0x318E], [0x31A0, 0x31BF], [0x31F0, 0x31FF], [0x3400, 0x4DBF], + [0x4E00, 0xA48C], [0xA4D0, 0xA4FD], [0xA500, 0xA60C], [0xA610, 0xA61F], + [0xA62A, 0xA62B], [0xA640, 0xA66E], [0xA67F, 0xA69D], [0xA6A0, 0xA6EF], + [0xA717, 0xA71F], [0xA722, 0xA788], [0xA78B, 0xA7CA], [0xA7D0, 0xA7D1], + [0xA7D3, 0xA7D3], [0xA7D5, 0xA7D9], [0xA7F2, 0xA801], [0xA803, 0xA805], + [0xA807, 0xA80A], [0xA80C, 0xA822], [0xA840, 0xA873], [0xA882, 0xA8B3], + [0xA8F2, 0xA8F7], [0xA8FB, 0xA8FB], [0xA8FD, 0xA8FE], [0xA90A, 0xA925], + [0xA930, 0xA946], [0xA960, 0xA97C], [0xA984, 0xA9B2], [0xA9CF, 0xA9CF], + [0xA9E0, 0xA9E4], [0xA9E6, 0xA9EF], [0xA9FA, 0xA9FE], [0xAA00, 0xAA28], + [0xAA40, 0xAA42], [0xAA44, 0xAA4B], [0xAA60, 0xAA76], [0xAA7A, 0xAA7A], + [0xAA7E, 0xAAAF], [0xAAB1, 0xAAB1], [0xAAB5, 0xAAB6], [0xAAB9, 0xAABD], + [0xAAC0, 0xAAC0], [0xAAC2, 0xAAC2], [0xAADB, 0xAADD], [0xAAE0, 0xAAEA], + [0xAAF2, 0xAAF4], [0xAB01, 0xAB06], [0xAB09, 0xAB0E], [0xAB11, 0xAB16], + [0xAB20, 0xAB26], [0xAB28, 0xAB2E], [0xAB30, 0xAB5A], [0xAB5C, 0xAB69], + [0xAB70, 0xABE2], [0xAC00, 0xD7A3], [0xD7B0, 0xD7C6], [0xD7CB, 0xD7FB], + [0xF900, 0xFA6D], [0xFA70, 0xFAD9], [0xFB00, 0xFB06], [0xFB13, 0xFB17], + [0xFB1D, 0xFB1D], [0xFB1F, 0xFB28], [0xFB2A, 0xFB36], [0xFB38, 0xFB3C], + [0xFB3E, 0xFB3E], [0xFB40, 0xFB41], [0xFB43, 0xFB44], [0xFB46, 0xFBB1], + [0xFBD3, 0xFC5D], [0xFC64, 0xFD3D], [0xFD40, 0xFD8F], [0xFD92, 0xFDC7], + [0xFDF0, 0xFDF9], [0xFE47, 0xFE71], [0xFE73, 0xFE73], [0xFE77, 0xFE77], + [0xFE79, 0xFE79], [0xFE7B, 0xFE7B], [0xFE7D, 0xFE7D], [0xFE7F, 0xFEFC], + [0xFF21, 0xFF3A], [0xFF41, 0xFF5A], [0xFF66, 0xFF9D], [0xFFA0, 0xFFBE], + [0xFFC2, 0xFFC7], [0xFFCA, 0xFFCF], [0xFFD2, 0xFFD7], [0xFFDA, 0xFFDC], + [0x10000, 0x1000B], [0x1000D, 0x10026], [0x10028, 0x1003A], [0x1003C, 0x1003D], + [0x1003F, 0x1004D], [0x10050, 0x1005D], [0x10080, 0x100FA], [0x10140, 0x10174], + [0x10280, 0x1029C], [0x102A0, 0x102D0], [0x10300, 0x1031F], [0x1032D, 0x1034A], + [0x10350, 0x10375], [0x10380, 0x1039D], [0x103A0, 0x103C3], [0x103C8, 0x103CF], + [0x103D1, 0x103D5], [0x10400, 0x1049D], [0x104B0, 0x104D3], [0x104D8, 0x104FB], + [0x10500, 0x10527], [0x10530, 0x10563], [0x10570, 0x1057A], [0x1057C, 0x1058A], + [0x1058C, 0x10592], [0x10594, 0x10595], [0x10597, 0x105A1], [0x105A3, 0x105B1], + [0x105B3, 0x105B9], [0x105BB, 0x105BC], [0x10600, 0x10736], [0x10740, 0x10755], + [0x10760, 0x10767], [0x10780, 0x10785], [0x10787, 0x107B0], [0x107B2, 0x107BA], + [0x10800, 0x10805], [0x10808, 0x10808], [0x1080A, 0x10835], [0x10837, 0x10838], + [0x1083C, 0x1083C], [0x1083F, 0x10855], [0x10860, 0x10876], [0x10880, 0x1089E], + [0x108E0, 0x108F2], [0x108F4, 0x108F5], [0x10900, 0x10915], [0x10920, 0x10939], + [0x10980, 0x109B7], [0x109BE, 0x109BF], [0x10A00, 0x10A00], [0x10A10, 0x10A13], + [0x10A15, 0x10A17], [0x10A19, 0x10A35], [0x10A60, 0x10A7C], [0x10A80, 0x10A9C], + [0x10AC0, 0x10AC7], [0x10AC9, 0x10AE4], [0x10B00, 0x10B35], [0x10B40, 0x10B55], + [0x10B60, 0x10B72], [0x10B80, 0x10B91], [0x10C00, 0x10C48], [0x10C80, 0x10CB2], + [0x10CC0, 0x10CF2], [0x10D00, 0x10D23], [0x10E80, 0x10EA9], [0x10EB0, 0x10EB1], + [0x10F00, 0x10F1C], [0x10F27, 0x10F27], [0x10F30, 0x10F45], [0x10F70, 0x10F81], + [0x10FB0, 0x10FC4], [0x10FE0, 0x10FF6], [0x11003, 0x11037], [0x11071, 0x11072], + [0x11075, 0x11075], [0x11083, 0x110AF], [0x110D0, 0x110E8], [0x11103, 0x11126], + [0x11144, 0x11144], [0x11147, 0x11147], [0x11150, 0x11172], [0x11176, 0x11176], + [0x11183, 0x111B2], [0x111C1, 0x111C4], [0x111DA, 0x111DA], [0x111DC, 0x111DC], + [0x11200, 0x11211], [0x11213, 0x1122B], [0x1123F, 0x11240], [0x11280, 0x11286], + [0x11288, 0x11288], [0x1128A, 0x1128D], [0x1128F, 0x1129D], [0x1129F, 0x112A8], + [0x112B0, 0x112DE], [0x11305, 0x1130C], [0x1130F, 0x11310], [0x11313, 0x11328], + [0x1132A, 0x11330], [0x11332, 0x11333], [0x11335, 0x11339], [0x1133D, 0x1133D], + [0x11350, 0x11350], [0x1135D, 0x11361], [0x11400, 0x11434], [0x11447, 0x1144A], + [0x1145F, 0x11461], [0x11480, 0x114AF], [0x114C4, 0x114C5], [0x114C7, 0x114C7], + [0x11580, 0x115AE], [0x115D8, 0x115DB], [0x11600, 0x1162F], [0x11644, 0x11644], + [0x11680, 0x116AA], [0x116B8, 0x116B8], [0x11700, 0x1171A], [0x11740, 0x11746], + [0x11800, 0x1182B], [0x118A0, 0x118DF], [0x118FF, 0x11906], [0x11909, 0x11909], + [0x1190C, 0x11913], [0x11915, 0x11916], [0x11918, 0x1192F], [0x1193F, 0x1193F], + [0x11941, 0x11941], [0x119A0, 0x119A7], [0x119AA, 0x119D0], [0x119E1, 0x119E1], + [0x119E3, 0x119E3], [0x11A00, 0x11A00], [0x11A0B, 0x11A32], [0x11A3A, 0x11A3A], + [0x11A50, 0x11A50], [0x11A5C, 0x11A89], [0x11A9D, 0x11A9D], [0x11AB0, 0x11AF8], + [0x11C00, 0x11C08], [0x11C0A, 0x11C2E], [0x11C40, 0x11C40], [0x11C72, 0x11C8F], + [0x11D00, 0x11D06], [0x11D08, 0x11D09], [0x11D0B, 0x11D30], [0x11D46, 0x11D46], + [0x11D60, 0x11D65], [0x11D67, 0x11D68], [0x11D6A, 0x11D89], [0x11D98, 0x11D98], + [0x11EE0, 0x11EF2], [0x11F02, 0x11F02], [0x11F04, 0x11F10], [0x11F12, 0x11F33], + [0x11FB0, 0x11FB0], [0x12000, 0x12399], [0x12400, 0x1246E], [0x12480, 0x12543], + [0x12F90, 0x12FF0], [0x13000, 0x1342F], [0x13441, 0x13446], [0x14400, 0x14646], + [0x16800, 0x16A38], [0x16A40, 0x16A5E], [0x16A70, 0x16ABE], [0x16AD0, 0x16AED], + [0x16B00, 0x16B2F], [0x16B40, 0x16B43], [0x16B63, 0x16B77], [0x16B7D, 0x16B8F], + [0x16E40, 0x16E7F], [0x16F00, 0x16F4A], [0x16F50, 0x16F50], [0x16F93, 0x16F9F], + [0x16FE0, 0x16FE1], [0x16FE3, 0x16FE3], [0x17000, 0x187F7], [0x18800, 0x18CD5], + [0x18D00, 0x18D08], [0x1AFF0, 0x1AFF3], [0x1AFF5, 0x1AFFB], [0x1AFFD, 0x1AFFE], + [0x1B000, 0x1B122], [0x1B132, 0x1B132], [0x1B150, 0x1B152], [0x1B155, 0x1B155], + [0x1B164, 0x1B167], [0x1B170, 0x1B2FB], [0x1BC00, 0x1BC6A], [0x1BC70, 0x1BC7C], + [0x1BC80, 0x1BC88], [0x1BC90, 0x1BC99], [0x1D400, 0x1D454], [0x1D456, 0x1D49C], + [0x1D49E, 0x1D49F], [0x1D4A2, 0x1D4A2], [0x1D4A5, 0x1D4A6], [0x1D4A9, 0x1D4AC], + [0x1D4AE, 0x1D4B9], [0x1D4BB, 0x1D4BB], [0x1D4BD, 0x1D4C3], [0x1D4C5, 0x1D505], + [0x1D507, 0x1D50A], [0x1D50D, 0x1D514], [0x1D516, 0x1D51C], [0x1D51E, 0x1D539], + [0x1D53B, 0x1D53E], [0x1D540, 0x1D544], [0x1D546, 0x1D546], [0x1D54A, 0x1D550], + [0x1D552, 0x1D6A5], [0x1D6A8, 0x1D6C0], [0x1D6C2, 0x1D6DA], [0x1D6DC, 0x1D6FA], + [0x1D6FC, 0x1D714], [0x1D716, 0x1D734], [0x1D736, 0x1D74E], [0x1D750, 0x1D76E], + [0x1D770, 0x1D788], [0x1D78A, 0x1D7A8], [0x1D7AA, 0x1D7C2], [0x1D7C4, 0x1D7CB], + [0x1DF00, 0x1DF1E], [0x1DF25, 0x1DF2A], [0x1E030, 0x1E06D], [0x1E100, 0x1E12C], + [0x1E137, 0x1E13D], [0x1E14E, 0x1E14E], [0x1E290, 0x1E2AD], [0x1E2C0, 0x1E2EB], + [0x1E4D0, 0x1E4EB], [0x1E7E0, 0x1E7E6], [0x1E7E8, 0x1E7EB], [0x1E7ED, 0x1E7EE], + [0x1E7F0, 0x1E7FE], [0x1E800, 0x1E8C4], [0x1E900, 0x1E943], [0x1E94B, 0x1E94B], + [0x1EE00, 0x1EE03], [0x1EE05, 0x1EE1F], [0x1EE21, 0x1EE22], [0x1EE24, 0x1EE24], + [0x1EE27, 0x1EE27], [0x1EE29, 0x1EE32], [0x1EE34, 0x1EE37], [0x1EE39, 0x1EE39], + [0x1EE3B, 0x1EE3B], [0x1EE42, 0x1EE42], [0x1EE47, 0x1EE47], [0x1EE49, 0x1EE49], + [0x1EE4B, 0x1EE4B], [0x1EE4D, 0x1EE4F], [0x1EE51, 0x1EE52], [0x1EE54, 0x1EE54], + [0x1EE57, 0x1EE57], [0x1EE59, 0x1EE59], [0x1EE5B, 0x1EE5B], [0x1EE5D, 0x1EE5D], + [0x1EE5F, 0x1EE5F], [0x1EE61, 0x1EE62], [0x1EE64, 0x1EE64], [0x1EE67, 0x1EE6A], + [0x1EE6C, 0x1EE72], [0x1EE74, 0x1EE77], [0x1EE79, 0x1EE7C], [0x1EE7E, 0x1EE7E], + [0x1EE80, 0x1EE89], [0x1EE8B, 0x1EE9B], [0x1EEA1, 0x1EEA3], [0x1EEA5, 0x1EEA9], + [0x1EEAB, 0x1EEBB], [0x20000, 0x2B739], [0x2B740, 0x2B81D], [0x2B820, 0x2CEA1], + [0x2CEB0, 0x2EBE0], [0x2EBF0, 0x2EE5D], [0x2F800, 0x2FA1D], [0x30000, 0x323AF], + [0x40000, 0x4FFFD], [0x50000, 0x5FFFD], [0x60000, 0x6FFFD], [0x70000, 0x7FFFD], + [0x80000, 0x8FFFD], [0x90000, 0x9FFFD], [0xA0000, 0xAFFFD], [0xB0000, 0xBFFFD], + [0xC0000, 0xCFFFD], [0xD0000, 0xDFFFD], [0xE0000, 0xEFFFD] ]; + +/** +Tests [[dchar, index] ... planes * 3] for LeastRestrictive_Start +*/ +enum uint[2][] LeastRestrictive_Start_Test = [ + [0x0000A8, 0], + [0x000FB9, 234], + [0x00FFDB, 467], + [0x010005, 468], + [0x011A50, 604], + [0x01EEB3, 740], + [0x025B9C, 741], + [0x02DD48, 744], + [0x02F90E, 746], + [0x0311D7, 747], + [0x047FFE, 748], + [0x057FFE, 749], + [0x067FFE, 750], + [0x077FFE, 751], + [0x087FFE, 752], + [0x097FFE, 753], + [0x0A7FFE, 754], + [0x0B7FFE, 755], + [0x0C7FFE, 756], + [0x0D7FFE, 757], + [0x0E7FFE, 758], +]; /** Least restrictive Continue Entries: 796056 */ static immutable dchar[2][] LeastRestrictive_Continue = [ - [0xA8, 0xA8], - [0xAA, 0xAA], - [0xAD, 0xAD], - [0xAF, 0xAF], - [0xB2, 0xB5], - [0xB7, 0xBA], - [0xBC, 0xBE], - [0xC0, 0xD6], - [0xD8, 0xF6], - [0xF8, 0x217], - [0x250, 0x2A8], - [0x2B0, 0x2B8], - [0x2BB, 0x2BB], - [0x2BD, 0x2C1], - [0x2C6, 0x2D1], - [0x2E0, 0x2E4], - [0x2EC, 0x2EC], - [0x2EE, 0x2EE], - [0x300, 0x374], - [0x376, 0x377], - [0x37A, 0x37D], - [0x37F, 0x37F], - [0x386, 0x386], - [0x388, 0x38A], - [0x38C, 0x38C], - [0x38E, 0x3A1], - [0x3A3, 0x3D6], - [0x3DA, 0x3DA], - [0x3DC, 0x3DC], - [0x3DE, 0x3DE], - [0x3E0, 0x3E0], - [0x3E2, 0x3F3], - [0x3F7, 0x40C], - [0x40E, 0x44F], - [0x451, 0x45C], - [0x45E, 0x481], - [0x483, 0x487], - [0x48A, 0x4C4], - [0x4C7, 0x4C8], - [0x4CB, 0x4CC], - [0x4D0, 0x4EB], - [0x4EE, 0x4F5], - [0x4F8, 0x4F9], - [0x531, 0x556], - [0x559, 0x559], - [0x560, 0x587], - [0x591, 0x5B9], - [0x5BB, 0x5BD], - [0x5BF, 0x5BF], - [0x5C1, 0x5C2], - [0x5C4, 0x5C5], - [0x5C7, 0x5C7], - [0x5D0, 0x5EA], - [0x5EF, 0x5F2], - [0x610, 0x61A], - [0x620, 0x63A], - [0x640, 0x652], - [0x660, 0x669], - [0x66E, 0x6B7], - [0x6BA, 0x6BE], - [0x6C0, 0x6CE], - [0x6D0, 0x6DC], - [0x6DF, 0x6E8], - [0x6EA, 0x6ED], - [0x6F0, 0x6F9], - [0x6FF, 0x6FF], - [0x710, 0x74A], - [0x74D, 0x7B1], - [0x7C0, 0x7F5], - [0x7FA, 0x7FA], - [0x7FD, 0x7FD], - [0x800, 0x82D], - [0x840, 0x85B], - [0x860, 0x86A], - [0x870, 0x887], - [0x889, 0x88E], - [0x898, 0x8E1], - [0x8E3, 0x903], - [0x905, 0x939], - [0x93D, 0x94D], - [0x950, 0x952], - [0x958, 0x963], - [0x966, 0x96F], - [0x971, 0x983], - [0x985, 0x98C], - [0x98F, 0x990], - [0x993, 0x9A8], - [0x9AA, 0x9B0], - [0x9B2, 0x9B2], - [0x9B6, 0x9B9], - [0x9BC, 0x9C4], - [0x9C7, 0x9C8], - [0x9CB, 0x9CD], - [0x9D7, 0x9D7], - [0x9DC, 0x9DD], - [0x9DF, 0x9E3], - [0x9E6, 0x9F1], - [0x9FC, 0x9FC], - [0x9FE, 0x9FE], - [0xA01, 0xA02], - [0xA05, 0xA0A], - [0xA0F, 0xA10], - [0xA13, 0xA28], - [0xA2A, 0xA30], - [0xA32, 0xA33], - [0xA35, 0xA36], - [0xA38, 0xA39], - [0xA3C, 0xA3C], - [0xA3E, 0xA42], - [0xA47, 0xA48], - [0xA4B, 0xA4D], - [0xA51, 0xA51], - [0xA59, 0xA5C], - [0xA5E, 0xA5E], - [0xA66, 0xA6F], - [0xA74, 0xA74], - [0xA81, 0xA83], - [0xA85, 0xA8B], - [0xA8D, 0xA8D], - [0xA8F, 0xA91], - [0xA93, 0xAA8], - [0xAAA, 0xAB0], - [0xAB2, 0xAB3], - [0xAB5, 0xAB9], - [0xABC, 0xAC5], - [0xAC7, 0xAC9], - [0xACB, 0xACD], - [0xAD0, 0xAD0], - [0xAE0, 0xAE0], - [0xAE6, 0xAEF], - [0xAF9, 0xAFF], - [0xB01, 0xB03], - [0xB05, 0xB0C], - [0xB0F, 0xB10], - [0xB13, 0xB28], - [0xB2A, 0xB30], - [0xB32, 0xB33], - [0xB35, 0xB39], - [0xB3C, 0xB43], - [0xB47, 0xB48], - [0xB4B, 0xB4D], - [0xB55, 0xB57], - [0xB5C, 0xB5D], - [0xB5F, 0xB61], - [0xB66, 0xB6F], - [0xB71, 0xB71], - [0xB82, 0xB83], - [0xB85, 0xB8A], - [0xB8E, 0xB90], - [0xB92, 0xB95], - [0xB99, 0xB9A], - [0xB9C, 0xB9C], - [0xB9E, 0xB9F], - [0xBA3, 0xBA4], - [0xBA8, 0xBAA], - [0xBAE, 0xBB5], - [0xBB7, 0xBB9], - [0xBBE, 0xBC2], - [0xBC6, 0xBC8], - [0xBCA, 0xBCD], - [0xBD0, 0xBD0], - [0xBD7, 0xBD7], - [0xBE6, 0xBEF], - [0xC00, 0xC03], - [0xC05, 0xC0C], - [0xC0E, 0xC10], - [0xC12, 0xC28], - [0xC2A, 0xC33], - [0xC35, 0xC39], - [0xC3C, 0xC44], - [0xC46, 0xC48], - [0xC4A, 0xC4D], - [0xC55, 0xC56], - [0xC58, 0xC5A], - [0xC5D, 0xC5D], - [0xC60, 0xC61], - [0xC66, 0xC6F], - [0xC80, 0xC83], - [0xC85, 0xC8C], - [0xC8E, 0xC90], - [0xC92, 0xCA8], - [0xCAA, 0xCB3], - [0xCB5, 0xCB9], - [0xCBC, 0xCC4], - [0xCC6, 0xCC8], - [0xCCA, 0xCCD], - [0xCD5, 0xCD6], - [0xCDD, 0xCDE], - [0xCE0, 0xCE1], - [0xCE6, 0xCEF], - [0xCF1, 0xCF3], - [0xD00, 0xD03], - [0xD05, 0xD0C], - [0xD0E, 0xD10], - [0xD12, 0xD39], - [0xD3E, 0xD43], - [0xD46, 0xD48], - [0xD4A, 0xD4E], - [0xD54, 0xD57], - [0xD5F, 0xD61], - [0xD66, 0xD6F], - [0xD7A, 0xD7F], - [0xD81, 0xD83], - [0xD85, 0xD96], - [0xD9A, 0xDB1], - [0xDB3, 0xDBB], - [0xDBD, 0xDBD], - [0xDC0, 0xDC6], - [0xDCA, 0xDCA], - [0xDCF, 0xDD4], - [0xDD6, 0xDD6], - [0xDD8, 0xDDF], - [0xDE6, 0xDEF], - [0xDF2, 0xDF3], - [0xE01, 0xE3A], - [0xE40, 0xE4E], - [0xE50, 0xE59], - [0xE81, 0xE82], - [0xE84, 0xE84], - [0xE86, 0xE88], - [0xE8A, 0xE8A], - [0xE8C, 0xE8D], - [0xE94, 0xE97], - [0xE99, 0xE9F], - [0xEA1, 0xEA3], - [0xEA5, 0xEA5], - [0xEA7, 0xEAB], - [0xEAD, 0xEAE], - [0xEB0, 0xEB9], - [0xEBB, 0xEBD], - [0xEC0, 0xEC4], - [0xEC6, 0xEC6], - [0xEC8, 0xECE], - [0xED0, 0xED9], - [0xEDC, 0xEDF], - [0xF00, 0xF00], - [0xF18, 0xF19], - [0xF20, 0xF29], - [0xF35, 0xF35], - [0xF37, 0xF37], - [0xF39, 0xF39], - [0xF3E, 0xF47], - [0xF49, 0xF6C], - [0xF71, 0xF84], - [0xF86, 0xF95], - [0xF97, 0xF97], - [0xF99, 0xFB7], - [0xFB9, 0xFB9], - [0xFC6, 0xFC6], - [0x1000, 0x1049], - [0x1050, 0x109D], - [0x10A0, 0x10C5], - [0x10C7, 0x10C7], - [0x10CD, 0x10CD], - [0x10D0, 0x10FA], - [0x10FC, 0x1248], - [0x124A, 0x124D], - [0x1250, 0x1256], - [0x1258, 0x1258], - [0x125A, 0x125D], - [0x1260, 0x1288], - [0x128A, 0x128D], - [0x1290, 0x12B0], - [0x12B2, 0x12B5], - [0x12B8, 0x12BE], - [0x12C0, 0x12C0], - [0x12C2, 0x12C5], - [0x12C8, 0x12D6], - [0x12D8, 0x1310], - [0x1312, 0x1315], - [0x1318, 0x135A], - [0x135D, 0x135F], - [0x1369, 0x1371], - [0x1380, 0x138F], - [0x13A0, 0x13F5], - [0x13F8, 0x13FD], - [0x1401, 0x166C], - [0x166F, 0x167F], - [0x1681, 0x169A], - [0x16A0, 0x16EA], - [0x16EE, 0x16F8], - [0x1700, 0x1715], - [0x171F, 0x1734], - [0x1740, 0x1753], - [0x1760, 0x176C], - [0x176E, 0x1770], - [0x1772, 0x1773], - [0x1780, 0x17D3], - [0x17D7, 0x17D7], - [0x17DC, 0x17DD], - [0x17E0, 0x17E9], - [0x180B, 0x180D], - [0x180F, 0x1819], - [0x1820, 0x1878], - [0x1880, 0x18AA], - [0x18B0, 0x18F5], - [0x1900, 0x191E], - [0x1920, 0x192B], - [0x1930, 0x193B], - [0x1946, 0x196D], - [0x1970, 0x1974], - [0x1980, 0x19AB], - [0x19B0, 0x19C9], - [0x19D0, 0x19DA], - [0x1A00, 0x1A1B], - [0x1A20, 0x1A5E], - [0x1A60, 0x1A7C], - [0x1A7F, 0x1A89], - [0x1A90, 0x1A99], - [0x1AA7, 0x1AA7], - [0x1AB0, 0x1ABD], - [0x1ABF, 0x1ACE], - [0x1B00, 0x1B4C], - [0x1B50, 0x1B59], - [0x1B6B, 0x1B73], - [0x1B80, 0x1BF3], - [0x1C00, 0x1C37], - [0x1C40, 0x1C49], - [0x1C4D, 0x1C7D], - [0x1C80, 0x1C88], - [0x1C90, 0x1CBA], - [0x1CBD, 0x1CBF], - [0x1CD0, 0x1CD2], - [0x1CD4, 0x1CFA], - [0x1D00, 0x1EF9], - [0x1F00, 0x1F15], - [0x1F18, 0x1F1D], - [0x1F20, 0x1F45], - [0x1F48, 0x1F4D], - [0x1F50, 0x1F57], - [0x1F59, 0x1F59], - [0x1F5B, 0x1F5B], - [0x1F5D, 0x1F5D], - [0x1F5F, 0x1F7D], - [0x1F80, 0x1FB4], - [0x1FB6, 0x1FBC], - [0x1FBE, 0x1FBE], - [0x1FC2, 0x1FC4], - [0x1FC6, 0x1FCC], - [0x1FD0, 0x1FD3], - [0x1FD6, 0x1FDB], - [0x1FE0, 0x1FEC], - [0x1FF2, 0x1FF4], - [0x1FF6, 0x1FFC], - [0x200B, 0x200D], - [0x202A, 0x202E], - [0x203F, 0x2040], - [0x2054, 0x2054], - [0x2060, 0x2071], - [0x207F, 0x207F], - [0x2090, 0x209C], - [0x20D0, 0x20DC], - [0x20E1, 0x20E1], - [0x20E5, 0x20F0], - [0x2102, 0x2102], - [0x2107, 0x2107], - [0x210A, 0x2113], - [0x2115, 0x2115], - [0x2118, 0x211D], - [0x2124, 0x2124], - [0x2126, 0x2126], - [0x2128, 0x2128], - [0x212A, 0x2138], - [0x213C, 0x213F], - [0x2145, 0x2149], - [0x214E, 0x214E], - [0x2160, 0x2188], - [0x2460, 0x24FF], - [0x2776, 0x2793], - [0x2C00, 0x2CE4], - [0x2CEB, 0x2CF3], - [0x2D00, 0x2D25], - [0x2D27, 0x2D27], - [0x2D2D, 0x2D2D], - [0x2D30, 0x2D67], - [0x2D6F, 0x2D6F], - [0x2D7F, 0x2D96], - [0x2DA0, 0x2DA6], - [0x2DA8, 0x2DAE], - [0x2DB0, 0x2DB6], - [0x2DB8, 0x2DBE], - [0x2DC0, 0x2DC6], - [0x2DC8, 0x2DCE], - [0x2DD0, 0x2DD6], - [0x2DD8, 0x2DDE], - [0x2DE0, 0x2DFF], - [0x2E80, 0x2FFF], - [0x3004, 0x3007], - [0x3021, 0x302F], - [0x3031, 0x303C], - [0x3041, 0x3096], - [0x3099, 0x309F], - [0x30A1, 0x30FC], - [0x3105, 0x312F], - [0x3131, 0x318E], - [0x31A0, 0x31BF], - [0x31F0, 0x31FF], - [0x3400, 0x4DBF], - [0x4E00, 0xA48C], - [0xA4D0, 0xA4FD], - [0xA500, 0xA60C], - [0xA610, 0xA62B], - [0xA640, 0xA66F], - [0xA674, 0xA67D], - [0xA67F, 0xA6F1], - [0xA717, 0xA71F], - [0xA722, 0xA788], - [0xA78B, 0xA7CA], - [0xA7D0, 0xA7D1], - [0xA7D3, 0xA7D3], - [0xA7D5, 0xA7D9], - [0xA7F2, 0xA827], - [0xA82C, 0xA82C], - [0xA840, 0xA873], - [0xA880, 0xA8C5], - [0xA8D0, 0xA8D9], - [0xA8E0, 0xA8F7], - [0xA8FB, 0xA8FB], - [0xA8FD, 0xA92D], - [0xA930, 0xA953], - [0xA960, 0xA97C], - [0xA980, 0xA9C0], - [0xA9CF, 0xA9D9], - [0xA9E0, 0xA9FE], - [0xAA00, 0xAA36], - [0xAA40, 0xAA4D], - [0xAA50, 0xAA59], - [0xAA60, 0xAA76], - [0xAA7A, 0xAAC2], - [0xAADB, 0xAADD], - [0xAAE0, 0xAAEF], - [0xAAF2, 0xAAF6], - [0xAB01, 0xAB06], - [0xAB09, 0xAB0E], - [0xAB11, 0xAB16], - [0xAB20, 0xAB26], - [0xAB28, 0xAB2E], - [0xAB30, 0xAB5A], - [0xAB5C, 0xAB69], - [0xAB70, 0xABEA], - [0xABEC, 0xABED], - [0xABF0, 0xABF9], - [0xAC00, 0xD7A3], - [0xD7B0, 0xD7C6], - [0xD7CB, 0xD7FB], - [0xF900, 0xFA6D], - [0xFA70, 0xFAD9], - [0xFB00, 0xFB06], - [0xFB13, 0xFB17], - [0xFB1D, 0xFB28], - [0xFB2A, 0xFB36], - [0xFB38, 0xFB3C], - [0xFB3E, 0xFB3E], - [0xFB40, 0xFB41], - [0xFB43, 0xFB44], - [0xFB46, 0xFBB1], - [0xFBD3, 0xFC5D], - [0xFC64, 0xFD3D], - [0xFD40, 0xFD8F], - [0xFD92, 0xFDC7], - [0xFDF0, 0xFDF9], - [0xFE00, 0xFE0F], - [0xFE20, 0xFE2F], - [0xFE33, 0xFE34], - [0xFE47, 0xFE4F], - [0xFE71, 0xFE71], - [0xFE73, 0xFE73], - [0xFE77, 0xFE77], - [0xFE79, 0xFE79], - [0xFE7B, 0xFE7B], - [0xFE7D, 0xFE7D], - [0xFE7F, 0xFEFC], - [0xFF10, 0xFF19], - [0xFF21, 0xFF3A], - [0xFF3F, 0xFF3F], - [0xFF41, 0xFF5A], - [0xFF65, 0xFFBE], - [0xFFC2, 0xFFC7], - [0xFFCA, 0xFFCF], - [0xFFD2, 0xFFD7], - [0xFFDA, 0xFFDC], - [0x10000, 0x1000B], - [0x1000D, 0x10026], - [0x10028, 0x1003A], - [0x1003C, 0x1003D], - [0x1003F, 0x1004D], - [0x10050, 0x1005D], - [0x10080, 0x100FA], - [0x10140, 0x10174], - [0x101FD, 0x101FD], - [0x10280, 0x1029C], - [0x102A0, 0x102D0], - [0x102E0, 0x102E0], - [0x10300, 0x1031F], - [0x1032D, 0x1034A], - [0x10350, 0x1037A], - [0x10380, 0x1039D], - [0x103A0, 0x103C3], - [0x103C8, 0x103CF], - [0x103D1, 0x103D5], - [0x10400, 0x1049D], - [0x104A0, 0x104A9], - [0x104B0, 0x104D3], - [0x104D8, 0x104FB], - [0x10500, 0x10527], - [0x10530, 0x10563], - [0x10570, 0x1057A], - [0x1057C, 0x1058A], - [0x1058C, 0x10592], - [0x10594, 0x10595], - [0x10597, 0x105A1], - [0x105A3, 0x105B1], - [0x105B3, 0x105B9], - [0x105BB, 0x105BC], - [0x10600, 0x10736], - [0x10740, 0x10755], - [0x10760, 0x10767], - [0x10780, 0x10785], - [0x10787, 0x107B0], - [0x107B2, 0x107BA], - [0x10800, 0x10805], - [0x10808, 0x10808], - [0x1080A, 0x10835], - [0x10837, 0x10838], - [0x1083C, 0x1083C], - [0x1083F, 0x10855], - [0x10860, 0x10876], - [0x10880, 0x1089E], - [0x108E0, 0x108F2], - [0x108F4, 0x108F5], - [0x10900, 0x10915], - [0x10920, 0x10939], - [0x10980, 0x109B7], - [0x109BE, 0x109BF], - [0x10A00, 0x10A03], - [0x10A05, 0x10A06], - [0x10A0C, 0x10A13], - [0x10A15, 0x10A17], - [0x10A19, 0x10A35], - [0x10A38, 0x10A3A], - [0x10A3F, 0x10A3F], - [0x10A60, 0x10A7C], - [0x10A80, 0x10A9C], - [0x10AC0, 0x10AC7], - [0x10AC9, 0x10AE6], - [0x10B00, 0x10B35], - [0x10B40, 0x10B55], - [0x10B60, 0x10B72], - [0x10B80, 0x10B91], - [0x10C00, 0x10C48], - [0x10C80, 0x10CB2], - [0x10CC0, 0x10CF2], - [0x10D00, 0x10D27], - [0x10D30, 0x10D39], - [0x10E80, 0x10EA9], - [0x10EAB, 0x10EAC], - [0x10EB0, 0x10EB1], - [0x10EFD, 0x10F1C], - [0x10F27, 0x10F27], - [0x10F30, 0x10F50], - [0x10F70, 0x10F85], - [0x10FB0, 0x10FC4], - [0x10FE0, 0x10FF6], - [0x11000, 0x11046], - [0x11066, 0x11075], - [0x1107F, 0x110BA], - [0x110C2, 0x110C2], - [0x110D0, 0x110E8], - [0x110F0, 0x110F9], - [0x11100, 0x11134], - [0x11136, 0x1113F], - [0x11144, 0x11147], - [0x11150, 0x11173], - [0x11176, 0x11176], - [0x11180, 0x111C4], - [0x111C9, 0x111CC], - [0x111CE, 0x111DA], - [0x111DC, 0x111DC], - [0x11200, 0x11211], - [0x11213, 0x11237], - [0x1123E, 0x11241], - [0x11280, 0x11286], - [0x11288, 0x11288], - [0x1128A, 0x1128D], - [0x1128F, 0x1129D], - [0x1129F, 0x112A8], - [0x112B0, 0x112EA], - [0x112F0, 0x112F9], - [0x11300, 0x11303], - [0x11305, 0x1130C], - [0x1130F, 0x11310], - [0x11313, 0x11328], - [0x1132A, 0x11330], - [0x11332, 0x11333], - [0x11335, 0x11339], - [0x1133B, 0x11344], - [0x11347, 0x11348], - [0x1134B, 0x1134D], - [0x11350, 0x11350], - [0x11357, 0x11357], - [0x1135D, 0x11363], - [0x11366, 0x1136C], - [0x11370, 0x11374], - [0x11400, 0x1144A], - [0x11450, 0x11459], - [0x1145E, 0x11461], - [0x11480, 0x114C5], - [0x114C7, 0x114C7], - [0x114D0, 0x114D9], - [0x11580, 0x115B5], - [0x115B8, 0x115C0], - [0x115D8, 0x115DD], - [0x11600, 0x11640], - [0x11644, 0x11644], - [0x11650, 0x11659], - [0x11680, 0x116B8], - [0x116C0, 0x116C9], - [0x11700, 0x1171A], - [0x1171D, 0x1172B], - [0x11730, 0x11739], - [0x11740, 0x11746], - [0x11800, 0x1183A], - [0x118A0, 0x118E9], - [0x118FF, 0x11906], - [0x11909, 0x11909], - [0x1190C, 0x11913], - [0x11915, 0x11916], - [0x11918, 0x11935], - [0x11937, 0x11938], - [0x1193B, 0x11943], - [0x11950, 0x11959], - [0x119A0, 0x119A7], - [0x119AA, 0x119D7], - [0x119DA, 0x119E1], - [0x119E3, 0x119E4], - [0x11A00, 0x11A3E], - [0x11A47, 0x11A47], - [0x11A50, 0x11A99], - [0x11A9D, 0x11A9D], - [0x11AB0, 0x11AF8], - [0x11C00, 0x11C08], - [0x11C0A, 0x11C36], - [0x11C38, 0x11C40], - [0x11C50, 0x11C59], - [0x11C72, 0x11C8F], - [0x11C92, 0x11CA7], - [0x11CA9, 0x11CB6], - [0x11D00, 0x11D06], - [0x11D08, 0x11D09], - [0x11D0B, 0x11D36], - [0x11D3A, 0x11D3A], - [0x11D3C, 0x11D3D], - [0x11D3F, 0x11D47], - [0x11D50, 0x11D59], - [0x11D60, 0x11D65], - [0x11D67, 0x11D68], - [0x11D6A, 0x11D8E], - [0x11D90, 0x11D91], - [0x11D93, 0x11D98], - [0x11DA0, 0x11DA9], - [0x11EE0, 0x11EF6], - [0x11F00, 0x11F10], - [0x11F12, 0x11F3A], - [0x11F3E, 0x11F42], - [0x11F50, 0x11F59], - [0x11FB0, 0x11FB0], - [0x12000, 0x12399], - [0x12400, 0x1246E], - [0x12480, 0x12543], - [0x12F90, 0x12FF0], - [0x13000, 0x1342F], - [0x13440, 0x13455], - [0x14400, 0x14646], - [0x16800, 0x16A38], - [0x16A40, 0x16A5E], - [0x16A60, 0x16A69], - [0x16A70, 0x16ABE], - [0x16AC0, 0x16AC9], - [0x16AD0, 0x16AED], - [0x16AF0, 0x16AF4], - [0x16B00, 0x16B36], - [0x16B40, 0x16B43], - [0x16B50, 0x16B59], - [0x16B63, 0x16B77], - [0x16B7D, 0x16B8F], - [0x16E40, 0x16E7F], - [0x16F00, 0x16F4A], - [0x16F4F, 0x16F87], - [0x16F8F, 0x16F9F], - [0x16FE0, 0x16FE1], - [0x16FE3, 0x16FE4], - [0x16FF0, 0x16FF1], - [0x17000, 0x187F7], - [0x18800, 0x18CD5], - [0x18D00, 0x18D08], - [0x1AFF0, 0x1AFF3], - [0x1AFF5, 0x1AFFB], - [0x1AFFD, 0x1AFFE], - [0x1B000, 0x1B122], - [0x1B132, 0x1B132], - [0x1B150, 0x1B152], - [0x1B155, 0x1B155], - [0x1B164, 0x1B167], - [0x1B170, 0x1B2FB], - [0x1BC00, 0x1BC6A], - [0x1BC70, 0x1BC7C], - [0x1BC80, 0x1BC88], - [0x1BC90, 0x1BC99], - [0x1BC9D, 0x1BC9E], - [0x1CF00, 0x1CF2D], - [0x1CF30, 0x1CF46], - [0x1D165, 0x1D169], - [0x1D16D, 0x1D172], - [0x1D17B, 0x1D182], - [0x1D185, 0x1D18B], - [0x1D1AA, 0x1D1AD], - [0x1D242, 0x1D244], - [0x1D400, 0x1D454], - [0x1D456, 0x1D49C], - [0x1D49E, 0x1D49F], - [0x1D4A2, 0x1D4A2], - [0x1D4A5, 0x1D4A6], - [0x1D4A9, 0x1D4AC], - [0x1D4AE, 0x1D4B9], - [0x1D4BB, 0x1D4BB], - [0x1D4BD, 0x1D4C3], - [0x1D4C5, 0x1D505], - [0x1D507, 0x1D50A], - [0x1D50D, 0x1D514], - [0x1D516, 0x1D51C], - [0x1D51E, 0x1D539], - [0x1D53B, 0x1D53E], - [0x1D540, 0x1D544], - [0x1D546, 0x1D546], - [0x1D54A, 0x1D550], - [0x1D552, 0x1D6A5], - [0x1D6A8, 0x1D6C0], - [0x1D6C2, 0x1D6DA], - [0x1D6DC, 0x1D6FA], - [0x1D6FC, 0x1D714], - [0x1D716, 0x1D734], - [0x1D736, 0x1D74E], - [0x1D750, 0x1D76E], - [0x1D770, 0x1D788], - [0x1D78A, 0x1D7A8], - [0x1D7AA, 0x1D7C2], - [0x1D7C4, 0x1D7CB], - [0x1D7CE, 0x1D7FF], - [0x1DA00, 0x1DA36], - [0x1DA3B, 0x1DA6C], - [0x1DA75, 0x1DA75], - [0x1DA84, 0x1DA84], - [0x1DA9B, 0x1DA9F], - [0x1DAA1, 0x1DAAF], - [0x1DF00, 0x1DF1E], - [0x1DF25, 0x1DF2A], - [0x1E000, 0x1E006], - [0x1E008, 0x1E018], - [0x1E01B, 0x1E021], - [0x1E023, 0x1E024], - [0x1E026, 0x1E02A], - [0x1E030, 0x1E06D], - [0x1E08F, 0x1E08F], - [0x1E100, 0x1E12C], - [0x1E130, 0x1E13D], - [0x1E140, 0x1E149], - [0x1E14E, 0x1E14E], - [0x1E290, 0x1E2AE], - [0x1E2C0, 0x1E2F9], - [0x1E4D0, 0x1E4F9], - [0x1E7E0, 0x1E7E6], - [0x1E7E8, 0x1E7EB], - [0x1E7ED, 0x1E7EE], - [0x1E7F0, 0x1E7FE], - [0x1E800, 0x1E8C4], - [0x1E8D0, 0x1E8D6], - [0x1E900, 0x1E94B], - [0x1E950, 0x1E959], - [0x1EE00, 0x1EE03], - [0x1EE05, 0x1EE1F], - [0x1EE21, 0x1EE22], - [0x1EE24, 0x1EE24], - [0x1EE27, 0x1EE27], - [0x1EE29, 0x1EE32], - [0x1EE34, 0x1EE37], - [0x1EE39, 0x1EE39], - [0x1EE3B, 0x1EE3B], - [0x1EE42, 0x1EE42], - [0x1EE47, 0x1EE47], - [0x1EE49, 0x1EE49], - [0x1EE4B, 0x1EE4B], - [0x1EE4D, 0x1EE4F], - [0x1EE51, 0x1EE52], - [0x1EE54, 0x1EE54], - [0x1EE57, 0x1EE57], - [0x1EE59, 0x1EE59], - [0x1EE5B, 0x1EE5B], - [0x1EE5D, 0x1EE5D], - [0x1EE5F, 0x1EE5F], - [0x1EE61, 0x1EE62], - [0x1EE64, 0x1EE64], - [0x1EE67, 0x1EE6A], - [0x1EE6C, 0x1EE72], - [0x1EE74, 0x1EE77], - [0x1EE79, 0x1EE7C], - [0x1EE7E, 0x1EE7E], - [0x1EE80, 0x1EE89], - [0x1EE8B, 0x1EE9B], - [0x1EEA1, 0x1EEA3], - [0x1EEA5, 0x1EEA9], - [0x1EEAB, 0x1EEBB], - [0x1FBF0, 0x1FBF9], - [0x20000, 0x2B739], - [0x2B740, 0x2B81D], - [0x2B820, 0x2CEA1], - [0x2CEB0, 0x2EBE0], - [0x2EBF0, 0x2EE5D], - [0x2F800, 0x2FA1D], - [0x30000, 0x323AF], - [0x40000, 0x4FFFD], - [0x50000, 0x5FFFD], - [0x60000, 0x6FFFD], - [0x70000, 0x7FFFD], - [0x80000, 0x8FFFD], - [0x90000, 0x9FFFD], - [0xA0000, 0xAFFFD], - [0xB0000, 0xBFFFD], - [0xC0000, 0xCFFFD], - [0xD0000, 0xDFFFD], - [0xE0000, 0xE01EF], + [0xA8, 0xA8], [0xAA, 0xAA], [0xAD, 0xAD], [0xAF, 0xAF], + [0xB2, 0xB5], [0xB7, 0xBA], [0xBC, 0xBE], [0xC0, 0xD6], + [0xD8, 0xF6], [0xF8, 0x217], [0x250, 0x2A8], [0x2B0, 0x2B8], + [0x2BB, 0x2BB], [0x2BD, 0x2C1], [0x2C6, 0x2D1], [0x2E0, 0x2E4], + [0x2EC, 0x2EC], [0x2EE, 0x2EE], [0x300, 0x374], [0x376, 0x377], + [0x37A, 0x37D], [0x37F, 0x37F], [0x386, 0x386], [0x388, 0x38A], + [0x38C, 0x38C], [0x38E, 0x3A1], [0x3A3, 0x3D6], [0x3DA, 0x3DA], + [0x3DC, 0x3DC], [0x3DE, 0x3DE], [0x3E0, 0x3E0], [0x3E2, 0x3F3], + [0x3F7, 0x40C], [0x40E, 0x44F], [0x451, 0x45C], [0x45E, 0x481], + [0x483, 0x487], [0x48A, 0x4C4], [0x4C7, 0x4C8], [0x4CB, 0x4CC], + [0x4D0, 0x4EB], [0x4EE, 0x4F5], [0x4F8, 0x4F9], [0x531, 0x556], + [0x559, 0x559], [0x560, 0x587], [0x591, 0x5B9], [0x5BB, 0x5BD], + [0x5BF, 0x5BF], [0x5C1, 0x5C2], [0x5C4, 0x5C5], [0x5C7, 0x5C7], + [0x5D0, 0x5EA], [0x5EF, 0x5F2], [0x610, 0x61A], [0x620, 0x63A], + [0x640, 0x652], [0x660, 0x669], [0x66E, 0x6B7], [0x6BA, 0x6BE], + [0x6C0, 0x6CE], [0x6D0, 0x6DC], [0x6DF, 0x6E8], [0x6EA, 0x6ED], + [0x6F0, 0x6F9], [0x6FF, 0x6FF], [0x710, 0x74A], [0x74D, 0x7B1], + [0x7C0, 0x7F5], [0x7FA, 0x7FA], [0x7FD, 0x7FD], [0x800, 0x82D], + [0x840, 0x85B], [0x860, 0x86A], [0x870, 0x887], [0x889, 0x88E], + [0x898, 0x8E1], [0x8E3, 0x903], [0x905, 0x939], [0x93D, 0x94D], + [0x950, 0x952], [0x958, 0x963], [0x966, 0x96F], [0x971, 0x983], + [0x985, 0x98C], [0x98F, 0x990], [0x993, 0x9A8], [0x9AA, 0x9B0], + [0x9B2, 0x9B2], [0x9B6, 0x9B9], [0x9BC, 0x9C4], [0x9C7, 0x9C8], + [0x9CB, 0x9CD], [0x9D7, 0x9D7], [0x9DC, 0x9DD], [0x9DF, 0x9E3], + [0x9E6, 0x9F1], [0x9FC, 0x9FC], [0x9FE, 0x9FE], [0xA01, 0xA02], + [0xA05, 0xA0A], [0xA0F, 0xA10], [0xA13, 0xA28], [0xA2A, 0xA30], + [0xA32, 0xA33], [0xA35, 0xA36], [0xA38, 0xA39], [0xA3C, 0xA3C], + [0xA3E, 0xA42], [0xA47, 0xA48], [0xA4B, 0xA4D], [0xA51, 0xA51], + [0xA59, 0xA5C], [0xA5E, 0xA5E], [0xA66, 0xA6F], [0xA74, 0xA74], + [0xA81, 0xA83], [0xA85, 0xA8B], [0xA8D, 0xA8D], [0xA8F, 0xA91], + [0xA93, 0xAA8], [0xAAA, 0xAB0], [0xAB2, 0xAB3], [0xAB5, 0xAB9], + [0xABC, 0xAC5], [0xAC7, 0xAC9], [0xACB, 0xACD], [0xAD0, 0xAD0], + [0xAE0, 0xAE0], [0xAE6, 0xAEF], [0xAF9, 0xAFF], [0xB01, 0xB03], + [0xB05, 0xB0C], [0xB0F, 0xB10], [0xB13, 0xB28], [0xB2A, 0xB30], + [0xB32, 0xB33], [0xB35, 0xB39], [0xB3C, 0xB43], [0xB47, 0xB48], + [0xB4B, 0xB4D], [0xB55, 0xB57], [0xB5C, 0xB5D], [0xB5F, 0xB61], + [0xB66, 0xB6F], [0xB71, 0xB71], [0xB82, 0xB83], [0xB85, 0xB8A], + [0xB8E, 0xB90], [0xB92, 0xB95], [0xB99, 0xB9A], [0xB9C, 0xB9C], + [0xB9E, 0xB9F], [0xBA3, 0xBA4], [0xBA8, 0xBAA], [0xBAE, 0xBB5], + [0xBB7, 0xBB9], [0xBBE, 0xBC2], [0xBC6, 0xBC8], [0xBCA, 0xBCD], + [0xBD0, 0xBD0], [0xBD7, 0xBD7], [0xBE6, 0xBEF], [0xC00, 0xC03], + [0xC05, 0xC0C], [0xC0E, 0xC10], [0xC12, 0xC28], [0xC2A, 0xC33], + [0xC35, 0xC39], [0xC3C, 0xC44], [0xC46, 0xC48], [0xC4A, 0xC4D], + [0xC55, 0xC56], [0xC58, 0xC5A], [0xC5D, 0xC5D], [0xC60, 0xC61], + [0xC66, 0xC6F], [0xC80, 0xC83], [0xC85, 0xC8C], [0xC8E, 0xC90], + [0xC92, 0xCA8], [0xCAA, 0xCB3], [0xCB5, 0xCB9], [0xCBC, 0xCC4], + [0xCC6, 0xCC8], [0xCCA, 0xCCD], [0xCD5, 0xCD6], [0xCDD, 0xCDE], + [0xCE0, 0xCE1], [0xCE6, 0xCEF], [0xCF1, 0xCF3], [0xD00, 0xD03], + [0xD05, 0xD0C], [0xD0E, 0xD10], [0xD12, 0xD39], [0xD3E, 0xD43], + [0xD46, 0xD48], [0xD4A, 0xD4E], [0xD54, 0xD57], [0xD5F, 0xD61], + [0xD66, 0xD6F], [0xD7A, 0xD7F], [0xD81, 0xD83], [0xD85, 0xD96], + [0xD9A, 0xDB1], [0xDB3, 0xDBB], [0xDBD, 0xDBD], [0xDC0, 0xDC6], + [0xDCA, 0xDCA], [0xDCF, 0xDD4], [0xDD6, 0xDD6], [0xDD8, 0xDDF], + [0xDE6, 0xDEF], [0xDF2, 0xDF3], [0xE01, 0xE3A], [0xE40, 0xE4E], + [0xE50, 0xE59], [0xE81, 0xE82], [0xE84, 0xE84], [0xE86, 0xE88], + [0xE8A, 0xE8A], [0xE8C, 0xE8D], [0xE94, 0xE97], [0xE99, 0xE9F], + [0xEA1, 0xEA3], [0xEA5, 0xEA5], [0xEA7, 0xEAB], [0xEAD, 0xEAE], + [0xEB0, 0xEB9], [0xEBB, 0xEBD], [0xEC0, 0xEC4], [0xEC6, 0xEC6], + [0xEC8, 0xECE], [0xED0, 0xED9], [0xEDC, 0xEDF], [0xF00, 0xF00], + [0xF18, 0xF19], [0xF20, 0xF29], [0xF35, 0xF35], [0xF37, 0xF37], + [0xF39, 0xF39], [0xF3E, 0xF47], [0xF49, 0xF6C], [0xF71, 0xF84], + [0xF86, 0xF95], [0xF97, 0xF97], [0xF99, 0xFB7], [0xFB9, 0xFB9], + [0xFC6, 0xFC6], [0x1000, 0x1049], [0x1050, 0x109D], [0x10A0, 0x10C5], + [0x10C7, 0x10C7], [0x10CD, 0x10CD], [0x10D0, 0x10FA], [0x10FC, 0x1248], + [0x124A, 0x124D], [0x1250, 0x1256], [0x1258, 0x1258], [0x125A, 0x125D], + [0x1260, 0x1288], [0x128A, 0x128D], [0x1290, 0x12B0], [0x12B2, 0x12B5], + [0x12B8, 0x12BE], [0x12C0, 0x12C0], [0x12C2, 0x12C5], [0x12C8, 0x12D6], + [0x12D8, 0x1310], [0x1312, 0x1315], [0x1318, 0x135A], [0x135D, 0x135F], + [0x1369, 0x1371], [0x1380, 0x138F], [0x13A0, 0x13F5], [0x13F8, 0x13FD], + [0x1401, 0x166C], [0x166F, 0x167F], [0x1681, 0x169A], [0x16A0, 0x16EA], + [0x16EE, 0x16F8], [0x1700, 0x1715], [0x171F, 0x1734], [0x1740, 0x1753], + [0x1760, 0x176C], [0x176E, 0x1770], [0x1772, 0x1773], [0x1780, 0x17D3], + [0x17D7, 0x17D7], [0x17DC, 0x17DD], [0x17E0, 0x17E9], [0x180B, 0x180D], + [0x180F, 0x1819], [0x1820, 0x1878], [0x1880, 0x18AA], [0x18B0, 0x18F5], + [0x1900, 0x191E], [0x1920, 0x192B], [0x1930, 0x193B], [0x1946, 0x196D], + [0x1970, 0x1974], [0x1980, 0x19AB], [0x19B0, 0x19C9], [0x19D0, 0x19DA], + [0x1A00, 0x1A1B], [0x1A20, 0x1A5E], [0x1A60, 0x1A7C], [0x1A7F, 0x1A89], + [0x1A90, 0x1A99], [0x1AA7, 0x1AA7], [0x1AB0, 0x1ABD], [0x1ABF, 0x1ACE], + [0x1B00, 0x1B4C], [0x1B50, 0x1B59], [0x1B6B, 0x1B73], [0x1B80, 0x1BF3], + [0x1C00, 0x1C37], [0x1C40, 0x1C49], [0x1C4D, 0x1C7D], [0x1C80, 0x1C88], + [0x1C90, 0x1CBA], [0x1CBD, 0x1CBF], [0x1CD0, 0x1CD2], [0x1CD4, 0x1CFA], + [0x1D00, 0x1EF9], [0x1F00, 0x1F15], [0x1F18, 0x1F1D], [0x1F20, 0x1F45], + [0x1F48, 0x1F4D], [0x1F50, 0x1F57], [0x1F59, 0x1F59], [0x1F5B, 0x1F5B], + [0x1F5D, 0x1F5D], [0x1F5F, 0x1F7D], [0x1F80, 0x1FB4], [0x1FB6, 0x1FBC], + [0x1FBE, 0x1FBE], [0x1FC2, 0x1FC4], [0x1FC6, 0x1FCC], [0x1FD0, 0x1FD3], + [0x1FD6, 0x1FDB], [0x1FE0, 0x1FEC], [0x1FF2, 0x1FF4], [0x1FF6, 0x1FFC], + [0x200B, 0x200D], [0x202A, 0x202E], [0x203F, 0x2040], [0x2054, 0x2054], + [0x2060, 0x2071], [0x207F, 0x207F], [0x2090, 0x209C], [0x20D0, 0x20DC], + [0x20E1, 0x20E1], [0x20E5, 0x20F0], [0x2102, 0x2102], [0x2107, 0x2107], + [0x210A, 0x2113], [0x2115, 0x2115], [0x2118, 0x211D], [0x2124, 0x2124], + [0x2126, 0x2126], [0x2128, 0x2128], [0x212A, 0x2138], [0x213C, 0x213F], + [0x2145, 0x2149], [0x214E, 0x214E], [0x2160, 0x2188], [0x2460, 0x24FF], + [0x2776, 0x2793], [0x2C00, 0x2CE4], [0x2CEB, 0x2CF3], [0x2D00, 0x2D25], + [0x2D27, 0x2D27], [0x2D2D, 0x2D2D], [0x2D30, 0x2D67], [0x2D6F, 0x2D6F], + [0x2D7F, 0x2D96], [0x2DA0, 0x2DA6], [0x2DA8, 0x2DAE], [0x2DB0, 0x2DB6], + [0x2DB8, 0x2DBE], [0x2DC0, 0x2DC6], [0x2DC8, 0x2DCE], [0x2DD0, 0x2DD6], + [0x2DD8, 0x2DDE], [0x2DE0, 0x2DFF], [0x2E80, 0x2FFF], [0x3004, 0x3007], + [0x3021, 0x302F], [0x3031, 0x303C], [0x3041, 0x3096], [0x3099, 0x309F], + [0x30A1, 0x30FC], [0x3105, 0x312F], [0x3131, 0x318E], [0x31A0, 0x31BF], + [0x31F0, 0x31FF], [0x3400, 0x4DBF], [0x4E00, 0xA48C], [0xA4D0, 0xA4FD], + [0xA500, 0xA60C], [0xA610, 0xA62B], [0xA640, 0xA66F], [0xA674, 0xA67D], + [0xA67F, 0xA6F1], [0xA717, 0xA71F], [0xA722, 0xA788], [0xA78B, 0xA7CA], + [0xA7D0, 0xA7D1], [0xA7D3, 0xA7D3], [0xA7D5, 0xA7D9], [0xA7F2, 0xA827], + [0xA82C, 0xA82C], [0xA840, 0xA873], [0xA880, 0xA8C5], [0xA8D0, 0xA8D9], + [0xA8E0, 0xA8F7], [0xA8FB, 0xA8FB], [0xA8FD, 0xA92D], [0xA930, 0xA953], + [0xA960, 0xA97C], [0xA980, 0xA9C0], [0xA9CF, 0xA9D9], [0xA9E0, 0xA9FE], + [0xAA00, 0xAA36], [0xAA40, 0xAA4D], [0xAA50, 0xAA59], [0xAA60, 0xAA76], + [0xAA7A, 0xAAC2], [0xAADB, 0xAADD], [0xAAE0, 0xAAEF], [0xAAF2, 0xAAF6], + [0xAB01, 0xAB06], [0xAB09, 0xAB0E], [0xAB11, 0xAB16], [0xAB20, 0xAB26], + [0xAB28, 0xAB2E], [0xAB30, 0xAB5A], [0xAB5C, 0xAB69], [0xAB70, 0xABEA], + [0xABEC, 0xABED], [0xABF0, 0xABF9], [0xAC00, 0xD7A3], [0xD7B0, 0xD7C6], + [0xD7CB, 0xD7FB], [0xF900, 0xFA6D], [0xFA70, 0xFAD9], [0xFB00, 0xFB06], + [0xFB13, 0xFB17], [0xFB1D, 0xFB28], [0xFB2A, 0xFB36], [0xFB38, 0xFB3C], + [0xFB3E, 0xFB3E], [0xFB40, 0xFB41], [0xFB43, 0xFB44], [0xFB46, 0xFBB1], + [0xFBD3, 0xFC5D], [0xFC64, 0xFD3D], [0xFD40, 0xFD8F], [0xFD92, 0xFDC7], + [0xFDF0, 0xFDF9], [0xFE00, 0xFE0F], [0xFE20, 0xFE2F], [0xFE33, 0xFE34], + [0xFE47, 0xFE4F], [0xFE71, 0xFE71], [0xFE73, 0xFE73], [0xFE77, 0xFE77], + [0xFE79, 0xFE79], [0xFE7B, 0xFE7B], [0xFE7D, 0xFE7D], [0xFE7F, 0xFEFC], + [0xFF10, 0xFF19], [0xFF21, 0xFF3A], [0xFF3F, 0xFF3F], [0xFF41, 0xFF5A], + [0xFF65, 0xFFBE], [0xFFC2, 0xFFC7], [0xFFCA, 0xFFCF], [0xFFD2, 0xFFD7], + [0xFFDA, 0xFFDC], [0x10000, 0x1000B], [0x1000D, 0x10026], [0x10028, 0x1003A], + [0x1003C, 0x1003D], [0x1003F, 0x1004D], [0x10050, 0x1005D], [0x10080, 0x100FA], + [0x10140, 0x10174], [0x101FD, 0x101FD], [0x10280, 0x1029C], [0x102A0, 0x102D0], + [0x102E0, 0x102E0], [0x10300, 0x1031F], [0x1032D, 0x1034A], [0x10350, 0x1037A], + [0x10380, 0x1039D], [0x103A0, 0x103C3], [0x103C8, 0x103CF], [0x103D1, 0x103D5], + [0x10400, 0x1049D], [0x104A0, 0x104A9], [0x104B0, 0x104D3], [0x104D8, 0x104FB], + [0x10500, 0x10527], [0x10530, 0x10563], [0x10570, 0x1057A], [0x1057C, 0x1058A], + [0x1058C, 0x10592], [0x10594, 0x10595], [0x10597, 0x105A1], [0x105A3, 0x105B1], + [0x105B3, 0x105B9], [0x105BB, 0x105BC], [0x10600, 0x10736], [0x10740, 0x10755], + [0x10760, 0x10767], [0x10780, 0x10785], [0x10787, 0x107B0], [0x107B2, 0x107BA], + [0x10800, 0x10805], [0x10808, 0x10808], [0x1080A, 0x10835], [0x10837, 0x10838], + [0x1083C, 0x1083C], [0x1083F, 0x10855], [0x10860, 0x10876], [0x10880, 0x1089E], + [0x108E0, 0x108F2], [0x108F4, 0x108F5], [0x10900, 0x10915], [0x10920, 0x10939], + [0x10980, 0x109B7], [0x109BE, 0x109BF], [0x10A00, 0x10A03], [0x10A05, 0x10A06], + [0x10A0C, 0x10A13], [0x10A15, 0x10A17], [0x10A19, 0x10A35], [0x10A38, 0x10A3A], + [0x10A3F, 0x10A3F], [0x10A60, 0x10A7C], [0x10A80, 0x10A9C], [0x10AC0, 0x10AC7], + [0x10AC9, 0x10AE6], [0x10B00, 0x10B35], [0x10B40, 0x10B55], [0x10B60, 0x10B72], + [0x10B80, 0x10B91], [0x10C00, 0x10C48], [0x10C80, 0x10CB2], [0x10CC0, 0x10CF2], + [0x10D00, 0x10D27], [0x10D30, 0x10D39], [0x10E80, 0x10EA9], [0x10EAB, 0x10EAC], + [0x10EB0, 0x10EB1], [0x10EFD, 0x10F1C], [0x10F27, 0x10F27], [0x10F30, 0x10F50], + [0x10F70, 0x10F85], [0x10FB0, 0x10FC4], [0x10FE0, 0x10FF6], [0x11000, 0x11046], + [0x11066, 0x11075], [0x1107F, 0x110BA], [0x110C2, 0x110C2], [0x110D0, 0x110E8], + [0x110F0, 0x110F9], [0x11100, 0x11134], [0x11136, 0x1113F], [0x11144, 0x11147], + [0x11150, 0x11173], [0x11176, 0x11176], [0x11180, 0x111C4], [0x111C9, 0x111CC], + [0x111CE, 0x111DA], [0x111DC, 0x111DC], [0x11200, 0x11211], [0x11213, 0x11237], + [0x1123E, 0x11241], [0x11280, 0x11286], [0x11288, 0x11288], [0x1128A, 0x1128D], + [0x1128F, 0x1129D], [0x1129F, 0x112A8], [0x112B0, 0x112EA], [0x112F0, 0x112F9], + [0x11300, 0x11303], [0x11305, 0x1130C], [0x1130F, 0x11310], [0x11313, 0x11328], + [0x1132A, 0x11330], [0x11332, 0x11333], [0x11335, 0x11339], [0x1133B, 0x11344], + [0x11347, 0x11348], [0x1134B, 0x1134D], [0x11350, 0x11350], [0x11357, 0x11357], + [0x1135D, 0x11363], [0x11366, 0x1136C], [0x11370, 0x11374], [0x11400, 0x1144A], + [0x11450, 0x11459], [0x1145E, 0x11461], [0x11480, 0x114C5], [0x114C7, 0x114C7], + [0x114D0, 0x114D9], [0x11580, 0x115B5], [0x115B8, 0x115C0], [0x115D8, 0x115DD], + [0x11600, 0x11640], [0x11644, 0x11644], [0x11650, 0x11659], [0x11680, 0x116B8], + [0x116C0, 0x116C9], [0x11700, 0x1171A], [0x1171D, 0x1172B], [0x11730, 0x11739], + [0x11740, 0x11746], [0x11800, 0x1183A], [0x118A0, 0x118E9], [0x118FF, 0x11906], + [0x11909, 0x11909], [0x1190C, 0x11913], [0x11915, 0x11916], [0x11918, 0x11935], + [0x11937, 0x11938], [0x1193B, 0x11943], [0x11950, 0x11959], [0x119A0, 0x119A7], + [0x119AA, 0x119D7], [0x119DA, 0x119E1], [0x119E3, 0x119E4], [0x11A00, 0x11A3E], + [0x11A47, 0x11A47], [0x11A50, 0x11A99], [0x11A9D, 0x11A9D], [0x11AB0, 0x11AF8], + [0x11C00, 0x11C08], [0x11C0A, 0x11C36], [0x11C38, 0x11C40], [0x11C50, 0x11C59], + [0x11C72, 0x11C8F], [0x11C92, 0x11CA7], [0x11CA9, 0x11CB6], [0x11D00, 0x11D06], + [0x11D08, 0x11D09], [0x11D0B, 0x11D36], [0x11D3A, 0x11D3A], [0x11D3C, 0x11D3D], + [0x11D3F, 0x11D47], [0x11D50, 0x11D59], [0x11D60, 0x11D65], [0x11D67, 0x11D68], + [0x11D6A, 0x11D8E], [0x11D90, 0x11D91], [0x11D93, 0x11D98], [0x11DA0, 0x11DA9], + [0x11EE0, 0x11EF6], [0x11F00, 0x11F10], [0x11F12, 0x11F3A], [0x11F3E, 0x11F42], + [0x11F50, 0x11F59], [0x11FB0, 0x11FB0], [0x12000, 0x12399], [0x12400, 0x1246E], + [0x12480, 0x12543], [0x12F90, 0x12FF0], [0x13000, 0x1342F], [0x13440, 0x13455], + [0x14400, 0x14646], [0x16800, 0x16A38], [0x16A40, 0x16A5E], [0x16A60, 0x16A69], + [0x16A70, 0x16ABE], [0x16AC0, 0x16AC9], [0x16AD0, 0x16AED], [0x16AF0, 0x16AF4], + [0x16B00, 0x16B36], [0x16B40, 0x16B43], [0x16B50, 0x16B59], [0x16B63, 0x16B77], + [0x16B7D, 0x16B8F], [0x16E40, 0x16E7F], [0x16F00, 0x16F4A], [0x16F4F, 0x16F87], + [0x16F8F, 0x16F9F], [0x16FE0, 0x16FE1], [0x16FE3, 0x16FE4], [0x16FF0, 0x16FF1], + [0x17000, 0x187F7], [0x18800, 0x18CD5], [0x18D00, 0x18D08], [0x1AFF0, 0x1AFF3], + [0x1AFF5, 0x1AFFB], [0x1AFFD, 0x1AFFE], [0x1B000, 0x1B122], [0x1B132, 0x1B132], + [0x1B150, 0x1B152], [0x1B155, 0x1B155], [0x1B164, 0x1B167], [0x1B170, 0x1B2FB], + [0x1BC00, 0x1BC6A], [0x1BC70, 0x1BC7C], [0x1BC80, 0x1BC88], [0x1BC90, 0x1BC99], + [0x1BC9D, 0x1BC9E], [0x1CF00, 0x1CF2D], [0x1CF30, 0x1CF46], [0x1D165, 0x1D169], + [0x1D16D, 0x1D172], [0x1D17B, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD], + [0x1D242, 0x1D244], [0x1D400, 0x1D454], [0x1D456, 0x1D49C], [0x1D49E, 0x1D49F], + [0x1D4A2, 0x1D4A2], [0x1D4A5, 0x1D4A6], [0x1D4A9, 0x1D4AC], [0x1D4AE, 0x1D4B9], + [0x1D4BB, 0x1D4BB], [0x1D4BD, 0x1D4C3], [0x1D4C5, 0x1D505], [0x1D507, 0x1D50A], + [0x1D50D, 0x1D514], [0x1D516, 0x1D51C], [0x1D51E, 0x1D539], [0x1D53B, 0x1D53E], + [0x1D540, 0x1D544], [0x1D546, 0x1D546], [0x1D54A, 0x1D550], [0x1D552, 0x1D6A5], + [0x1D6A8, 0x1D6C0], [0x1D6C2, 0x1D6DA], [0x1D6DC, 0x1D6FA], [0x1D6FC, 0x1D714], + [0x1D716, 0x1D734], [0x1D736, 0x1D74E], [0x1D750, 0x1D76E], [0x1D770, 0x1D788], + [0x1D78A, 0x1D7A8], [0x1D7AA, 0x1D7C2], [0x1D7C4, 0x1D7CB], [0x1D7CE, 0x1D7FF], + [0x1DA00, 0x1DA36], [0x1DA3B, 0x1DA6C], [0x1DA75, 0x1DA75], [0x1DA84, 0x1DA84], + [0x1DA9B, 0x1DA9F], [0x1DAA1, 0x1DAAF], [0x1DF00, 0x1DF1E], [0x1DF25, 0x1DF2A], + [0x1E000, 0x1E006], [0x1E008, 0x1E018], [0x1E01B, 0x1E021], [0x1E023, 0x1E024], + [0x1E026, 0x1E02A], [0x1E030, 0x1E06D], [0x1E08F, 0x1E08F], [0x1E100, 0x1E12C], + [0x1E130, 0x1E13D], [0x1E140, 0x1E149], [0x1E14E, 0x1E14E], [0x1E290, 0x1E2AE], + [0x1E2C0, 0x1E2F9], [0x1E4D0, 0x1E4F9], [0x1E7E0, 0x1E7E6], [0x1E7E8, 0x1E7EB], + [0x1E7ED, 0x1E7EE], [0x1E7F0, 0x1E7FE], [0x1E800, 0x1E8C4], [0x1E8D0, 0x1E8D6], + [0x1E900, 0x1E94B], [0x1E950, 0x1E959], [0x1EE00, 0x1EE03], [0x1EE05, 0x1EE1F], + [0x1EE21, 0x1EE22], [0x1EE24, 0x1EE24], [0x1EE27, 0x1EE27], [0x1EE29, 0x1EE32], + [0x1EE34, 0x1EE37], [0x1EE39, 0x1EE39], [0x1EE3B, 0x1EE3B], [0x1EE42, 0x1EE42], + [0x1EE47, 0x1EE47], [0x1EE49, 0x1EE49], [0x1EE4B, 0x1EE4B], [0x1EE4D, 0x1EE4F], + [0x1EE51, 0x1EE52], [0x1EE54, 0x1EE54], [0x1EE57, 0x1EE57], [0x1EE59, 0x1EE59], + [0x1EE5B, 0x1EE5B], [0x1EE5D, 0x1EE5D], [0x1EE5F, 0x1EE5F], [0x1EE61, 0x1EE62], + [0x1EE64, 0x1EE64], [0x1EE67, 0x1EE6A], [0x1EE6C, 0x1EE72], [0x1EE74, 0x1EE77], + [0x1EE79, 0x1EE7C], [0x1EE7E, 0x1EE7E], [0x1EE80, 0x1EE89], [0x1EE8B, 0x1EE9B], + [0x1EEA1, 0x1EEA3], [0x1EEA5, 0x1EEA9], [0x1EEAB, 0x1EEBB], [0x1FBF0, 0x1FBF9], + [0x20000, 0x2B739], [0x2B740, 0x2B81D], [0x2B820, 0x2CEA1], [0x2CEB0, 0x2EBE0], + [0x2EBF0, 0x2EE5D], [0x2F800, 0x2FA1D], [0x30000, 0x323AF], [0x40000, 0x4FFFD], + [0x50000, 0x5FFFD], [0x60000, 0x6FFFD], [0x70000, 0x7FFFD], [0x80000, 0x8FFFD], + [0x90000, 0x9FFFD], [0xA0000, 0xAFFFD], [0xB0000, 0xBFFFD], [0xC0000, 0xCFFFD], + [0xD0000, 0xDFFFD], [0xE0000, 0xE01EF] +]; + +/** +Tests [[dchar, index] ... planes * 3] for LeastRestrictive_Continue +*/ +enum uint[2][] LeastRestrictive_Continue_Test = [ + [0x0000A8, 0], + [0x000F39, 240], + [0x00FFDB, 480], + [0x010005, 481], + [0x011CAF, 646], + [0x01FBF4, 811], + [0x025B9C, 812], + [0x02DD48, 815], + [0x02F90E, 817], + [0x0311D7, 818], + [0x047FFE, 819], + [0x057FFE, 820], + [0x067FFE, 821], + [0x077FFE, 822], + [0x087FFE, 823], + [0x097FFE, 824], + [0x0A7FFE, 825], + [0x0B7FFE, 826], + [0x0C7FFE, 827], + [0x0D7FFE, 828], + [0x0E00F7, 829], +]; + +/** +Is not normalized table, used for quick check algorithm. +Has Maybe entries merged into No. +Entries: 1231 +*/ +static immutable dchar[2][] IsCharacterNotNormalized = [ + [0x300, 0x304], [0x306, 0x30C], [0x30F, 0x30F], [0x311, 0x311], + [0x313, 0x314], [0x31B, 0x31B], [0x323, 0x328], [0x32D, 0x32E], + [0x330, 0x331], [0x338, 0x338], [0x340, 0x345], [0x374, 0x374], + [0x37E, 0x37E], [0x387, 0x387], [0x653, 0x655], [0x93C, 0x93C], + [0x958, 0x95F], [0x9BE, 0x9BE], [0x9D7, 0x9D7], [0x9DC, 0x9DD], + [0x9DF, 0x9DF], [0xA33, 0xA33], [0xA36, 0xA36], [0xA59, 0xA5B], + [0xA5E, 0xA5E], [0xB3E, 0xB3E], [0xB56, 0xB57], [0xB5C, 0xB5D], + [0xBBE, 0xBBE], [0xBD7, 0xBD7], [0xC56, 0xC56], [0xCC2, 0xCC2], + [0xCD5, 0xCD6], [0xD3E, 0xD3E], [0xD57, 0xD57], [0xDCA, 0xDCA], + [0xDCF, 0xDCF], [0xDDF, 0xDDF], [0xF43, 0xF43], [0xF4D, 0xF4D], + [0xF52, 0xF52], [0xF57, 0xF57], [0xF5C, 0xF5C], [0xF69, 0xF69], + [0xF73, 0xF73], [0xF75, 0xF76], [0xF78, 0xF78], [0xF81, 0xF81], + [0xF93, 0xF93], [0xF9D, 0xF9D], [0xFA2, 0xFA2], [0xFA7, 0xFA7], + [0xFAC, 0xFAC], [0xFB9, 0xFB9], [0x102E, 0x102E], [0x1161, 0x1175], + [0x11A8, 0x11C2], [0x1B35, 0x1B35], [0x1F71, 0x1F71], [0x1F73, 0x1F73], + [0x1F75, 0x1F75], [0x1F77, 0x1F77], [0x1F79, 0x1F79], [0x1F7B, 0x1F7B], + [0x1F7D, 0x1F7D], [0x1FBB, 0x1FBB], [0x1FBE, 0x1FBE], [0x1FC9, 0x1FC9], + [0x1FCB, 0x1FCB], [0x1FD3, 0x1FD3], [0x1FDB, 0x1FDB], [0x1FE3, 0x1FE3], + [0x1FEB, 0x1FEB], [0x1FEE, 0x1FEF], [0x1FF9, 0x1FF9], [0x1FFB, 0x1FFB], + [0x1FFD, 0x1FFD], [0x2000, 0x2001], [0x2126, 0x2126], [0x212A, 0x212B], + [0x2329, 0x232A], [0x2ADC, 0x2ADC], [0x3099, 0x309A], [0xF900, 0xFA0D], + [0xFA10, 0xFA10], [0xFA12, 0xFA12], [0xFA15, 0xFA1E], [0xFA20, 0xFA20], + [0xFA22, 0xFA22], [0xFA25, 0xFA26], [0xFA2A, 0xFA6D], [0xFA70, 0xFAD9], + [0xFB1D, 0xFB1D], [0xFB1F, 0xFB1F], [0xFB2A, 0xFB36], [0xFB38, 0xFB3C], + [0xFB3E, 0xFB3E], [0xFB40, 0xFB41], [0xFB43, 0xFB44], [0xFB46, 0xFB4E], + [0x110BA, 0x110BA], [0x11127, 0x11127], [0x1133E, 0x1133E], [0x11357, 0x11357], + [0x114B0, 0x114B0], [0x114BA, 0x114BA], [0x114BD, 0x114BD], [0x115AF, 0x115AF], + [0x11930, 0x11930], [0x1D15E, 0x1D164], [0x1D1BB, 0x1D1C0], [0x2F800, 0x2FA1D], +]; + +/** +Tests [[dchar, index] ... planes * 3] for IsCharacterNotNormalized +*/ +enum uint[2][] IsCharacterNotNormalized_Test = [ + [0x000302, 0], + [0x000FA2, 50], + [0x00FB4A, 99], + [0x0110BA, 100], + [0x0114BA, 105], + [0x01D1BD, 110], + [0x02F90E, 111], +]; + +/** +The index table of CCC value for a character. +Entries: 333631 +*/ +static immutable dchar[2][] IndexTableForCCC = [ + [0x0, 0x2FF], [0x300, 0x314], [0x315, 0x315], [0x316, 0x319], + [0x31A, 0x31A], [0x31B, 0x31B], [0x31C, 0x320], [0x321, 0x322], + [0x323, 0x326], [0x327, 0x328], [0x329, 0x333], [0x334, 0x338], + [0x339, 0x33C], [0x33D, 0x344], [0x345, 0x345], [0x346, 0x346], + [0x347, 0x349], [0x34A, 0x34C], [0x34D, 0x34E], [0x34F, 0x34F], + [0x350, 0x352], [0x353, 0x356], [0x357, 0x357], [0x358, 0x358], + [0x359, 0x35A], [0x35B, 0x35B], [0x35C, 0x35C], [0x35D, 0x35E], + [0x35F, 0x35F], [0x360, 0x361], [0x362, 0x362], [0x363, 0x36F], + [0x370, 0x482], [0x483, 0x487], [0x488, 0x58F], [0x591, 0x591], + [0x592, 0x595], [0x596, 0x596], [0x597, 0x599], [0x59A, 0x59A], + [0x59B, 0x59B], [0x59C, 0x5A1], [0x5A2, 0x5A7], [0x5A8, 0x5A9], + [0x5AA, 0x5AA], [0x5AB, 0x5AC], [0x5AD, 0x5AD], [0x5AE, 0x5AE], + [0x5AF, 0x5AF], [0x5B0, 0x5B0], [0x5B1, 0x5B1], [0x5B2, 0x5B2], + [0x5B3, 0x5B3], [0x5B4, 0x5B4], [0x5B5, 0x5B5], [0x5B6, 0x5B6], + [0x5B7, 0x5B7], [0x5B8, 0x5B8], [0x5B9, 0x5BA], [0x5BB, 0x5BB], + [0x5BC, 0x5BC], [0x5BD, 0x5BD], [0x5BE, 0x5BE], [0x5BF, 0x5BF], + [0x5C0, 0x5C0], [0x5C1, 0x5C1], [0x5C2, 0x5C2], [0x5C3, 0x5C3], + [0x5C4, 0x5C4], [0x5C5, 0x5C5], [0x5C6, 0x5C6], [0x5C7, 0x5C7], + [0x5D0, 0x60F], [0x610, 0x617], [0x618, 0x618], [0x619, 0x619], + [0x61A, 0x61A], [0x61B, 0x64A], [0x64B, 0x64B], [0x64C, 0x64C], + [0x64D, 0x64D], [0x64E, 0x64E], [0x64F, 0x64F], [0x650, 0x650], + [0x651, 0x651], [0x652, 0x652], [0x653, 0x654], [0x655, 0x656], + [0x657, 0x65B], [0x65C, 0x65C], [0x65D, 0x65E], [0x65F, 0x65F], + [0x660, 0x66F], [0x670, 0x670], [0x671, 0x6D5], [0x6D6, 0x6DC], + [0x6DD, 0x6DE], [0x6DF, 0x6E2], [0x6E3, 0x6E3], [0x6E4, 0x6E4], + [0x6E5, 0x6E6], [0x6E7, 0x6E8], [0x6E9, 0x6E9], [0x6EA, 0x6EA], + [0x6EB, 0x6EC], [0x6ED, 0x6ED], [0x6EE, 0x710], [0x711, 0x711], + [0x712, 0x72F], [0x730, 0x730], [0x731, 0x731], [0x732, 0x733], + [0x734, 0x734], [0x735, 0x736], [0x737, 0x739], [0x73A, 0x73A], + [0x73B, 0x73C], [0x73D, 0x73D], [0x73E, 0x73E], [0x73F, 0x741], + [0x742, 0x742], [0x743, 0x743], [0x744, 0x744], [0x745, 0x745], + [0x746, 0x746], [0x747, 0x747], [0x748, 0x748], [0x749, 0x74A], + [0x74D, 0x7EA], [0x7EB, 0x7F1], [0x7F2, 0x7F2], [0x7F3, 0x7F3], + [0x7F4, 0x7FA], [0x7FD, 0x7FD], [0x7FE, 0x815], [0x816, 0x819], + [0x81A, 0x81A], [0x81B, 0x823], [0x824, 0x824], [0x825, 0x827], + [0x828, 0x828], [0x829, 0x82D], [0x830, 0x858], [0x859, 0x85B], + [0x85E, 0x891], [0x898, 0x898], [0x899, 0x89B], [0x89C, 0x89F], + [0x8A0, 0x8C9], [0x8CA, 0x8CE], [0x8CF, 0x8D3], [0x8D4, 0x8E1], + [0x8E2, 0x8E2], [0x8E3, 0x8E3], [0x8E4, 0x8E5], [0x8E6, 0x8E6], + [0x8E7, 0x8E8], [0x8E9, 0x8E9], [0x8EA, 0x8EC], [0x8ED, 0x8EF], + [0x8F0, 0x8F0], [0x8F1, 0x8F1], [0x8F2, 0x8F2], [0x8F3, 0x8F5], + [0x8F6, 0x8F6], [0x8F7, 0x8F8], [0x8F9, 0x8FA], [0x8FB, 0x8FF], + [0x900, 0x93B], [0x93C, 0x93C], [0x93D, 0x94C], [0x94D, 0x94D], + [0x94E, 0x950], [0x951, 0x951], [0x952, 0x952], [0x953, 0x954], + [0x955, 0x9B9], [0x9BC, 0x9BC], [0x9BD, 0x9CC], [0x9CD, 0x9CD], + [0x9CE, 0x9FD], [0x9FE, 0x9FE], [0xA01, 0xA39], [0xA3C, 0xA3C], + [0xA3E, 0xA4C], [0xA4D, 0xA4D], [0xA51, 0xAB9], [0xABC, 0xABC], + [0xABD, 0xACC], [0xACD, 0xACD], [0xAD0, 0xB39], [0xB3C, 0xB3C], + [0xB3D, 0xB4C], [0xB4D, 0xB4D], [0xB55, 0xBCC], [0xBCD, 0xBCD], + [0xBD0, 0xC39], [0xC3C, 0xC3C], [0xC3D, 0xC4C], [0xC4D, 0xC4D], + [0xC55, 0xC55], [0xC56, 0xC56], [0xC58, 0xCB9], [0xCBC, 0xCBC], + [0xCBD, 0xCCC], [0xCCD, 0xCCD], [0xCD5, 0xD3A], [0xD3B, 0xD3C], + [0xD3D, 0xD4C], [0xD4D, 0xD4D], [0xD4E, 0xDC6], [0xDCA, 0xDCA], + [0xDCF, 0xE37], [0xE38, 0xE39], [0xE3A, 0xE3A], [0xE3F, 0xE47], + [0xE48, 0xE4B], [0xE4C, 0xEB7], [0xEB8, 0xEB9], [0xEBA, 0xEBA], + [0xEBB, 0xEC6], [0xEC8, 0xECB], [0xECC, 0xF17], [0xF18, 0xF19], + [0xF1A, 0xF34], [0xF35, 0xF35], [0xF36, 0xF36], [0xF37, 0xF37], + [0xF38, 0xF38], [0xF39, 0xF39], [0xF3A, 0xF6C], [0xF71, 0xF71], + [0xF72, 0xF72], [0xF73, 0xF73], [0xF74, 0xF74], [0xF75, 0xF79], + [0xF7A, 0xF7D], [0xF7E, 0xF7F], [0xF80, 0xF80], [0xF81, 0xF81], + [0xF82, 0xF83], [0xF84, 0xF84], [0xF85, 0xF85], [0xF86, 0xF87], + [0xF88, 0xFC5], [0xFC6, 0xFC6], [0xFC7, 0x1036], [0x1037, 0x1037], + [0x1038, 0x1038], [0x1039, 0x103A], [0x103B, 0x108C], [0x108D, 0x108D], + [0x108E, 0x135A], [0x135D, 0x135F], [0x1360, 0x1713], [0x1714, 0x1715], + [0x171F, 0x1733], [0x1734, 0x1734], [0x1735, 0x17D1], [0x17D2, 0x17D2], + [0x17D3, 0x17DC], [0x17DD, 0x17DD], [0x17E0, 0x18A8], [0x18A9, 0x18A9], + [0x18AA, 0x1938], [0x1939, 0x1939], [0x193A, 0x193A], [0x193B, 0x193B], + [0x1940, 0x1A16], [0x1A17, 0x1A17], [0x1A18, 0x1A18], [0x1A19, 0x1A5E], + [0x1A60, 0x1A60], [0x1A61, 0x1A74], [0x1A75, 0x1A7C], [0x1A7F, 0x1A7F], + [0x1A80, 0x1AAD], [0x1AB0, 0x1AB4], [0x1AB5, 0x1ABA], [0x1ABB, 0x1ABC], + [0x1ABD, 0x1ABD], [0x1ABE, 0x1ABE], [0x1ABF, 0x1AC0], [0x1AC1, 0x1AC2], + [0x1AC3, 0x1AC4], [0x1AC5, 0x1AC9], [0x1ACA, 0x1ACA], [0x1ACB, 0x1ACE], + [0x1B00, 0x1B33], [0x1B34, 0x1B34], [0x1B35, 0x1B43], [0x1B44, 0x1B44], + [0x1B45, 0x1B6A], [0x1B6B, 0x1B6B], [0x1B6C, 0x1B6C], [0x1B6D, 0x1B73], + [0x1B74, 0x1BA9], [0x1BAA, 0x1BAB], [0x1BAC, 0x1BE5], [0x1BE6, 0x1BE6], + [0x1BE7, 0x1BF1], [0x1BF2, 0x1BF3], [0x1BFC, 0x1C36], [0x1C37, 0x1C37], + [0x1C3B, 0x1CC7], [0x1CD0, 0x1CD2], [0x1CD3, 0x1CD3], [0x1CD4, 0x1CD4], + [0x1CD5, 0x1CD9], [0x1CDA, 0x1CDB], [0x1CDC, 0x1CDF], [0x1CE0, 0x1CE0], + [0x1CE1, 0x1CE1], [0x1CE2, 0x1CE8], [0x1CE9, 0x1CEC], [0x1CED, 0x1CED], + [0x1CEE, 0x1CF3], [0x1CF4, 0x1CF4], [0x1CF5, 0x1CF7], [0x1CF8, 0x1CF9], + [0x1CFA, 0x1DBF], [0x1DC0, 0x1DC1], [0x1DC2, 0x1DC2], [0x1DC3, 0x1DC9], + [0x1DCA, 0x1DCA], [0x1DCB, 0x1DCC], [0x1DCD, 0x1DCD], [0x1DCE, 0x1DCE], + [0x1DCF, 0x1DCF], [0x1DD0, 0x1DD0], [0x1DD1, 0x1DF5], [0x1DF6, 0x1DF6], + [0x1DF7, 0x1DF8], [0x1DF9, 0x1DF9], [0x1DFA, 0x1DFA], [0x1DFB, 0x1DFB], + [0x1DFC, 0x1DFC], [0x1DFD, 0x1DFD], [0x1DFE, 0x1DFE], [0x1DFF, 0x1DFF], + [0x1E00, 0x20C0], [0x20D0, 0x20D1], [0x20D2, 0x20D3], [0x20D4, 0x20D7], + [0x20D8, 0x20DA], [0x20DB, 0x20DC], [0x20DD, 0x20E0], [0x20E1, 0x20E1], + [0x20E2, 0x20E4], [0x20E5, 0x20E6], [0x20E7, 0x20E7], [0x20E8, 0x20E8], + [0x20E9, 0x20E9], [0x20EA, 0x20EB], [0x20EC, 0x20EF], [0x20F0, 0x20F0], + [0x2100, 0x2CEE], [0x2CEF, 0x2CF1], [0x2CF2, 0x2D70], [0x2D7F, 0x2D7F], + [0x2D80, 0x2DDE], [0x2DE0, 0x2DFF], [0x2E00, 0x3029], [0x302A, 0x302A], + [0x302B, 0x302B], [0x302C, 0x302C], [0x302D, 0x302D], [0x302E, 0x302F], + [0x3030, 0x3096], [0x3099, 0x309A], [0x309B, 0xA66E], [0xA66F, 0xA66F], + [0xA670, 0xA673], [0xA674, 0xA67D], [0xA67E, 0xA69D], [0xA69E, 0xA69F], + [0xA6A0, 0xA6EF], [0xA6F0, 0xA6F1], [0xA6F2, 0xA805], [0xA806, 0xA806], + [0xA807, 0xA82B], [0xA82C, 0xA82C], [0xA830, 0xA8C3], [0xA8C4, 0xA8C4], + [0xA8C5, 0xA8D9], [0xA8E0, 0xA8F1], [0xA8F2, 0xA92A], [0xA92B, 0xA92D], + [0xA92E, 0xA952], [0xA953, 0xA953], [0xA95F, 0xA9B2], [0xA9B3, 0xA9B3], + [0xA9B4, 0xA9BF], [0xA9C0, 0xA9C0], [0xA9C1, 0xAAAF], [0xAAB0, 0xAAB0], + [0xAAB1, 0xAAB1], [0xAAB2, 0xAAB3], [0xAAB4, 0xAAB4], [0xAAB5, 0xAAB6], + [0xAAB7, 0xAAB8], [0xAAB9, 0xAABD], [0xAABE, 0xAABF], [0xAAC0, 0xAAC0], + [0xAAC1, 0xAAC1], [0xAAC2, 0xAAF5], [0xAAF6, 0xAAF6], [0xAB01, 0xABEC], + [0xABED, 0xABED], [0xABF0, 0xFB1D], [0xFB1E, 0xFB1E], [0xFB1F, 0xFE19], + [0xFE20, 0xFE26], [0xFE27, 0xFE2D], [0xFE2E, 0xFE2F], [0xFE30, 0xFFFD], + [0x10000, 0x101FC], [0x101FD, 0x101FD], [0x10280, 0x102D0], [0x102E0, 0x102E0], + [0x102E1, 0x10375], [0x10376, 0x1037A], [0x10380, 0x10A0C], [0x10A0D, 0x10A0D], + [0x10A0E, 0x10A0E], [0x10A0F, 0x10A0F], [0x10A10, 0x10A35], [0x10A38, 0x10A38], + [0x10A39, 0x10A39], [0x10A3A, 0x10A3A], [0x10A3F, 0x10A3F], [0x10A40, 0x10AE4], + [0x10AE5, 0x10AE5], [0x10AE6, 0x10AE6], [0x10AEB, 0x10D23], [0x10D24, 0x10D27], + [0x10D30, 0x10EA9], [0x10EAB, 0x10EAC], [0x10EAD, 0x10EB1], [0x10EFD, 0x10EFF], + [0x10F00, 0x10F45], [0x10F46, 0x10F47], [0x10F48, 0x10F4A], [0x10F4B, 0x10F4B], + [0x10F4C, 0x10F4C], [0x10F4D, 0x10F50], [0x10F51, 0x10F81], [0x10F82, 0x10F82], + [0x10F83, 0x10F83], [0x10F84, 0x10F84], [0x10F85, 0x10F85], [0x10F86, 0x11045], + [0x11046, 0x11046], [0x11047, 0x1106F], [0x11070, 0x11070], [0x11071, 0x11075], + [0x1107F, 0x1107F], [0x11080, 0x110B8], [0x110B9, 0x110B9], [0x110BA, 0x110BA], + [0x110BB, 0x110F9], [0x11100, 0x11102], [0x11103, 0x11132], [0x11133, 0x11134], + [0x11136, 0x11172], [0x11173, 0x11173], [0x11174, 0x111BF], [0x111C0, 0x111C0], + [0x111C1, 0x111C9], [0x111CA, 0x111CA], [0x111CB, 0x11234], [0x11235, 0x11235], + [0x11236, 0x11236], [0x11237, 0x112E8], [0x112E9, 0x112E9], [0x112EA, 0x112EA], + [0x112F0, 0x11339], [0x1133B, 0x1133C], [0x1133D, 0x1134C], [0x1134D, 0x1134D], + [0x11350, 0x11363], [0x11366, 0x1136C], [0x11370, 0x11374], [0x11400, 0x11441], + [0x11442, 0x11442], [0x11443, 0x11445], [0x11446, 0x11446], [0x11447, 0x1145D], + [0x1145E, 0x1145E], [0x1145F, 0x114C1], [0x114C2, 0x114C2], [0x114C3, 0x114C3], + [0x114C4, 0x115BE], [0x115BF, 0x115BF], [0x115C0, 0x115C0], [0x115C1, 0x1163E], + [0x1163F, 0x1163F], [0x11640, 0x116B5], [0x116B6, 0x116B6], [0x116B7, 0x116B7], + [0x116B8, 0x1172A], [0x1172B, 0x1172B], [0x11730, 0x11838], [0x11839, 0x11839], + [0x1183A, 0x1183A], [0x1183B, 0x1193C], [0x1193D, 0x1193E], [0x1193F, 0x11942], + [0x11943, 0x11943], [0x11944, 0x119DF], [0x119E0, 0x119E0], [0x119E1, 0x11A33], + [0x11A34, 0x11A34], [0x11A35, 0x11A46], [0x11A47, 0x11A47], [0x11A50, 0x11A98], + [0x11A99, 0x11A99], [0x11A9A, 0x11C3E], [0x11C3F, 0x11C3F], [0x11C40, 0x11D41], + [0x11D42, 0x11D42], [0x11D43, 0x11D43], [0x11D44, 0x11D45], [0x11D46, 0x11D96], + [0x11D97, 0x11D97], [0x11D98, 0x11F40], [0x11F41, 0x11F42], [0x11F43, 0x16AED], + [0x16AF0, 0x16AF4], [0x16AF5, 0x16B2F], [0x16B30, 0x16B36], [0x16B37, 0x16FE4], + [0x16FF0, 0x16FF1], [0x17000, 0x1BC9D], [0x1BC9E, 0x1BC9E], [0x1BC9F, 0x1D164], + [0x1D165, 0x1D166], [0x1D167, 0x1D169], [0x1D16A, 0x1D16C], [0x1D16D, 0x1D16D], + [0x1D16E, 0x1D172], [0x1D173, 0x1D17A], [0x1D17B, 0x1D182], [0x1D183, 0x1D184], + [0x1D185, 0x1D189], [0x1D18A, 0x1D18B], [0x1D18C, 0x1D1A9], [0x1D1AA, 0x1D1AD], + [0x1D1AE, 0x1D241], [0x1D242, 0x1D244], [0x1D245, 0x1DF2A], [0x1E000, 0x1E006], + [0x1E008, 0x1E018], [0x1E01B, 0x1E021], [0x1E023, 0x1E024], [0x1E026, 0x1E02A], + [0x1E030, 0x1E06D], [0x1E08F, 0x1E08F], [0x1E100, 0x1E12C], [0x1E130, 0x1E136], + [0x1E137, 0x1E2AD], [0x1E2AE, 0x1E2AE], [0x1E2C0, 0x1E2EB], [0x1E2EC, 0x1E2EF], + [0x1E2F0, 0x1E4EB], [0x1E4EC, 0x1E4ED], [0x1E4EE, 0x1E4EE], [0x1E4EF, 0x1E4EF], + [0x1E4F0, 0x1E8CF], [0x1E8D0, 0x1E8D6], [0x1E900, 0x1E943], [0x1E944, 0x1E949], + [0x1E94A, 0x1E94A], [0x1E94B, 0x1FBF9], [0x20000, 0x2FA1D], [0x30000, 0x323AF], + [0xE0001, 0xE01EF], [0xF0000, 0xFFFFD], [0x100000, 0x10FFFD] +]; + +/** +Tests [[dchar, index] ... planes * 3] for IndexTableForCCC +*/ +enum uint[2][] IndexTableForCCC_Test = [ + [0x00017F, 0], + [0x000D44, 208], + [0x00FF16, 415], + [0x0100FE, 416], + [0x0115FF, 495], + [0x01F2A2, 573], + [0x027D0E, 574], + [0x0311D7, 575], + [0x0E00F8, 576], + [0x0F7FFE, 577], + [0x107FFE, 578], +]; + +/// CCC Value table +static immutable ubyte[] ValueTableForCCC = [ + 0, 230, 232, 220, 232, 216, 220, 202, + 220, 202, 220, 1, 220, 230, 240, 230, + 220, 230, 220, 0, 230, 220, 230, 232, + 220, 230, 233, 234, 233, 234, 233, 230, + 0, 230, 0, 220, 230, 220, 230, 222, + 220, 230, 220, 230, 220, 230, 222, 228, + 230, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 0, 23, + 0, 24, 25, 0, 230, 220, 0, 18, + 0, 230, 30, 31, 32, 0, 27, 28, + 29, 30, 31, 32, 33, 34, 230, 220, + 230, 220, 230, 220, 0, 35, 0, 230, + 0, 230, 220, 230, 0, 230, 0, 220, + 230, 220, 0, 36, 0, 230, 220, 230, + 220, 230, 220, 230, 220, 230, 220, 230, + 220, 230, 220, 230, 220, 230, 220, 230, + 0, 230, 220, 230, 0, 220, 0, 230, + 0, 230, 0, 230, 0, 230, 0, 220, + 0, 230, 220, 230, 0, 230, 220, 230, + 0, 220, 230, 220, 230, 220, 230, 220, + 27, 28, 29, 230, 220, 230, 220, 230, + 0, 7, 0, 9, 0, 230, 220, 230, + 0, 7, 0, 9, 0, 230, 0, 7, + 0, 9, 0, 7, 0, 9, 0, 7, + 0, 9, 0, 9, 0, 7, 0, 9, + 84, 91, 0, 7, 0, 9, 0, 9, + 0, 9, 0, 9, 0, 103, 9, 0, + 107, 0, 118, 9, 0, 122, 0, 220, + 0, 220, 0, 220, 0, 216, 0, 129, + 130, 0, 132, 0, 130, 0, 130, 0, + 230, 9, 0, 230, 0, 220, 0, 7, + 0, 9, 0, 220, 0, 230, 0, 9, + 0, 9, 0, 9, 0, 230, 0, 228, + 0, 222, 230, 220, 0, 230, 220, 0, + 9, 0, 230, 220, 0, 230, 220, 230, + 220, 0, 220, 230, 220, 230, 220, 230, + 0, 7, 0, 9, 0, 230, 220, 230, + 0, 9, 0, 7, 0, 9, 0, 7, + 0, 230, 0, 1, 220, 230, 220, 230, + 0, 1, 0, 220, 0, 230, 0, 230, + 0, 230, 220, 230, 220, 230, 234, 214, + 220, 202, 230, 232, 228, 220, 218, 230, + 233, 220, 230, 220, 0, 230, 1, 230, + 1, 230, 0, 230, 0, 1, 230, 220, + 230, 1, 220, 230, 0, 230, 0, 9, + 0, 230, 0, 218, 228, 232, 222, 224, + 0, 8, 0, 230, 0, 230, 0, 230, + 0, 230, 0, 9, 0, 9, 0, 9, + 0, 230, 0, 220, 0, 9, 0, 7, + 0, 9, 0, 230, 0, 230, 220, 0, + 230, 0, 230, 0, 230, 0, 9, 0, + 9, 0, 26, 0, 230, 220, 230, 0, + 0, 220, 0, 220, 0, 230, 0, 220, + 0, 230, 0, 230, 1, 220, 9, 0, + 230, 220, 0, 230, 0, 230, 0, 220, + 0, 220, 230, 220, 230, 220, 0, 230, + 220, 230, 220, 0, 9, 0, 9, 0, + 9, 0, 9, 7, 0, 230, 0, 9, + 0, 7, 0, 9, 0, 7, 0, 9, + 7, 0, 7, 9, 0, 7, 0, 9, + 0, 230, 230, 0, 9, 0, 7, 0, + 230, 0, 9, 7, 0, 9, 7, 0, + 9, 0, 9, 7, 0, 9, 0, 9, + 7, 0, 9, 0, 7, 0, 9, 0, + 9, 0, 9, 0, 9, 0, 9, 0, + 7, 0, 9, 0, 9, 0, 9, 0, + 1, 0, 230, 0, 6, 0, 1, 0, + 216, 1, 0, 226, 216, 0, 220, 0, + 230, 220, 0, 230, 0, 230, 0, 230, + 230, 230, 230, 230, 0, 230, 0, 230, + 0, 230, 0, 230, 0, 232, 220, 230, + 0, 220, 0, 230, 7, 0, 0, 0, + 0, 0, 0 ]; diff --git a/compiler/src/dmd/cparse.d b/compiler/src/dmd/cparse.d index a7e1ecf96079..8ae935aa30ab 100644 --- a/compiler/src/dmd/cparse.d +++ b/compiler/src/dmd/cparse.d @@ -89,6 +89,10 @@ final class CParser(AST) : Parser!AST this.wchar_tsize = target.wchar_tsize; // C `char` is always unsigned in ImportC + + // We know that we are parsing out C, due the parent not knowing this, we have to setup tables here. + charLookup = this.compileEnv.cCharLookupTable; + normalizationStrategy = this.compileEnv.cNormalization; } /******************************************** diff --git a/compiler/src/dmd/frontend.h b/compiler/src/dmd/frontend.h index 558948d71498..e0a057471ce0 100644 --- a/compiler/src/dmd/frontend.h +++ b/compiler/src/dmd/frontend.h @@ -331,6 +331,7 @@ class GccAsmStatement; class ImportStatement; struct Token; struct Param; +struct UnicodeQuickCheckState; class FileManager; class Object; class TypeInfo_Class; @@ -6129,6 +6130,13 @@ enum class CLIIdentifierTable : uint8_t All = 4u, }; +enum class CLIIdentifierNormalization : uint8_t +{ + default_ = 0u, + SilentlyAccept = 1u, + Warning = 2u, +}; + enum class JsonFieldFlags : uint32_t { none = 0u, @@ -6150,6 +6158,8 @@ struct CompileEnv final bool masm; IdentifierCharLookup cCharLookupTable; IdentifierCharLookup dCharLookupTable; + NormalizationStrategy cNormalization; + NormalizationStrategy dNormalization; CompileEnv() : versionNumber(), date(), @@ -6163,7 +6173,7 @@ struct CompileEnv final dCharLookupTable() { } - CompileEnv(uint32_t versionNumber, _d_dynamicArray< const char > date = {}, _d_dynamicArray< const char > time = {}, _d_dynamicArray< const char > vendor = {}, _d_dynamicArray< const char > timestamp = {}, bool previewIn = false, bool ddocOutput = false, bool masm = false, IdentifierCharLookup cCharLookupTable = IdentifierCharLookup(), IdentifierCharLookup dCharLookupTable = IdentifierCharLookup()) : + CompileEnv(uint32_t versionNumber, _d_dynamicArray< const char > date = {}, _d_dynamicArray< const char > time = {}, _d_dynamicArray< const char > vendor = {}, _d_dynamicArray< const char > timestamp = {}, bool previewIn = false, bool ddocOutput = false, bool masm = false, IdentifierCharLookup cCharLookupTable = IdentifierCharLookup(), IdentifierCharLookup dCharLookupTable = IdentifierCharLookup(), NormalizationStrategy cNormalization = (NormalizationStrategy)0, NormalizationStrategy dNormalization = (NormalizationStrategy)0) : versionNumber(versionNumber), date(date), time(time), @@ -6173,7 +6183,9 @@ struct CompileEnv final ddocOutput(ddocOutput), masm(masm), cCharLookupTable(cCharLookupTable), - dCharLookupTable(dCharLookupTable) + dCharLookupTable(dCharLookupTable), + cNormalization(cNormalization), + dNormalization(dNormalization) {} }; @@ -7832,19 +7844,42 @@ enum class IdentifierTable struct IdentifierCharLookup final { bool(*isStart)(char32_t ); - bool(*isContinue)(char32_t ); + bool(*isContinue)(char32_t , UnicodeQuickCheckState& ); static IdentifierCharLookup forTable(IdentifierTable table); IdentifierCharLookup() : isStart(), isContinue() { } - IdentifierCharLookup(bool(*isStart)(char32_t ), bool(*isContinue)(char32_t ) = nullptr) : + IdentifierCharLookup(bool(*isStart)(char32_t ), bool(*isContinue)(char32_t , UnicodeQuickCheckState& ) = nullptr) : isStart(isStart), isContinue(isContinue) {} }; +enum class NormalizationStrategy +{ + SilentlyAccept = 0, + Normalize = 1, + Deprecate = 2, + Warning = 3, +}; + +struct UnicodeQuickCheckState final +{ + uint8_t lastCCC; + bool isNormalized; + UnicodeQuickCheckState() : + lastCCC(), + isNormalized(true) + { + } + UnicodeQuickCheckState(uint8_t lastCCC, bool isNormalized = true) : + lastCCC(lastCCC), + isNormalized(isNormalized) + {} +}; + extern bool isAnyIdentifierCharacter(char32_t c); extern bool isAnyStart(char32_t c); @@ -8082,6 +8117,8 @@ struct Param final CHECKACTION checkAction; CLIIdentifierTable dIdentifierTable; CLIIdentifierTable cIdentifierTable; + CLIIdentifierNormalization dNormalization; + CLIIdentifierNormalization cNormalization; _d_dynamicArray< const char > argv0; Array modFileAliasStrings; Array imppath; @@ -8159,6 +8196,8 @@ struct Param final checkAction((CHECKACTION)0u), dIdentifierTable((CLIIdentifierTable)0u), cIdentifierTable((CLIIdentifierTable)0u), + dNormalization((CLIIdentifierNormalization)0u), + cNormalization((CLIIdentifierNormalization)0u), argv0(), modFileAliasStrings(), imppath(), @@ -8190,7 +8229,7 @@ struct Param final mapfile() { } - Param(bool obj, bool multiobj = false, bool trace = false, bool tracegc = false, bool vcg_ast = false, DiagnosticReporting useDeprecated = (DiagnosticReporting)1u, bool useUnitTests = false, bool useInline = false, bool release = false, bool preservePaths = false, DiagnosticReporting warnings = (DiagnosticReporting)2u, bool cov = false, uint8_t covPercent = 0u, bool ctfe_cov = false, bool ignoreUnsupportedPragmas = true, bool useModuleInfo = true, bool useTypeInfo = true, bool useExceptions = true, bool useGC = true, bool betterC = false, bool addMain = false, bool allInst = false, bool bitfields = false, CppStdRevision cplusplus = (CppStdRevision)201103u, Help help = Help(), Verbose v = Verbose(), FeatureState useDIP25 = (FeatureState)2u, FeatureState useDIP1000 = (FeatureState)0u, bool ehnogc = false, bool useDIP1021 = false, FeatureState fieldwise = (FeatureState)0u, bool fixAliasThis = false, FeatureState rvalueRefParam = (FeatureState)0u, FeatureState noSharedAccess = (FeatureState)0u, bool previewIn = false, bool inclusiveInContracts = false, bool shortenedMethods = true, bool fixImmutableConv = false, bool fix16997 = true, FeatureState dtorFields = (FeatureState)0u, FeatureState systemVariables = (FeatureState)0u, CHECKENABLE useInvariants = (CHECKENABLE)0u, CHECKENABLE useIn = (CHECKENABLE)0u, CHECKENABLE useOut = (CHECKENABLE)0u, CHECKENABLE useArrayBounds = (CHECKENABLE)0u, CHECKENABLE useAssert = (CHECKENABLE)0u, CHECKENABLE useSwitchError = (CHECKENABLE)0u, CHECKENABLE boundscheck = (CHECKENABLE)0u, CHECKACTION checkAction = (CHECKACTION)0u, CLIIdentifierTable dIdentifierTable = (CLIIdentifierTable)0u, CLIIdentifierTable cIdentifierTable = (CLIIdentifierTable)0u, _d_dynamicArray< const char > argv0 = {}, Array modFileAliasStrings = Array(), Array imppath = Array(), Array fileImppath = Array(), _d_dynamicArray< const char > objdir = {}, _d_dynamicArray< const char > objname = {}, _d_dynamicArray< const char > libname = {}, Output ddoc = Output(), Output dihdr = Output(), Output cxxhdr = Output(), Output json = Output(), JsonFieldFlags jsonFieldFlags = (JsonFieldFlags)0u, Output makeDeps = Output(), Output mixinOut = Output(), Output moduleDeps = Output(), uint32_t debuglevel = 0u, uint32_t versionlevel = 0u, bool run = false, Array runargs = Array(), Array cppswitches = Array(), const char* cpp = nullptr, Array objfiles = Array(), Array linkswitches = Array(), Array linkswitchIsForCC = Array(), Array libfiles = Array(), Array dllfiles = Array(), _d_dynamicArray< const char > deffile = {}, _d_dynamicArray< const char > resfile = {}, _d_dynamicArray< const char > exefile = {}, _d_dynamicArray< const char > mapfile = {}) : + Param(bool obj, bool multiobj = false, bool trace = false, bool tracegc = false, bool vcg_ast = false, DiagnosticReporting useDeprecated = (DiagnosticReporting)1u, bool useUnitTests = false, bool useInline = false, bool release = false, bool preservePaths = false, DiagnosticReporting warnings = (DiagnosticReporting)2u, bool cov = false, uint8_t covPercent = 0u, bool ctfe_cov = false, bool ignoreUnsupportedPragmas = true, bool useModuleInfo = true, bool useTypeInfo = true, bool useExceptions = true, bool useGC = true, bool betterC = false, bool addMain = false, bool allInst = false, bool bitfields = false, CppStdRevision cplusplus = (CppStdRevision)201103u, Help help = Help(), Verbose v = Verbose(), FeatureState useDIP25 = (FeatureState)2u, FeatureState useDIP1000 = (FeatureState)0u, bool ehnogc = false, bool useDIP1021 = false, FeatureState fieldwise = (FeatureState)0u, bool fixAliasThis = false, FeatureState rvalueRefParam = (FeatureState)0u, FeatureState noSharedAccess = (FeatureState)0u, bool previewIn = false, bool inclusiveInContracts = false, bool shortenedMethods = true, bool fixImmutableConv = false, bool fix16997 = true, FeatureState dtorFields = (FeatureState)0u, FeatureState systemVariables = (FeatureState)0u, CHECKENABLE useInvariants = (CHECKENABLE)0u, CHECKENABLE useIn = (CHECKENABLE)0u, CHECKENABLE useOut = (CHECKENABLE)0u, CHECKENABLE useArrayBounds = (CHECKENABLE)0u, CHECKENABLE useAssert = (CHECKENABLE)0u, CHECKENABLE useSwitchError = (CHECKENABLE)0u, CHECKENABLE boundscheck = (CHECKENABLE)0u, CHECKACTION checkAction = (CHECKACTION)0u, CLIIdentifierTable dIdentifierTable = (CLIIdentifierTable)0u, CLIIdentifierTable cIdentifierTable = (CLIIdentifierTable)0u, CLIIdentifierNormalization dNormalization = (CLIIdentifierNormalization)0u, CLIIdentifierNormalization cNormalization = (CLIIdentifierNormalization)0u, _d_dynamicArray< const char > argv0 = {}, Array modFileAliasStrings = Array(), Array imppath = Array(), Array fileImppath = Array(), _d_dynamicArray< const char > objdir = {}, _d_dynamicArray< const char > objname = {}, _d_dynamicArray< const char > libname = {}, Output ddoc = Output(), Output dihdr = Output(), Output cxxhdr = Output(), Output json = Output(), JsonFieldFlags jsonFieldFlags = (JsonFieldFlags)0u, Output makeDeps = Output(), Output mixinOut = Output(), Output moduleDeps = Output(), uint32_t debuglevel = 0u, uint32_t versionlevel = 0u, bool run = false, Array runargs = Array(), Array cppswitches = Array(), const char* cpp = nullptr, Array objfiles = Array(), Array linkswitches = Array(), Array linkswitchIsForCC = Array(), Array libfiles = Array(), Array dllfiles = Array(), _d_dynamicArray< const char > deffile = {}, _d_dynamicArray< const char > resfile = {}, _d_dynamicArray< const char > exefile = {}, _d_dynamicArray< const char > mapfile = {}) : obj(obj), multiobj(multiobj), trace(trace), @@ -8242,6 +8281,8 @@ struct Param final checkAction(checkAction), dIdentifierTable(dIdentifierTable), cIdentifierTable(cIdentifierTable), + dNormalization(dNormalization), + cNormalization(cNormalization), argv0(argv0), modFileAliasStrings(modFileAliasStrings), imppath(imppath), diff --git a/compiler/src/dmd/globals.d b/compiler/src/dmd/globals.d index f8291fa5ce7e..3ccd1dc725e3 100644 --- a/compiler/src/dmd/globals.d +++ b/compiler/src/dmd/globals.d @@ -82,6 +82,14 @@ enum CLIIdentifierTable : ubyte All = 4, /// The least restrictive set of all other tables } +/// When a non-normalized identifier is found, what should happen? +enum CLIIdentifierNormalization : ubyte +{ + default_ = 0, /// The default normalization strategy + SilentlyAccept = 1, /// Silently accept the bad string + Warning = 2, /// Emit a warning but allow +} + extern(C++) struct Output { bool doOutput; // Output is enabled @@ -209,8 +217,10 @@ extern (C++) struct Param CHECKACTION checkAction = CHECKACTION.D; // action to take when bounds, asserts or switch defaults are violated - CLIIdentifierTable dIdentifierTable = CLIIdentifierTable.default_; - CLIIdentifierTable cIdentifierTable = CLIIdentifierTable.default_; + CLIIdentifierTable dIdentifierTable = CLIIdentifierTable.default_; // the D identifier table to use + CLIIdentifierTable cIdentifierTable = CLIIdentifierTable.default_; // the C identifier table to use (ImportC) + CLIIdentifierNormalization dNormalization = CLIIdentifierNormalization.default_; // The D identifier normalization strategy to use + CLIIdentifierNormalization cNormalization = CLIIdentifierNormalization.default_; // The C identifier normalization strategy to use (ImportC) const(char)[] argv0; // program name Array!(const(char)*) modFileAliasStrings; // array of char*'s of -I module filename alias strings diff --git a/compiler/src/dmd/globals.h b/compiler/src/dmd/globals.h index ac2b2867fb7c..60cc6db34c60 100644 --- a/compiler/src/dmd/globals.h +++ b/compiler/src/dmd/globals.h @@ -93,6 +93,16 @@ enum class CLIIdentifierTable : unsigned char All = 4, /// The least restrictive set of all other tables }; +/// When a non-normalized identifier is found, what should happen? +enum class CLIIdentifierNormalization : unsigned char +{ + default_ = 0, /// The default normalization strategy + SilentlyAccept = 1, /// Silently accept the bad string + Deprecate = 2, /// Emit a deprecation but allow + Warning = 3, /// Emit a warning but allow + Error = 4 /// Emit an error and fail +}; + struct Output { /// Configuration for the compiler generator @@ -211,8 +221,10 @@ struct Param CHECKACTION checkAction; // action to take when bounds, asserts or switch defaults are violated - CLIIdentifierTable dIdentifierTable; - CLIIdentifierTable cIdentifierTable; + CLIIdentifierTable dIdentifierTable; // the D identifier table to use + CLIIdentifierTable cIdentifierTable; // the C identifier table to use (ImportC) + CLIIdentifierNormalization dNormalization; // The D identifier normalization strategy to use + CLIIdentifierNormalization cNormalization; // The C identifier normalization strategy to use (ImportC) DString argv0; // program name Array modFileAliasStrings; // array of char*'s of -I module filename alias strings diff --git a/compiler/src/dmd/identifier.d b/compiler/src/dmd/identifier.d index 6fd0d3ad5ec6..7e29f6e07f92 100644 --- a/compiler/src/dmd/identifier.d +++ b/compiler/src/dmd/identifier.d @@ -300,6 +300,50 @@ nothrow: sv.value = id; } + /****************************************** + * Used for inserting keywords into the string table with respect to normalization. + * + * If the input string hasn't been normalized, it will be normalized and inserted into the table + * both as the unnormalized as the key, and the normalized version as the key. + * + * The normalization form this normalizes into is form C. + * + * Note: Normalization is not currently implemented so it calls into ``idPool`` only. + * + * Params: + * s = The string slice containing the identifier + * isNormalized = Is the input string currently normalized? + * + * See_Also: idPool + * Returns: An identifier that has been normalized if it needs to be. + */ + extern (D) static Identifier idPoolNormalize(scope const(char)[] s, bool isNormalized) + { + // Normalization itself is not implemented here currently. + + return idPool(s, false); + + /* + Pseudo code for how this function needs to work: + + if (s in stringtable) + return stringtable[s]; + else if (isNormalized) + return idPool(s, false); + + auto sNormalized = toNFC(s); + if (sNormalized in stringtable) + { + free(sNormalized); + return stringtable[sNormalized]; + } + + stringtable[sNoramlized] = sNormalized; + stringTable[s] = sNormalized; + return sNormalized; + */ + } + /********************************** * Determine if string is a valid Identifier. * Params: diff --git a/compiler/src/dmd/lexer.d b/compiler/src/dmd/lexer.d index b8a4223f884d..69203569b321 100644 --- a/compiler/src/dmd/lexer.d +++ b/compiler/src/dmd/lexer.d @@ -57,8 +57,11 @@ struct CompileEnv bool masm; /// use MASM inline asm syntax // these need a default otherwise tests won't work. - IdentifierCharLookup cCharLookupTable; - IdentifierCharLookup dCharLookupTable; + IdentifierCharLookup cCharLookupTable; /// C identifier table (set to the lexer by the C parser) + IdentifierCharLookup dCharLookupTable; /// D identifier table + + NormalizationStrategy cNormalization; /// C normalization strategy (set to the lexer by the C parser) + NormalizationStrategy dNormalization; /// D normalization strategy } /*********************************************************** @@ -74,7 +77,8 @@ class Lexer Token token; - IdentifierCharLookup charLookup; + IdentifierCharLookup charLookup; /// Character table for identifiers + NormalizationStrategy normalizationStrategy; /// What to do when an identifier is not normalized // For ImportC bool Ccompile; /// true if compiling ImportC @@ -188,15 +192,11 @@ class Lexer endOfLine(); } - // setup the identifier table lookup functions - if (this.Ccompile) - { - charLookup = this.compileEnv.cCharLookupTable; - } - else - { - charLookup = this.compileEnv.dCharLookupTable; - } + // setup the identifier table lookup functions and normalization + // C tables are setup in its parser constructor + // Due to us not knowing if we're in C at this point in time. + charLookup = this.compileEnv.dCharLookupTable; + normalizationStrategy = this.compileEnv.dNormalization; } /*********************** @@ -328,6 +328,7 @@ class Lexer t.blockComment = null; t.lineComment = null; + UnicodeQuickCheckState unicodeQuickCheckState; size_t universalCharacterName4, universalCharacterName8; while (1) @@ -648,7 +649,11 @@ class Lexer const isStartCharacter = t.ptr is p; if (isidchar(c)) + { + // ASCII ranges are all starters and hence CCC = 0 + unicodeQuickCheckState.lastCCC = 0; continue; + } else if (c & 0x80) { const s = p; @@ -656,13 +661,15 @@ class Lexer if (isStartCharacter) { + // Start character always has ccc=0, + // therefore quick check state is already setup for this iteration. if (charLookup.isStart(u)) continue; error(t.loc, "character 0x%04x is not allowed as a start character in an identifier", u); } else { - if (charLookup.isContinue(u)) + if (charLookup.isContinue(u, unicodeQuickCheckState)) continue; error(t.loc, "character 0x%04x is not allowed as a continue character in an identifier", u); } @@ -718,6 +725,9 @@ class Lexer if (universalCharacterName4 > 0 || universalCharacterName8 > 0) { + // unfortunately we need to rerun the quick check algorithm over the entire input, so we'll reset it. + unicodeQuickCheckState = UnicodeQuickCheckState.init; + auto priorValidation = t.ptr[0 .. p - t.ptr]; const(char)* priorVPtr = priorValidation.ptr; const possibleLength = ( @@ -772,23 +782,58 @@ class Lexer // but hey it was written specifically so why worry? if (priorVPtr is priorValidation.ptr) { + // Start characters are ccc=0 so the quick check state is already setup. if (!charLookup.isStart(tempDchar)) warning(t.loc, "char 0x%x is not allowed start character for an identifier", tempDchar); } else { - if (!charLookup.isContinue(tempDchar)) + if (!charLookup.isContinue(tempDchar, unicodeQuickCheckState)) warning(t.loc, "char 0x%x is not allowed continue character for an identifier", tempDchar); } } else - storage[offset++] = *++priorVPtr; + { + if (isidchar(*priorVPtr)) + { + // ASCII ranges are all starters and hence CCC = 0 + unicodeQuickCheckState.lastCCC = 0; + // copy as is + storage[offset++] = *++priorVPtr; + } + else + { + const isStartCharacter = t.ptr is priorVPtr; + + const inputOffset = priorVPtr - priorValidation.ptr; + size_t toDecodeOffset = inputOffset; + dchar tempDChar; + + string msg = utf_decodeChar(priorValidation, toDecodeOffset, tempDChar); + if (msg) + error(t.loc, "%.*s".ptr, cast(int)msg.length, msg.ptr); + + // We are a whole lot less concerned about validation here + // however we'll still call into isStart/isContinue as if we're doing it + // for simplicity sake. + // Note: the start character always has a ccc=0, + // therefore the quick check state is setup correctly for that iteration. + if (isStartCharacter) + unicodeQuickCheckState.lastCCC = 0; + else + charLookup.isContinue(tempDChar, unicodeQuickCheckState); + + // copy the decode length accross + foreach(_; 0 .. toDecodeOffset - inputOffset) + storage[offset++] = *++priorVPtr; + } + } } - id = Identifier.idPool(storage[0 .. offset], false); + id = acquireIdentifierFromString(storage[0 .. offset], unicodeQuickCheckState.isNormalized); } else - id = Identifier.idPool((cast(char*)t.ptr)[0 .. p - t.ptr], false); + id = acquireIdentifierFromString((cast(char*)t.ptr)[0 .. p - t.ptr], unicodeQuickCheckState.isNormalized); t.ident = id; t.value = cast(TOK)id.getValue(); @@ -1363,6 +1408,7 @@ class Lexer c = decodeUTF(); // Check for start of an identifier + // Quick check state is already setup as its ccc=0 if (charLookup.isStart(c)) goto case_ident; @@ -1877,7 +1923,7 @@ class Lexer delimright = ']'; else if (c == '<') delimright = '>'; - else if (isalpha(c) || c == '_' || (c >= 0x80 && charLookup.isStart(c))) + else if (isalpha(c) || c == '_' || (c >= 0x80 && isAnyStart(c))) { // Start of identifier; must be a heredoc Token tok; @@ -1927,7 +1973,7 @@ class Lexer goto Ldone; // we're looking for a new identifier token - if (startline && (isalpha(c) || c == '_' || (c >= 0x80 && charLookup.isStart(c))) && hereid) + if (startline && (isalpha(c) || c == '_' || (c >= 0x80 && isAnyStart(c))) && hereid) { Token tok; auto psave = p; @@ -2393,6 +2439,55 @@ class Lexer } } + /************************************** + * Given an identifier string slice and if that slice is currently normalized, + * return an identifier with respect to the normalization strategy (logging, is normalized). + * + * This function will only take action when the input string is not normalized. + * What it does when it takes action depends upon the normalization strategy that is provided by CLI switch for the language. + * When normalization, it does nothing here. But will inform identifier interning to normalize. + * Otherwise it will do some variation of logging (including no logging aka silently accept), which may result in compilation failing. + * + * Params: + * s = The string slice that contains the identifier from the source code + * isNormalized = Is the string in normal form C. As per quick check algorithm. + * + * Returns: An identifier, that may or may not be normalized (as requested by the user). + */ + private Identifier acquireIdentifierFromString(scope const(char)[] s, bool isNormalized) + { + // Boot strap compiler cannot inline this function. + // As of 2024Q1 + + // When a strategy accepts even if not normalized, we set as normalized. + + if (!isNormalized) + { + final switch (this.normalizationStrategy) + { + case NormalizationStrategy.Normalize: + // Do nothing, everything is correct + break; + + case NormalizationStrategy.SilentlyAccept: + isNormalized = true; + break; + + case NormalizationStrategy.Deprecate: + isNormalized = true; + deprecation("Unnormalized identifier `%.*s`", cast(int)s.length, s.ptr); + break; + + case NormalizationStrategy.Warning: + isNormalized = true; + warning("Unnormalized identifier `%.*s`", cast(int)s.length, s.ptr); + break; + } + } + + return Identifier.idPoolNormalize(s, isNormalized); + } + /************************************** * Read in a number. * If it's an integer, store it in tok.TKutok.Vlong. @@ -3179,6 +3274,11 @@ class Lexer eSink.deprecation(loc, format, args); } + void warning(T...)(const(char)* format, T args) + { + eSink.warning(token.loc, format, args); + } + void warning(T...)(const ref Loc loc, const(char)* format, T args) { eSink.warning(loc, format, args); diff --git a/compiler/src/dmd/main.d b/compiler/src/dmd/main.d index 27f79379abae..44067a09ed4d 100644 --- a/compiler/src/dmd/main.d +++ b/compiler/src/dmd/main.d @@ -216,6 +216,39 @@ private int tryMain(size_t argc, const(char)** argv, ref Param params) break; } + final switch(global.params.cNormalization) + { + case CLIIdentifierNormalization.default_: + // C11 silently accepts, if this is upgraded to C23 change this to normalization/deprecate/warning/error. + global.compileEnv.cNormalization = NormalizationStrategy.SilentlyAccept; + break; + + case CLIIdentifierNormalization.SilentlyAccept: + global.compileEnv.cNormalization = NormalizationStrategy.SilentlyAccept; + break; + + case CLIIdentifierNormalization.Warning: + global.compileEnv.cNormalization = NormalizationStrategy.Warning; + break; + } + + final switch(global.params.dNormalization) + { + case CLIIdentifierNormalization.default_: + // @@@DEPRECATED_2.119@@@ + // Change the default behavior to deprecate, if normalization hasn't been implemented by then. + global.compileEnv.dNormalization = NormalizationStrategy.SilentlyAccept; + break; + + case CLIIdentifierNormalization.SilentlyAccept: + global.compileEnv.dNormalization = NormalizationStrategy.SilentlyAccept; + break; + + case CLIIdentifierNormalization.Warning: + global.compileEnv.dNormalization = NormalizationStrategy.Warning; + break; + } + if (params.help.usage) { usage(); diff --git a/compiler/src/dmd/mars.d b/compiler/src/dmd/mars.d index 06f694e9e472..2f6763432bf2 100644 --- a/compiler/src/dmd/mars.d +++ b/compiler/src/dmd/mars.d @@ -1512,6 +1512,52 @@ bool parseCommandLine(const ref Strings arguments, const size_t argc, ref Param else goto Lerror; } + else if (startsWith(p + 1, "normalization-importc")) + { + // Parse: + // -normalization-importc=[ignore|deprecate|warn|error] + if (p[22] == '=') + { + const(char)[] normalize = arg[23 .. $]; + + switch(normalize) + { + case "ignore": + params.cNormalization = CLIIdentifierNormalization.SilentlyAccept; + break; + case "warn": + params.cNormalization = CLIIdentifierNormalization.Warning; + break; + default: + goto Lerror; + } + } + else + goto Lerror; + } + else if (startsWith(p + 1, "normalization")) + { + // Parse: + // -normalization=[ignore|deprecate|warn|error] + if (p[14] == '=') + { + const(char)[] normalize = arg[15 .. $]; + + switch(normalize) + { + case "ignore": + params.dNormalization = CLIIdentifierNormalization.SilentlyAccept; + break; + case "warn": + params.dNormalization = CLIIdentifierNormalization.Warning; + break; + default: + goto Lerror; + } + } + else + goto Lerror; + } else if (arg == "-nothrow") // https://dlang.org/dmd.html#switch-nothrow { params.useExceptions = false; diff --git a/compiler/test/compilable/ident_UAX31.c b/compiler/test/compilable/ident_UAX31.c index 4536031e78ca..7f301ee9d645 100644 --- a/compiler/test/compilable/ident_UAX31.c +++ b/compiler/test/compilable/ident_UAX31.c @@ -6,4 +6,5 @@ // verify that the UAX31 identifier set is applied. int \u00F8ide\u00F9nt; +int \u00F8ideùnt; int øideùnt2; diff --git a/compiler/test/compilable/ident_c11.c b/compiler/test/compilable/ident_c11.c index 5ef3cf3b73bf..7865e6b5a761 100644 --- a/compiler/test/compilable/ident_c11.c +++ b/compiler/test/compilable/ident_c11.c @@ -6,4 +6,5 @@ // verify that the C11 identifier set is applied. int \u00A8ide\u00AFnt; +int \u00A8ide¯nt; int ¨ide¯nt; diff --git a/compiler/test/compilable/ident_c99.c b/compiler/test/compilable/ident_c99.c index 3be11d7fe810..8dbcc38c40c2 100644 --- a/compiler/test/compilable/ident_c99.c +++ b/compiler/test/compilable/ident_c99.c @@ -3,4 +3,5 @@ // verify that the C99 identifier set is applied. int \u00AAide\u00B5nt; +int \u00AAideµnt; int ªideµnt2; diff --git a/compiler/test/compilable/normalize_silent.c b/compiler/test/compilable/normalize_silent.c new file mode 100644 index 000000000000..f17b8af754bb --- /dev/null +++ b/compiler/test/compilable/normalize_silent.c @@ -0,0 +1,15 @@ +// REQUIRED_ARGS: -identifiers-importc=UAX31 -normalization-importc=ignore + +// Disable on posix, as we use gcc there and it'll do its own thing. +// Clang doesn't currently have normalization warning, so enable it there. +// Sppn only has c99 tables, so disable these tests for that +// DISABLED: win32omf linux freebsd openbsd + +// all ccc's are in order (starters only), this needs to be ok +int sstarters; + +// all non-starters are in order, only U+0315 is normalized the rest are maybes/no's, is in error +int s\u0300\u0315\u0345e; + +// all non-starters are not in order, is in error +int s\u0345\u0315\u0300e; diff --git a/compiler/test/compilable/normalize_silent.d b/compiler/test/compilable/normalize_silent.d new file mode 100644 index 000000000000..c555aaab16f9 --- /dev/null +++ b/compiler/test/compilable/normalize_silent.d @@ -0,0 +1,10 @@ +// REQUIRED_ARGS: -identifiers=UAX31 -normalization=ignore + +// all ccc's are in order (starters only), this needs to be ok +int sstarters; + +// all non-starters are in order, only U+0315 is normalized the rest are maybes/no's, is in error +mixin("int s\u0300\u0315\u0345e;"); + +// all non-starters are not in order, is in error +mixin("int s\u0345\u0315\u0300e;"); diff --git a/compiler/test/fail_compilation/normalize_warn.c b/compiler/test/fail_compilation/normalize_warn.c new file mode 100644 index 000000000000..2a1ef37035a3 --- /dev/null +++ b/compiler/test/fail_compilation/normalize_warn.c @@ -0,0 +1,25 @@ +// REQUIRED_ARGS: -identifiers-importc=UAX31 -normalization-importc=warn -w + +// Disable on posix, as we use gcc there and it'll do its own thing. +// Clang doesn't currently have normalization warning, so enable it there. +// Sppn only has c99 tables, so disable these tests for that +// DISABLED: win32omf linux freebsd openbsd + +/* +TEST_OUTPUT: +--- +fail_compilation\normalize_warn.c(22): Warning: Unnormalized identifier `s̀̕ͅe` +fail_compilation\normalize_warn.c(25): Warning: Unnormalized identifier `s̀̕ͅe` +Error: warnings are treated as errors + Use -wi if you wish to treat warnings only as informational. +--- +*/ + +// all ccc's are in order (starters only), this needs to be ok +int sstarters; + +// all non-starters are in order, only U+0315 is normalized the rest are maybes/no's, will error +int s\u0300\u0315\u0345e; + +// all non-starters are not in order, will error +int s\u0345\u0315\u0300e; diff --git a/compiler/test/fail_compilation/normalize_warn.d b/compiler/test/fail_compilation/normalize_warn.d new file mode 100644 index 000000000000..8e08d148a85b --- /dev/null +++ b/compiler/test/fail_compilation/normalize_warn.d @@ -0,0 +1,20 @@ +// REQUIRED_ARGS: -identifiers=UAX31 -normalization=warn -w + +/* +TEST_OUTPUT: +--- +fail_compilation\normalize_warn.d-mixin-17(17): Warning: Unnormalized identifier `s̀̕ͅe` +fail_compilation\normalize_warn.d-mixin-20(20): Warning: Unnormalized identifier `s̀̕ͅe` +Error: warnings are treated as errors + Use -wi if you wish to treat warnings only as informational. +--- +*/ + +// all ccc's are in order (starters only), this needs to be ok +int sstarters; + +// all non-starters are in order, only U+0315 is normalized the rest are maybes/no's, will error +mixin("int s\u0300\u0315\u0345e;"); + +// all non-starters are not in order, will error +mixin("int s\u0345\u0315\u0300e;"); diff --git a/compiler/tools/unicode_tables/derivedNormalizationProps.d b/compiler/tools/unicode_tables/derivedNormalizationProps.d new file mode 100644 index 000000000000..e13ef94bc117 --- /dev/null +++ b/compiler/tools/unicode_tables/derivedNormalizationProps.d @@ -0,0 +1,105 @@ +module unicode_tables.derivedNormalizationProps; +import unicode_tables.util; + +ValueRanges isCharacterNotNormalized; + +void parseDerivedNormalizationProps(string dataFile) +{ + import std.algorithm : countUntil, splitter; + import std.string : strip, lineSplitter; + import std.conv : parse; + import std.file : readText; + + string inputText = readText(dataFile); + ValueRanges maybes, nos; + + ValueRange valueRangeFromString(string charRangeStr) + { + ValueRange ret; + + ptrdiff_t offsetOfSeperator = charRangeStr.countUntil(".."); + if (offsetOfSeperator < 0) + { + ret.start = parse!uint(charRangeStr, 16); + ret.end = ret.start; + } + else + { + string startStr = charRangeStr[0 .. offsetOfSeperator], + endStr = charRangeStr[offsetOfSeperator + 2 .. $]; + ret.start = parse!uint(startStr, 16); + ret.end = parse!uint(endStr, 16); + } + + return ret; + } + + void handleLine(ValueRange valueRange, string propertyStr, string yesNoMaybeStr) + { + switch (propertyStr) + { + case "NFC_QC": + // normalization form C, quick check value + break; + case "NFD_QC": + case "NFKD_QC": + case "NFKC_QC": + // not interested in these for UAX31 + return; + + default: + return; + } + + switch (yesNoMaybeStr) + { + case "Y": + assert(0); // As of Unicode 15.1.0 there are no yes entries. + case "N": + nos.add(valueRange); + break; + case "M": + maybes.add(valueRange); + break; + default: + return; + } + } + + foreach (line; inputText.lineSplitter) + { + ptrdiff_t offset; + + offset = line.countUntil('#'); + if (offset >= 0) + line = line[0 .. offset]; + line = line.strip; + + if (line.length < 5) // anything that low can't represent a functional line + continue; + + offset = line.countUntil(';'); + if (offset < 0) // no char range + continue; + string charRangeStr = line[0 .. offset].strip; + line = line[offset + 1 .. $].strip; + + ValueRange valueRange = valueRangeFromString(charRangeStr); + + offset = line.countUntil(';'); + string propertyStr; + + if (offset > 0) + { + propertyStr = line[0 .. offset].strip; + line = line[offset + 1 .. $].strip; + } + else + propertyStr = line.strip; + + if (line.length > 0) + handleLine(valueRange, propertyStr, line); + } + + isCharacterNotNormalized = maybes.merge(nos); +} diff --git a/compiler/tools/unicode_tables/unicodeData.d b/compiler/tools/unicode_tables/unicodeData.d index 4cd81b4410b8..a9135eff13a0 100644 --- a/compiler/tools/unicode_tables/unicodeData.d +++ b/compiler/tools/unicode_tables/unicodeData.d @@ -9,6 +9,8 @@ module unicode_tables.unicodeData; import unicode_tables.util; UDEntry[] udEntries; +ValueRanges cccIndexTable; +ubyte[] cccValueTable; void parseUnicodeData(string dataFile) { @@ -17,55 +19,56 @@ void parseUnicodeData(string dataFile) import std.string : lineSplitter, strip, split; import std.conv : parse; - bool expectedRangeEnd, nextRangeEnd; - - foreach (line; readText(dataFile).lineSplitter) { - { - // handle end of line comment - ptrdiff_t offset = line.countUntil('#'); - if (offset >= 0) - line = line[0 .. offset]; - line = line.strip; - } + bool expectedRangeEnd, nextRangeEnd; - string[] fields = line.split(";"); + foreach (line; readText(dataFile).lineSplitter) { - foreach (ref field; fields) { - field = field.strip; + // handle end of line comment + ptrdiff_t offset = line.countUntil('#'); + if (offset >= 0) + line = line[0 .. offset]; + line = line.strip; } - if (fields.length == 0) - { - continue; - } - else if (fields.length != 15) + string[] fields = line.split(";"); { - continue; - } - } - - { - /+ - How first field ranges are specified (the First, Last bit): - 3400;;Lo;0;L;;;;;N;;;;; - 4DBF;;Lo;0;L;;;;;N;;;;; - +/ + foreach (ref field; fields) + { + field = field.strip; + } - if (fields[1].endsWith(">")) - { - if (fields[1].endsWith("First>")) + if (fields.length == 0) { - nextRangeEnd = true; + continue; } - else if (fields[1].endsWith("Last>")) + else if (fields.length != 15) { - assert(nextRangeEnd); - nextRangeEnd = false; - expectedRangeEnd = true; + continue; } - else if (fields[1] == "") + } + + { + /+ + How first field ranges are specified (the First, Last bit): + 3400;;Lo;0;L;;;;;N;;;;; + 4DBF;;Lo;0;L;;;;;N;;;;; + +/ + + if (fields[1].endsWith(">")) + { + if (fields[1].endsWith("First>")) + { + nextRangeEnd = true; + } + else if (fields[1].endsWith("Last>")) + { + assert(nextRangeEnd); + nextRangeEnd = false; + expectedRangeEnd = true; + } + else if (fields[1] == "") { if (expectedRangeEnd) { @@ -78,36 +81,78 @@ void parseUnicodeData(string dataFile) { continue; } + } + else if (expectedRangeEnd) + { + continue; + } } - else if (expectedRangeEnd) + + uint character = parse!uint(fields[0], 16); + + if (expectedRangeEnd) { + udEntries[$ - 1].range.end = character; + expectedRangeEnd = false; continue; } - } - uint character = parse!uint(fields[0], 16); + { + UDEntry entry; + entry.range = ValueRange(character); - if (expectedRangeEnd) - { - udEntries[$ - 1].range.end = character; - expectedRangeEnd = false; - continue; + static foreach (GC; __traits(allMembers, GeneralCategory)) + { + if (fields[2] == GC) + entry.generalCategory = __traits(getMember, GeneralCategory, GC); + } + + entry.canonicalCombiningClass = parse!ubyte(fields[3]); + + // sanity check of input ranges to ensure nothing spans multiple planes + const startPlane = entry.range.start >> 16; + const endPlane = entry.range.end >> 16; + assert(startPlane == endPlane); + + udEntries ~= entry; + } } + } + { + ubyte lastCCC; + int oldPlane = -1; + + foreach (ud; udEntries) { - UDEntry entry; - entry.range = ValueRange(character); + const initialLength = cccIndexTable.ranges.length; + const newPlane = cast(int) ud.range.start >> 16; - static foreach (GC; __traits(allMembers, GeneralCategory)) + if (oldPlane != newPlane) + cccIndexTable.ranges ~= ud.range; + else if (ud.canonicalCombiningClass == 0 && lastCCC == 0 && initialLength > 0) { - if (fields[2] == GC) - entry.generalCategory = __traits(getMember, GeneralCategory, GC); + // If a character isn't mapped, its ccc defaults to zero. + // This means we can combine entries for zero which we cannot do for others. + + cccIndexTable.ranges[$ - 1].end = ud.range.end; + } + else + { + if (lastCCC == ud.canonicalCombiningClass) + cccIndexTable.add(ud.range); + else + cccIndexTable.ranges ~= ud.range; } - entry.canonicalCombiningClass = parse!int(fields[3]); + if (initialLength != cccIndexTable.ranges.length) + cccValueTable ~= ud.canonicalCombiningClass; - udEntries ~= entry; + oldPlane = newPlane; + lastCCC = ud.canonicalCombiningClass; } + + assert(cccIndexTable.ranges.length == cccValueTable.length); } } @@ -115,9 +160,9 @@ struct UDEntry { ValueRange range; GeneralCategory generalCategory; - int canonicalCombiningClass; + ubyte canonicalCombiningClass; - @safe: +@safe: bool isStarter() { @@ -128,14 +173,14 @@ struct UDEntry { switch (generalCategory) { - case GeneralCategory.Lu: - case GeneralCategory.Ll: - case GeneralCategory.Lt: - case GeneralCategory.Lm: - case GeneralCategory.Lo: - return true; - default: - return false; + case GeneralCategory.Lu: + case GeneralCategory.Ll: + case GeneralCategory.Lt: + case GeneralCategory.Lm: + case GeneralCategory.Lo: + return true; + default: + return false; } } } diff --git a/compiler/tools/unicode_tables/util.d b/compiler/tools/unicode_tables/util.d index 87cbd37b7b6f..d11191825ebd 100644 --- a/compiler/tools/unicode_tables/util.d +++ b/compiler/tools/unicode_tables/util.d @@ -41,7 +41,8 @@ struct ValueRange return end + 1 - start; } - int opCmp(const ValueRange other) const { + int opCmp(const ValueRange other) const + { return this.start < other.start ? -1 : (this.start > other.start ? 1 : 0); } @@ -68,7 +69,8 @@ struct ValueRanges void add(ValueRange toAdd) { - if (ranges.length > 0 && (ranges[$ - 1].end >= toAdd.start || ranges[$ - 1].end + 1 == toAdd.start)) + if (ranges.length > 0 && (ranges[$ - 1].end >= toAdd.start + || ranges[$ - 1].end + 1 == toAdd.start)) { ranges[$ - 1].end = toAdd.end; } @@ -94,16 +96,22 @@ struct ValueRanges ValueRanges merge(const ref ValueRanges andThis) const { - import std.algorithm : sort; ValueRanges ret; + ret.ranges = (this.ranges ~ andThis.ranges).dup; - auto sorted = sort((this.ranges ~ andThis.ranges).dup); + ret.sortMerge; + return ret; + } - foreach(range; sorted) { - ret.add(range); - } + void sortMerge() + { + import std.algorithm : sort; - return ret; + auto sorted = sort(this.ranges); + this.ranges = null; + + foreach (range; sorted) + this.add(range); } bool within(dchar index) const diff --git a/compiler/tools/unicodetables.d b/compiler/tools/unicodetables.d index 4c4a14fbc282..dccf3ed9002b 100644 --- a/compiler/tools/unicodetables.d +++ b/compiler/tools/unicodetables.d @@ -22,13 +22,15 @@ License: $(LINK2 https://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) module unicodetables; import unicode_tables.util; import unicode_tables.fixedtables; -import std.stdio : File, writeln; +import std.stdio : File, writeln, writefln; -enum { +enum +{ // don't forget to update me when you commit new tables! UCDDirectory = "UCD-15.1.0/", UnicodeDataFile = UCDDirectory ~ "UnicodeData.txt", DerivedCorePropertiesFile = UCDDirectory ~ "DerivedCoreProperties.txt", + DerivedNormalizationPropsFile = UCDDirectory ~ "DerivedNormalizationProps.txt", UnicodeTableFile = "../src/dmd/common/identifiertables.d", } @@ -43,13 +45,21 @@ int main(string[] args) { import std.file : exists; - if (!exists(UnicodeDataFile)) { + if (!exists(UnicodeDataFile)) + { writeln("Missing UCD table UnicodeData.txt"); return 1; - } else if (!exists(DerivedCorePropertiesFile)) { + } + else if (!exists(DerivedCorePropertiesFile)) + { writeln("Missing UCD table DerivedCoreProperties.txt"); return 2; } + else if (!exists(DerivedNormalizationPropsFile)) + { + writeln("Missing UCD table DerivedNormalizationProps.txt"); + return 3; + } { tableFile = File(UnicodeTableFile, "w+"); @@ -61,9 +71,11 @@ int main(string[] args) { import unicode_tables.unicodeData; import unicode_tables.derivedCoreProperties; + import unicode_tables.derivedNormalizationProps; parseUnicodeData(UnicodeDataFile); parseProperties(DerivedCorePropertiesFile); + parseDerivedNormalizationProps(DerivedNormalizationPropsFile); } write_XID_Start; @@ -76,17 +88,158 @@ int main(string[] args) tableFile.writeln; write_least_restrictive_table; + tableFile.writeln; + + writeIsNotNormalizedTable; + tableFile.writeln; + + writeCCC; + + printSomeCharacters; return 0; } -void writeTable(string name, const ValueRanges vr) +void writeIdentifierTable(string name, const ValueRanges vr) { tableFile.writeln("static immutable dchar[2][] ", name, " = ["); - foreach (entry; vr.ranges) + const(ValueRange)[] values = vr.ranges; + + // sanity check to guarantee we don't span multiple planes + foreach (v; values) + { + const startPlane = v.start >> 16; + const endPlane = v.end >> 16; + assert(startPlane == endPlane, name ~ " spans multiple planes"); + } + + while (values.length >= 4) + { + tableFile.write(" "); + tableFile.writefln!"[0x%X, 0x%X], [0x%X, 0x%X], [0x%X, 0x%X], [0x%X, 0x%X],"( + values[0].start, values[0].end, values[1].start, values[1].end, + values[2].start, values[2].end, values[3].start, values[3].end); + values = values[4 .. $]; + } + + if (values.length > 0) + { + tableFile.write(" "); + + foreach (i, entry; values) + { + if (i > 0) + tableFile.write(", "); + tableFile.writef!"[0x%X, 0x%X]"(entry.start, entry.end); + } + + tableFile.writeln(); + } + + tableFile.writeln("];"); +} + +void writeValueTable(string name, const(ubyte)[] values) +{ + tableFile.writeln("static immutable ubyte[] ", name, " = ["); + + while (values.length >= 8) + { + tableFile.write(" "); + tableFile.writefln!"%s, %s, %s, %s, %s, %s, %s, %s,"(values[0], + values[1], values[2], values[3], values[4], values[5], values[6], values[7]); + values = values[8 .. $]; + } + + if (values.length > 0) + { + tableFile.write(" "); + + foreach (i, entry; values) + { + if (i > 0) + tableFile.write(", "); + tableFile.writef!"%s"(entry); + } + + tableFile.writeln(); + } + + tableFile.writeln("];"); +} + +void writeTestCases(string name, const ValueRanges vr) +{ + ValueRanges[17] planes; + dchar[3][17] charsToTestFor; + uint[3][17] indexToTestFor; + bool[17] isEnabled; + + foreach (planeNumber, ref plane; planes) + { + foreach (range; vr.ranges) + { + const mid = cast(dchar)((cast(ulong) range.start + cast(ulong) range.end) / 2); + const midPlane = mid >> 16; + + if (midPlane != planeNumber) + continue; + + // do not change offsets (.add would have) + plane.ranges ~= ValueRange(mid); + } + + if (plane.ranges.length == 0) + continue; + + isEnabled[planeNumber] = true; + + uint offsetToPlane; + + foreach (ref plane2; planes[0 .. planeNumber]) + { + offsetToPlane += cast(uint)plane2.ranges.length; + } + + charsToTestFor[planeNumber][0] = plane.ranges[0].start; + charsToTestFor[planeNumber][1] = plane.ranges[0].start; + charsToTestFor[planeNumber][2] = plane.ranges[0].start; + indexToTestFor[planeNumber][0] = offsetToPlane + 0; + indexToTestFor[planeNumber][1] = offsetToPlane + 0; + indexToTestFor[planeNumber][2] = offsetToPlane + 0; + + if (plane.ranges.length > 1) + { + charsToTestFor[planeNumber][1] = plane.ranges[$ - 1].start; + indexToTestFor[planeNumber][1] = offsetToPlane + cast(uint)plane.ranges.length - 1; + } + + if (plane.ranges.length > 2) + { + const offset = cast(uint)plane.ranges.length / 2; + + charsToTestFor[planeNumber][2] = plane.ranges[offset].start; + indexToTestFor[planeNumber][2] = offsetToPlane + offset; + } + } + + // Use enum here because we will only access it once in a unittest + tableFile.writeln("/**"); + tableFile.writeln("Tests [[dchar, index] ... planes * 3] for ", name); + tableFile.writeln("*/"); + tableFile.writeln("enum uint[2][] ", name, "_Test", " = ["); + foreach (i; 0 .. 17) { - tableFile.writefln!" [0x%X, 0x%X],"(entry.start, entry.end); + if (isEnabled[i]) + { + tableFile.writefln!" [0x%06X, %d],"(charsToTestFor[i][0], indexToTestFor[i][0]); + // 2 is middle, must go before 1 which is end + if (charsToTestFor[i][0] != charsToTestFor[i][2]) + tableFile.writefln!" [0x%06X, %d],"(charsToTestFor[i][2], indexToTestFor[i][2]); + if (charsToTestFor[i][0] != charsToTestFor[i][1]) + tableFile.writefln!" [0x%06X, %d],"(charsToTestFor[i][1], indexToTestFor[i][1]); + } } tableFile.writeln("];"); @@ -99,7 +252,7 @@ void write_XID_Start() ValueRanges start = ValueRanges(propertyXID_StartRanges.ranges.dup); - version(IgnoreASCIIRanges) + version (IgnoreASCIIRanges) { // Remove ASCII ranges as its always a waste of time, since its handles elsewhere. start = start.not(ASCII_Table); @@ -116,7 +269,10 @@ void write_XID_Start() tableFile.writeln("UAX31 profile Start"); tableFile.writeln("Entries: ", start.count); tableFile.writeln("*/"); - writeTable("UAX31_Start", start); + writeIdentifierTable("UAX31_Start", start); + + tableFile.writeln; + writeTestCases("UAX31_Start", start); } void write_XID_Continue() @@ -125,7 +281,7 @@ void write_XID_Continue() ValueRanges cont = ValueRanges(propertyXID_ContinueRanges.ranges.dup); - version(IgnoreASCIIRanges) + version (IgnoreASCIIRanges) { // Remove ASCII ranges as its always a waste of time, since its handles elsewhere. cont = cont.not(ASCII_Table); @@ -135,7 +291,10 @@ void write_XID_Continue() tableFile.writeln("UAX31 profile Continue"); tableFile.writeln("Entries: ", cont.count); tableFile.writeln("*/"); - writeTable("UAX31_Continue", cont); + writeIdentifierTable("UAX31_Continue", cont); + + tableFile.writeln; + writeTestCases("UAX31_Continue", cont); } void write_other_tables() @@ -151,9 +310,12 @@ void write_other_tables() tableFile.writeln("C99 Continue"); tableFile.writeln("Entries: ", c99_Table.count); tableFile.writeln("*/"); - writeTable("FixedTable_C99_Continue", c99_Table); + writeIdentifierTable("FixedTable_C99_Continue", c99_Table); tableFile.writeln; + tableFile.writeln; + writeTestCases("FixedTable_C99_Continue", c99_Table); + tableFile.writeln("/**"); tableFile.writeln("C11 Start"); tableFile.writeln("Entries: ", c11_Table.count); @@ -165,10 +327,14 @@ void write_other_tables() tableFile.writeln("C11 Continue"); tableFile.writeln("Entries: ", c11_Table.count); tableFile.writeln("*/"); - writeTable("FixedTable_C11_Continue", c11_Table); + writeIdentifierTable("FixedTable_C11_Continue", c11_Table); + + tableFile.writeln; + writeTestCases("FixedTable_C11_Continue", c11_Table); } -void write_least_restrictive_table() { +void write_least_restrictive_table() +{ import unicode_tables.derivedCoreProperties; ValueRanges toMerge = c99_Table.merge(c11_Table); @@ -176,7 +342,7 @@ void write_least_restrictive_table() { ValueRanges lrc = propertyXID_ContinueRanges.merge(toMerge); ValueRanges lr = lrs.merge(lrc); - version(IgnoreASCIIRanges) + version (IgnoreASCIIRanges) { // Remove ASCII ranges as its always a waste of time, since its handles elsewhere. lrs = lrs.not(ASCII_Table); @@ -188,19 +354,90 @@ void write_least_restrictive_table() { tableFile.writeln("Least restrictive with both Start and Continue"); tableFile.writeln("Entries: ", lr.count); tableFile.writeln("*/"); - writeTable("LeastRestrictive_OfAll", lr); + writeIdentifierTable("LeastRestrictive_OfAll", lr); tableFile.writeln; + tableFile.writeln; + writeTestCases("LeastRestrictive_OfAll", lr); + tableFile.writeln("/**"); tableFile.writeln("Least restrictive Start"); tableFile.writeln("Entries: ", lrs.count); tableFile.writeln("*/"); - writeTable("LeastRestrictive_Start", lrs); + writeIdentifierTable("LeastRestrictive_Start", lrs); + tableFile.writeln; + tableFile.writeln; + writeTestCases("LeastRestrictive_Start", lrs); tableFile.writeln("/**"); tableFile.writeln("Least restrictive Continue"); tableFile.writeln("Entries: ", lrc.count); tableFile.writeln("*/"); - writeTable("LeastRestrictive_Continue", lrc); + writeIdentifierTable("LeastRestrictive_Continue", lrc); + + tableFile.writeln; + writeTestCases("LeastRestrictive_Continue", lrc); +} + +void writeIsNotNormalizedTable() +{ + import unicode_tables.derivedNormalizationProps; + + tableFile.writeln("/**"); + tableFile.writeln("Is not normalized table, used for quick check algorithm."); + tableFile.writeln("Has Maybe entries merged into No."); + tableFile.writeln("Entries: ", isCharacterNotNormalized.count); + tableFile.writeln("*/"); + writeIdentifierTable("IsCharacterNotNormalized", isCharacterNotNormalized); + + tableFile.writeln; + writeTestCases("IsCharacterNotNormalized", isCharacterNotNormalized); +} + +void writeCCC() +{ + import unicode_tables.unicodeData; + + tableFile.writeln("/**"); + tableFile.writeln("The index table of CCC value for a character."); + tableFile.writeln("Entries: ", cccIndexTable.count); + tableFile.writeln("*/"); + writeIdentifierTable("IndexTableForCCC", cccIndexTable); + + tableFile.writeln; + writeTestCases("IndexTableForCCC", cccIndexTable); + + tableFile.writeln(); + + tableFile.writeln("/// CCC Value table"); + writeValueTable("ValueTableForCCC", cccValueTable); +} + +void printSomeCharacters() +{ + import unicode_tables.unicodeData; + import unicode_tables.derivedNormalizationProps; + + writeln("Some UAX31 non-starters"); + writefln!"%-10s %-8s %-3s %-13s"("char (hex)", "char (dec)", "ccc", "is normalized"); + + ubyte done; + ubyte lastCCC; + + foreach (index, ccc; cccValueTable) + { + if (ccc > lastCCC) + lastCCC = ccc; + else + continue; + + dchar startCharacter = cccIndexTable.ranges[index].start; + bool isNormalized = !isCharacterNotNormalized.within(startCharacter); + + writefln!"0x%08X %08d %3d %13s"(startCharacter, startCharacter, ccc, isNormalized); + + if (done++ == 4) + break; + } }